diff options
966 files changed, 73685 insertions, 29190 deletions
diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000000..728acb8da7 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,17 @@ +# This file contains a list of Git commit hashes that should be hidden from the +# regular Git history. Typically, this includes commits involving mass auto-formatting +# or other normalizations. Commit hashes *must* use the full 40-character notation. +# To apply the ignore list in your local Git client, you must run: +# +# git config blame.ignoreRevsFile .git-blame-ignore-revs +# +# This file is automatically used by GitHub.com's blame view. + +# A Whole New World (clang-format edition) +5dbf1809c6e3e905b94b8764e99491e608122261 + +# Style: clang-format: Disable KeepEmptyLinesAtTheStartOfBlocks +0be6d925dc3c6413bce7a3ccb49631b8e4a6e67a + +# Style: clang-format: Disable AllowShortIfStatementsOnASingleLine +e956e80c1fa1cc8aefcb1533e5acf5cf3c8ffdd9 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e7e88e95d7..bd4eb906c0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -114,7 +114,6 @@ doc_classes/* @godotengine/documentation /modules/gdscript/ @godotengine/gdscript /modules/jsonrpc/ @godotengine/gdscript /modules/mono/ @godotengine/mono -/modules/visual_script/ @godotengine/visualscript ## Text /modules/freetype/ @godotengine/buildsystem diff --git a/.github/workflows/web_builds.yml b/.github/workflows/web_builds.yml index b3fb87ed7e..deee91938d 100644 --- a/.github/workflows/web_builds.yml +++ b/.github/workflows/web_builds.yml @@ -6,7 +6,7 @@ env: # Only used for the cache key. Increment version to force clean build. GODOT_BASE_BRANCH: master SCONSFLAGS: verbose=yes warnings=extra werror=yes debug_symbols=no - EM_VERSION: 3.1.20 + EM_VERSION: 3.1.18 EM_CACHE_FOLDER: "emsdk-cache" concurrency: diff --git a/SConstruct b/SConstruct index ce586010f4..200e8e5984 100644 --- a/SConstruct +++ b/SConstruct @@ -170,7 +170,7 @@ opts.Add(EnumVariable("arch", "CPU architecture", "auto", ["auto"] + architectur opts.Add(EnumVariable("float", "Floating-point precision", "32", ("32", "64"))) opts.Add(EnumVariable("optimize", "Optimization type", "speed", ("speed", "size", "none"))) opts.Add(BoolVariable("production", "Set defaults to build Godot for use in production", False)) -opts.Add(BoolVariable("use_lto", "Use link-time optimization", False)) +opts.Add(EnumVariable("lto", "Link-time optimization (for production buids)", "none", ("none", "auto", "thin", "full"))) # Components opts.Add(BoolVariable("deprecated", "Enable compatibility code for deprecated and removed features", True)) @@ -438,35 +438,6 @@ if selected_platform in platform_list: ) env.SetOption("num_jobs", safer_cpu_count) - # 'dev' and 'production' are aliases to set default options if they haven't been set - # manually by the user. - if env["dev"]: - env["verbose"] = methods.get_cmdline_bool("verbose", True) - env["warnings"] = ARGUMENTS.get("warnings", "extra") - env["werror"] = methods.get_cmdline_bool("werror", True) - if env["tools"]: - env["tests"] = methods.get_cmdline_bool("tests", True) - if env["production"]: - env["use_static_cpp"] = methods.get_cmdline_bool("use_static_cpp", True) - env["use_lto"] = methods.get_cmdline_bool("use_lto", True) - env["debug_symbols"] = methods.get_cmdline_bool("debug_symbols", False) - if not env["tools"] and env["target"] == "debug": - print( - "WARNING: Requested `production` build with `tools=no target=debug`, " - "this will give you a full debug template (use `target=release_debug` " - "for an optimized template with debug features)." - ) - if env.msvc: - print( - "WARNING: For `production` Windows builds, you should use MinGW with GCC " - "or Clang instead of Visual Studio, as they can better optimize the " - "GDScript VM in a very significant way. MSVC LTO also doesn't work " - "reliably for our use case." - "If you want to use MSVC nevertheless for production builds, set " - "`debug_symbols=no use_lto=no` instead of the `production=yes` option." - ) - Exit(255) - env.extra_suffix = "" if env["extra_suffix"] != "": @@ -489,19 +460,42 @@ if selected_platform in platform_list: env["LINKFLAGS"] = "" env.Append(LINKFLAGS=str(LINKFLAGS).split()) - # Platform specific flags + # Platform specific flags. + # These can sometimes override default options. flag_list = platform_flags[selected_platform] for f in flag_list: if not (f[0] in ARGUMENTS) or ARGUMENTS[f[0]] == "auto": # Allow command line to override platform flags env[f[0]] = f[1] - # Must happen after the flags' definition, so that they can be used by platform detect + # 'dev' and 'production' are aliases to set default options if they haven't been + # set manually by the user. + # These need to be checked *after* platform specific flags so that different + # default values can be set (e.g. to keep LTO off for `production` on some platforms). + if env["dev"]: + env["verbose"] = methods.get_cmdline_bool("verbose", True) + env["warnings"] = ARGUMENTS.get("warnings", "extra") + env["werror"] = methods.get_cmdline_bool("werror", True) + if env["tools"]: + env["tests"] = methods.get_cmdline_bool("tests", True) + if env["production"]: + env["use_static_cpp"] = methods.get_cmdline_bool("use_static_cpp", True) + env["debug_symbols"] = methods.get_cmdline_bool("debug_symbols", False) + # LTO "auto" means we handle the preferred option in each platform detect.py. + env["lto"] = ARGUMENTS.get("lto", "auto") + if not env["tools"] and env["target"] == "debug": + print( + "WARNING: Requested `production` build with `tools=no target=debug`, " + "this will give you a full debug template (use `target=release_debug` " + "for an optimized template with debug features)." + ) + + # Must happen after the flags' definition, as configure is when most flags + # are actually handled to change compile options, etc. detect.configure(env) - print( - 'Building for platform "%s", architecture "%s", %s, target "%s".' - % (selected_platform, env["arch"], "editor" if env["tools"] else "template", env["target"]) - ) + # Needs to happen after configure to handle "auto". + if env["lto"] != "none": + print("Using LTO: " + env["lto"]) # Set our C and C++ standard requirements. # C++17 is required as we need guaranteed copy elision as per GH-36436. @@ -517,6 +511,11 @@ if selected_platform in platform_list: # We apply it to CCFLAGS (both C and C++ code) in case it impacts C features. env.Prepend(CCFLAGS=["/std:c++17"]) + print( + 'Building for platform "%s", architecture "%s", %s, target "%s".' + % (selected_platform, env["arch"], "editor" if env["tools"] else "template", env["target"]) + ) + # Enforce our minimal compiler version requirements cc_version = methods.get_compiler_version(env) or { "major": None, @@ -735,7 +734,7 @@ if selected_platform in platform_list: env.module_list = modules_enabled methods.sort_module_list(env) - methods.update_version(env.module_version_string) + methods.generate_version_header(env.module_version_string) env["PROGSUFFIX"] = suffix + env.module_version_string + env["PROGSUFFIX"] env["OBJSUFFIX"] = suffix + env["OBJSUFFIX"] diff --git a/core/config/project_settings.cpp b/core/config/project_settings.cpp index 6275502378..15f807017f 100644 --- a/core/config/project_settings.cpp +++ b/core/config/project_settings.cpp @@ -101,10 +101,15 @@ const PackedStringArray ProjectSettings::_get_supported_features() { features.append(VERSION_BRANCH "." _MKSTR(VERSION_PATCH)); features.append(VERSION_FULL_CONFIG); features.append(VERSION_FULL_BUILD); - // For now, assume Vulkan is always supported. - // This should be removed if it's possible to build the editor without Vulkan. - features.append("Vulkan Clustered"); - features.append("Vulkan Mobile"); + +#ifdef VULKAN_ENABLED + features.append("Forward Plus"); + features.append("Mobile"); +#endif + +#ifdef GLES3_ENABLED + features.append("GL Compatibility"); +#endif return features; } @@ -909,7 +914,7 @@ Error ProjectSettings::save_custom(const String &p_path, const CustomMap &p_cust project_features = ProjectSettings::get_required_features(); } // Check the rendering API. - const String rendering_api = has_setting("rendering/quality/driver/driver_name") ? (String)get_setting("rendering/quality/driver/driver_name") : String(); + const String rendering_api = has_setting("rendering/renderer/rendering_method") ? (String)get_setting("rendering/renderer/rendering_method") : String(); if (!rendering_api.is_empty()) { // Add the rendering API as a project feature if it doesn't already exist. if (!project_features.has(rendering_api)) { @@ -1139,6 +1144,7 @@ void ProjectSettings::_bind_methods() { ClassDB::bind_method(D_METHOD("get_order", "name"), &ProjectSettings::get_order); ClassDB::bind_method(D_METHOD("set_initial_value", "name", "value"), &ProjectSettings::set_initial_value); ClassDB::bind_method(D_METHOD("add_property_info", "hint"), &ProjectSettings::_add_property_info_bind); + ClassDB::bind_method(D_METHOD("set_restart_if_changed", "name", "restart"), &ProjectSettings::set_restart_if_changed); ClassDB::bind_method(D_METHOD("clear", "name"), &ProjectSettings::clear); ClassDB::bind_method(D_METHOD("localize_path", "path"), &ProjectSettings::localize_path); ClassDB::bind_method(D_METHOD("globalize_path", "path"), &ProjectSettings::globalize_path); diff --git a/core/config/project_settings.h b/core/config/project_settings.h index a9af63ee39..960dfe0395 100644 --- a/core/config/project_settings.h +++ b/core/config/project_settings.h @@ -45,9 +45,10 @@ public: static const String PROJECT_DATA_DIR_NAME_SUFFIX; enum { - //properties that are not for built in values begin from this value, so builtin ones are displayed first + // Properties that are not for built in values begin from this value, so builtin ones are displayed first. NO_BUILTIN_ORDER_BASE = 1 << 16 }; + #ifdef TOOLS_ENABLED const static PackedStringArray get_required_features(); const static PackedStringArray get_unsupported_features(const PackedStringArray &p_project_features); diff --git a/core/core_bind.cpp b/core/core_bind.cpp index 9daf58cb71..2149ee4512 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -322,6 +322,14 @@ String OS::get_name() const { return ::OS::get_singleton()->get_name(); } +String OS::get_distribution_name() const { + return ::OS::get_singleton()->get_distribution_name(); +} + +String OS::get_version() const { + return ::OS::get_singleton()->get_version(); +} + Vector<String> OS::get_cmdline_args() { List<String> cmdline = ::OS::get_singleton()->get_cmdline_args(); Vector<String> cmdlinev; @@ -535,6 +543,8 @@ void OS::_bind_methods() { ClassDB::bind_method(D_METHOD("has_environment", "variable"), &OS::has_environment); ClassDB::bind_method(D_METHOD("get_name"), &OS::get_name); + ClassDB::bind_method(D_METHOD("get_distribution_name"), &OS::get_distribution_name); + ClassDB::bind_method(D_METHOD("get_version"), &OS::get_version); ClassDB::bind_method(D_METHOD("get_cmdline_args"), &OS::get_cmdline_args); ClassDB::bind_method(D_METHOD("get_cmdline_user_args"), &OS::get_cmdline_user_args); @@ -800,14 +810,13 @@ Dictionary Geometry2D::make_atlas(const Vector<Size2> &p_rects) { ::Geometry2D::make_atlas(rects, result, size); - Size2 r_size = size; Vector<Point2> r_result; for (int i = 0; i < result.size(); i++) { r_result.push_back(result[i]); } ret["points"] = r_result; - ret["size"] = r_size; + ret["size"] = size; return ret; } @@ -982,636 +991,6 @@ void Geometry3D::_bind_methods() { ClassDB::bind_method(D_METHOD("clip_polygon", "points", "plane"), &Geometry3D::clip_polygon); } -////// File ////// - -Error File::open_encrypted(const String &p_path, ModeFlags p_mode_flags, const Vector<uint8_t> &p_key) { - Error err = open(p_path, p_mode_flags); - if (err) { - return err; - } - - Ref<FileAccessEncrypted> fae; - fae.instantiate(); - err = fae->open_and_parse(f, p_key, (p_mode_flags == WRITE) ? FileAccessEncrypted::MODE_WRITE_AES256 : FileAccessEncrypted::MODE_READ); - if (err) { - close(); - return err; - } - f = fae; - return OK; -} - -Error File::open_encrypted_pass(const String &p_path, ModeFlags p_mode_flags, const String &p_pass) { - Error err = open(p_path, p_mode_flags); - if (err) { - return err; - } - - Ref<FileAccessEncrypted> fae; - fae.instantiate(); - err = fae->open_and_parse_password(f, p_pass, (p_mode_flags == WRITE) ? FileAccessEncrypted::MODE_WRITE_AES256 : FileAccessEncrypted::MODE_READ); - if (err) { - close(); - return err; - } - - f = fae; - return OK; -} - -Error File::open_compressed(const String &p_path, ModeFlags p_mode_flags, CompressionMode p_compress_mode) { - Ref<FileAccessCompressed> fac; - fac.instantiate(); - fac->configure("GCPF", (Compression::Mode)p_compress_mode); - - Error err = fac->_open(p_path, p_mode_flags); - - if (err) { - return err; - } - - f = fac; - return OK; -} - -Error File::open(const String &p_path, ModeFlags p_mode_flags) { - Error err; - f = FileAccess::open(p_path, p_mode_flags, &err); - if (f.is_valid()) { - f->set_big_endian(big_endian); - } - return err; -} - -void File::flush() { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before flushing."); - f->flush(); -} - -void File::close() { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened."); - f.unref(); -} - -bool File::is_open() const { - return f != nullptr; -} - -String File::get_path() const { - ERR_FAIL_COND_V_MSG(f.is_null(), "", "File must be opened before use, or is lacking read-write permission."); - return f->get_path(); -} - -String File::get_path_absolute() const { - ERR_FAIL_COND_V_MSG(f.is_null(), "", "File must be opened before use, or is lacking read-write permission."); - return f->get_path_absolute(); -} - -void File::seek(int64_t p_position) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - ERR_FAIL_COND_MSG(p_position < 0, "Seek position must be a positive integer."); - f->seek(p_position); -} - -void File::seek_end(int64_t p_position) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - f->seek_end(p_position); -} - -uint64_t File::get_position() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_position(); -} - -uint64_t File::get_length() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_length(); -} - -bool File::eof_reached() const { - ERR_FAIL_COND_V_MSG(f.is_null(), false, "File must be opened before use, or is lacking read-write permission."); - return f->eof_reached(); -} - -uint8_t File::get_8() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_8(); -} - -uint16_t File::get_16() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_16(); -} - -uint32_t File::get_32() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_32(); -} - -uint64_t File::get_64() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_64(); -} - -float File::get_float() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_float(); -} - -double File::get_double() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_double(); -} - -real_t File::get_real() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use, or is lacking read-write permission."); - return f->get_real(); -} - -Vector<uint8_t> File::get_buffer(int64_t p_length) const { - Vector<uint8_t> data; - ERR_FAIL_COND_V_MSG(f.is_null(), data, "File must be opened before use, or is lacking read-write permission."); - - ERR_FAIL_COND_V_MSG(p_length < 0, data, "Length of buffer cannot be smaller than 0."); - if (p_length == 0) { - return data; - } - - Error err = data.resize(p_length); - ERR_FAIL_COND_V_MSG(err != OK, data, "Can't resize data to " + itos(p_length) + " elements."); - - uint8_t *w = data.ptrw(); - int64_t len = f->get_buffer(&w[0], p_length); - - if (len < p_length) { - data.resize(len); - } - - return data; -} - -String File::get_as_text(bool p_skip_cr) const { - ERR_FAIL_COND_V_MSG(f.is_null(), String(), "File must be opened before use, or is lacking read-write permission."); - - uint64_t original_pos = f->get_position(); - const_cast<FileAccess *>(*f)->seek(0); - - String text = f->get_as_utf8_string(p_skip_cr); - - const_cast<FileAccess *>(*f)->seek(original_pos); - - return text; -} - -String File::get_md5(const String &p_path) const { - return FileAccess::get_md5(p_path); -} - -String File::get_sha256(const String &p_path) const { - return FileAccess::get_sha256(p_path); -} - -String File::get_line() const { - ERR_FAIL_COND_V_MSG(f.is_null(), String(), "File must be opened before use, or is lacking read-write permission."); - return f->get_line(); -} - -Vector<String> File::get_csv_line(const String &p_delim) const { - ERR_FAIL_COND_V_MSG(f.is_null(), Vector<String>(), "File must be opened before use, or is lacking read-write permission."); - return f->get_csv_line(p_delim); -} - -/**< use this for files WRITTEN in _big_ endian machines (i.e. amiga/mac) - * It's not about the current CPU type but file formats. - * These flags get reset to false (little endian) on each open - */ - -void File::set_big_endian(bool p_big_endian) { - big_endian = p_big_endian; - if (f.is_valid()) { - f->set_big_endian(p_big_endian); - } -} - -bool File::is_big_endian() { - return big_endian; -} - -Error File::get_error() const { - if (f.is_null()) { - return ERR_UNCONFIGURED; - } - return f->get_error(); -} - -void File::store_8(uint8_t p_dest) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_8(p_dest); -} - -void File::store_16(uint16_t p_dest) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_16(p_dest); -} - -void File::store_32(uint32_t p_dest) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_32(p_dest); -} - -void File::store_64(uint64_t p_dest) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_64(p_dest); -} - -void File::store_float(float p_dest) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_float(p_dest); -} - -void File::store_double(double p_dest) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_double(p_dest); -} - -void File::store_real(real_t p_real) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_real(p_real); -} - -void File::store_string(const String &p_string) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_string(p_string); -} - -void File::store_pascal_string(const String &p_string) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - f->store_pascal_string(p_string); -} - -String File::get_pascal_string() { - ERR_FAIL_COND_V_MSG(f.is_null(), "", "File must be opened before use, or is lacking read-write permission."); - - return f->get_pascal_string(); -} - -void File::store_line(const String &p_string) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - f->store_line(p_string); -} - -void File::store_csv_line(const Vector<String> &p_values, const String &p_delim) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - f->store_csv_line(p_values, p_delim); -} - -void File::store_buffer(const Vector<uint8_t> &p_buffer) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - - uint64_t len = p_buffer.size(); - if (len == 0) { - return; - } - - const uint8_t *r = p_buffer.ptr(); - - f->store_buffer(&r[0], len); -} - -bool File::file_exists(const String &p_name) { - return FileAccess::exists(p_name); -} - -void File::store_var(const Variant &p_var, bool p_full_objects) { - ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use, or is lacking read-write permission."); - int len; - Error err = encode_variant(p_var, nullptr, len, p_full_objects); - ERR_FAIL_COND_MSG(err != OK, "Error when trying to encode Variant."); - - Vector<uint8_t> buff; - buff.resize(len); - - uint8_t *w = buff.ptrw(); - err = encode_variant(p_var, &w[0], len, p_full_objects); - ERR_FAIL_COND_MSG(err != OK, "Error when trying to encode Variant."); - - store_32(len); - store_buffer(buff); -} - -Variant File::get_var(bool p_allow_objects) const { - ERR_FAIL_COND_V_MSG(f.is_null(), Variant(), "File must be opened before use, or is lacking read-write permission."); - uint32_t len = get_32(); - Vector<uint8_t> buff = get_buffer(len); - ERR_FAIL_COND_V((uint32_t)buff.size() != len, Variant()); - - const uint8_t *r = buff.ptr(); - - Variant v; - Error err = decode_variant(v, &r[0], len, nullptr, p_allow_objects); - ERR_FAIL_COND_V_MSG(err != OK, Variant(), "Error when trying to encode Variant."); - - return v; -} - -uint64_t File::get_modified_time(const String &p_file) const { - return FileAccess::get_modified_time(p_file); -} - -void File::_bind_methods() { - ClassDB::bind_method(D_METHOD("open_encrypted", "path", "mode_flags", "key"), &File::open_encrypted); - ClassDB::bind_method(D_METHOD("open_encrypted_with_pass", "path", "mode_flags", "pass"), &File::open_encrypted_pass); - ClassDB::bind_method(D_METHOD("open_compressed", "path", "mode_flags", "compression_mode"), &File::open_compressed, DEFVAL(0)); - - ClassDB::bind_method(D_METHOD("open", "path", "flags"), &File::open); - ClassDB::bind_method(D_METHOD("flush"), &File::flush); - ClassDB::bind_method(D_METHOD("close"), &File::close); - ClassDB::bind_method(D_METHOD("get_path"), &File::get_path); - ClassDB::bind_method(D_METHOD("get_path_absolute"), &File::get_path_absolute); - ClassDB::bind_method(D_METHOD("is_open"), &File::is_open); - ClassDB::bind_method(D_METHOD("seek", "position"), &File::seek); - ClassDB::bind_method(D_METHOD("seek_end", "position"), &File::seek_end, DEFVAL(0)); - ClassDB::bind_method(D_METHOD("get_position"), &File::get_position); - ClassDB::bind_method(D_METHOD("get_length"), &File::get_length); - ClassDB::bind_method(D_METHOD("eof_reached"), &File::eof_reached); - ClassDB::bind_method(D_METHOD("get_8"), &File::get_8); - ClassDB::bind_method(D_METHOD("get_16"), &File::get_16); - ClassDB::bind_method(D_METHOD("get_32"), &File::get_32); - ClassDB::bind_method(D_METHOD("get_64"), &File::get_64); - ClassDB::bind_method(D_METHOD("get_float"), &File::get_float); - ClassDB::bind_method(D_METHOD("get_double"), &File::get_double); - ClassDB::bind_method(D_METHOD("get_real"), &File::get_real); - ClassDB::bind_method(D_METHOD("get_buffer", "length"), &File::get_buffer); - ClassDB::bind_method(D_METHOD("get_line"), &File::get_line); - ClassDB::bind_method(D_METHOD("get_csv_line", "delim"), &File::get_csv_line, DEFVAL(",")); - ClassDB::bind_method(D_METHOD("get_as_text", "skip_cr"), &File::get_as_text, DEFVAL(false)); - ClassDB::bind_method(D_METHOD("get_md5", "path"), &File::get_md5); - ClassDB::bind_method(D_METHOD("get_sha256", "path"), &File::get_sha256); - ClassDB::bind_method(D_METHOD("is_big_endian"), &File::is_big_endian); - ClassDB::bind_method(D_METHOD("set_big_endian", "big_endian"), &File::set_big_endian); - ClassDB::bind_method(D_METHOD("get_error"), &File::get_error); - ClassDB::bind_method(D_METHOD("get_var", "allow_objects"), &File::get_var, DEFVAL(false)); - - ClassDB::bind_method(D_METHOD("store_8", "value"), &File::store_8); - ClassDB::bind_method(D_METHOD("store_16", "value"), &File::store_16); - ClassDB::bind_method(D_METHOD("store_32", "value"), &File::store_32); - ClassDB::bind_method(D_METHOD("store_64", "value"), &File::store_64); - ClassDB::bind_method(D_METHOD("store_float", "value"), &File::store_float); - ClassDB::bind_method(D_METHOD("store_double", "value"), &File::store_double); - ClassDB::bind_method(D_METHOD("store_real", "value"), &File::store_real); - ClassDB::bind_method(D_METHOD("store_buffer", "buffer"), &File::store_buffer); - ClassDB::bind_method(D_METHOD("store_line", "line"), &File::store_line); - ClassDB::bind_method(D_METHOD("store_csv_line", "values", "delim"), &File::store_csv_line, DEFVAL(",")); - ClassDB::bind_method(D_METHOD("store_string", "string"), &File::store_string); - ClassDB::bind_method(D_METHOD("store_var", "value", "full_objects"), &File::store_var, DEFVAL(false)); - - ClassDB::bind_method(D_METHOD("store_pascal_string", "string"), &File::store_pascal_string); - ClassDB::bind_method(D_METHOD("get_pascal_string"), &File::get_pascal_string); - - ClassDB::bind_static_method("File", D_METHOD("file_exists", "path"), &File::file_exists); - ClassDB::bind_method(D_METHOD("get_modified_time", "file"), &File::get_modified_time); - - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "big_endian"), "set_big_endian", "is_big_endian"); - - BIND_ENUM_CONSTANT(READ); - BIND_ENUM_CONSTANT(WRITE); - BIND_ENUM_CONSTANT(READ_WRITE); - BIND_ENUM_CONSTANT(WRITE_READ); - - BIND_ENUM_CONSTANT(COMPRESSION_FASTLZ); - BIND_ENUM_CONSTANT(COMPRESSION_DEFLATE); - BIND_ENUM_CONSTANT(COMPRESSION_ZSTD); - BIND_ENUM_CONSTANT(COMPRESSION_GZIP); -} - -////// Directory ////// - -Error Directory::open(const String &p_path) { - Error err; - Ref<DirAccess> alt = DirAccess::open(p_path, &err); - if (alt.is_null()) { - return err; - } - d = alt; - dir_open = true; - - return OK; -} - -bool Directory::is_open() const { - return d.is_valid() && dir_open; -} - -Error Directory::list_dir_begin() { - ERR_FAIL_COND_V_MSG(!is_open(), ERR_UNCONFIGURED, "Directory must be opened before use."); - return d->list_dir_begin(); -} - -String Directory::get_next() { - ERR_FAIL_COND_V_MSG(!is_open(), "", "Directory must be opened before use."); - - String next = d->get_next(); - while (!next.is_empty() && ((!include_navigational && (next == "." || next == "..")) || (!include_hidden && d->current_is_hidden()))) { - next = d->get_next(); - } - return next; -} - -bool Directory::current_is_dir() const { - ERR_FAIL_COND_V_MSG(!is_open(), false, "Directory must be opened before use."); - return d->current_is_dir(); -} - -void Directory::list_dir_end() { - ERR_FAIL_COND_MSG(!is_open(), "Directory must be opened before use."); - d->list_dir_end(); -} - -PackedStringArray Directory::get_files() { - return _get_contents(false); -} - -PackedStringArray Directory::get_directories() { - return _get_contents(true); -} - -PackedStringArray Directory::_get_contents(bool p_directories) { - PackedStringArray ret; - ERR_FAIL_COND_V_MSG(!is_open(), ret, "Directory must be opened before use."); - - list_dir_begin(); - String s = get_next(); - while (!s.is_empty()) { - if (current_is_dir() == p_directories) { - ret.append(s); - } - s = get_next(); - } - - ret.sort(); - return ret; -} - -void Directory::set_include_navigational(bool p_enable) { - include_navigational = p_enable; -} - -bool Directory::get_include_navigational() const { - return include_navigational; -} - -void Directory::set_include_hidden(bool p_enable) { - include_hidden = p_enable; -} - -bool Directory::get_include_hidden() const { - return include_hidden; -} - -int Directory::get_drive_count() { - ERR_FAIL_COND_V_MSG(!is_open(), 0, "Directory must be opened before use."); - return d->get_drive_count(); -} - -String Directory::get_drive(int p_drive) { - ERR_FAIL_COND_V_MSG(!is_open(), "", "Directory must be opened before use."); - return d->get_drive(p_drive); -} - -int Directory::get_current_drive() { - ERR_FAIL_COND_V_MSG(!is_open(), 0, "Directory must be opened before use."); - return d->get_current_drive(); -} - -Error Directory::change_dir(String p_dir) { - ERR_FAIL_COND_V_MSG(d.is_null(), ERR_UNCONFIGURED, "Directory is not configured properly."); - Error err = d->change_dir(p_dir); - - if (err != OK) { - return err; - } - dir_open = true; - - return OK; -} - -String Directory::get_current_dir() { - ERR_FAIL_COND_V_MSG(!is_open(), "", "Directory must be opened before use."); - return d->get_current_dir(); -} - -Error Directory::make_dir(String p_dir) { - ERR_FAIL_COND_V_MSG(d.is_null(), ERR_UNCONFIGURED, "Directory is not configured properly."); - if (!p_dir.is_relative_path()) { - Ref<DirAccess> da = DirAccess::create_for_path(p_dir); - return da->make_dir(p_dir); - } - return d->make_dir(p_dir); -} - -Error Directory::make_dir_recursive(String p_dir) { - ERR_FAIL_COND_V_MSG(d.is_null(), ERR_UNCONFIGURED, "Directory is not configured properly."); - if (!p_dir.is_relative_path()) { - Ref<DirAccess> da = DirAccess::create_for_path(p_dir); - return da->make_dir_recursive(p_dir); - } - return d->make_dir_recursive(p_dir); -} - -bool Directory::file_exists(String p_file) { - ERR_FAIL_COND_V_MSG(d.is_null(), false, "Directory is not configured properly."); - if (!p_file.is_relative_path()) { - return FileAccess::exists(p_file); - } - return d->file_exists(p_file); -} - -bool Directory::dir_exists(String p_dir) { - ERR_FAIL_COND_V_MSG(d.is_null(), false, "Directory is not configured properly."); - if (!p_dir.is_relative_path()) { - return DirAccess::exists(p_dir); - } - return d->dir_exists(p_dir); -} - -uint64_t Directory::get_space_left() { - ERR_FAIL_COND_V_MSG(d.is_null(), 0, "Directory must be opened before use."); - return d->get_space_left() / 1024 * 1024; // Truncate to closest MiB. -} - -Error Directory::copy(String p_from, String p_to) { - ERR_FAIL_COND_V_MSG(!is_open(), ERR_UNCONFIGURED, "Directory must be opened before use."); - return d->copy(p_from, p_to); -} - -Error Directory::rename(String p_from, String p_to) { - ERR_FAIL_COND_V_MSG(!is_open(), ERR_UNCONFIGURED, "Directory must be opened before use."); - ERR_FAIL_COND_V_MSG(p_from.is_empty() || p_from == "." || p_from == "..", ERR_INVALID_PARAMETER, "Invalid path to rename."); - - if (!p_from.is_relative_path()) { - Ref<DirAccess> da = DirAccess::create_for_path(p_from); - ERR_FAIL_COND_V_MSG(!da->file_exists(p_from) && !da->dir_exists(p_from), ERR_DOES_NOT_EXIST, "File or directory does not exist."); - return da->rename(p_from, p_to); - } - - ERR_FAIL_COND_V_MSG(!d->file_exists(p_from) && !d->dir_exists(p_from), ERR_DOES_NOT_EXIST, "File or directory does not exist."); - return d->rename(p_from, p_to); -} - -Error Directory::remove(String p_name) { - ERR_FAIL_COND_V_MSG(!is_open(), ERR_UNCONFIGURED, "Directory must be opened before use."); - if (!p_name.is_relative_path()) { - Ref<DirAccess> da = DirAccess::create_for_path(p_name); - return da->remove(p_name); - } - - return d->remove(p_name); -} - -void Directory::_bind_methods() { - ClassDB::bind_method(D_METHOD("open", "path"), &Directory::open); - ClassDB::bind_method(D_METHOD("list_dir_begin"), &Directory::list_dir_begin, DEFVAL(false), DEFVAL(false)); - ClassDB::bind_method(D_METHOD("get_next"), &Directory::get_next); - ClassDB::bind_method(D_METHOD("current_is_dir"), &Directory::current_is_dir); - ClassDB::bind_method(D_METHOD("list_dir_end"), &Directory::list_dir_end); - ClassDB::bind_method(D_METHOD("get_files"), &Directory::get_files); - ClassDB::bind_method(D_METHOD("get_directories"), &Directory::get_directories); - ClassDB::bind_method(D_METHOD("get_drive_count"), &Directory::get_drive_count); - ClassDB::bind_method(D_METHOD("get_drive", "idx"), &Directory::get_drive); - ClassDB::bind_method(D_METHOD("get_current_drive"), &Directory::get_current_drive); - ClassDB::bind_method(D_METHOD("change_dir", "todir"), &Directory::change_dir); - ClassDB::bind_method(D_METHOD("get_current_dir"), &Directory::get_current_dir); - ClassDB::bind_method(D_METHOD("make_dir", "path"), &Directory::make_dir); - ClassDB::bind_method(D_METHOD("make_dir_recursive", "path"), &Directory::make_dir_recursive); - ClassDB::bind_method(D_METHOD("file_exists", "path"), &Directory::file_exists); - ClassDB::bind_method(D_METHOD("dir_exists", "path"), &Directory::dir_exists); - ClassDB::bind_method(D_METHOD("get_space_left"), &Directory::get_space_left); - ClassDB::bind_method(D_METHOD("copy", "from", "to"), &Directory::copy); - ClassDB::bind_method(D_METHOD("rename", "from", "to"), &Directory::rename); - ClassDB::bind_method(D_METHOD("remove", "path"), &Directory::remove); - - ClassDB::bind_method(D_METHOD("set_include_navigational", "enable"), &Directory::set_include_navigational); - ClassDB::bind_method(D_METHOD("get_include_navigational"), &Directory::get_include_navigational); - ClassDB::bind_method(D_METHOD("set_include_hidden", "enable"), &Directory::set_include_hidden); - ClassDB::bind_method(D_METHOD("get_include_hidden"), &Directory::get_include_hidden); - - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "include_navigational"), "set_include_navigational", "get_include_navigational"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "include_hidden"), "set_include_hidden", "get_include_hidden"); -} - -Directory::Directory() { - d = DirAccess::create(DirAccess::ACCESS_RESOURCES); -} - ////// Marshalls ////// Marshalls *Marshalls::singleton = nullptr; diff --git a/core/core_bind.h b/core/core_bind.h index cd382d2915..345c517b99 100644 --- a/core/core_bind.h +++ b/core/core_bind.h @@ -193,6 +193,8 @@ public: bool set_environment(const String &p_var, const String &p_value) const; String get_name() const; + String get_distribution_name() const; + String get_version() const; Vector<String> get_cmdline_args(); Vector<String> get_cmdline_user_args(); @@ -353,156 +355,6 @@ public: Geometry3D() { singleton = this; } }; -class File : public RefCounted { - GDCLASS(File, RefCounted); - - Ref<FileAccess> f; - bool big_endian = false; - -protected: - static void _bind_methods(); - -public: - enum ModeFlags { - READ = 1, - WRITE = 2, - READ_WRITE = 3, - WRITE_READ = 7, - }; - - enum CompressionMode { - COMPRESSION_FASTLZ = Compression::MODE_FASTLZ, - COMPRESSION_DEFLATE = Compression::MODE_DEFLATE, - COMPRESSION_ZSTD = Compression::MODE_ZSTD, - COMPRESSION_GZIP = Compression::MODE_GZIP - }; - - Error open_encrypted(const String &p_path, ModeFlags p_mode_flags, const Vector<uint8_t> &p_key); - Error open_encrypted_pass(const String &p_path, ModeFlags p_mode_flags, const String &p_pass); - Error open_compressed(const String &p_path, ModeFlags p_mode_flags, CompressionMode p_compress_mode = COMPRESSION_FASTLZ); - - Error open(const String &p_path, ModeFlags p_mode_flags); // open a file. - void flush(); // Flush a file (write its buffer to disk). - void close(); // Close a file. - bool is_open() const; // True when file is open. - - String get_path() const; // Returns the path for the current open file. - String get_path_absolute() const; // Returns the absolute path for the current open file. - - void seek(int64_t p_position); // Seek to a given position. - void seek_end(int64_t p_position = 0); // Seek from the end of file. - uint64_t get_position() const; // Get position in the file. - uint64_t get_length() const; // Get size of the file. - - bool eof_reached() const; // Reading passed EOF. - - uint8_t get_8() const; // Get a byte. - uint16_t get_16() const; // Get 16 bits uint. - uint32_t get_32() const; // Get 32 bits uint. - uint64_t get_64() const; // Get 64 bits uint. - - float get_float() const; - double get_double() const; - real_t get_real() const; - - Variant get_var(bool p_allow_objects = false) const; - - Vector<uint8_t> get_buffer(int64_t p_length) const; // Get an array of bytes. - String get_line() const; - Vector<String> get_csv_line(const String &p_delim = ",") const; - String get_as_text(bool p_skip_cr = false) const; - String get_md5(const String &p_path) const; - String get_sha256(const String &p_path) const; - - /* - * Use this for files WRITTEN in _big_ endian machines (ie, amiga/mac). - * It's not about the current CPU type but file formats. - * This flag gets reset to `false` (little endian) on each open. - */ - void set_big_endian(bool p_big_endian); - bool is_big_endian(); - - Error get_error() const; // Get last error. - - void store_8(uint8_t p_dest); // Store a byte. - void store_16(uint16_t p_dest); // Store 16 bits uint. - void store_32(uint32_t p_dest); // Store 32 bits uint. - void store_64(uint64_t p_dest); // Store 64 bits uint. - - void store_float(float p_dest); - void store_double(double p_dest); - void store_real(real_t p_real); - - void store_string(const String &p_string); - void store_line(const String &p_string); - void store_csv_line(const Vector<String> &p_values, const String &p_delim = ","); - - virtual void store_pascal_string(const String &p_string); - virtual String get_pascal_string(); - - void store_buffer(const Vector<uint8_t> &p_buffer); // Store an array of bytes. - - void store_var(const Variant &p_var, bool p_full_objects = false); - - static bool file_exists(const String &p_name); // Return true if a file exists. - - uint64_t get_modified_time(const String &p_file) const; - - File() {} -}; - -class Directory : public RefCounted { - GDCLASS(Directory, RefCounted); - Ref<DirAccess> d; - - bool dir_open = false; - bool include_navigational = false; - bool include_hidden = false; - -protected: - static void _bind_methods(); - -public: - Error open(const String &p_path); - - bool is_open() const; - - Error list_dir_begin(); - String get_next(); - bool current_is_dir() const; - void list_dir_end(); - - PackedStringArray get_files(); - PackedStringArray get_directories(); - PackedStringArray _get_contents(bool p_directories); - - void set_include_navigational(bool p_enable); - bool get_include_navigational() const; - void set_include_hidden(bool p_enable); - bool get_include_hidden() const; - - int get_drive_count(); - String get_drive(int p_drive); - int get_current_drive(); - - Error change_dir(String p_dir); // Can be relative or absolute, return false on success. - String get_current_dir(); // Return current dir location. - - Error make_dir(String p_dir); - Error make_dir_recursive(String p_dir); - - bool file_exists(String p_file); - bool dir_exists(String p_dir); - - uint64_t get_space_left(); - - Error copy(String p_from, String p_to); - Error rename(String p_from, String p_to); - Error remove(String p_name); - - Directory(); -}; - class Marshalls : public Object { GDCLASS(Marshalls, Object); @@ -736,9 +588,6 @@ VARIANT_ENUM_CAST(core_bind::Geometry2D::PolyBooleanOperation); VARIANT_ENUM_CAST(core_bind::Geometry2D::PolyJoinType); VARIANT_ENUM_CAST(core_bind::Geometry2D::PolyEndType); -VARIANT_ENUM_CAST(core_bind::File::ModeFlags); -VARIANT_ENUM_CAST(core_bind::File::CompressionMode); - VARIANT_ENUM_CAST(core_bind::Thread::Priority); #endif // CORE_BIND_H diff --git a/core/core_constants.cpp b/core/core_constants.cpp index c4d83d4765..2f8b28363b 100644 --- a/core/core_constants.cpp +++ b/core/core_constants.cpp @@ -433,11 +433,11 @@ void register_global_constants() { BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(KeyModifierMask, KEY_CODE_MASK, CODE_MASK); BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(KeyModifierMask, KEY_MODIFIER_MASK, MODIFIER_MASK); + BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, CMD_OR_CTRL); BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, SHIFT); BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, ALT); BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, META); BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, CTRL); - BIND_CORE_ENUM_CLASS_CONSTANT_NO_VAL(KeyModifierMask, KEY_MASK, CMD); BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, KPAD); BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, GROUP_SWITCH); diff --git a/core/doc_data.h b/core/doc_data.h index 1d8d2483e0..3b7bf149b4 100644 --- a/core/doc_data.h +++ b/core/doc_data.h @@ -66,6 +66,8 @@ public: String return_enum; String qualifiers; String description; + bool is_deprecated = false; + bool is_experimental = false; Vector<ArgumentDoc> arguments; Vector<int> errors_returned; bool operator<(const MethodDoc &p_method) const { @@ -105,6 +107,8 @@ public: String enumeration; bool is_bitfield = false; String description; + bool is_deprecated = false; + bool is_experimental = false; bool operator<(const ConstantDoc &p_const) const { return name < p_const.name; } @@ -126,6 +130,8 @@ public: String default_value; bool overridden = false; String overrides; + bool is_deprecated = false; + bool is_experimental = false; bool operator<(const PropertyDoc &p_prop) const { return name < p_prop.name; } @@ -167,6 +173,8 @@ public: Vector<PropertyDoc> properties; Vector<MethodDoc> annotations; Vector<ThemeItemDoc> theme_properties; + bool is_deprecated = false; + bool is_experimental = false; bool is_script_doc = false; String script_path; bool operator<(const ClassDoc &p_class) const { diff --git a/core/extension/extension_api_dump.cpp b/core/extension/extension_api_dump.cpp index 5cf951a93c..bda1a5cdc1 100644 --- a/core/extension/extension_api_dump.cpp +++ b/core/extension/extension_api_dump.cpp @@ -462,7 +462,7 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() { d["indexing_return_type"] = index_type == Variant::NIL ? String("Variant") : Variant::get_type_name(index_type); } - d["is_keyed"] = Variant::ValidatedKeyedSetter(type); + d["is_keyed"] = Variant::is_keyed(type); { //members diff --git a/core/extension/gdnative_interface.cpp b/core/extension/gdnative_interface.cpp index ef0b590030..67dc55bdb7 100644 --- a/core/extension/gdnative_interface.cpp +++ b/core/extension/gdnative_interface.cpp @@ -251,27 +251,6 @@ static GDNativeBool gdnative_variant_booleanize(const GDNativeVariantPtr p_self) return self->booleanize(); } -static void gdnative_variant_sub(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, GDNativeVariantPtr r_dst) { - const Variant *a = (const Variant *)p_a; - const Variant *b = (const Variant *)p_b; - memnew_placement(r_dst, Variant); - Variant::sub(*a, *b, *(Variant *)r_dst); -} - -static void gdnative_variant_blend(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst) { - const Variant *a = (const Variant *)p_a; - const Variant *b = (const Variant *)p_b; - memnew_placement(r_dst, Variant); - Variant::blend(*a, *b, p_c, *(Variant *)r_dst); -} - -static void gdnative_variant_interpolate(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst) { - const Variant *a = (const Variant *)p_a; - const Variant *b = (const Variant *)p_b; - memnew_placement(r_dst, Variant); - Variant::interpolate(*a, *b, p_c, *(Variant *)r_dst); -} - static void gdnative_variant_duplicate(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_ret, GDNativeBool p_deep) { const Variant *self = (const Variant *)p_self; memnew_placement(r_ret, Variant(self->duplicate(p_deep))); @@ -905,7 +884,7 @@ static GDNativeMethodBindPtr gdnative_classdb_get_method_bind(const char *p_clas MethodBind *mb = ClassDB::get_method(StringName(p_classname), StringName(p_methodname)); ERR_FAIL_COND_V(!mb, nullptr); if (mb->get_hash() != p_hash) { - ERR_PRINT_ONCE("Hash mismatch for method '" + String(p_classname) + "." + String(p_methodname) + "'."); + ERR_PRINT("Hash mismatch for method '" + String(p_classname) + "." + String(p_methodname) + "'."); return nullptr; } // MethodBind *mb = ClassDB::get_method("Node", "get_name"); @@ -970,9 +949,6 @@ void gdnative_setup_interface(GDNativeInterface *p_interface) { gdni.variant_recursive_hash = gdnative_variant_recursive_hash; gdni.variant_hash_compare = gdnative_variant_hash_compare; gdni.variant_booleanize = gdnative_variant_booleanize; - gdni.variant_sub = gdnative_variant_sub; - gdni.variant_blend = gdnative_variant_blend; - gdni.variant_interpolate = gdnative_variant_interpolate; gdni.variant_duplicate = gdnative_variant_duplicate; gdni.variant_stringify = gdnative_variant_stringify; diff --git a/core/extension/gdnative_interface.h b/core/extension/gdnative_interface.h index cb2adcb562..39378d8261 100644 --- a/core/extension/gdnative_interface.h +++ b/core/extension/gdnative_interface.h @@ -427,9 +427,6 @@ typedef struct { GDNativeInt (*variant_recursive_hash)(const GDNativeVariantPtr p_self, GDNativeInt p_recursion_count); GDNativeBool (*variant_hash_compare)(const GDNativeVariantPtr p_self, const GDNativeVariantPtr p_other); GDNativeBool (*variant_booleanize)(const GDNativeVariantPtr p_self); - void (*variant_sub)(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, GDNativeVariantPtr r_dst); - void (*variant_blend)(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst); - void (*variant_interpolate)(const GDNativeVariantPtr p_a, const GDNativeVariantPtr p_b, float p_c, GDNativeVariantPtr r_dst); void (*variant_duplicate)(const GDNativeVariantPtr p_self, GDNativeVariantPtr r_ret, GDNativeBool p_deep); void (*variant_stringify)(const GDNativeVariantPtr p_self, GDNativeStringPtr r_ret); diff --git a/core/input/input_event.cpp b/core/input/input_event.cpp index 3f02d80c26..596b704732 100644 --- a/core/input/input_event.cpp +++ b/core/input/input_event.cpp @@ -142,13 +142,33 @@ int64_t InputEventFromWindow::get_window_id() const { /////////////////////////////////// -void InputEventWithModifiers::set_store_command(bool p_enabled) { - store_command = p_enabled; +void InputEventWithModifiers::set_command_or_control_autoremap(bool p_enabled) { + command_or_control_autoremap = p_enabled; + if (command_or_control_autoremap) { +#ifdef MACOS_ENABLED + ctrl_pressed = false; + meta_pressed = true; +#else + ctrl_pressed = true; + meta_pressed = false; +#endif + } else { + ctrl_pressed = false; + meta_pressed = false; + } emit_changed(); } -bool InputEventWithModifiers::is_storing_command() const { - return store_command; +bool InputEventWithModifiers::is_command_or_control_autoremap() const { + return command_or_control_autoremap; +} + +bool InputEventWithModifiers::is_command_or_control_pressed() const { +#ifdef MACOS_ENABLED + return meta_pressed; +#else + return ctrl_pressed; +#endif } void InputEventWithModifiers::set_shift_pressed(bool p_enabled) { @@ -170,6 +190,7 @@ bool InputEventWithModifiers::is_alt_pressed() const { } void InputEventWithModifiers::set_ctrl_pressed(bool p_enabled) { + ERR_FAIL_COND_MSG(command_or_control_autoremap, "Command/Control autoremaping is enabled, cannot set Control directly!"); ctrl_pressed = p_enabled; emit_changed(); } @@ -179,6 +200,7 @@ bool InputEventWithModifiers::is_ctrl_pressed() const { } void InputEventWithModifiers::set_meta_pressed(bool p_enabled) { + ERR_FAIL_COND_MSG(command_or_control_autoremap, "Command/Control autoremaping is enabled, cannot set Meta directly!"); meta_pressed = p_enabled; emit_changed(); } @@ -187,15 +209,6 @@ bool InputEventWithModifiers::is_meta_pressed() const { return meta_pressed; } -void InputEventWithModifiers::set_command_pressed(bool p_enabled) { - command_pressed = p_enabled; - emit_changed(); -} - -bool InputEventWithModifiers::is_command_pressed() const { - return command_pressed; -} - void InputEventWithModifiers::set_modifiers_from_event(const InputEventWithModifiers *event) { set_alt_pressed(event->is_alt_pressed()); set_shift_pressed(event->is_shift_pressed()); @@ -217,6 +230,13 @@ Key InputEventWithModifiers::get_modifiers_mask() const { if (is_meta_pressed()) { mask |= KeyModifierMask::META; } + if (is_command_or_control_autoremap()) { +#ifdef MACOS_ENABLED + mask |= KeyModifierMask::META; +#else + mask |= KeyModifierMask::CTRL; +#endif + } return mask; } @@ -248,8 +268,10 @@ String InputEventWithModifiers::to_string() { } void InputEventWithModifiers::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_store_command", "enable"), &InputEventWithModifiers::set_store_command); - ClassDB::bind_method(D_METHOD("is_storing_command"), &InputEventWithModifiers::is_storing_command); + ClassDB::bind_method(D_METHOD("set_command_or_control_autoremap", "enable"), &InputEventWithModifiers::set_command_or_control_autoremap); + ClassDB::bind_method(D_METHOD("is_command_or_control_autoremap"), &InputEventWithModifiers::is_command_or_control_autoremap); + + ClassDB::bind_method(D_METHOD("is_command_or_control_pressed"), &InputEventWithModifiers::is_command_or_control_pressed); ClassDB::bind_method(D_METHOD("set_alt_pressed", "pressed"), &InputEventWithModifiers::set_alt_pressed); ClassDB::bind_method(D_METHOD("is_alt_pressed"), &InputEventWithModifiers::is_alt_pressed); @@ -263,34 +285,24 @@ void InputEventWithModifiers::_bind_methods() { ClassDB::bind_method(D_METHOD("set_meta_pressed", "pressed"), &InputEventWithModifiers::set_meta_pressed); ClassDB::bind_method(D_METHOD("is_meta_pressed"), &InputEventWithModifiers::is_meta_pressed); - ClassDB::bind_method(D_METHOD("set_command_pressed", "pressed"), &InputEventWithModifiers::set_command_pressed); - ClassDB::bind_method(D_METHOD("is_command_pressed"), &InputEventWithModifiers::is_command_pressed); - - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "store_command"), "set_store_command", "is_storing_command"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "command_or_control_autoremap"), "set_command_or_control_autoremap", "is_command_or_control_autoremap"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "alt_pressed"), "set_alt_pressed", "is_alt_pressed"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "shift_pressed"), "set_shift_pressed", "is_shift_pressed"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ctrl_pressed"), "set_ctrl_pressed", "is_ctrl_pressed"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "meta_pressed"), "set_meta_pressed", "is_meta_pressed"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "command_pressed"), "set_command_pressed", "is_command_pressed"); } void InputEventWithModifiers::_validate_property(PropertyInfo &p_property) const { - if (store_command) { - // If we only want to Store "Command". -#ifdef APPLE_STYLE_KEYS - // Don't store "Meta" on Mac. + if (command_or_control_autoremap) { + // Cannot be used with Meta/Command or Control! if (p_property.name == "meta_pressed") { p_property.usage ^= PROPERTY_USAGE_STORAGE; } -#else - // Don't store "Ctrl". if (p_property.name == "ctrl_pressed") { p_property.usage ^= PROPERTY_USAGE_STORAGE; } -#endif } else { - // We don't want to store command, only ctrl or meta (on mac). - if (p_property.name == "command_pressed") { + if (p_property.name == "command_or_control_autoremap") { p_property.usage ^= PROPERTY_USAGE_STORAGE; } } @@ -399,14 +411,18 @@ Ref<InputEventKey> InputEventKey::create_reference(Key p_keycode) { if ((p_keycode & KeyModifierMask::ALT) != Key::NONE) { ie->set_alt_pressed(true); } - if ((p_keycode & KeyModifierMask::CTRL) != Key::NONE) { - ie->set_ctrl_pressed(true); - } - if ((p_keycode & KeyModifierMask::CMD) != Key::NONE) { - ie->set_command_pressed(true); - } - if ((p_keycode & KeyModifierMask::META) != Key::NONE) { - ie->set_meta_pressed(true); + if ((p_keycode & KeyModifierMask::CMD_OR_CTRL) != Key::NONE) { + ie->set_command_or_control_autoremap(true); + if ((p_keycode & KeyModifierMask::CTRL) != Key::NONE || (p_keycode & KeyModifierMask::META) != Key::NONE) { + WARN_PRINT("Invalid Key Modifiers: Command or Control autoremapping is enabled, Meta and Control values are ignored!"); + } + } else { + if ((p_keycode & KeyModifierMask::CTRL) != Key::NONE) { + ie->set_ctrl_pressed(true); + } + if ((p_keycode & KeyModifierMask::META) != Key::NONE) { + ie->set_meta_pressed(true); + } } return ie; diff --git a/core/input/input_event.h b/core/input/input_event.h index 6cfc031c8a..bc3ec3e7ac 100644 --- a/core/input/input_event.h +++ b/core/input/input_event.h @@ -107,32 +107,22 @@ public: class InputEventWithModifiers : public InputEventFromWindow { GDCLASS(InputEventWithModifiers, InputEventFromWindow); - bool store_command = true; + bool command_or_control_autoremap = false; bool shift_pressed = false; bool alt_pressed = false; -#ifdef APPLE_STYLE_KEYS - union { - bool command_pressed; - bool meta_pressed = false; //< windows/mac key - }; - + bool meta_pressed = false; // "Command" on macOS, "Meta/Win" key on other platforms. bool ctrl_pressed = false; -#else - union { - bool command_pressed; //< windows/mac key - bool ctrl_pressed = false; - }; - bool meta_pressed = false; //< windows/mac key -#endif protected: static void _bind_methods(); void _validate_property(PropertyInfo &p_property) const; public: - void set_store_command(bool p_enabled); - bool is_storing_command() const; + void set_command_or_control_autoremap(bool p_enabled); + bool is_command_or_control_autoremap() const; + + bool is_command_or_control_pressed() const; void set_shift_pressed(bool p_pressed); bool is_shift_pressed() const; @@ -146,9 +136,6 @@ public: void set_meta_pressed(bool p_pressed); bool is_meta_pressed() const; - void set_command_pressed(bool p_pressed); - bool is_command_pressed() const; - void set_modifiers_from_event(const InputEventWithModifiers *event); Key get_modifiers_mask() const; diff --git a/core/input/input_map.cpp b/core/input/input_map.cpp index 702e257fb4..ce76d11b6e 100644 --- a/core/input/input_map.cpp +++ b/core/input/input_map.cpp @@ -429,27 +429,27 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { // ///// UI basic Shortcuts ///// inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::X | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::X | KeyModifierMask::CMD_OR_CTRL)); inputs.push_back(InputEventKey::create_reference(Key::KEY_DELETE | KeyModifierMask::SHIFT)); default_builtin_cache.insert("ui_cut", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::C | KeyModifierMask::CMD)); - inputs.push_back(InputEventKey::create_reference(Key::INSERT | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::C | KeyModifierMask::CMD_OR_CTRL)); + inputs.push_back(InputEventKey::create_reference(Key::INSERT | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_copy", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::V | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::V | KeyModifierMask::CMD_OR_CTRL)); inputs.push_back(InputEventKey::create_reference(Key::INSERT | KeyModifierMask::SHIFT)); default_builtin_cache.insert("ui_paste", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::Z | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::Z | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_undo", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::Z | KeyModifierMask::CMD | KeyModifierMask::SHIFT)); - inputs.push_back(InputEventKey::create_reference(Key::Y | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::Z | KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT)); + inputs.push_back(InputEventKey::create_reference(Key::Y | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_redo", inputs); // ///// UI Text Input Shortcuts ///// @@ -474,13 +474,13 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::ENTER | KeyModifierMask::CMD)); - inputs.push_back(InputEventKey::create_reference(Key::KP_ENTER | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::ENTER | KeyModifierMask::CMD_OR_CTRL)); + inputs.push_back(InputEventKey::create_reference(Key::KP_ENTER | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_newline_blank", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::ENTER | KeyModifierMask::SHIFT | KeyModifierMask::CMD)); - inputs.push_back(InputEventKey::create_reference(Key::KP_ENTER | KeyModifierMask::SHIFT | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::ENTER | KeyModifierMask::SHIFT | KeyModifierMask::CMD_OR_CTRL)); + inputs.push_back(InputEventKey::create_reference(Key::KP_ENTER | KeyModifierMask::SHIFT | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_newline_above", inputs); // Indentation @@ -499,7 +499,7 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { default_builtin_cache.insert("ui_text_backspace", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::BACKSPACE | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::BACKSPACE | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_backspace_word", inputs); inputs = List<Ref<InputEvent>>(); @@ -510,7 +510,7 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { default_builtin_cache.insert("ui_text_backspace_all_to_left", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::BACKSPACE | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::BACKSPACE | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_backspace_all_to_left.macos", inputs); inputs = List<Ref<InputEvent>>(); @@ -518,7 +518,7 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { default_builtin_cache.insert("ui_text_delete", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::KEY_DELETE | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::KEY_DELETE | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_delete_word", inputs); inputs = List<Ref<InputEvent>>(); @@ -529,7 +529,7 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { default_builtin_cache.insert("ui_text_delete_all_to_right", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::KEY_DELETE | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::KEY_DELETE | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_delete_all_to_right.macos", inputs); // Text Caret Movement Left/Right @@ -539,7 +539,7 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { default_builtin_cache.insert("ui_text_caret_left", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::LEFT | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::LEFT | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_caret_word_left", inputs); inputs = List<Ref<InputEvent>>(); @@ -551,7 +551,7 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { default_builtin_cache.insert("ui_text_caret_right", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::RIGHT | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::RIGHT | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_caret_word_right", inputs); inputs = List<Ref<InputEvent>>(); @@ -576,7 +576,7 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { inputs = List<Ref<InputEvent>>(); inputs.push_back(InputEventKey::create_reference(Key::A | KeyModifierMask::CTRL)); - inputs.push_back(InputEventKey::create_reference(Key::LEFT | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::LEFT | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_caret_line_start.macos", inputs); inputs = List<Ref<InputEvent>>(); @@ -585,7 +585,7 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { inputs = List<Ref<InputEvent>>(); inputs.push_back(InputEventKey::create_reference(Key::E | KeyModifierMask::CTRL)); - inputs.push_back(InputEventKey::create_reference(Key::RIGHT | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::RIGHT | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_caret_line_end.macos", inputs); // Text Caret Movement Page Up/Down @@ -601,47 +601,47 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { // Text Caret Movement Document Start/End inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::HOME | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::HOME | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_caret_document_start", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::UP | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::UP | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_caret_document_start.macos", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::END | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::END | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_caret_document_end", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::DOWN | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::DOWN | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_caret_document_end.macos", inputs); // Text Scrolling inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::UP | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::UP | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_scroll_up", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::UP | KeyModifierMask::CMD | KeyModifierMask::ALT)); + inputs.push_back(InputEventKey::create_reference(Key::UP | KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::ALT)); default_builtin_cache.insert("ui_text_scroll_up.macos", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::DOWN | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::DOWN | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_scroll_down", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::DOWN | KeyModifierMask::CMD | KeyModifierMask::ALT)); + inputs.push_back(InputEventKey::create_reference(Key::DOWN | KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::ALT)); default_builtin_cache.insert("ui_text_scroll_down.macos", inputs); // Text Misc inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::A | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::A | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_select_all", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::D | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::D | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_select_word_under_caret", inputs); inputs = List<Ref<InputEvent>>(); @@ -660,7 +660,7 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { // ///// UI Graph Shortcuts ///// inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::D | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::D | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_graph_duplicate", inputs); inputs = List<Ref<InputEvent>>(); @@ -681,7 +681,7 @@ const HashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() { default_builtin_cache.insert("ui_filedialog_show_hidden", inputs); inputs = List<Ref<InputEvent>>(); - inputs.push_back(InputEventKey::create_reference(Key::QUOTELEFT | KeyModifierMask::CMD)); + inputs.push_back(InputEventKey::create_reference(Key::QUOTELEFT | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_swap_input_direction", inputs); return default_builtin_cache; diff --git a/core/io/dir_access.cpp b/core/io/dir_access.cpp index bed41b8d89..f86dfe8057 100644 --- a/core/io/dir_access.cpp +++ b/core/io/dir_access.cpp @@ -36,6 +36,8 @@ #include "core/os/os.h" #include "core/templates/local_vector.h" +thread_local Error DirAccess::last_dir_open_error = OK; + String DirAccess::_get_root_path() const { switch (_access_type) { case ACCESS_RESOURCES: @@ -249,6 +251,61 @@ Ref<DirAccess> DirAccess::open(const String &p_path, Error *r_error) { return da; } +Ref<DirAccess> DirAccess::_open(const String &p_path) { + Error err = OK; + Ref<DirAccess> da = open(p_path, &err); + last_dir_open_error = err; + if (err) { + return Ref<DirAccess>(); + } + return da; +} + +int DirAccess::_get_drive_count() { + Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + return d->get_drive_count(); +} + +String DirAccess::get_drive_name(int p_idx) { + Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + return d->get_drive(p_idx); +} + +Error DirAccess::make_dir_absolute(const String &p_dir) { + Ref<DirAccess> d = DirAccess::create_for_path(p_dir); + return d->make_dir(p_dir); +} + +Error DirAccess::make_dir_recursive_absolute(const String &p_dir) { + Ref<DirAccess> d = DirAccess::create_for_path(p_dir); + return d->make_dir_recursive(p_dir); +} + +bool DirAccess::dir_exists_absolute(const String &p_dir) { + Ref<DirAccess> d = DirAccess::create_for_path(p_dir); + return d->dir_exists(p_dir); +} + +Error DirAccess::copy_absolute(const String &p_from, const String &p_to, int p_chmod_flags) { + Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + // Support copying from res:// to user:// etc. + String from = ProjectSettings::get_singleton()->globalize_path(p_from); + String to = ProjectSettings::get_singleton()->globalize_path(p_to); + return d->copy(from, to, p_chmod_flags); +} + +Error DirAccess::rename_absolute(const String &p_from, const String &p_to) { + Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + String from = ProjectSettings::get_singleton()->globalize_path(p_from); + String to = ProjectSettings::get_singleton()->globalize_path(p_to); + return d->rename(from, to); +} + +Error DirAccess::remove_absolute(const String &p_path) { + Ref<DirAccess> d = DirAccess::create_for_path(p_path); + return d->remove(p_path); +} + Ref<DirAccess> DirAccess::create(AccessType p_access) { Ref<DirAccess> da = create_func[p_access] ? create_func[p_access]() : nullptr; if (da.is_valid()) { @@ -266,6 +323,10 @@ Ref<DirAccess> DirAccess::create(AccessType p_access) { return da; } +Error DirAccess::get_open_error() { + return last_dir_open_error; +} + String DirAccess::get_full_path(const String &p_path, AccessType p_access) { Ref<DirAccess> d = DirAccess::create(p_access); if (d.is_null()) { @@ -424,3 +485,102 @@ bool DirAccess::exists(String p_dir) { Ref<DirAccess> da = DirAccess::create_for_path(p_dir); return da->change_dir(p_dir) == OK; } + +PackedStringArray DirAccess::get_files() { + return _get_contents(false); +} + +PackedStringArray DirAccess::get_files_at(const String &p_path) { + Ref<DirAccess> da = DirAccess::open(p_path); + return da->get_files(); +} + +PackedStringArray DirAccess::get_directories() { + return _get_contents(true); +} + +PackedStringArray DirAccess::get_directories_at(const String &p_path) { + Ref<DirAccess> da = DirAccess::open(p_path); + return da->get_directories(); +} + +PackedStringArray DirAccess::_get_contents(bool p_directories) { + PackedStringArray ret; + + list_dir_begin(); + String s = _get_next(); + while (!s.is_empty()) { + if (current_is_dir() == p_directories) { + ret.append(s); + } + s = _get_next(); + } + + ret.sort(); + return ret; +} + +String DirAccess::_get_next() { + String next = get_next(); + while (!next.is_empty() && ((!include_navigational && (next == "." || next == "..")) || (!include_hidden && current_is_hidden()))) { + next = get_next(); + } + return next; +} + +void DirAccess::set_include_navigational(bool p_enable) { + include_navigational = p_enable; +} + +bool DirAccess::get_include_navigational() const { + return include_navigational; +} + +void DirAccess::set_include_hidden(bool p_enable) { + include_hidden = p_enable; +} + +bool DirAccess::get_include_hidden() const { + return include_hidden; +} + +void DirAccess::_bind_methods() { + ClassDB::bind_static_method("DirAccess", D_METHOD("open", "path"), &DirAccess::_open); + ClassDB::bind_static_method("DirAccess", D_METHOD("get_open_error"), &DirAccess::get_open_error); + + ClassDB::bind_method(D_METHOD("list_dir_begin"), &DirAccess::list_dir_begin, DEFVAL(false), DEFVAL(false)); + ClassDB::bind_method(D_METHOD("get_next"), &DirAccess::_get_next); + ClassDB::bind_method(D_METHOD("current_is_dir"), &DirAccess::current_is_dir); + ClassDB::bind_method(D_METHOD("list_dir_end"), &DirAccess::list_dir_end); + ClassDB::bind_method(D_METHOD("get_files"), &DirAccess::get_files); + ClassDB::bind_static_method("DirAccess", D_METHOD("get_files_at", "path"), &DirAccess::get_files_at); + ClassDB::bind_method(D_METHOD("get_directories"), &DirAccess::get_directories); + ClassDB::bind_static_method("DirAccess", D_METHOD("get_directories_at", "path"), &DirAccess::get_directories_at); + ClassDB::bind_static_method("DirAccess", D_METHOD("get_drive_count"), &DirAccess::_get_drive_count); + ClassDB::bind_static_method("DirAccess", D_METHOD("get_drive_name", "idx"), &DirAccess::get_drive_name); + ClassDB::bind_method(D_METHOD("get_current_drive"), &DirAccess::get_current_drive); + ClassDB::bind_method(D_METHOD("change_dir", "to_dir"), &DirAccess::change_dir); + ClassDB::bind_method(D_METHOD("get_current_dir", "include_drive"), &DirAccess::get_current_dir, DEFVAL(true)); + ClassDB::bind_method(D_METHOD("make_dir", "path"), &DirAccess::make_dir); + ClassDB::bind_static_method("DirAccess", D_METHOD("make_dir_absolute", "path"), &DirAccess::make_dir_absolute); + ClassDB::bind_method(D_METHOD("make_dir_recursive", "path"), &DirAccess::make_dir_recursive); + ClassDB::bind_static_method("DirAccess", D_METHOD("make_dir_recursive_absolute", "path"), &DirAccess::make_dir_recursive_absolute); + ClassDB::bind_method(D_METHOD("file_exists", "path"), &DirAccess::file_exists); + ClassDB::bind_method(D_METHOD("dir_exists", "path"), &DirAccess::dir_exists); + ClassDB::bind_static_method("DirAccess", D_METHOD("dir_exists_absolute", "path"), &DirAccess::dir_exists_absolute); + ClassDB::bind_method(D_METHOD("get_space_left"), &DirAccess::get_space_left); + ClassDB::bind_method(D_METHOD("copy", "from", "to", "chmod_flags"), &DirAccess::copy, DEFVAL(-1)); + ClassDB::bind_static_method("DirAccess", D_METHOD("copy_absolute", "from", "to", "chmod_flags"), &DirAccess::copy_absolute, DEFVAL(-1)); + ClassDB::bind_method(D_METHOD("rename", "from", "to"), &DirAccess::rename); + ClassDB::bind_static_method("DirAccess", D_METHOD("rename_absolute", "from", "to"), &DirAccess::rename_absolute); + ClassDB::bind_method(D_METHOD("remove", "path"), &DirAccess::remove); + ClassDB::bind_static_method("DirAccess", D_METHOD("remove_absolute", "path"), &DirAccess::remove_absolute); + + ClassDB::bind_method(D_METHOD("set_include_navigational", "enable"), &DirAccess::set_include_navigational); + ClassDB::bind_method(D_METHOD("get_include_navigational"), &DirAccess::get_include_navigational); + ClassDB::bind_method(D_METHOD("set_include_hidden", "enable"), &DirAccess::set_include_hidden); + ClassDB::bind_method(D_METHOD("get_include_hidden"), &DirAccess::get_include_hidden); + + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "include_navigational"), "set_include_navigational", "get_include_navigational"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "include_hidden"), "set_include_hidden", "get_include_hidden"); +} diff --git a/core/io/dir_access.h b/core/io/dir_access.h index 2469c2a080..ee675f1c89 100644 --- a/core/io/dir_access.h +++ b/core/io/dir_access.h @@ -37,6 +37,8 @@ //@ TODO, excellent candidate for THREAD_SAFE MACRO, should go through all these and add THREAD_SAFE where it applies class DirAccess : public RefCounted { + GDCLASS(DirAccess, RefCounted); + public: enum AccessType { ACCESS_RESOURCES, @@ -53,7 +55,13 @@ private: Error _copy_dir(Ref<DirAccess> &p_target_da, String p_to, int p_chmod_flags, bool p_copy_links); + thread_local static Error last_dir_open_error; + bool include_navigational = false; + bool include_hidden = false; + protected: + static void _bind_methods(); + String _get_root_path() const; virtual String _get_root_string() const; @@ -118,6 +126,7 @@ public: static Ref<DirAccess> create_for_path(const String &p_path); static Ref<DirAccess> create(AccessType p_access); + static Error get_open_error(); template <class T> static void make_default(AccessType p_access) { @@ -125,6 +134,30 @@ public: } static Ref<DirAccess> open(const String &p_path, Error *r_error = nullptr); + static Ref<DirAccess> _open(const String &p_path); + + static int _get_drive_count(); + static String get_drive_name(int p_idx); + + static Error make_dir_absolute(const String &p_dir); + static Error make_dir_recursive_absolute(const String &p_dir); + static bool dir_exists_absolute(const String &p_dir); + + static Error copy_absolute(const String &p_from, const String &p_to, int p_chmod_flags = -1); + static Error rename_absolute(const String &p_from, const String &p_to); + static Error remove_absolute(const String &p_path); + + PackedStringArray get_files(); + static PackedStringArray get_files_at(const String &p_path); + PackedStringArray get_directories(); + static PackedStringArray get_directories_at(const String &p_path); + PackedStringArray _get_contents(bool p_directories); + String _get_next(); + + void set_include_navigational(bool p_enable); + bool get_include_navigational() const; + void set_include_hidden(bool p_enable); + bool get_include_hidden() const; DirAccess() {} virtual ~DirAccess() {} diff --git a/core/io/file_access.cpp b/core/io/file_access.cpp index 72c00bd678..499f083f51 100644 --- a/core/io/file_access.cpp +++ b/core/io/file_access.cpp @@ -32,6 +32,8 @@ #include "core/config/project_settings.h" #include "core/crypto/crypto_core.h" +#include "core/io/file_access_compressed.h" +#include "core/io/file_access_encrypted.h" #include "core/io/file_access_pack.h" #include "core/io/marshalls.h" #include "core/os/os.h" @@ -41,6 +43,7 @@ FileAccess::CreateFunc FileAccess::create_func[ACCESS_MAX] = { nullptr, nullptr FileAccess::FileCloseFailNotify FileAccess::close_fail_notify = nullptr; bool FileAccess::backup_save = false; +thread_local Error FileAccess::last_file_open_error = OK; Ref<FileAccess> FileAccess::create(AccessType p_access) { ERR_FAIL_INDEX_V(p_access, ACCESS_MAX, nullptr); @@ -81,7 +84,7 @@ Ref<FileAccess> FileAccess::create_for_path(const String &p_path) { } Error FileAccess::reopen(const String &p_path, int p_mode_flags) { - return _open(p_path, p_mode_flags); + return open_internal(p_path, p_mode_flags); } Ref<FileAccess> FileAccess::open(const String &p_path, int p_mode_flags, Error *r_error) { @@ -99,7 +102,7 @@ Ref<FileAccess> FileAccess::open(const String &p_path, int p_mode_flags, Error * } ret = create_for_path(p_path); - Error err = ret->_open(p_path, p_mode_flags); + Error err = ret->open_internal(p_path, p_mode_flags); if (r_error) { *r_error = err; @@ -111,6 +114,66 @@ Ref<FileAccess> FileAccess::open(const String &p_path, int p_mode_flags, Error * return ret; } +Ref<FileAccess> FileAccess::_open(const String &p_path, ModeFlags p_mode_flags) { + Error err = OK; + Ref<FileAccess> fa = open(p_path, p_mode_flags, &err); + last_file_open_error = err; + if (err) { + return Ref<FileAccess>(); + } + return fa; +} + +Ref<FileAccess> FileAccess::open_encrypted(const String &p_path, ModeFlags p_mode_flags, const Vector<uint8_t> &p_key) { + Ref<FileAccess> fa = _open(p_path, p_mode_flags); + if (fa.is_null()) { + return fa; + } + + Ref<FileAccessEncrypted> fae; + fae.instantiate(); + Error err = fae->open_and_parse(fa, p_key, (p_mode_flags == WRITE) ? FileAccessEncrypted::MODE_WRITE_AES256 : FileAccessEncrypted::MODE_READ); + if (err) { + last_file_open_error = err; + return Ref<FileAccess>(); + } + return fae; +} + +Ref<FileAccess> FileAccess::open_encrypted_pass(const String &p_path, ModeFlags p_mode_flags, const String &p_pass) { + Ref<FileAccess> fa = _open(p_path, p_mode_flags); + if (fa.is_null()) { + return fa; + } + + Ref<FileAccessEncrypted> fae; + fae.instantiate(); + Error err = fae->open_and_parse_password(fa, p_pass, (p_mode_flags == WRITE) ? FileAccessEncrypted::MODE_WRITE_AES256 : FileAccessEncrypted::MODE_READ); + if (err) { + last_file_open_error = err; + return Ref<FileAccess>(); + } + return fae; +} + +Ref<FileAccess> FileAccess::open_compressed(const String &p_path, ModeFlags p_mode_flags, CompressionMode p_compress_mode) { + Ref<FileAccessCompressed> fac; + fac.instantiate(); + fac->configure("GCPF", (Compression::Mode)p_compress_mode); + Error err = fac->open_internal(p_path, p_mode_flags); + + if (err) { + last_file_open_error = err; + return Ref<FileAccess>(); + } + + return fac; +} + +Error FileAccess::get_open_error() { + return last_file_open_error; +} + FileAccess::CreateFunc FileAccess::get_create_func(AccessType p_access) { return create_func[p_access]; } @@ -227,6 +290,20 @@ real_t FileAccess::get_real() const { } } +Variant FileAccess::get_var(bool p_allow_objects) const { + uint32_t len = get_32(); + Vector<uint8_t> buff = _get_buffer(len); + ERR_FAIL_COND_V((uint32_t)buff.size() != len, Variant()); + + const uint8_t *r = buff.ptr(); + + Variant v; + Error err = decode_variant(v, &r[0], len, nullptr, p_allow_objects); + ERR_FAIL_COND_V_MSG(err != OK, Variant(), "Error when trying to encode Variant."); + + return v; +} + double FileAccess::get_double() const { MarshallDouble m; m.l = get_64(); @@ -370,6 +447,17 @@ Vector<String> FileAccess::get_csv_line(const String &p_delim) const { return strings; } +String FileAccess::get_as_text(bool p_skip_cr) const { + uint64_t original_pos = get_position(); + const_cast<FileAccess *>(this)->seek(0); + + String text = get_as_utf8_string(p_skip_cr); + + const_cast<FileAccess *>(this)->seek(original_pos); + + return text; +} + uint64_t FileAccess::get_buffer(uint8_t *p_dst, uint64_t p_length) const { ERR_FAIL_COND_V(!p_dst && p_length > 0, -1); @@ -381,6 +469,27 @@ uint64_t FileAccess::get_buffer(uint8_t *p_dst, uint64_t p_length) const { return i; } +Vector<uint8_t> FileAccess::_get_buffer(int64_t p_length) const { + Vector<uint8_t> data; + + ERR_FAIL_COND_V_MSG(p_length < 0, data, "Length of buffer cannot be smaller than 0."); + if (p_length == 0) { + return data; + } + + Error err = data.resize(p_length); + ERR_FAIL_COND_V_MSG(err != OK, data, "Can't resize data to " + itos(p_length) + " elements."); + + uint8_t *w = data.ptrw(); + int64_t len = get_buffer(&w[0], p_length); + + if (len < p_length) { + data.resize(len); + } + + return data; +} + String FileAccess::get_as_utf8_string(bool p_skip_cr) const { Vector<uint8_t> sourcef; uint64_t len = get_length(); @@ -554,6 +663,33 @@ void FileAccess::store_buffer(const uint8_t *p_src, uint64_t p_length) { } } +void FileAccess::_store_buffer(const Vector<uint8_t> &p_buffer) { + uint64_t len = p_buffer.size(); + if (len == 0) { + return; + } + + const uint8_t *r = p_buffer.ptr(); + + store_buffer(&r[0], len); +} + +void FileAccess::store_var(const Variant &p_var, bool p_full_objects) { + int len; + Error err = encode_variant(p_var, nullptr, len, p_full_objects); + ERR_FAIL_COND_MSG(err != OK, "Error when trying to encode Variant."); + + Vector<uint8_t> buff; + buff.resize(len); + + uint8_t *w = buff.ptrw(); + err = encode_variant(p_var, &w[0], len, p_full_objects); + ERR_FAIL_COND_MSG(err != OK, "Error when trying to encode Variant."); + + store_32(len); + _store_buffer(buff); +} + Vector<uint8_t> FileAccess::get_file_as_array(const String &p_path, Error *r_error) { Ref<FileAccess> f = FileAccess::open(p_path, READ, r_error); if (f.is_null()) { @@ -666,3 +802,69 @@ String FileAccess::get_sha256(const String &p_file) { return String::hex_encode_buffer(hash, 32); } + +void FileAccess::_bind_methods() { + ClassDB::bind_static_method("FileAccess", D_METHOD("open", "path", "flags"), &FileAccess::_open); + ClassDB::bind_static_method("FileAccess", D_METHOD("open_encrypted", "path", "mode_flags", "key"), &FileAccess::open_encrypted); + ClassDB::bind_static_method("FileAccess", D_METHOD("open_encrypted_with_pass", "path", "mode_flags", "pass"), &FileAccess::open_encrypted_pass); + ClassDB::bind_static_method("FileAccess", D_METHOD("open_compressed", "path", "mode_flags", "compression_mode"), &FileAccess::open_compressed, DEFVAL(0)); + ClassDB::bind_static_method("FileAccess", D_METHOD("get_open_error"), &FileAccess::get_open_error); + + ClassDB::bind_method(D_METHOD("flush"), &FileAccess::flush); + ClassDB::bind_method(D_METHOD("get_path"), &FileAccess::get_path); + ClassDB::bind_method(D_METHOD("get_path_absolute"), &FileAccess::get_path_absolute); + ClassDB::bind_method(D_METHOD("is_open"), &FileAccess::is_open); + ClassDB::bind_method(D_METHOD("seek", "position"), &FileAccess::seek); + ClassDB::bind_method(D_METHOD("seek_end", "position"), &FileAccess::seek_end, DEFVAL(0)); + ClassDB::bind_method(D_METHOD("get_position"), &FileAccess::get_position); + ClassDB::bind_method(D_METHOD("get_length"), &FileAccess::get_length); + ClassDB::bind_method(D_METHOD("eof_reached"), &FileAccess::eof_reached); + ClassDB::bind_method(D_METHOD("get_8"), &FileAccess::get_8); + ClassDB::bind_method(D_METHOD("get_16"), &FileAccess::get_16); + ClassDB::bind_method(D_METHOD("get_32"), &FileAccess::get_32); + ClassDB::bind_method(D_METHOD("get_64"), &FileAccess::get_64); + ClassDB::bind_method(D_METHOD("get_float"), &FileAccess::get_float); + ClassDB::bind_method(D_METHOD("get_double"), &FileAccess::get_double); + ClassDB::bind_method(D_METHOD("get_real"), &FileAccess::get_real); + ClassDB::bind_method(D_METHOD("get_buffer", "length"), &FileAccess::_get_buffer); + ClassDB::bind_method(D_METHOD("get_line"), &FileAccess::get_line); + ClassDB::bind_method(D_METHOD("get_csv_line", "delim"), &FileAccess::get_csv_line, DEFVAL(",")); + ClassDB::bind_method(D_METHOD("get_as_text", "skip_cr"), &FileAccess::get_as_text, DEFVAL(false)); + ClassDB::bind_static_method("FileAccess", D_METHOD("get_md5", "path"), &FileAccess::get_md5); + ClassDB::bind_static_method("FileAccess", D_METHOD("get_sha256", "path"), &FileAccess::get_sha256); + ClassDB::bind_method(D_METHOD("is_big_endian"), &FileAccess::is_big_endian); + ClassDB::bind_method(D_METHOD("set_big_endian", "big_endian"), &FileAccess::set_big_endian); + ClassDB::bind_method(D_METHOD("get_error"), &FileAccess::get_error); + ClassDB::bind_method(D_METHOD("get_var", "allow_objects"), &FileAccess::get_var, DEFVAL(false)); + + ClassDB::bind_method(D_METHOD("store_8", "value"), &FileAccess::store_8); + ClassDB::bind_method(D_METHOD("store_16", "value"), &FileAccess::store_16); + ClassDB::bind_method(D_METHOD("store_32", "value"), &FileAccess::store_32); + ClassDB::bind_method(D_METHOD("store_64", "value"), &FileAccess::store_64); + ClassDB::bind_method(D_METHOD("store_float", "value"), &FileAccess::store_float); + ClassDB::bind_method(D_METHOD("store_double", "value"), &FileAccess::store_double); + ClassDB::bind_method(D_METHOD("store_real", "value"), &FileAccess::store_real); + ClassDB::bind_method(D_METHOD("store_buffer", "buffer"), &FileAccess::_store_buffer); + ClassDB::bind_method(D_METHOD("store_line", "line"), &FileAccess::store_line); + ClassDB::bind_method(D_METHOD("store_csv_line", "values", "delim"), &FileAccess::store_csv_line, DEFVAL(",")); + ClassDB::bind_method(D_METHOD("store_string", "string"), &FileAccess::store_string); + ClassDB::bind_method(D_METHOD("store_var", "value", "full_objects"), &FileAccess::store_var, DEFVAL(false)); + + ClassDB::bind_method(D_METHOD("store_pascal_string", "string"), &FileAccess::store_pascal_string); + ClassDB::bind_method(D_METHOD("get_pascal_string"), &FileAccess::get_pascal_string); + + ClassDB::bind_static_method("FileAccess", D_METHOD("file_exists", "path"), &FileAccess::exists); + ClassDB::bind_static_method("FileAccess", D_METHOD("get_modified_time", "file"), &FileAccess::get_modified_time); + + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "big_endian"), "set_big_endian", "is_big_endian"); + + BIND_ENUM_CONSTANT(READ); + BIND_ENUM_CONSTANT(WRITE); + BIND_ENUM_CONSTANT(READ_WRITE); + BIND_ENUM_CONSTANT(WRITE_READ); + + BIND_ENUM_CONSTANT(COMPRESSION_FASTLZ); + BIND_ENUM_CONSTANT(COMPRESSION_DEFLATE); + BIND_ENUM_CONSTANT(COMPRESSION_ZSTD); + BIND_ENUM_CONSTANT(COMPRESSION_GZIP); +} diff --git a/core/io/file_access.h b/core/io/file_access.h index fc0eb95d44..f8c42d3c0d 100644 --- a/core/io/file_access.h +++ b/core/io/file_access.h @@ -31,6 +31,7 @@ #ifndef FILE_ACCESS_H #define FILE_ACCESS_H +#include "core/io/compression.h" #include "core/math/math_defs.h" #include "core/object/ref_counted.h" #include "core/os/memory.h" @@ -42,6 +43,8 @@ */ class FileAccess : public RefCounted { + GDCLASS(FileAccess, RefCounted); + public: enum AccessType { ACCESS_RESOURCES, @@ -60,15 +63,18 @@ public: virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) = 0; protected: + static void _bind_methods(); + AccessType get_access_type() const; String fix_path(const String &p_path) const; - virtual Error _open(const String &p_path, int p_mode_flags) = 0; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) = 0; ///< open a file virtual uint64_t _get_modified_time(const String &p_file) = 0; static FileCloseFailNotify close_fail_notify; private: static bool backup_save; + thread_local static Error last_file_open_error; AccessType _access_type = ACCESS_FILESYSTEM; static CreateFunc create_func[ACCESS_MAX]; /** default file access creation function for a platform */ @@ -89,6 +95,13 @@ public: WRITE_READ = 7, }; + enum CompressionMode { + COMPRESSION_FASTLZ = Compression::MODE_FASTLZ, + COMPRESSION_DEFLATE = Compression::MODE_DEFLATE, + COMPRESSION_ZSTD = Compression::MODE_ZSTD, + COMPRESSION_GZIP = Compression::MODE_GZIP + }; + virtual bool is_open() const = 0; ///< true when file is open virtual String get_path() const { return ""; } /// returns the path for the current open file @@ -110,10 +123,14 @@ public: virtual double get_double() const; virtual real_t get_real() const; + Variant get_var(bool p_allow_objects = false) const; + virtual uint64_t get_buffer(uint8_t *p_dst, uint64_t p_length) const; ///< get an array of bytes + Vector<uint8_t> _get_buffer(int64_t p_length) const; virtual String get_line() const; virtual String get_token() const; virtual Vector<String> get_csv_line(const String &p_delim = ",") const; + String get_as_text(bool p_skip_cr = false) const; virtual String get_as_utf8_string(bool p_skip_cr = false) const; /** @@ -144,6 +161,9 @@ public: virtual String get_pascal_string(); virtual void store_buffer(const uint8_t *p_src, uint64_t p_length); ///< store an array of bytes + void _store_buffer(const Vector<uint8_t> &p_buffer); + + void store_var(const Variant &p_var, bool p_full_objects = false); virtual bool file_exists(const String &p_name) = 0; ///< return true if a file exists @@ -152,6 +172,13 @@ public: static Ref<FileAccess> create(AccessType p_access); /// Create a file access (for the current platform) this is the only portable way of accessing files. static Ref<FileAccess> create_for_path(const String &p_path); static Ref<FileAccess> open(const String &p_path, int p_mode_flags, Error *r_error = nullptr); /// Create a file access (for the current platform) this is the only portable way of accessing files. + + static Ref<FileAccess> _open(const String &p_path, ModeFlags p_mode_flags); + static Ref<FileAccess> open_encrypted(const String &p_path, ModeFlags p_mode_flags, const Vector<uint8_t> &p_key); + static Ref<FileAccess> open_encrypted_pass(const String &p_path, ModeFlags p_mode_flags, const String &p_pass); + static Ref<FileAccess> open_compressed(const String &p_path, ModeFlags p_mode_flags, CompressionMode p_compress_mode = COMPRESSION_FASTLZ); + static Error get_open_error(); + static CreateFunc get_create_func(AccessType p_access); static bool exists(const String &p_name); ///< return true if a file exists static uint64_t get_modified_time(const String &p_file); @@ -177,4 +204,7 @@ public: virtual ~FileAccess() {} }; +VARIANT_ENUM_CAST(FileAccess::CompressionMode); +VARIANT_ENUM_CAST(FileAccess::ModeFlags); + #endif // FILE_ACCESS_H diff --git a/core/io/file_access_compressed.cpp b/core/io/file_access_compressed.cpp index 1d0a718166..d2c8a88269 100644 --- a/core/io/file_access_compressed.cpp +++ b/core/io/file_access_compressed.cpp @@ -95,7 +95,7 @@ Error FileAccessCompressed::open_after_magic(Ref<FileAccess> p_base) { return ret == -1 ? ERR_FILE_CORRUPT : OK; } -Error FileAccessCompressed::_open(const String &p_path, int p_mode_flags) { +Error FileAccessCompressed::open_internal(const String &p_path, int p_mode_flags) { ERR_FAIL_COND_V(p_mode_flags == READ_WRITE, ERR_UNAVAILABLE); _close(); diff --git a/core/io/file_access_compressed.h b/core/io/file_access_compressed.h index e41491a92c..ee114c2c65 100644 --- a/core/io/file_access_compressed.h +++ b/core/io/file_access_compressed.h @@ -70,7 +70,7 @@ public: Error open_after_magic(Ref<FileAccess> p_base); - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual void seek(uint64_t p_position) override; ///< seek to a given position diff --git a/core/io/file_access_encrypted.cpp b/core/io/file_access_encrypted.cpp index d1b014a0be..be502dacd9 100644 --- a/core/io/file_access_encrypted.cpp +++ b/core/io/file_access_encrypted.cpp @@ -111,7 +111,7 @@ Error FileAccessEncrypted::open_and_parse_password(Ref<FileAccess> p_base, const return open_and_parse(p_base, key, p_mode); } -Error FileAccessEncrypted::_open(const String &p_path, int p_mode_flags) { +Error FileAccessEncrypted::open_internal(const String &p_path, int p_mode_flags) { return OK; } diff --git a/core/io/file_access_encrypted.h b/core/io/file_access_encrypted.h index 6200f87a7a..6b4588841d 100644 --- a/core/io/file_access_encrypted.h +++ b/core/io/file_access_encrypted.h @@ -60,7 +60,7 @@ public: Error open_and_parse(Ref<FileAccess> p_base, const Vector<uint8_t> &p_key, Mode p_mode, bool p_with_magic = true); Error open_and_parse_password(Ref<FileAccess> p_base, const String &p_key, Mode p_mode); - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual String get_path() const override; /// returns the path for the current open file diff --git a/core/io/file_access_memory.cpp b/core/io/file_access_memory.cpp index 499d001234..21ded4247f 100644 --- a/core/io/file_access_memory.cpp +++ b/core/io/file_access_memory.cpp @@ -78,7 +78,7 @@ Error FileAccessMemory::open_custom(const uint8_t *p_data, uint64_t p_len) { return OK; } -Error FileAccessMemory::_open(const String &p_path, int p_mode_flags) { +Error FileAccessMemory::open_internal(const String &p_path, int p_mode_flags) { ERR_FAIL_COND_V(!files, ERR_FILE_NOT_FOUND); String name = fix_path(p_path); diff --git a/core/io/file_access_memory.h b/core/io/file_access_memory.h index f2bd2aa832..b1f408eb98 100644 --- a/core/io/file_access_memory.h +++ b/core/io/file_access_memory.h @@ -45,7 +45,7 @@ public: static void cleanup(); virtual Error open_custom(const uint8_t *p_data, uint64_t p_len); ///< open a file - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual void seek(uint64_t p_position) override; ///< seek to a given position diff --git a/core/io/file_access_network.cpp b/core/io/file_access_network.cpp index 1365b4b593..13730518bf 100644 --- a/core/io/file_access_network.cpp +++ b/core/io/file_access_network.cpp @@ -252,7 +252,7 @@ void FileAccessNetwork::_respond(uint64_t p_len, Error p_status) { pages.resize(pc); } -Error FileAccessNetwork::_open(const String &p_path, int p_mode_flags) { +Error FileAccessNetwork::open_internal(const String &p_path, int p_mode_flags) { ERR_FAIL_COND_V(p_mode_flags != READ, ERR_UNAVAILABLE); _close(); diff --git a/core/io/file_access_network.h b/core/io/file_access_network.h index ceadc715a1..ee92d3b9db 100644 --- a/core/io/file_access_network.h +++ b/core/io/file_access_network.h @@ -132,7 +132,7 @@ public: RESPONSE_GET_MODTIME, }; - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual void seek(uint64_t p_position) override; ///< seek to a given position diff --git a/core/io/file_access_pack.cpp b/core/io/file_access_pack.cpp index adae0db0f4..dfcce30ab5 100644 --- a/core/io/file_access_pack.cpp +++ b/core/io/file_access_pack.cpp @@ -259,7 +259,7 @@ Ref<FileAccess> PackedSourcePCK::get_file(const String &p_path, PackedData::Pack ////////////////////////////////////////////////////////////////// -Error FileAccessPack::_open(const String &p_path, int p_mode_flags) { +Error FileAccessPack::open_internal(const String &p_path, int p_mode_flags) { ERR_FAIL_V(ERR_UNAVAILABLE); return ERR_UNAVAILABLE; } diff --git a/core/io/file_access_pack.h b/core/io/file_access_pack.h index 023758ac0f..4b9b49a161 100644 --- a/core/io/file_access_pack.h +++ b/core/io/file_access_pack.h @@ -148,7 +148,7 @@ class FileAccessPack : public FileAccess { uint64_t off; Ref<FileAccess> f; - virtual Error _open(const String &p_path, int p_mode_flags) override; + virtual Error open_internal(const String &p_path, int p_mode_flags) override; virtual uint64_t _get_modified_time(const String &p_file) override { return 0; } virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; } virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; } diff --git a/core/io/file_access_zip.cpp b/core/io/file_access_zip.cpp index 17f2335a8e..2af6f370cf 100644 --- a/core/io/file_access_zip.cpp +++ b/core/io/file_access_zip.cpp @@ -234,7 +234,7 @@ ZipArchive::~ZipArchive() { packages.clear(); } -Error FileAccessZip::_open(const String &p_path, int p_mode_flags) { +Error FileAccessZip::open_internal(const String &p_path, int p_mode_flags) { _close(); ERR_FAIL_COND_V(p_mode_flags & FileAccess::WRITE, FAILED); diff --git a/core/io/file_access_zip.h b/core/io/file_access_zip.h index 74a48192f3..6d61b9a291 100644 --- a/core/io/file_access_zip.h +++ b/core/io/file_access_zip.h @@ -85,7 +85,7 @@ class FileAccessZip : public FileAccess { void _close(); public: - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual void seek(uint64_t p_position) override; ///< seek to a given position diff --git a/core/io/http_client.cpp b/core/io/http_client.cpp index 52b1120b2a..93a310e83b 100644 --- a/core/io/http_client.cpp +++ b/core/io/http_client.cpp @@ -138,7 +138,7 @@ PackedStringArray HTTPClient::_get_response_headers() { } void HTTPClient::_bind_methods() { - ClassDB::bind_method(D_METHOD("connect_to_host", "host", "port", "use_ssl", "verify_host"), &HTTPClient::connect_to_host, DEFVAL(-1), DEFVAL(false), DEFVAL(true)); + ClassDB::bind_method(D_METHOD("connect_to_host", "host", "port", "use_tls", "verify_host"), &HTTPClient::connect_to_host, DEFVAL(-1), DEFVAL(false), DEFVAL(true)); ClassDB::bind_method(D_METHOD("set_connection", "connection"), &HTTPClient::set_connection); ClassDB::bind_method(D_METHOD("get_connection"), &HTTPClient::get_connection); ClassDB::bind_method(D_METHOD("request_raw", "method", "url", "headers", "body"), &HTTPClient::_request_raw); @@ -190,7 +190,7 @@ void HTTPClient::_bind_methods() { BIND_ENUM_CONSTANT(STATUS_REQUESTING); // Request in progress BIND_ENUM_CONSTANT(STATUS_BODY); // Request resulted in body which must be read BIND_ENUM_CONSTANT(STATUS_CONNECTION_ERROR); - BIND_ENUM_CONSTANT(STATUS_SSL_HANDSHAKE_ERROR); + BIND_ENUM_CONSTANT(STATUS_TLS_HANDSHAKE_ERROR); BIND_ENUM_CONSTANT(RESPONSE_CONTINUE); BIND_ENUM_CONSTANT(RESPONSE_SWITCHING_PROTOCOLS); diff --git a/core/io/http_client.h b/core/io/http_client.h index de6045f647..0524b010f4 100644 --- a/core/io/http_client.h +++ b/core/io/http_client.h @@ -138,7 +138,7 @@ public: STATUS_REQUESTING, // Request in progress STATUS_BODY, // Request resulted in body, which must be read STATUS_CONNECTION_ERROR, - STATUS_SSL_HANDSHAKE_ERROR, + STATUS_TLS_HANDSHAKE_ERROR, }; @@ -168,7 +168,7 @@ public: Error verify_headers(const Vector<String> &p_headers); virtual Error request(Method p_method, const String &p_url, const Vector<String> &p_headers, const uint8_t *p_body, int p_body_size) = 0; - virtual Error connect_to_host(const String &p_host, int p_port = -1, bool p_ssl = false, bool p_verify_host = true) = 0; + virtual Error connect_to_host(const String &p_host, int p_port = -1, bool p_tls = false, bool p_verify_host = true) = 0; virtual void set_connection(const Ref<StreamPeer> &p_connection) = 0; virtual Ref<StreamPeer> get_connection() const = 0; diff --git a/core/io/http_client_tcp.cpp b/core/io/http_client_tcp.cpp index 7afab9ea09..5c1d00a330 100644 --- a/core/io/http_client_tcp.cpp +++ b/core/io/http_client_tcp.cpp @@ -39,7 +39,7 @@ HTTPClient *HTTPClientTCP::_create_func() { return memnew(HTTPClientTCP); } -Error HTTPClientTCP::connect_to_host(const String &p_host, int p_port, bool p_ssl, bool p_verify_host) { +Error HTTPClientTCP::connect_to_host(const String &p_host, int p_port, bool p_tls, bool p_verify_host) { close(); conn_port = p_port; @@ -47,21 +47,21 @@ Error HTTPClientTCP::connect_to_host(const String &p_host, int p_port, bool p_ss ip_candidates.clear(); - ssl = p_ssl; - ssl_verify_host = p_verify_host; + tls = p_tls; + tls_verify_host = p_verify_host; String host_lower = conn_host.to_lower(); if (host_lower.begins_with("http://")) { conn_host = conn_host.substr(7, conn_host.length() - 7); } else if (host_lower.begins_with("https://")) { - ssl = true; + tls = true; conn_host = conn_host.substr(8, conn_host.length() - 8); } ERR_FAIL_COND_V(conn_host.length() < HOST_MIN_LEN, ERR_INVALID_PARAMETER); if (conn_port < 0) { - if (ssl) { + if (tls) { conn_port = PORT_HTTPS; } else { conn_port = PORT_HTTP; @@ -70,11 +70,11 @@ Error HTTPClientTCP::connect_to_host(const String &p_host, int p_port, bool p_ss connection = tcp_connection; - if (ssl && https_proxy_port != -1) { + if (tls && https_proxy_port != -1) { proxy_client.instantiate(); // Needs proxy negotiation. server_host = https_proxy_host; server_port = https_proxy_port; - } else if (!ssl && http_proxy_port != -1) { + } else if (!tls && http_proxy_port != -1) { server_host = http_proxy_host; server_port = http_proxy_port; } else { @@ -107,7 +107,7 @@ Error HTTPClientTCP::connect_to_host(const String &p_host, int p_port, bool p_ss void HTTPClientTCP::set_connection(const Ref<StreamPeer> &p_connection) { ERR_FAIL_COND_MSG(p_connection.is_null(), "Connection is not a reference to a valid StreamPeer object."); - if (ssl) { + if (tls) { ERR_FAIL_NULL_MSG(Object::cast_to<StreamPeerTLS>(p_connection.ptr()), "Connection is not a reference to a valid StreamPeerTLS object."); } @@ -156,7 +156,7 @@ Error HTTPClientTCP::request(Method p_method, const String &p_url, const Vector< } String uri = p_url; - if (!ssl && http_proxy_port != -1) { + if (!tls && http_proxy_port != -1) { uri = vformat("http://%s:%d%s", conn_host, conn_port, p_url); } @@ -181,7 +181,7 @@ Error HTTPClientTCP::request(Method p_method, const String &p_url, const Vector< } } if (add_host) { - if ((ssl && conn_port == PORT_HTTPS) || (!ssl && conn_port == PORT_HTTP)) { + if ((tls && conn_port == PORT_HTTPS) || (!tls && conn_port == PORT_HTTP)) { // Don't append the standard ports. request += "Host: " + conn_host + "\r\n"; } else { @@ -316,7 +316,7 @@ Error HTTPClientTCP::poll() { return OK; } break; case StreamPeerTCP::STATUS_CONNECTED: { - if (ssl && proxy_client.is_valid()) { + if (tls && proxy_client.is_valid()) { Error err = proxy_client->poll(); if (err == ERR_UNCONFIGURED) { proxy_client->set_connection(tcp_connection); @@ -357,42 +357,42 @@ Error HTTPClientTCP::poll() { return ERR_CANT_CONNECT; } break; } - } else if (ssl) { - Ref<StreamPeerTLS> ssl; + } else if (tls) { + Ref<StreamPeerTLS> tls; if (!handshaking) { // Connect the StreamPeerTLS and start handshaking. - ssl = Ref<StreamPeerTLS>(StreamPeerTLS::create()); - ssl->set_blocking_handshake_enabled(false); - Error err = ssl->connect_to_stream(tcp_connection, ssl_verify_host, conn_host); + tls = Ref<StreamPeerTLS>(StreamPeerTLS::create()); + tls->set_blocking_handshake_enabled(false); + Error err = tls->connect_to_stream(tcp_connection, tls_verify_host, conn_host); if (err != OK) { close(); - status = STATUS_SSL_HANDSHAKE_ERROR; + status = STATUS_TLS_HANDSHAKE_ERROR; return ERR_CANT_CONNECT; } - connection = ssl; + connection = tls; handshaking = true; } else { - // We are already handshaking, which means we can use your already active SSL connection. - ssl = static_cast<Ref<StreamPeerTLS>>(connection); - if (ssl.is_null()) { + // We are already handshaking, which means we can use your already active TLS connection. + tls = static_cast<Ref<StreamPeerTLS>>(connection); + if (tls.is_null()) { close(); - status = STATUS_SSL_HANDSHAKE_ERROR; + status = STATUS_TLS_HANDSHAKE_ERROR; return ERR_CANT_CONNECT; } - ssl->poll(); // Try to finish the handshake. + tls->poll(); // Try to finish the handshake. } - if (ssl->get_status() == StreamPeerTLS::STATUS_CONNECTED) { + if (tls->get_status() == StreamPeerTLS::STATUS_CONNECTED) { // Handshake has been successful. handshaking = false; ip_candidates.clear(); status = STATUS_CONNECTED; return OK; - } else if (ssl->get_status() != StreamPeerTLS::STATUS_HANDSHAKING) { + } else if (tls->get_status() != StreamPeerTLS::STATUS_HANDSHAKING) { // Handshake has failed. close(); - status = STATUS_SSL_HANDSHAKE_ERROR; + status = STATUS_TLS_HANDSHAKE_ERROR; return ERR_CANT_CONNECT; } // ... we will need to poll more for handshake to finish. @@ -421,7 +421,7 @@ Error HTTPClientTCP::poll() { case STATUS_BODY: case STATUS_CONNECTED: { // Check if we are still connected. - if (ssl) { + if (tls) { Ref<StreamPeerTLS> tmp = connection; tmp->poll(); if (tmp->get_status() != StreamPeerTLS::STATUS_CONNECTED) { @@ -548,7 +548,7 @@ Error HTTPClientTCP::poll() { return ERR_UNCONFIGURED; } break; case STATUS_CONNECTION_ERROR: - case STATUS_SSL_HANDSHAKE_ERROR: { + case STATUS_TLS_HANDSHAKE_ERROR: { return ERR_CONNECTION_ERROR; } break; case STATUS_CANT_CONNECT: { diff --git a/core/io/http_client_tcp.h b/core/io/http_client_tcp.h index c10e0b1eca..744c15f7ab 100644 --- a/core/io/http_client_tcp.h +++ b/core/io/http_client_tcp.h @@ -46,8 +46,8 @@ private: String http_proxy_host; int https_proxy_port = -1; // Proxy server for https requests. String https_proxy_host; - bool ssl = false; - bool ssl_verify_host = false; + bool tls = false; + bool tls_verify_host = false; bool blocking = false; bool handshaking = false; bool head_request = false; @@ -79,7 +79,7 @@ public: Error request(Method p_method, const String &p_url, const Vector<String> &p_headers, const uint8_t *p_body, int p_body_size) override; - Error connect_to_host(const String &p_host, int p_port = -1, bool p_ssl = false, bool p_verify_host = true) override; + Error connect_to_host(const String &p_host, int p_port = -1, bool p_tls = false, bool p_verify_host = true) override; void set_connection(const Ref<StreamPeer> &p_connection) override; Ref<StreamPeer> get_connection() const override; void close() override; diff --git a/core/io/image_loader.cpp b/core/io/image_loader.cpp index d09697b951..d6854666c0 100644 --- a/core/io/image_loader.cpp +++ b/core/io/image_loader.cpp @@ -32,6 +32,12 @@ #include "core/string/print_string.h" +void ImageFormatLoader::_bind_methods() { + BIND_BITFIELD_FLAG(FLAG_NONE); + BIND_BITFIELD_FLAG(FLAG_FORCE_LINEAR); + BIND_BITFIELD_FLAG(FLAG_CONVERT_COLORS); +} + bool ImageFormatLoader::recognize(const String &p_extension) const { List<String> extensions; get_recognized_extensions(&extensions); @@ -44,7 +50,39 @@ bool ImageFormatLoader::recognize(const String &p_extension) const { return false; } -Error ImageLoader::load_image(String p_file, Ref<Image> p_image, Ref<FileAccess> p_custom, uint32_t p_flags, float p_scale) { +Error ImageFormatLoaderExtension::load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { + Error err; + if (GDVIRTUAL_CALL(_load_image, p_image, p_fileaccess, p_flags, p_scale, err)) { + return err; + } + return ERR_UNAVAILABLE; +} + +void ImageFormatLoaderExtension::get_recognized_extensions(List<String> *p_extension) const { + PackedStringArray ext; + if (GDVIRTUAL_CALL(_get_recognized_extensions, ext)) { + for (int i = 0; i < ext.size(); i++) { + p_extension->push_back(ext[i]); + } + } +} + +void ImageFormatLoaderExtension::add_format_loader() { + ImageLoader::add_image_format_loader(this); +} + +void ImageFormatLoaderExtension::remove_format_loader() { + ImageLoader::remove_image_format_loader(this); +} + +void ImageFormatLoaderExtension::_bind_methods() { + GDVIRTUAL_BIND(_get_recognized_extensions); + GDVIRTUAL_BIND(_load_image, "image", "fileaccess", "flags", "scale"); + ClassDB::bind_method(D_METHOD("add_format_loader"), &ImageFormatLoaderExtension::add_format_loader); + ClassDB::bind_method(D_METHOD("remove_format_loader"), &ImageFormatLoaderExtension::remove_format_loader); +} + +Error ImageLoader::load_image(String p_file, Ref<Image> p_image, Ref<FileAccess> p_custom, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { ERR_FAIL_COND_V_MSG(p_image.is_null(), ERR_INVALID_PARAMETER, "It's not a reference to a valid Image object."); Ref<FileAccess> f = p_custom; @@ -60,7 +98,7 @@ Error ImageLoader::load_image(String p_file, Ref<Image> p_image, Ref<FileAccess> if (!loader[i]->recognize(extension)) { continue; } - Error err = loader[i]->load_image(p_image, f, p_flags, p_scale); + Error err = loader.write[i]->load_image(p_image, f, p_flags, p_scale); if (err != OK) { ERR_PRINT("Error loading image: " + p_file); } @@ -79,7 +117,7 @@ void ImageLoader::get_recognized_extensions(List<String> *p_extensions) { } } -ImageFormatLoader *ImageLoader::recognize(const String &p_extension) { +Ref<ImageFormatLoader> ImageLoader::recognize(const String &p_extension) { for (int i = 0; i < loader.size(); i++) { if (loader[i]->recognize(p_extension)) { return loader[i]; @@ -89,17 +127,17 @@ ImageFormatLoader *ImageLoader::recognize(const String &p_extension) { return nullptr; } -Vector<ImageFormatLoader *> ImageLoader::loader; +Vector<Ref<ImageFormatLoader>> ImageLoader::loader; -void ImageLoader::add_image_format_loader(ImageFormatLoader *p_loader) { +void ImageLoader::add_image_format_loader(Ref<ImageFormatLoader> p_loader) { loader.push_back(p_loader); } -void ImageLoader::remove_image_format_loader(ImageFormatLoader *p_loader) { +void ImageLoader::remove_image_format_loader(Ref<ImageFormatLoader> p_loader) { loader.erase(p_loader); } -const Vector<ImageFormatLoader *> &ImageLoader::get_image_format_loaders() { +const Vector<Ref<ImageFormatLoader>> &ImageLoader::get_image_format_loaders() { return loader; } @@ -152,7 +190,7 @@ Ref<Resource> ResourceFormatLoaderImage::load(const String &p_path, const String Ref<Image> image; image.instantiate(); - Error err = ImageLoader::loader[idx]->load_image(image, f); + Error err = ImageLoader::loader.write[idx]->load_image(image, f); if (err != OK) { if (r_error) { diff --git a/core/io/image_loader.h b/core/io/image_loader.h index cb64d2310e..f70fdf22aa 100644 --- a/core/io/image_loader.h +++ b/core/io/image_loader.h @@ -31,46 +31,74 @@ #ifndef IMAGE_LOADER_H #define IMAGE_LOADER_H +#include "core/core_bind.h" #include "core/io/file_access.h" #include "core/io/image.h" #include "core/io/resource_loader.h" +#include "core/object/gdvirtual.gen.inc" #include "core/string/ustring.h" #include "core/templates/list.h" +#include "core/variant/binder_common.h" class ImageLoader; -class ImageFormatLoader { +class ImageFormatLoader : public RefCounted { + GDCLASS(ImageFormatLoader, RefCounted); + friend class ImageLoader; friend class ResourceFormatLoaderImage; -protected: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, uint32_t p_flags = (uint32_t)FLAG_NONE, float p_scale = 1.0) = 0; - virtual void get_recognized_extensions(List<String> *p_extensions) const = 0; - bool recognize(const String &p_extension) const; - public: enum LoaderFlags { FLAG_NONE = 0, FLAG_FORCE_LINEAR = 1, + FLAG_CONVERT_COLORS = 2, }; +protected: + static void _bind_methods(); + + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, BitField<ImageFormatLoader::LoaderFlags> p_flags = FLAG_NONE, float p_scale = 1.0) = 0; + virtual void get_recognized_extensions(List<String> *p_extensions) const = 0; + bool recognize(const String &p_extension) const; + +public: virtual ~ImageFormatLoader() {} }; +VARIANT_BITFIELD_CAST(ImageFormatLoader::LoaderFlags); + +class ImageFormatLoaderExtension : public ImageFormatLoader { + GDCLASS(ImageFormatLoaderExtension, ImageFormatLoader); + +protected: + static void _bind_methods(); + +public: + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, BitField<ImageFormatLoader::LoaderFlags> p_flags = FLAG_NONE, float p_scale = 1.0) override; + virtual void get_recognized_extensions(List<String> *p_extensions) const override; + + void add_format_loader(); + void remove_format_loader(); + + GDVIRTUAL0RC(PackedStringArray, _get_recognized_extensions); + GDVIRTUAL4R(Error, _load_image, Ref<Image>, Ref<FileAccess>, BitField<ImageFormatLoader::LoaderFlags>, float); +}; + class ImageLoader { - static Vector<ImageFormatLoader *> loader; + static Vector<Ref<ImageFormatLoader>> loader; friend class ResourceFormatLoaderImage; protected: public: - static Error load_image(String p_file, Ref<Image> p_image, Ref<FileAccess> p_custom = Ref<FileAccess>(), uint32_t p_flags = (uint32_t)ImageFormatLoader::FLAG_NONE, float p_scale = 1.0); + static Error load_image(String p_file, Ref<Image> p_image, Ref<FileAccess> p_custom = Ref<FileAccess>(), BitField<ImageFormatLoader::LoaderFlags> p_flags = ImageFormatLoader::FLAG_NONE, float p_scale = 1.0); static void get_recognized_extensions(List<String> *p_extensions); - static ImageFormatLoader *recognize(const String &p_extension); + static Ref<ImageFormatLoader> recognize(const String &p_extension); - static void add_image_format_loader(ImageFormatLoader *p_loader); - static void remove_image_format_loader(ImageFormatLoader *p_loader); + static void add_image_format_loader(Ref<ImageFormatLoader> p_loader); + static void remove_image_format_loader(Ref<ImageFormatLoader> p_loader); - static const Vector<ImageFormatLoader *> &get_image_format_loaders(); + static const Vector<Ref<ImageFormatLoader>> &get_image_format_loaders(); static void cleanup(); }; diff --git a/core/io/json.cpp b/core/io/json.cpp index 91500ff3d5..7e267d35d4 100644 --- a/core/io/json.cpp +++ b/core/io/json.cpp @@ -56,6 +56,8 @@ String JSON::_make_indent(const String &p_indent, int p_size) { } String JSON::_stringify(const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, HashSet<const void *> &p_markers, bool p_full_precision) { + ERR_FAIL_COND_V_MSG(p_cur_indent > Variant::MAX_RECURSION_DEPTH, "...", "JSON structure is too deep. Bailing."); + String colon = ":"; String end_statement = ""; @@ -357,17 +359,22 @@ Error JSON::_get_token(const char32_t *p_str, int &index, int p_len, Token &r_to return ERR_PARSE_ERROR; } -Error JSON::_parse_value(Variant &value, Token &token, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str) { +Error JSON::_parse_value(Variant &value, Token &token, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str) { + if (p_depth > Variant::MAX_RECURSION_DEPTH) { + r_err_str = "JSON structure is too deep. Bailing."; + return ERR_OUT_OF_MEMORY; + } + if (token.type == TK_CURLY_BRACKET_OPEN) { Dictionary d; - Error err = _parse_object(d, p_str, index, p_len, line, r_err_str); + Error err = _parse_object(d, p_str, index, p_len, line, p_depth + 1, r_err_str); if (err) { return err; } value = d; } else if (token.type == TK_BRACKET_OPEN) { Array a; - Error err = _parse_array(a, p_str, index, p_len, line, r_err_str); + Error err = _parse_array(a, p_str, index, p_len, line, p_depth + 1, r_err_str); if (err) { return err; } @@ -396,7 +403,7 @@ Error JSON::_parse_value(Variant &value, Token &token, const char32_t *p_str, in return OK; } -Error JSON::_parse_array(Array &array, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str) { +Error JSON::_parse_array(Array &array, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str) { Token token; bool need_comma = false; @@ -421,7 +428,7 @@ Error JSON::_parse_array(Array &array, const char32_t *p_str, int &index, int p_ } Variant v; - err = _parse_value(v, token, p_str, index, p_len, line, r_err_str); + err = _parse_value(v, token, p_str, index, p_len, line, p_depth, r_err_str); if (err) { return err; } @@ -434,7 +441,7 @@ Error JSON::_parse_array(Array &array, const char32_t *p_str, int &index, int p_ return ERR_PARSE_ERROR; } -Error JSON::_parse_object(Dictionary &object, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str) { +Error JSON::_parse_object(Dictionary &object, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str) { bool at_key = true; String key; Token token; @@ -483,7 +490,7 @@ Error JSON::_parse_object(Dictionary &object, const char32_t *p_str, int &index, } Variant v; - err = _parse_value(v, token, p_str, index, p_len, line, r_err_str); + err = _parse_value(v, token, p_str, index, p_len, line, p_depth, r_err_str); if (err) { return err; } @@ -497,6 +504,10 @@ Error JSON::_parse_object(Dictionary &object, const char32_t *p_str, int &index, return ERR_PARSE_ERROR; } +void JSON::set_data(const Variant &p_data) { + data = p_data; +} + Error JSON::_parse_string(const String &p_json, Variant &r_ret, String &r_err_str, int &r_err_line) { const char32_t *str = p_json.ptr(); int idx = 0; @@ -510,7 +521,7 @@ Error JSON::_parse_string(const String &p_json, Variant &r_ret, String &r_err_st return err; } - err = _parse_value(r_ret, token, str, idx, len, r_err_line, r_err_str); + err = _parse_value(r_ret, token, str, idx, len, r_err_line, 0, r_err_str); // Check if EOF is reached // or it's a type of the next token. @@ -557,6 +568,88 @@ void JSON::_bind_methods() { ClassDB::bind_method(D_METHOD("parse", "json_string"), &JSON::parse); ClassDB::bind_method(D_METHOD("get_data"), &JSON::get_data); + ClassDB::bind_method(D_METHOD("set_data", "data"), &JSON::set_data); ClassDB::bind_method(D_METHOD("get_error_line"), &JSON::get_error_line); ClassDB::bind_method(D_METHOD("get_error_message"), &JSON::get_error_message); + + ADD_PROPERTY(PropertyInfo(Variant::NIL, "data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NIL_IS_VARIANT), "set_data", "get_data"); // Ensures that it can be serialized as binary. +} + +//// + +//////////// + +Ref<Resource> ResourceFormatLoaderJSON::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode) { + if (r_error) { + *r_error = ERR_FILE_CANT_OPEN; + } + + if (!FileAccess::exists(p_path)) { + *r_error = ERR_FILE_NOT_FOUND; + return Ref<Resource>(); + } + + Ref<JSON> json; + json.instantiate(); + + Error err = json->parse(FileAccess::get_file_as_string(p_path)); + if (err != OK) { + if (r_error) { + *r_error = err; + } + ERR_PRINT("Error parsing JSON file at '" + p_path + "', on line " + itos(json->get_error_line()) + ": " + json->get_error_message()); + return Ref<Resource>(); + } + + if (r_error) { + *r_error = OK; + } + + return json; +} + +void ResourceFormatLoaderJSON::get_recognized_extensions(List<String> *p_extensions) const { + p_extensions->push_back("json"); +} + +bool ResourceFormatLoaderJSON::handles_type(const String &p_type) const { + return (p_type == "JSON"); +} + +String ResourceFormatLoaderJSON::get_resource_type(const String &p_path) const { + String el = p_path.get_extension().to_lower(); + if (el == "json") { + return "JSON"; + } + return ""; +} + +Error ResourceFormatSaverJSON::save(const Ref<Resource> &p_resource, const String &p_path, uint32_t p_flags) { + Ref<JSON> json = p_resource; + ERR_FAIL_COND_V(json.is_null(), ERR_INVALID_PARAMETER); + + String source = JSON::stringify(json->get_data(), "\t", false, true); + + Error err; + Ref<FileAccess> file = FileAccess::open(p_path, FileAccess::WRITE, &err); + + ERR_FAIL_COND_V_MSG(err, err, "Cannot save json '" + p_path + "'."); + + file->store_string(source); + if (file->get_error() != OK && file->get_error() != ERR_FILE_EOF) { + return ERR_CANT_CREATE; + } + + return OK; +} + +void ResourceFormatSaverJSON::get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const { + Ref<JSON> json = p_resource; + if (json.is_valid()) { + p_extensions->push_back("json"); + } +} + +bool ResourceFormatSaverJSON::recognize(const Ref<Resource> &p_resource) const { + return p_resource->get_class_name() == "JSON"; //only json, not inherited } diff --git a/core/io/json.h b/core/io/json.h index 840b1cc08a..829a5f922b 100644 --- a/core/io/json.h +++ b/core/io/json.h @@ -31,7 +31,9 @@ #ifndef JSON_H #define JSON_H -#include "core/object/ref_counted.h" +#include "core/io/resource.h" +#include "core/io/resource_loader.h" +#include "core/io/resource_saver.h" #include "core/variant/variant.h" class JSON : public RefCounted { @@ -72,9 +74,9 @@ class JSON : public RefCounted { static String _make_indent(const String &p_indent, int p_size); static String _stringify(const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, HashSet<const void *> &p_markers, bool p_full_precision = false); static Error _get_token(const char32_t *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str); - static Error _parse_value(Variant &value, Token &token, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str); - static Error _parse_array(Array &array, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str); - static Error _parse_object(Dictionary &object, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str); + static Error _parse_value(Variant &value, Token &token, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str); + static Error _parse_array(Array &array, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str); + static Error _parse_object(Dictionary &object, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str); static Error _parse_string(const String &p_json, Variant &r_ret, String &r_err_str, int &r_err_line); protected: @@ -86,8 +88,24 @@ public: static Variant parse_string(const String &p_json_string); inline Variant get_data() const { return data; } + void set_data(const Variant &p_data); inline int get_error_line() const { return err_line; } inline String get_error_message() const { return err_str; } }; +class ResourceFormatLoaderJSON : public ResourceFormatLoader { +public: + virtual Ref<Resource> load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, CacheMode p_cache_mode = CACHE_MODE_REUSE); + 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 ResourceFormatSaverJSON : public ResourceFormatSaver { +public: + virtual Error save(const Ref<Resource> &p_resource, const String &p_path, uint32_t p_flags = 0); + virtual void get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const; + virtual bool recognize(const Ref<Resource> &p_resource) const; +}; + #endif // JSON_H diff --git a/core/io/resource.cpp b/core/io/resource.cpp index d117f86f39..553698f8a6 100644 --- a/core/io/resource.cpp +++ b/core/io/resource.cpp @@ -93,15 +93,14 @@ String Resource::get_path() const { String Resource::generate_scene_unique_id() { // Generate a unique enough hash, but still user-readable. // If it's not unique it does not matter because the saver will try again. - OS::Date date = OS::get_singleton()->get_date(); - OS::Time time = OS::get_singleton()->get_time(); + OS::DateTime dt = OS::get_singleton()->get_datetime(); uint32_t hash = hash_murmur3_one_32(OS::get_singleton()->get_ticks_usec()); - hash = hash_murmur3_one_32(date.year, hash); - hash = hash_murmur3_one_32(date.month, hash); - hash = hash_murmur3_one_32(date.day, hash); - hash = hash_murmur3_one_32(time.hour, hash); - hash = hash_murmur3_one_32(time.minute, hash); - hash = hash_murmur3_one_32(time.second, hash); + hash = hash_murmur3_one_32(dt.year, hash); + hash = hash_murmur3_one_32(dt.month, hash); + hash = hash_murmur3_one_32(dt.day, hash); + hash = hash_murmur3_one_32(dt.hour, hash); + hash = hash_murmur3_one_32(dt.minute, hash); + hash = hash_murmur3_one_32(dt.second, hash); hash = hash_murmur3_one_32(Math::rand(), hash); static constexpr uint32_t characters = 5; diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp index 4f1204fc48..06649aba5b 100644 --- a/core/io/resource_format_binary.cpp +++ b/core/io/resource_format_binary.cpp @@ -1206,7 +1206,7 @@ Error ResourceFormatLoaderBinary::rename_dependencies(const String &p_path, cons Ref<FileAccessCompressed> facw; facw.instantiate(); facw->configure("RSCC"); - err = facw->_open(p_path + ".depren", FileAccess::WRITE); + err = facw->open_internal(p_path + ".depren", FileAccess::WRITE); ERR_FAIL_COND_V_MSG(err, ERR_FILE_CORRUPT, "Cannot create file '" + p_path + ".depren'."); fw = facw; @@ -1986,7 +1986,7 @@ Error ResourceFormatSaverBinaryInstance::save(const String &p_path, const Ref<Re fac.instantiate(); fac->configure("RSCC"); f = fac; - err = fac->_open(p_path, FileAccess::WRITE); + err = fac->open_internal(p_path, FileAccess::WRITE); } else { f = FileAccess::open(p_path, FileAccess::WRITE, &err); } diff --git a/core/io/resource_importer.cpp b/core/io/resource_importer.cpp index aa7f96a047..d923522317 100644 --- a/core/io/resource_importer.cpp +++ b/core/io/resource_importer.cpp @@ -108,6 +108,15 @@ Error ResourceFormatImporter::_get_path_and_type(const String &p_path, PathAndTy } } +#ifdef TOOLS_ENABLED + if (r_path_and_type.metadata && !r_path_and_type.path.is_empty()) { + Dictionary metadata = r_path_and_type.metadata; + if (metadata.has("has_editor_variant")) { + r_path_and_type.path = r_path_and_type.path.get_basename() + ".editor." + r_path_and_type.path.get_extension(); + } + } +#endif + if (r_path_and_type.path.is_empty() || r_path_and_type.type.is_empty()) { return ERR_FILE_CORRUPT; } diff --git a/core/io/stream_peer_gzip.cpp b/core/io/stream_peer_gzip.cpp new file mode 100644 index 0000000000..ca8be2d62e --- /dev/null +++ b/core/io/stream_peer_gzip.cpp @@ -0,0 +1,209 @@ +/*************************************************************************/ +/* stream_peer_gzip.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 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 "core/io/stream_peer_gzip.h" + +#include "core/io/zip_io.h" +#include <zlib.h> + +void StreamPeerGZIP::_bind_methods() { + ClassDB::bind_method(D_METHOD("start_compression", "use_deflate", "buffer_size"), &StreamPeerGZIP::start_compression, DEFVAL(false), DEFVAL(65535)); + ClassDB::bind_method(D_METHOD("start_decompression", "use_deflate", "buffer_size"), &StreamPeerGZIP::start_decompression, DEFVAL(false), DEFVAL(65535)); + ClassDB::bind_method(D_METHOD("finish"), &StreamPeerGZIP::finish); + ClassDB::bind_method(D_METHOD("clear"), &StreamPeerGZIP::clear); +} + +StreamPeerGZIP::StreamPeerGZIP() { +} + +StreamPeerGZIP::~StreamPeerGZIP() { + _close(); +} + +void StreamPeerGZIP::_close() { + if (ctx) { + z_stream *strm = (z_stream *)ctx; + if (compressing) { + deflateEnd(strm); + } else { + inflateEnd(strm); + } + memfree(strm); + ctx = nullptr; + } +} + +void StreamPeerGZIP::clear() { + _close(); + rb.clear(); + buffer.clear(); +} + +Error StreamPeerGZIP::start_compression(bool p_is_deflate, int buffer_size) { + return _start(true, p_is_deflate, buffer_size); +} + +Error StreamPeerGZIP::start_decompression(bool p_is_deflate, int buffer_size) { + return _start(false, p_is_deflate, buffer_size); +} + +Error StreamPeerGZIP::_start(bool p_compress, bool p_is_deflate, int buffer_size) { + ERR_FAIL_COND_V(ctx != nullptr, ERR_ALREADY_IN_USE); + clear(); + compressing = p_compress; + rb.resize(nearest_shift(buffer_size - 1)); + buffer.resize(1024); + + // Create ctx. + ctx = memalloc(sizeof(z_stream)); + z_stream &strm = *(z_stream *)ctx; + strm.next_in = Z_NULL; + strm.avail_in = 0; + strm.zalloc = zipio_alloc; + strm.zfree = zipio_free; + strm.opaque = Z_NULL; + int window_bits = p_is_deflate ? 15 : (15 + 16); + int err = Z_OK; + int level = Z_DEFAULT_COMPRESSION; + if (compressing) { + err = deflateInit2(&strm, level, Z_DEFLATED, window_bits, 8, Z_DEFAULT_STRATEGY); + } else { + err = inflateInit2(&strm, window_bits); + } + ERR_FAIL_COND_V(err != Z_OK, FAILED); + return OK; +} + +Error StreamPeerGZIP::_process(uint8_t *p_dst, int p_dst_size, const uint8_t *p_src, int p_src_size, int &r_consumed, int &r_out, bool p_close) { + ERR_FAIL_COND_V(!ctx, ERR_UNCONFIGURED); + z_stream &strm = *(z_stream *)ctx; + strm.avail_in = p_src_size; + strm.avail_out = p_dst_size; + strm.next_in = (Bytef *)p_src; + strm.next_out = (Bytef *)p_dst; + int flush = p_close ? Z_FINISH : Z_NO_FLUSH; + if (compressing) { + int err = deflate(&strm, flush); + ERR_FAIL_COND_V(err != (p_close ? Z_STREAM_END : Z_OK), FAILED); + } else { + int err = inflate(&strm, flush); + ERR_FAIL_COND_V(err != Z_OK && err != Z_STREAM_END, FAILED); + } + r_out = p_dst_size - strm.avail_out; + r_consumed = p_src_size - strm.avail_in; + return OK; +} + +Error StreamPeerGZIP::put_data(const uint8_t *p_data, int p_bytes) { + int wrote = 0; + Error err = put_partial_data(p_data, p_bytes, wrote); + if (err != OK) { + return err; + } + ERR_FAIL_COND_V(p_bytes != wrote, ERR_OUT_OF_MEMORY); + return OK; +} + +Error StreamPeerGZIP::put_partial_data(const uint8_t *p_data, int p_bytes, int &r_sent) { + ERR_FAIL_COND_V(!ctx, ERR_UNCONFIGURED); + ERR_FAIL_COND_V(p_bytes < 0, ERR_INVALID_PARAMETER); + + // Ensure we have enough space in temporary buffer. + if (buffer.size() < p_bytes) { + buffer.resize(p_bytes); + } + + r_sent = 0; + while (r_sent < p_bytes && rb.space_left() > 1024) { // Keep the ring buffer size meaningful. + int sent = 0; + int to_write = 0; + // Compress or decompress + Error err = _process(buffer.ptrw(), MIN(buffer.size(), rb.space_left()), p_data + r_sent, p_bytes - r_sent, sent, to_write); + if (err != OK) { + return err; + } + // When decompressing, we might need to do another round. + r_sent += sent; + + // We can't write more than this buffer is full. + if (sent == 0 && to_write == 0) { + return OK; + } + if (to_write) { + // Copy to ring buffer. + int wrote = rb.write(buffer.ptr(), to_write); + ERR_FAIL_COND_V(wrote != to_write, ERR_BUG); + } + } + return OK; +} + +Error StreamPeerGZIP::get_data(uint8_t *p_buffer, int p_bytes) { + int received = 0; + Error err = get_partial_data(p_buffer, p_bytes, received); + if (err != OK) { + return err; + } + ERR_FAIL_COND_V(p_bytes != received, ERR_UNAVAILABLE); + return OK; +} + +Error StreamPeerGZIP::get_partial_data(uint8_t *p_buffer, int p_bytes, int &r_received) { + ERR_FAIL_COND_V(p_bytes < 0, ERR_INVALID_PARAMETER); + + r_received = MIN(p_bytes, rb.data_left()); + if (r_received == 0) { + return OK; + } + int received = rb.read(p_buffer, r_received); + ERR_FAIL_COND_V(received != r_received, ERR_BUG); + return OK; +} + +int StreamPeerGZIP::get_available_bytes() const { + return rb.data_left(); +} + +Error StreamPeerGZIP::finish() { + ERR_FAIL_COND_V(!ctx || !compressing, ERR_UNAVAILABLE); + // Ensure we have enough space in temporary buffer. + if (buffer.size() < 1024) { + buffer.resize(1024); // 1024 should be more than enough. + } + int consumed = 0; + int to_write = 0; + Error err = _process(buffer.ptrw(), 1024, nullptr, 0, consumed, to_write, true); // compress + if (err != OK) { + return err; + } + int wrote = rb.write(buffer.ptr(), to_write); + ERR_FAIL_COND_V(wrote != to_write, ERR_OUT_OF_MEMORY); + return OK; +} diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.java b/core/io/stream_peer_gzip.h index 778efa914a..5bafdbca9b 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.java +++ b/core/io/stream_peer_gzip.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* GodotGestureHandler.java */ +/* stream_peer_gzip.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,60 +28,49 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -package org.godotengine.godot.input; +#ifndef STREAM_PEER_GZIP_H +#define STREAM_PEER_GZIP_H -import org.godotengine.godot.GodotLib; -import org.godotengine.godot.GodotRenderView; +#include "core/io/stream_peer.h" -import android.view.GestureDetector; -import android.view.MotionEvent; +#include "core/core_bind.h" +#include "core/io/compression.h" +#include "core/templates/ring_buffer.h" -/** - * 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 GodotRenderView mRenderView; +class StreamPeerGZIP : public StreamPeer { + GDCLASS(StreamPeerGZIP, StreamPeer); - public GodotGestureHandler(GodotRenderView godotView) { - mRenderView = godotView; - } +private: + void *ctx = nullptr; // Will hold our z_stream instance. + bool compressing = true; - private void queueEvent(Runnable task) { - mRenderView.queueOnRenderThread(task); - } + RingBuffer<uint8_t> rb; + Vector<uint8_t> buffer; - @Override - public boolean onDown(MotionEvent event) { - super.onDown(event); - //Log.i("GodotGesture", "onDown"); - return true; - } + Error _process(uint8_t *p_dst, int p_dst_size, const uint8_t *p_src, int p_src_size, int &r_consumed, int &r_out, bool p_close = false); + void _close(); + Error _start(bool p_compress, bool p_is_deflate, int buffer_size = 65535); - @Override - public boolean onSingleTapConfirmed(MotionEvent event) { - super.onSingleTapConfirmed(event); - return true; - } +protected: + static void _bind_methods(); - @Override - public void onLongPress(MotionEvent event) { - //Log.i("GodotGesture", "onLongPress"); - } +public: + Error start_compression(bool p_is_deflate, int buffer_size = 65535); + Error start_decompression(bool p_is_deflate, int buffer_size = 65535); - @Override - public boolean onDoubleTap(MotionEvent event) { - //Log.i("GodotGesture", "onDoubleTap"); - final int x = Math.round(event.getX()); - final int y = Math.round(event.getY()); - final int buttonMask = event.getButtonState(); - GodotLib.doubleTap(buttonMask, x, y); - return true; - } + Error finish(); + void clear(); - @Override - public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { - //Log.i("GodotGesture", "onFling"); - return true; - } -} + virtual Error put_data(const uint8_t *p_data, int p_bytes) override; + virtual Error put_partial_data(const uint8_t *p_data, int p_bytes, int &r_sent) override; + + virtual Error get_data(uint8_t *p_buffer, int p_bytes) override; + virtual Error get_partial_data(uint8_t *p_buffer, int p_bytes, int &r_received) override; + + virtual int get_available_bytes() const override; + + StreamPeerGZIP(); + ~StreamPeerGZIP(); +}; + +#endif // STREAM_PEER_GZIP_H diff --git a/core/io/xml_parser.cpp b/core/io/xml_parser.cpp index 154b55f5e7..abae48fdd8 100644 --- a/core/io/xml_parser.cpp +++ b/core/io/xml_parser.cpp @@ -137,7 +137,7 @@ bool XMLParser::_parse_cdata() { next_char(); } - if (cDataEnd) { + if (!cDataEnd) { cDataEnd = P; } node_name = String::utf8(cDataBegin, (int)(cDataEnd - cDataBegin)); diff --git a/core/math/a_star_grid_2d.cpp b/core/math/a_star_grid_2d.cpp index 23d7e379ee..ad67cfa852 100644 --- a/core/math/a_star_grid_2d.cpp +++ b/core/math/a_star_grid_2d.cpp @@ -30,16 +30,16 @@ #include "a_star_grid_2d.h" -static real_t heuristic_manhattan(const Vector2i &p_from, const Vector2i &p_to) { +static real_t heuristic_euclidian(const Vector2i &p_from, const Vector2i &p_to) { real_t dx = (real_t)ABS(p_to.x - p_from.x); real_t dy = (real_t)ABS(p_to.y - p_from.y); - return dx + dy; + return (real_t)Math::sqrt(dx * dx + dy * dy); } -static real_t heuristic_euclidian(const Vector2i &p_from, const Vector2i &p_to) { +static real_t heuristic_manhattan(const Vector2i &p_from, const Vector2i &p_to) { real_t dx = (real_t)ABS(p_to.x - p_from.x); real_t dy = (real_t)ABS(p_to.y - p_from.y); - return (real_t)Math::sqrt(dx * dx + dy * dy); + return dx + dy; } static real_t heuristic_octile(const Vector2i &p_from, const Vector2i &p_to) { @@ -55,7 +55,7 @@ static real_t heuristic_chebyshev(const Vector2i &p_from, const Vector2i &p_to) return MAX(dx, dy); } -static real_t (*heuristics[AStarGrid2D::HEURISTIC_MAX])(const Vector2i &, const Vector2i &) = { heuristic_manhattan, heuristic_euclidian, heuristic_octile, heuristic_chebyshev }; +static real_t (*heuristics[AStarGrid2D::HEURISTIC_MAX])(const Vector2i &, const Vector2i &) = { heuristic_euclidian, heuristic_manhattan, heuristic_octile, heuristic_chebyshev }; void AStarGrid2D::set_size(const Size2i &p_size) { ERR_FAIL_COND(p_size.x < 0 || p_size.y < 0); @@ -572,7 +572,7 @@ void AStarGrid2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "cell_size"), "set_cell_size", "get_cell_size"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "jumping_enabled"), "set_jumping_enabled", "is_jumping_enabled"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "default_heuristic", PROPERTY_HINT_ENUM, "Manhattan,Euclidean,Octile,Chebyshev,Max"), "set_default_heuristic", "get_default_heuristic"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "default_heuristic", PROPERTY_HINT_ENUM, "Euclidean,Manhattan,Octile,Chebyshev,Max"), "set_default_heuristic", "get_default_heuristic"); ADD_PROPERTY(PropertyInfo(Variant::INT, "diagonal_mode", PROPERTY_HINT_ENUM, "Never,Always,At Least One Walkable,Only If No Obstacles,Max"), "set_diagonal_mode", "get_diagonal_mode"); BIND_ENUM_CONSTANT(HEURISTIC_EUCLIDEAN); diff --git a/core/math/basis.cpp b/core/math/basis.cpp index 0eb6320ac6..4b163409ce 100644 --- a/core/math/basis.cpp +++ b/core/math/basis.cpp @@ -754,29 +754,28 @@ void Basis::get_axis_angle(Vector3 &r_axis, real_t &r_angle) const { #ifdef MATH_CHECKS ERR_FAIL_COND(!is_rotation()); #endif -*/ - real_t angle, x, y, z; // variables for result - real_t angle_epsilon = 0.1; // margin to distinguish between 0 and 180 degrees - - if ((Math::abs(rows[1][0] - rows[0][1]) < CMP_EPSILON) && (Math::abs(rows[2][0] - rows[0][2]) < CMP_EPSILON) && (Math::abs(rows[2][1] - rows[1][2]) < CMP_EPSILON)) { - // singularity found - // first check for identity matrix which must have +1 for all terms - // in leading diagonal and zero in other terms - if ((Math::abs(rows[1][0] + rows[0][1]) < angle_epsilon) && (Math::abs(rows[2][0] + rows[0][2]) < angle_epsilon) && (Math::abs(rows[2][1] + rows[1][2]) < angle_epsilon) && (Math::abs(rows[0][0] + rows[1][1] + rows[2][2] - 3) < angle_epsilon)) { - // this singularity is identity matrix so angle = 0 + */ + + // https://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + real_t x, y, z; // Variables for result. + if (Math::is_zero_approx(rows[0][1] - rows[1][0]) && Math::is_zero_approx(rows[0][2] - rows[2][0]) && Math::is_zero_approx(rows[1][2] - rows[2][1])) { + // Singularity found. + // First check for identity matrix which must have +1 for all terms in leading diagonal and zero in other terms. + if (is_diagonal() && (Math::abs(rows[0][0] + rows[1][1] + rows[2][2] - 3) < 3 * CMP_EPSILON)) { + // This singularity is identity matrix so angle = 0. r_axis = Vector3(0, 1, 0); r_angle = 0; return; } - // otherwise this singularity is angle = 180 - angle = Math_PI; + // Otherwise this singularity is angle = 180. real_t xx = (rows[0][0] + 1) / 2; real_t yy = (rows[1][1] + 1) / 2; real_t zz = (rows[2][2] + 1) / 2; - real_t xy = (rows[1][0] + rows[0][1]) / 4; - real_t xz = (rows[2][0] + rows[0][2]) / 4; - real_t yz = (rows[2][1] + rows[1][2]) / 4; - if ((xx > yy) && (xx > zz)) { // rows[0][0] is the largest diagonal term + real_t xy = (rows[0][1] + rows[1][0]) / 4; + real_t xz = (rows[0][2] + rows[2][0]) / 4; + real_t yz = (rows[1][2] + rows[2][1]) / 4; + + if ((xx > yy) && (xx > zz)) { // rows[0][0] is the largest diagonal term. if (xx < CMP_EPSILON) { x = 0; y = Math_SQRT12; @@ -786,7 +785,7 @@ void Basis::get_axis_angle(Vector3 &r_axis, real_t &r_angle) const { y = xy / x; z = xz / x; } - } else if (yy > zz) { // rows[1][1] is the largest diagonal term + } else if (yy > zz) { // rows[1][1] is the largest diagonal term. if (yy < CMP_EPSILON) { x = Math_SQRT12; y = 0; @@ -796,7 +795,7 @@ void Basis::get_axis_angle(Vector3 &r_axis, real_t &r_angle) const { x = xy / y; z = yz / y; } - } else { // rows[2][2] is the largest diagonal term so base result on this + } else { // rows[2][2] is the largest diagonal term so base result on this. if (zz < CMP_EPSILON) { x = Math_SQRT12; y = Math_SQRT12; @@ -808,22 +807,24 @@ void Basis::get_axis_angle(Vector3 &r_axis, real_t &r_angle) const { } } r_axis = Vector3(x, y, z); - r_angle = angle; + r_angle = Math_PI; return; } - // as we have reached here there are no singularities so we can handle normally - real_t s = Math::sqrt((rows[1][2] - rows[2][1]) * (rows[1][2] - rows[2][1]) + (rows[2][0] - rows[0][2]) * (rows[2][0] - rows[0][2]) + (rows[0][1] - rows[1][0]) * (rows[0][1] - rows[1][0])); // s=|axis||sin(angle)|, used to normalise + // As we have reached here there are no singularities so we can handle normally. + double s = Math::sqrt((rows[2][1] - rows[1][2]) * (rows[2][1] - rows[1][2]) + (rows[0][2] - rows[2][0]) * (rows[0][2] - rows[2][0]) + (rows[1][0] - rows[0][1]) * (rows[1][0] - rows[0][1])); // Used to normalise. - angle = Math::acos((rows[0][0] + rows[1][1] + rows[2][2] - 1) / 2); - if (angle < 0) { - s = -s; + if (Math::abs(s) < CMP_EPSILON) { + // Prevent divide by zero, should not happen if matrix is orthogonal and should be caught by singularity test above. + s = 1; } + x = (rows[2][1] - rows[1][2]) / s; y = (rows[0][2] - rows[2][0]) / s; z = (rows[1][0] - rows[0][1]) / s; r_axis = Vector3(x, y, z); - r_angle = angle; + // CLAMP to avoid NaN if the value passed to acos is not in [0,1]. + r_angle = Math::acos(CLAMP((rows[0][0] + rows[1][1] + rows[2][2] - 1) / 2, (real_t)0.0, (real_t)1.0)); } void Basis::set_quaternion(const Quaternion &p_quaternion) { diff --git a/core/math/math_fieldwise.cpp b/core/math/math_fieldwise.cpp index 208f89f449..f36b228543 100644 --- a/core/math/math_fieldwise.cpp +++ b/core/math/math_fieldwise.cpp @@ -76,6 +76,7 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const return target; } + case Variant::VECTOR3I: { SETUP_TYPE(Vector3i) @@ -85,6 +86,7 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const return target; } + case Variant::VECTOR4: { SETUP_TYPE(Vector4) @@ -95,6 +97,7 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const return target; } + case Variant::VECTOR4I: { SETUP_TYPE(Vector4i) @@ -106,7 +109,6 @@ Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const return target; } - case Variant::PLANE: { SETUP_TYPE(Plane) diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h index 656fc9f798..7fa674a23d 100644 --- a/core/math/math_funcs.h +++ b/core/math/math_funcs.h @@ -267,6 +267,7 @@ public: return cubic_interpolate(from_rot, to_rot, pre_rot, post_rot, p_weight); } + static _ALWAYS_INLINE_ float cubic_interpolate_angle(float p_from, float p_to, float p_pre, float p_post, float p_weight) { float from_rot = fmod(p_from, (float)Math_TAU); @@ -293,6 +294,7 @@ public: double b2 = Math::lerp(a2, a3, p_post_t == 0 ? 1.0 : t / p_post_t); return Math::lerp(b1, b2, p_to_t == 0 ? 0.5 : t / p_to_t); } + static _ALWAYS_INLINE_ float cubic_interpolate_in_time(float p_from, float p_to, float p_pre, float p_post, float p_weight, float p_to_t, float p_pre_t, float p_post_t) { /* Barry-Goldman method */ @@ -320,6 +322,7 @@ public: return cubic_interpolate_in_time(from_rot, to_rot, pre_rot, post_rot, p_weight, p_to_t, p_pre_t, p_post_t); } + static _ALWAYS_INLINE_ float cubic_interpolate_angle_in_time(float p_from, float p_to, float p_pre, float p_post, float p_weight, float p_to_t, float p_pre_t, float p_post_t) { float from_rot = fmod(p_from, (float)Math_TAU); @@ -346,6 +349,7 @@ public: return p_start * omt3 + p_control_1 * omt2 * p_t * 3.0 + p_control_2 * omt * t2 * 3.0 + p_end * t3; } + static _ALWAYS_INLINE_ float bezier_interpolate(float p_start, float p_control_1, float p_control_2, float p_end, float p_t) { /* Formula from Wikipedia article on Bezier curves. */ float omt = (1.0f - p_t); @@ -368,11 +372,19 @@ public: return p_from + distance * p_weight; } - static _ALWAYS_INLINE_ double inverse_lerp(double p_from, double p_to, double p_value) { return (p_value - p_from) / (p_to - p_from); } - static _ALWAYS_INLINE_ float inverse_lerp(float p_from, float p_to, float p_value) { return (p_value - p_from) / (p_to - p_from); } + static _ALWAYS_INLINE_ double inverse_lerp(double p_from, double p_to, double p_value) { + return (p_value - p_from) / (p_to - p_from); + } + static _ALWAYS_INLINE_ float inverse_lerp(float p_from, float p_to, float p_value) { + return (p_value - p_from) / (p_to - p_from); + } - static _ALWAYS_INLINE_ double remap(double p_value, double p_istart, double p_istop, double p_ostart, double p_ostop) { return Math::lerp(p_ostart, p_ostop, Math::inverse_lerp(p_istart, p_istop, p_value)); } - static _ALWAYS_INLINE_ float remap(float p_value, float p_istart, float p_istop, float p_ostart, float p_ostop) { return Math::lerp(p_ostart, p_ostop, Math::inverse_lerp(p_istart, p_istop, p_value)); } + static _ALWAYS_INLINE_ double remap(double p_value, double p_istart, double p_istop, double p_ostart, double p_ostop) { + return Math::lerp(p_ostart, p_ostop, Math::inverse_lerp(p_istart, p_istop, p_value)); + } + static _ALWAYS_INLINE_ float remap(float p_value, float p_istart, float p_istop, float p_ostart, float p_ostop) { + return Math::lerp(p_ostart, p_ostop, Math::inverse_lerp(p_istart, p_istop, p_value)); + } static _ALWAYS_INLINE_ double smoothstep(double p_from, double p_to, double p_s) { if (is_equal_approx(p_from, p_to)) { @@ -388,14 +400,26 @@ public: float s = CLAMP((p_s - p_from) / (p_to - p_from), 0.0f, 1.0f); return s * s * (3.0f - 2.0f * s); } - static _ALWAYS_INLINE_ double move_toward(double p_from, double p_to, double p_delta) { return abs(p_to - p_from) <= p_delta ? p_to : p_from + SIGN(p_to - p_from) * p_delta; } - static _ALWAYS_INLINE_ float move_toward(float p_from, float p_to, float p_delta) { return abs(p_to - p_from) <= p_delta ? p_to : p_from + SIGN(p_to - p_from) * p_delta; } + static _ALWAYS_INLINE_ double move_toward(double p_from, double p_to, double p_delta) { + return abs(p_to - p_from) <= p_delta ? p_to : p_from + SIGN(p_to - p_from) * p_delta; + } + static _ALWAYS_INLINE_ float move_toward(float p_from, float p_to, float p_delta) { + return abs(p_to - p_from) <= p_delta ? p_to : p_from + SIGN(p_to - p_from) * p_delta; + } - static _ALWAYS_INLINE_ double linear_to_db(double p_linear) { return Math::log(p_linear) * 8.6858896380650365530225783783321; } - static _ALWAYS_INLINE_ float linear_to_db(float p_linear) { return Math::log(p_linear) * (float)8.6858896380650365530225783783321; } + static _ALWAYS_INLINE_ double linear_to_db(double p_linear) { + return Math::log(p_linear) * 8.6858896380650365530225783783321; + } + static _ALWAYS_INLINE_ float linear_to_db(float p_linear) { + return Math::log(p_linear) * (float)8.6858896380650365530225783783321; + } - static _ALWAYS_INLINE_ double db_to_linear(double p_db) { return Math::exp(p_db * 0.11512925464970228420089957273422); } - static _ALWAYS_INLINE_ float db_to_linear(float p_db) { return Math::exp(p_db * (float)0.11512925464970228420089957273422); } + static _ALWAYS_INLINE_ double db_to_linear(double p_db) { + return Math::exp(p_db * 0.11512925464970228420089957273422); + } + static _ALWAYS_INLINE_ float db_to_linear(float p_db) { + return Math::exp(p_db * (float)0.11512925464970228420089957273422); + } static _ALWAYS_INLINE_ double round(double p_val) { return ::round(p_val); } static _ALWAYS_INLINE_ float round(float p_val) { return ::roundf(p_val); } diff --git a/core/math/vector2i.h b/core/math/vector2i.h index 0245900a3b..e131bdea94 100644 --- a/core/math/vector2i.h +++ b/core/math/vector2i.h @@ -38,6 +38,8 @@ class String; struct Vector2; struct _NO_DISCARD_ Vector2i { + static const int AXIS_COUNT = 2; + enum Axis { AXIS_X, AXIS_Y, diff --git a/core/math/vector3i.h b/core/math/vector3i.h index 825ce40318..c6d03cd031 100644 --- a/core/math/vector3i.h +++ b/core/math/vector3i.h @@ -38,6 +38,8 @@ class String; struct Vector3; struct _NO_DISCARD_ Vector3i { + static const int AXIS_COUNT = 3; + enum Axis { AXIS_X, AXIS_Y, diff --git a/core/math/vector4.h b/core/math/vector4.h index f964264108..d89f3ddb05 100644 --- a/core/math/vector4.h +++ b/core/math/vector4.h @@ -37,6 +37,8 @@ #include "core/string/ustring.h" struct _NO_DISCARD_ Vector4 { + static const int AXIS_COUNT = 4; + enum Axis { AXIS_X, AXIS_Y, diff --git a/core/math/vector4i.h b/core/math/vector4i.h index d08e40d754..fdf33b9569 100644 --- a/core/math/vector4i.h +++ b/core/math/vector4i.h @@ -38,6 +38,8 @@ class String; struct Vector4; struct _NO_DISCARD_ Vector4i { + static const int AXIS_COUNT = 4; + enum Axis { AXIS_X, AXIS_Y, diff --git a/core/object/undo_redo.cpp b/core/object/undo_redo.cpp index d3c48853f1..aa66e86bc0 100644 --- a/core/object/undo_redo.cpp +++ b/core/object/undo_redo.cpp @@ -126,27 +126,28 @@ void UndoRedo::create_action(const String &p_name, MergeMode p_mode) { force_keep_in_merge_ends = false; } -void UndoRedo::add_do_methodp(Object *p_object, const StringName &p_method, const Variant **p_args, int p_argcount) { - ERR_FAIL_COND(p_object == nullptr); +void UndoRedo::add_do_method(const Callable &p_callable) { + ERR_FAIL_COND(p_callable.is_null()); ERR_FAIL_COND(action_level <= 0); ERR_FAIL_COND((current_action + 1) >= actions.size()); + + Object *object = p_callable.get_object(); + ERR_FAIL_NULL(object); + Operation do_op; - do_op.object = p_object->get_instance_id(); - if (Object::cast_to<RefCounted>(p_object)) { - do_op.ref = Ref<RefCounted>(Object::cast_to<RefCounted>(p_object)); + do_op.callable = p_callable; + do_op.object = p_callable.get_object_id(); + if (Object::cast_to<RefCounted>(object)) { + do_op.ref = Ref<RefCounted>(Object::cast_to<RefCounted>(object)); } - do_op.type = Operation::TYPE_METHOD; - do_op.name = p_method; + do_op.name = p_callable.get_method(); - for (int i = 0; i < p_argcount; i++) { - do_op.args.push_back(*p_args[i]); - } actions.write[current_action + 1].do_ops.push_back(do_op); } -void UndoRedo::add_undo_methodp(Object *p_object, const StringName &p_method, const Variant **p_args, int p_argcount) { - ERR_FAIL_COND(p_object == nullptr); +void UndoRedo::add_undo_method(const Callable &p_callable) { + ERR_FAIL_COND(p_callable.is_null()); ERR_FAIL_COND(action_level <= 0); ERR_FAIL_COND((current_action + 1) >= actions.size()); @@ -155,19 +156,19 @@ void UndoRedo::add_undo_methodp(Object *p_object, const StringName &p_method, co return; } + Object *object = p_callable.get_object(); + ERR_FAIL_NULL(object); + Operation undo_op; - undo_op.object = p_object->get_instance_id(); - if (Object::cast_to<RefCounted>(p_object)) { - undo_op.ref = Ref<RefCounted>(Object::cast_to<RefCounted>(p_object)); + undo_op.callable = p_callable; + undo_op.object = p_callable.get_object_id(); + if (Object::cast_to<RefCounted>(object)) { + undo_op.ref = Ref<RefCounted>(Object::cast_to<RefCounted>(object)); } - undo_op.type = Operation::TYPE_METHOD; undo_op.force_keep_in_merge_ends = force_keep_in_merge_ends; - undo_op.name = p_method; + undo_op.name = p_callable.get_method(); - for (int i = 0; i < p_argcount; i++) { - undo_op.args.push_back(*p_args[i]); - } actions.write[current_action + 1].undo_ops.push_back(undo_op); } @@ -183,7 +184,7 @@ void UndoRedo::add_do_property(Object *p_object, const StringName &p_property, c do_op.type = Operation::TYPE_PROPERTY; do_op.name = p_property; - do_op.args.push_back(p_value); + do_op.value = p_value; actions.write[current_action + 1].do_ops.push_back(do_op); } @@ -206,7 +207,7 @@ void UndoRedo::add_undo_property(Object *p_object, const StringName &p_property, undo_op.type = Operation::TYPE_PROPERTY; undo_op.force_keep_in_merge_ends = force_keep_in_merge_ends; undo_op.name = p_property; - undo_op.args.push_back(p_value); + undo_op.value = p_value; actions.write[current_action + 1].undo_ops.push_back(undo_op); } @@ -312,33 +313,42 @@ void UndoRedo::_process_operation_list(List<Operation>::Element *E) { switch (op.type) { case Operation::TYPE_METHOD: { - int argc = op.args.size(); - Vector<const Variant *> argptrs; - argptrs.resize(argc); - - for (int i = 0; i < argc; i++) { - argptrs.write[i] = &op.args[i]; - } - Callable::CallError ce; - obj->callp(op.name, (const Variant **)argptrs.ptr(), argc, ce); + Variant ret; + op.callable.callp(nullptr, 0, ret, ce); if (ce.error != Callable::CallError::CALL_OK) { - ERR_PRINT("Error calling UndoRedo method operation '" + String(op.name) + "': " + Variant::get_call_error_text(obj, op.name, (const Variant **)argptrs.ptr(), argc, ce)); + ERR_PRINT("Error calling UndoRedo method operation '" + String(op.name) + "': " + Variant::get_call_error_text(obj, op.name, nullptr, 0, ce)); } #ifdef TOOLS_ENABLED Resource *res = Object::cast_to<Resource>(obj); if (res) { res->set_edited(true); } - #endif if (method_callback) { - method_callback(method_callback_ud, obj, op.name, (const Variant **)argptrs.ptr(), argc); + Vector<Variant> binds; + if (op.callable.is_custom()) { + CallableCustomBind *ccb = dynamic_cast<CallableCustomBind *>(op.callable.get_custom()); + if (ccb) { + binds = ccb->get_binds(); + } + } + + if (binds.is_empty()) { + method_callback(method_callback_ud, obj, op.name, nullptr, 0); + } else { + const Variant **args = (const Variant **)alloca(sizeof(const Variant **) * binds.size()); + for (int i = 0; i < binds.size(); i++) { + args[i] = (const Variant *)&binds[i]; + } + + method_callback(method_callback_ud, obj, op.name, args, binds.size()); + } } } break; case Operation::TYPE_PROPERTY: { - obj->set(op.name, op.args[0]); + obj->set(op.name, op.value); #ifdef TOOLS_ENABLED Resource *res = Object::cast_to<Resource>(obj); if (res) { @@ -346,7 +356,7 @@ void UndoRedo::_process_operation_list(List<Operation>::Element *E) { } #endif if (property_callback) { - property_callback(prop_callback_ud, obj, op.name, op.args[0]); + property_callback(prop_callback_ud, obj, op.name, op.value); } } break; case Operation::TYPE_REFERENCE: { @@ -444,87 +454,13 @@ UndoRedo::~UndoRedo() { clear_history(); } -void UndoRedo::_add_do_method(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - if (p_argcount < 2) { - r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; - r_error.argument = 0; - return; - } - - if (p_args[0]->get_type() != Variant::OBJECT) { - r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument = 0; - r_error.expected = Variant::OBJECT; - return; - } - - if (p_args[1]->get_type() != Variant::STRING_NAME && p_args[1]->get_type() != Variant::STRING) { - r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument = 1; - r_error.expected = Variant::STRING_NAME; - return; - } - - r_error.error = Callable::CallError::CALL_OK; - - Object *object = *p_args[0]; - StringName method = *p_args[1]; - - add_do_methodp(object, method, p_args + 2, p_argcount - 2); -} - -void UndoRedo::_add_undo_method(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - if (p_argcount < 2) { - r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; - r_error.argument = 0; - return; - } - - if (p_args[0]->get_type() != Variant::OBJECT) { - r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument = 0; - r_error.expected = Variant::OBJECT; - return; - } - - if (p_args[1]->get_type() != Variant::STRING_NAME && p_args[1]->get_type() != Variant::STRING) { - r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument = 1; - r_error.expected = Variant::STRING_NAME; - return; - } - - r_error.error = Callable::CallError::CALL_OK; - - Object *object = *p_args[0]; - StringName method = *p_args[1]; - - add_undo_methodp(object, method, p_args + 2, p_argcount - 2); -} - 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", "execute"), &UndoRedo::commit_action, DEFVAL(true)); ClassDB::bind_method(D_METHOD("is_committing_action"), &UndoRedo::is_committing_action); - { - MethodInfo mi; - mi.name = "add_do_method"; - mi.arguments.push_back(PropertyInfo(Variant::OBJECT, "object")); - mi.arguments.push_back(PropertyInfo(Variant::STRING_NAME, "method")); - - ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "add_do_method", &UndoRedo::_add_do_method, mi, varray(), false); - } - - { - MethodInfo mi; - mi.name = "add_undo_method"; - mi.arguments.push_back(PropertyInfo(Variant::OBJECT, "object")); - mi.arguments.push_back(PropertyInfo(Variant::STRING_NAME, "method")); - - ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "add_undo_method", &UndoRedo::_add_undo_method, mi, varray(), false); - } - + ClassDB::bind_method(D_METHOD("add_do_method", "callable"), &UndoRedo::add_do_method); + ClassDB::bind_method(D_METHOD("add_undo_method", "callable"), &UndoRedo::add_undo_method); ClassDB::bind_method(D_METHOD("add_do_property", "object", "property", "value"), &UndoRedo::add_do_property); ClassDB::bind_method(D_METHOD("add_undo_property", "object", "property", "value"), &UndoRedo::add_undo_property); ClassDB::bind_method(D_METHOD("add_do_reference", "object"), &UndoRedo::add_do_reference); diff --git a/core/object/undo_redo.h b/core/object/undo_redo.h index 63cf3e5cbe..c7c58697c3 100644 --- a/core/object/undo_redo.h +++ b/core/object/undo_redo.h @@ -46,8 +46,6 @@ public: }; typedef void (*CommitNotifyCallback)(void *p_ud, const String &p_name); - void _add_do_method(const Variant **p_args, int p_argcount, Callable::CallError &r_error); - void _add_undo_method(const Variant **p_args, int p_argcount, Callable::CallError &r_error); typedef void (*MethodNotifyCallback)(void *p_ud, Object *p_base, const StringName &p_name, const Variant **p_args, int p_argcount); typedef void (*PropertyNotifyCallback)(void *p_ud, Object *p_base, const StringName &p_property, const Variant &p_value); @@ -58,14 +56,14 @@ private: TYPE_METHOD, TYPE_PROPERTY, TYPE_REFERENCE - }; + } type; - Type type; bool force_keep_in_merge_ends; Ref<RefCounted> ref; ObjectID object; StringName name; - Vector<Variant> args; + Callable callable; + Variant value; void delete_reference(); }; @@ -106,30 +104,8 @@ protected: public: void create_action(const String &p_name = "", MergeMode p_mode = MERGE_DISABLE); - void add_do_methodp(Object *p_object, const StringName &p_method, const Variant **p_args, int p_argcount); - void add_undo_methodp(Object *p_object, const StringName &p_method, const Variant **p_args, int p_argcount); - - template <typename... VarArgs> - void add_do_method(Object *p_object, const StringName &p_method, VarArgs... p_args) { - Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported. - const Variant *argptrs[sizeof...(p_args) + 1]; - for (uint32_t i = 0; i < sizeof...(p_args); i++) { - argptrs[i] = &args[i]; - } - - add_do_methodp(p_object, p_method, sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args)); - } - template <typename... VarArgs> - void add_undo_method(Object *p_object, const StringName &p_method, VarArgs... p_args) { - Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported. - const Variant *argptrs[sizeof...(p_args) + 1]; - for (uint32_t i = 0; i < sizeof...(p_args); i++) { - argptrs[i] = &args[i]; - } - - add_undo_methodp(p_object, p_method, sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args)); - } - + void add_do_method(const Callable &p_callable); + void add_undo_method(const Callable &p_callable); void add_do_property(Object *p_object, const StringName &p_property, const Variant &p_value); void add_undo_property(Object *p_object, const StringName &p_property, const Variant &p_value); void add_do_reference(Object *p_object); diff --git a/core/os/keyboard.cpp b/core/os/keyboard.cpp index a592791d06..f3be495c8e 100644 --- a/core/os/keyboard.cpp +++ b/core/os/keyboard.cpp @@ -61,12 +61,16 @@ static const _KeyCodeText _keycodes[] = { {Key::PAGEDOWN ,"PageDown"}, {Key::SHIFT ,"Shift"}, {Key::CTRL ,"Ctrl"}, -#ifdef MACOS_ENABLED +#if defined(MACOS_ENABLED) {Key::META ,"Command"}, + {Key::ALT ,"Option"}, +#elif defined(WINDOWS_ENABLED) + {Key::META ,"Windows"}, + {Key::ALT ,"Alt"}, #else {Key::META ,"Meta"}, -#endif {Key::ALT ,"Alt"}, +#endif {Key::CAPSLOCK ,"CapsLock"}, {Key::NUMLOCK ,"NumLock"}, {Key::SCROLLLOCK ,"ScrollLock"}, @@ -437,6 +441,14 @@ String keycode_get_string(Key p_code) { codestr += find_keycode_name(Key::ALT); codestr += "+"; } + if ((p_code & KeyModifierMask::CMD_OR_CTRL) != Key::NONE) { +#ifdef MACOS_ENABLED + codestr += find_keycode_name(Key::META); +#else + codestr += find_keycode_name(Key::CTRL); +#endif + codestr += "+"; + } if ((p_code & KeyModifierMask::CTRL) != Key::NONE) { codestr += find_keycode_name(Key::CTRL); codestr += "+"; diff --git a/core/os/keyboard.h b/core/os/keyboard.h index 29418049cb..e5d9b24e85 100644 --- a/core/os/keyboard.h +++ b/core/os/keyboard.h @@ -36,11 +36,11 @@ enum class Key { NONE = 0, // Special key: The strategy here is similar to the one used by toolkits, - // which consists in leaving the 24 bits unicode range for printable - // characters, and use the upper 8 bits for special keys and modifiers. + // which consists in leaving the 21 bits unicode range for printable + // characters, and use the upper 11 bits for special keys and modifiers. // This way everything (char/keycode) can fit nicely in one 32-bit // integer (the enum's underlying type is `int` by default). - SPECIAL = (1 << 24), + SPECIAL = (1 << 22), /* CURSOR/FUNCTION/BROWSER/MULTIMEDIA/MISC KEYS */ ESCAPE = SPECIAL | 0x01, TAB = SPECIAL | 0x02, @@ -312,17 +312,14 @@ enum class Key { }; enum class KeyModifierMask { - CODE_MASK = ((1 << 25) - 1), ///< Apply this mask to any keycode to remove modifiers. - MODIFIER_MASK = (0x7F << 24), ///< Apply this mask to isolate modifiers. + CODE_MASK = ((1 << 23) - 1), ///< Apply this mask to any keycode to remove modifiers. + MODIFIER_MASK = (0x7F << 22), ///< Apply this mask to isolate modifiers. + //RESERVED = (1 << 23), + CMD_OR_CTRL = (1 << 24), SHIFT = (1 << 25), ALT = (1 << 26), META = (1 << 27), CTRL = (1 << 28), -#ifdef APPLE_STYLE_KEYS - CMD = META, -#else - CMD = CTRL, -#endif KPAD = (1 << 29), GROUP_SWITCH = (1 << 30) }; diff --git a/core/os/os.h b/core/os/os.h index 0e8a2d0398..0f79ff1a23 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -69,6 +69,7 @@ class OS { // so we can retrieve the rendering drivers available int _display_driver_id = -1; String _current_rendering_driver_name; + String _current_rendering_method; protected: void _set_logger(CompositeLogger *p_logger); @@ -98,6 +99,8 @@ protected: virtual void initialize_joypads() = 0; void set_current_rendering_driver_name(String p_driver_name) { _current_rendering_driver_name = p_driver_name; } + void set_current_rendering_method(String p_name) { _current_rendering_method = p_name; } + void set_display_driver_id(int p_display_driver_id) { _display_driver_id = p_display_driver_id; } virtual void set_main_loop(MainLoop *p_main_loop) = 0; @@ -116,6 +119,8 @@ public: static OS *get_singleton(); String get_current_rendering_driver_name() const { return _current_rendering_driver_name; } + String get_current_rendering_method() const { return _current_rendering_method; } + int get_display_driver_id() const { return _display_driver_id; } void print_error(const char *p_function, const char *p_file, int p_line, const char *p_code, const char *p_rationale, bool p_editor_notify = false, Logger::ErrorType p_type = Logger::ERR_ERROR); @@ -161,6 +166,8 @@ public: virtual bool set_environment(const String &p_var, const String &p_value) const = 0; virtual String get_name() const = 0; + virtual String get_distribution_name() const = 0; + virtual String get_version() const = 0; virtual List<String> get_cmdline_args() const { return _cmdline; } virtual List<String> get_cmdline_user_args() const { return _user_args; } virtual List<String> get_cmdline_platform_args() const { return List<String>(); } @@ -202,18 +209,15 @@ public: MONTH_DECEMBER, }; - struct Date { + struct DateTime { int64_t year; Month month; uint8_t day; Weekday weekday; - bool dst; - }; - - struct Time { uint8_t hour; uint8_t minute; uint8_t second; + bool dst; }; struct TimeZoneInfo { @@ -221,8 +225,7 @@ public: String name; }; - virtual Date get_date(bool p_utc = false) const = 0; - virtual Time get_time(bool p_utc = false) const = 0; + virtual DateTime get_datetime(bool utc = false) const = 0; virtual TimeZoneInfo get_time_zone_info() const = 0; virtual double get_unix_time() const; diff --git a/core/os/time.cpp b/core/os/time.cpp index a30e2a906b..a3c2c99b4c 100644 --- a/core/os/time.cpp +++ b/core/os/time.cpp @@ -324,63 +324,60 @@ String Time::get_offset_string_from_offset_minutes(int64_t p_offset_minutes) con } Dictionary Time::get_datetime_dict_from_system(bool p_utc) const { - OS::Date date = OS::get_singleton()->get_date(p_utc); - OS::Time time = OS::get_singleton()->get_time(p_utc); + OS::DateTime dt = OS::get_singleton()->get_datetime(p_utc); Dictionary datetime; - datetime[YEAR_KEY] = date.year; - datetime[MONTH_KEY] = (uint8_t)date.month; - datetime[DAY_KEY] = date.day; - datetime[WEEKDAY_KEY] = (uint8_t)date.weekday; - datetime[DST_KEY] = date.dst; - datetime[HOUR_KEY] = time.hour; - datetime[MINUTE_KEY] = time.minute; - datetime[SECOND_KEY] = time.second; + datetime[YEAR_KEY] = dt.year; + datetime[MONTH_KEY] = (uint8_t)dt.month; + datetime[DAY_KEY] = dt.day; + datetime[WEEKDAY_KEY] = (uint8_t)dt.weekday; + datetime[HOUR_KEY] = dt.hour; + datetime[MINUTE_KEY] = dt.minute; + datetime[SECOND_KEY] = dt.second; + datetime[DST_KEY] = dt.dst; return datetime; } Dictionary Time::get_date_dict_from_system(bool p_utc) const { - OS::Date date = OS::get_singleton()->get_date(p_utc); + OS::DateTime dt = OS::get_singleton()->get_datetime(p_utc); Dictionary date_dictionary; - date_dictionary[YEAR_KEY] = date.year; - date_dictionary[MONTH_KEY] = (uint8_t)date.month; - date_dictionary[DAY_KEY] = date.day; - date_dictionary[WEEKDAY_KEY] = (uint8_t)date.weekday; - date_dictionary[DST_KEY] = date.dst; + date_dictionary[YEAR_KEY] = dt.year; + date_dictionary[MONTH_KEY] = (uint8_t)dt.month; + date_dictionary[DAY_KEY] = dt.day; + date_dictionary[WEEKDAY_KEY] = (uint8_t)dt.weekday; return date_dictionary; } Dictionary Time::get_time_dict_from_system(bool p_utc) const { - OS::Time time = OS::get_singleton()->get_time(p_utc); + OS::DateTime dt = OS::get_singleton()->get_datetime(p_utc); Dictionary time_dictionary; - time_dictionary[HOUR_KEY] = time.hour; - time_dictionary[MINUTE_KEY] = time.minute; - time_dictionary[SECOND_KEY] = time.second; + time_dictionary[HOUR_KEY] = dt.hour; + time_dictionary[MINUTE_KEY] = dt.minute; + time_dictionary[SECOND_KEY] = dt.second; return time_dictionary; } String Time::get_datetime_string_from_system(bool p_utc, bool p_use_space) const { - OS::Date date = OS::get_singleton()->get_date(p_utc); - OS::Time time = OS::get_singleton()->get_time(p_utc); + OS::DateTime dt = OS::get_singleton()->get_datetime(p_utc); // vformat only supports up to 6 arguments, so we need to split this up into 2 parts. - String timestamp = vformat("%04d-%02d-%02d", date.year, (uint8_t)date.month, date.day); + String timestamp = vformat("%04d-%02d-%02d", dt.year, (uint8_t)dt.month, dt.day); if (p_use_space) { - timestamp = vformat("%s %02d:%02d:%02d", timestamp, time.hour, time.minute, time.second); + timestamp = vformat("%s %02d:%02d:%02d", timestamp, dt.hour, dt.minute, dt.second); } else { - timestamp = vformat("%sT%02d:%02d:%02d", timestamp, time.hour, time.minute, time.second); + timestamp = vformat("%sT%02d:%02d:%02d", timestamp, dt.hour, dt.minute, dt.second); } return timestamp; } String Time::get_date_string_from_system(bool p_utc) const { - OS::Date date = OS::get_singleton()->get_date(p_utc); + OS::DateTime dt = OS::get_singleton()->get_datetime(p_utc); // Android is picky about the types passed to make Variant, so we need a cast. - return vformat("%04d-%02d-%02d", date.year, (uint8_t)date.month, date.day); + return vformat("%04d-%02d-%02d", dt.year, (uint8_t)dt.month, dt.day); } String Time::get_time_string_from_system(bool p_utc) const { - OS::Time time = OS::get_singleton()->get_time(p_utc); - return vformat("%02d:%02d:%02d", time.hour, time.minute, time.second); + OS::DateTime dt = OS::get_singleton()->get_datetime(p_utc); + return vformat("%02d:%02d:%02d", dt.hour, dt.minute, dt.second); } Dictionary Time::get_time_zone_from_system() const { diff --git a/core/register_core_types.cpp b/core/register_core_types.cpp index 1b3f11ffab..bad53ab4e6 100644 --- a/core/register_core_types.cpp +++ b/core/register_core_types.cpp @@ -58,6 +58,7 @@ #include "core/io/resource_format_binary.h" #include "core/io/resource_importer.h" #include "core/io/resource_uid.h" +#include "core/io/stream_peer_gzip.h" #include "core/io/stream_peer_tls.h" #include "core/io/tcp_server.h" #include "core/io/translation_loader_po.h" @@ -87,6 +88,8 @@ static Ref<TranslationLoaderPO> resource_format_po; static Ref<ResourceFormatSaverCrypto> resource_format_saver_crypto; static Ref<ResourceFormatLoaderCrypto> resource_format_loader_crypto; static Ref<NativeExtensionResourceLoader> resource_loader_native_extension; +static Ref<ResourceFormatSaverJSON> resource_saver_json; +static Ref<ResourceFormatLoaderJSON> resource_loader_json; static core_bind::ResourceLoader *_resource_loader = nullptr; static core_bind::ResourceSaver *_resource_saver = nullptr; @@ -182,6 +185,7 @@ void register_core_types() { GDREGISTER_ABSTRACT_CLASS(StreamPeer); GDREGISTER_CLASS(StreamPeerExtension); GDREGISTER_CLASS(StreamPeerBuffer); + GDREGISTER_CLASS(StreamPeerGZIP); GDREGISTER_CLASS(StreamPeerTCP); GDREGISTER_CLASS(TCPServer); @@ -211,6 +215,12 @@ void register_core_types() { resource_format_loader_crypto.instantiate(); ResourceLoader::add_resource_format_loader(resource_format_loader_crypto); + resource_loader_json.instantiate(); + ResourceLoader::add_resource_format_loader(resource_loader_json); + + resource_saver_json.instantiate(); + ResourceSaver::add_resource_format_saver(resource_saver_json); + GDREGISTER_CLASS(MainLoop); GDREGISTER_CLASS(Translation); GDREGISTER_CLASS(OptimizedTranslation); @@ -220,8 +230,8 @@ void register_core_types() { GDREGISTER_CLASS(ResourceFormatLoader); GDREGISTER_CLASS(ResourceFormatSaver); - GDREGISTER_CLASS(core_bind::File); - GDREGISTER_CLASS(core_bind::Directory); + GDREGISTER_ABSTRACT_CLASS(FileAccess); + GDREGISTER_ABSTRACT_CLASS(DirAccess); GDREGISTER_CLASS(core_bind::Thread); GDREGISTER_CLASS(core_bind::Mutex); GDREGISTER_CLASS(core_bind::Semaphore); @@ -241,6 +251,8 @@ void register_core_types() { GDREGISTER_CLASS(EncodedObjectAsID); GDREGISTER_CLASS(RandomNumberGenerator); + GDREGISTER_ABSTRACT_CLASS(ImageFormatLoader); + GDREGISTER_CLASS(ImageFormatLoaderExtension); GDREGISTER_ABSTRACT_CLASS(ResourceImporter); GDREGISTER_CLASS(NativeExtension); @@ -284,8 +296,8 @@ void register_core_settings() { ProjectSettings::get_singleton()->set_custom_property_info("network/limits/tcp/connect_timeout_seconds", PropertyInfo(Variant::INT, "network/limits/tcp/connect_timeout_seconds", PROPERTY_HINT_RANGE, "1,1800,1")); GLOBAL_DEF_RST("network/limits/packet_peer_stream/max_buffer_po2", (16)); ProjectSettings::get_singleton()->set_custom_property_info("network/limits/packet_peer_stream/max_buffer_po2", PropertyInfo(Variant::INT, "network/limits/packet_peer_stream/max_buffer_po2", PROPERTY_HINT_RANGE, "0,64,1,or_greater")); - GLOBAL_DEF("network/ssl/certificate_bundle_override", ""); - ProjectSettings::get_singleton()->set_custom_property_info("network/ssl/certificate_bundle_override", PropertyInfo(Variant::STRING, "network/ssl/certificate_bundle_override", PROPERTY_HINT_FILE, "*.crt")); + GLOBAL_DEF("network/tls/certificate_bundle_override", ""); + ProjectSettings::get_singleton()->set_custom_property_info("network/tls/certificate_bundle_override", PropertyInfo(Variant::STRING, "network/tls/certificate_bundle_override", PROPERTY_HINT_FILE, "*.crt")); int worker_threads = GLOBAL_DEF("threading/worker_pool/max_threads", -1); bool low_priority_use_system_threads = GLOBAL_DEF("threading/worker_pool/use_system_threads_for_low_priority_tasks", true); @@ -387,6 +399,12 @@ void unregister_core_types() { ResourceLoader::remove_resource_format_loader(resource_format_loader_crypto); resource_format_loader_crypto.unref(); + ResourceSaver::remove_resource_format_saver(resource_saver_json); + resource_saver_json.unref(); + + ResourceLoader::remove_resource_format_loader(resource_loader_json); + resource_loader_json.unref(); + if (ip) { memdelete(ip); } diff --git a/core/string/locales.h b/core/string/locales.h index 32d6608ec2..0ccb17a436 100644 --- a/core/string/locales.h +++ b/core/string/locales.h @@ -1072,6 +1072,7 @@ static const char *script_list[][2] = { { "Jurchen", "Jurc" }, { "Kayah Li", "Kali" }, { "Katakana", "Kana" }, + { "Kawi", "Kawi" }, { "Kharoshthi", "Khar" }, { "Khmer", "Khmr" }, { "Khojki", "Khoj" }, @@ -1110,6 +1111,7 @@ static const char *script_list[][2] = { { "Meitei Mayek", "Mtei" }, { "Multani", "Mult" }, { "Myanmar (Burmese)", "Mymr" }, + { "​Nag Mundari", "Nagm" }, { "Nandinagari", "Nand" }, { "Old North Arabian", "Narb" }, { "Nabataean", "Nbat" }, diff --git a/core/variant/variant.cpp b/core/variant/variant.cpp index b280fc9fe3..f24ffeb1a9 100644 --- a/core/variant/variant.cpp +++ b/core/variant/variant.cpp @@ -3727,36 +3727,6 @@ String Variant::get_callable_error_text(const Callable &p_callable, const Varian return get_call_error_text(p_callable.get_object(), p_callable.get_method(), p_argptrs, p_argcount, ce); } -String vformat(const String &p_text, const Variant &p1, const Variant &p2, const Variant &p3, const Variant &p4, const Variant &p5) { - Array args; - if (p1.get_type() != Variant::NIL) { - args.push_back(p1); - - if (p2.get_type() != Variant::NIL) { - args.push_back(p2); - - if (p3.get_type() != Variant::NIL) { - args.push_back(p3); - - if (p4.get_type() != Variant::NIL) { - args.push_back(p4); - - if (p5.get_type() != Variant::NIL) { - args.push_back(p5); - } - } - } - } - } - - bool error = false; - String fmt = p_text.sprintf(args, &error); - - ERR_FAIL_COND_V_MSG(error, String(), fmt); - - return fmt; -} - void Variant::register_types() { _register_variant_operators(); _register_variant_methods(); diff --git a/core/variant/variant.h b/core/variant/variant.h index 212f94a9a8..b0738e7d44 100644 --- a/core/variant/variant.h +++ b/core/variant/variant.h @@ -552,9 +552,6 @@ public: void zero(); Variant duplicate(bool p_deep = false) const; Variant recursive_duplicate(bool p_deep, int recursion_count) const; - static void blend(const Variant &a, const Variant &b, float c, Variant &r_dst); - static void interpolate(const Variant &a, const Variant &b, float c, Variant &r_dst); - static void sub(const Variant &a, const Variant &b, Variant &r_dst); /* Built-In Methods */ @@ -807,7 +804,22 @@ const Variant::ObjData &Variant::_get_obj() const { return *reinterpret_cast<const ObjData *>(&_data._mem[0]); } -String vformat(const String &p_text, const Variant &p1 = Variant(), const Variant &p2 = Variant(), const Variant &p3 = Variant(), const Variant &p4 = Variant(), const Variant &p5 = Variant()); +template <typename... VarArgs> +String vformat(const String &p_text, const VarArgs... p_args) { + Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported. + Array args_array; + args_array.resize(sizeof...(p_args)); + for (uint32_t i = 0; i < sizeof...(p_args); i++) { + args_array[i] = args[i]; + } + + bool error = false; + String fmt = p_text.sprintf(args_array, &error); + + ERR_FAIL_COND_V_MSG(error, String(), fmt); + + return fmt; +} template <typename... VarArgs> Callable Callable::bind(VarArgs... p_args) { diff --git a/core/variant/variant_setget.cpp b/core/variant/variant_setget.cpp index 57b953f7f0..ff67b187ef 100644 --- a/core/variant/variant_setget.cpp +++ b/core/variant/variant_setget.cpp @@ -1911,572 +1911,6 @@ Variant Variant::recursive_duplicate(bool p_deep, int recursion_count) const { } } -void Variant::sub(const Variant &a, const Variant &b, Variant &r_dst) { - if (a.type != b.type) { - return; - } - - switch (a.type) { - case NIL: { - r_dst = Variant(); - } - return; - case INT: { - int64_t va = a._data._int; - int64_t vb = b._data._int; - r_dst = int(va - vb); - } - return; - case FLOAT: { - double ra = a._data._float; - double rb = b._data._float; - r_dst = ra - rb; - } - return; - case VECTOR2: { - r_dst = *reinterpret_cast<const Vector2 *>(a._data._mem) - *reinterpret_cast<const Vector2 *>(b._data._mem); - } - return; - case VECTOR2I: { - int32_t vax = reinterpret_cast<const Vector2i *>(a._data._mem)->x; - int32_t vbx = reinterpret_cast<const Vector2i *>(b._data._mem)->x; - int32_t vay = reinterpret_cast<const Vector2i *>(a._data._mem)->y; - int32_t vby = reinterpret_cast<const Vector2i *>(b._data._mem)->y; - r_dst = Vector2i(int32_t(vax - vbx), int32_t(vay - vby)); - } - return; - case RECT2: { - const Rect2 *ra = reinterpret_cast<const Rect2 *>(a._data._mem); - const Rect2 *rb = reinterpret_cast<const Rect2 *>(b._data._mem); - r_dst = Rect2(ra->position - rb->position, ra->size - rb->size); - } - return; - case RECT2I: { - const Rect2i *ra = reinterpret_cast<const Rect2i *>(a._data._mem); - const Rect2i *rb = reinterpret_cast<const Rect2i *>(b._data._mem); - - int32_t vax = ra->position.x; - int32_t vay = ra->position.y; - int32_t vbx = ra->size.x; - int32_t vby = ra->size.y; - int32_t vcx = rb->position.x; - int32_t vcy = rb->position.y; - int32_t vdx = rb->size.x; - int32_t vdy = rb->size.y; - - r_dst = Rect2i(int32_t(vax - vbx), int32_t(vay - vby), int32_t(vcx - vdx), int32_t(vcy - vdy)); - } - return; - case VECTOR3: { - r_dst = *reinterpret_cast<const Vector3 *>(a._data._mem) - *reinterpret_cast<const Vector3 *>(b._data._mem); - } - return; - case VECTOR3I: { - int32_t vax = reinterpret_cast<const Vector3i *>(a._data._mem)->x; - int32_t vbx = reinterpret_cast<const Vector3i *>(b._data._mem)->x; - int32_t vay = reinterpret_cast<const Vector3i *>(a._data._mem)->y; - int32_t vby = reinterpret_cast<const Vector3i *>(b._data._mem)->y; - int32_t vaz = reinterpret_cast<const Vector3i *>(a._data._mem)->z; - int32_t vbz = reinterpret_cast<const Vector3i *>(b._data._mem)->z; - r_dst = Vector3i(int32_t(vax - vbx), int32_t(vay - vby), int32_t(vaz - vbz)); - } - return; - case AABB: { - const ::AABB *ra = reinterpret_cast<const ::AABB *>(a._data._mem); - const ::AABB *rb = reinterpret_cast<const ::AABB *>(b._data._mem); - r_dst = ::AABB(ra->position - rb->position, ra->size - rb->size); - } - return; - case QUATERNION: { - Quaternion empty_rot; - const Quaternion *qa = reinterpret_cast<const Quaternion *>(a._data._mem); - const Quaternion *qb = reinterpret_cast<const Quaternion *>(b._data._mem); - r_dst = (*qb).inverse() * *qa; - } - return; - case COLOR: { - const Color *ca = reinterpret_cast<const Color *>(a._data._mem); - const Color *cb = reinterpret_cast<const Color *>(b._data._mem); - float new_r = ca->r - cb->r; - float new_g = ca->g - cb->g; - float new_b = ca->b - cb->b; - float new_a = ca->a - cb->a; - new_r = new_r > 1.0 ? 1.0 : new_r; - new_g = new_g > 1.0 ? 1.0 : new_g; - new_b = new_b > 1.0 ? 1.0 : new_b; - new_a = new_a > 1.0 ? 1.0 : new_a; - r_dst = Color(new_r, new_g, new_b, new_a); - } - return; - default: { - r_dst = a; - } - return; - } -} - -void Variant::blend(const Variant &a, const Variant &b, float c, Variant &r_dst) { - if (a.type != b.type) { - if (a.is_num() && b.is_num()) { - real_t va = a; - real_t vb = b; - r_dst = va + vb * c; - } else { - r_dst = a; - } - return; - } - - switch (a.type) { - case NIL: { - r_dst = Variant(); - } - return; - case INT: { - int64_t va = a._data._int; - int64_t vb = b._data._int; - r_dst = int(va + vb * c + 0.5); - } - return; - case FLOAT: { - double ra = a._data._float; - double rb = b._data._float; - r_dst = ra + rb * c; - } - return; - case VECTOR2: { - r_dst = *reinterpret_cast<const Vector2 *>(a._data._mem) + *reinterpret_cast<const Vector2 *>(b._data._mem) * c; - } - return; - case VECTOR2I: { - int32_t vax = reinterpret_cast<const Vector2i *>(a._data._mem)->x; - int32_t vbx = reinterpret_cast<const Vector2i *>(b._data._mem)->x; - int32_t vay = reinterpret_cast<const Vector2i *>(a._data._mem)->y; - int32_t vby = reinterpret_cast<const Vector2i *>(b._data._mem)->y; - r_dst = Vector2i(int32_t(vax + vbx * c + 0.5), int32_t(vay + vby * c + 0.5)); - } - return; - case RECT2: { - const Rect2 *ra = reinterpret_cast<const Rect2 *>(a._data._mem); - const Rect2 *rb = reinterpret_cast<const Rect2 *>(b._data._mem); - r_dst = Rect2(ra->position + rb->position * c, ra->size + rb->size * c); - } - return; - case RECT2I: { - const Rect2i *ra = reinterpret_cast<const Rect2i *>(a._data._mem); - const Rect2i *rb = reinterpret_cast<const Rect2i *>(b._data._mem); - - int32_t vax = ra->position.x; - int32_t vay = ra->position.y; - int32_t vbx = ra->size.x; - int32_t vby = ra->size.y; - int32_t vcx = rb->position.x; - int32_t vcy = rb->position.y; - int32_t vdx = rb->size.x; - int32_t vdy = rb->size.y; - - r_dst = Rect2i(int32_t(vax + vbx * c + 0.5), int32_t(vay + vby * c + 0.5), int32_t(vcx + vdx * c + 0.5), int32_t(vcy + vdy * c + 0.5)); - } - return; - case VECTOR3: { - r_dst = *reinterpret_cast<const Vector3 *>(a._data._mem) + *reinterpret_cast<const Vector3 *>(b._data._mem) * c; - } - return; - case VECTOR3I: { - int32_t vax = reinterpret_cast<const Vector3i *>(a._data._mem)->x; - int32_t vbx = reinterpret_cast<const Vector3i *>(b._data._mem)->x; - int32_t vay = reinterpret_cast<const Vector3i *>(a._data._mem)->y; - int32_t vby = reinterpret_cast<const Vector3i *>(b._data._mem)->y; - int32_t vaz = reinterpret_cast<const Vector3i *>(a._data._mem)->z; - int32_t vbz = reinterpret_cast<const Vector3i *>(b._data._mem)->z; - r_dst = Vector3i(int32_t(vax + vbx * c + 0.5), int32_t(vay + vby * c + 0.5), int32_t(vaz + vbz * c + 0.5)); - } - return; - case AABB: { - const ::AABB *ra = reinterpret_cast<const ::AABB *>(a._data._mem); - const ::AABB *rb = reinterpret_cast<const ::AABB *>(b._data._mem); - r_dst = ::AABB(ra->position + rb->position * c, ra->size + rb->size * c); - } - return; - case QUATERNION: { - Quaternion empty_rot; - const Quaternion *qa = reinterpret_cast<const Quaternion *>(a._data._mem); - const Quaternion *qb = reinterpret_cast<const Quaternion *>(b._data._mem); - r_dst = *qa * empty_rot.slerp(*qb, c); - } - return; - case COLOR: { - const Color *ca = reinterpret_cast<const Color *>(a._data._mem); - const Color *cb = reinterpret_cast<const Color *>(b._data._mem); - float new_r = ca->r + cb->r * c; - float new_g = ca->g + cb->g * c; - float new_b = ca->b + cb->b * c; - float new_a = ca->a + cb->a * c; - new_r = new_r > 1.0 ? 1.0 : new_r; - new_g = new_g > 1.0 ? 1.0 : new_g; - new_b = new_b > 1.0 ? 1.0 : new_b; - new_a = new_a > 1.0 ? 1.0 : new_a; - r_dst = Color(new_r, new_g, new_b, new_a); - } - return; - default: { - r_dst = c < 0.5 ? a : b; - } - return; - } -} - -void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &r_dst) { - if (a.type != b.type) { - if (a.is_num() && b.is_num()) { - //not as efficient but.. - real_t va = a; - real_t vb = b; - r_dst = va + (vb - va) * c; - - } else { - r_dst = a; - } - return; - } - - switch (a.type) { - case NIL: { - r_dst = Variant(); - } - return; - case BOOL: { - r_dst = a; - } - return; - case INT: { - int64_t va = a._data._int; - int64_t vb = b._data._int; - r_dst = int(va + (vb - va) * c); - } - return; - case FLOAT: { - real_t va = a._data._float; - real_t vb = b._data._float; - r_dst = va + (vb - va) * c; - } - return; - case STRING: { - //this is pretty funny and bizarre, but artists like to use it for typewriter effects - String sa = *reinterpret_cast<const String *>(a._data._mem); - String sb = *reinterpret_cast<const String *>(b._data._mem); - String dst; - int sa_len = sa.length(); - int sb_len = sb.length(); - int csize = sa_len + (sb_len - sa_len) * c; - if (csize == 0) { - r_dst = ""; - return; - } - dst.resize(csize + 1); - dst[csize] = 0; - int split = csize / 2; - - for (int i = 0; i < csize; i++) { - char32_t chr = ' '; - - if (i < split) { - if (i < sa.length()) { - chr = sa[i]; - } else if (i < sb.length()) { - chr = sb[i]; - } - - } else { - if (i < sb.length()) { - chr = sb[i]; - } else if (i < sa.length()) { - chr = sa[i]; - } - } - - dst[i] = chr; - } - - r_dst = dst; - } - return; - case VECTOR2: { - r_dst = reinterpret_cast<const Vector2 *>(a._data._mem)->lerp(*reinterpret_cast<const Vector2 *>(b._data._mem), c); - } - return; - case VECTOR2I: { - int32_t vax = reinterpret_cast<const Vector2i *>(a._data._mem)->x; - int32_t vbx = reinterpret_cast<const Vector2i *>(b._data._mem)->x; - int32_t vay = reinterpret_cast<const Vector2i *>(a._data._mem)->y; - int32_t vby = reinterpret_cast<const Vector2i *>(b._data._mem)->y; - r_dst = Vector2i(int32_t(vax + vbx * c + 0.5), int32_t(vay + vby * c + 0.5)); - } - return; - - case RECT2: { - 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: { - const Rect2i *ra = reinterpret_cast<const Rect2i *>(a._data._mem); - const Rect2i *rb = reinterpret_cast<const Rect2i *>(b._data._mem); - - int32_t vax = ra->position.x; - int32_t vay = ra->position.y; - int32_t vbx = ra->size.x; - int32_t vby = ra->size.y; - int32_t vcx = rb->position.x; - int32_t vcy = rb->position.y; - int32_t vdx = rb->size.x; - int32_t vdy = rb->size.y; - - r_dst = Rect2i(int32_t(vax + vbx * c + 0.5), int32_t(vay + vby * c + 0.5), int32_t(vcx + vdx * c + 0.5), int32_t(vcy + vdy * c + 0.5)); - } - return; - - case VECTOR3: { - r_dst = reinterpret_cast<const Vector3 *>(a._data._mem)->lerp(*reinterpret_cast<const Vector3 *>(b._data._mem), c); - } - return; - case VECTOR3I: { - int32_t vax = reinterpret_cast<const Vector3i *>(a._data._mem)->x; - int32_t vbx = reinterpret_cast<const Vector3i *>(b._data._mem)->x; - int32_t vay = reinterpret_cast<const Vector3i *>(a._data._mem)->y; - int32_t vby = reinterpret_cast<const Vector3i *>(b._data._mem)->y; - int32_t vaz = reinterpret_cast<const Vector3i *>(a._data._mem)->z; - int32_t vbz = reinterpret_cast<const Vector3i *>(b._data._mem)->z; - r_dst = Vector3i(int32_t(vax + vbx * c + 0.5), int32_t(vay + vby * c + 0.5), int32_t(vaz + vbz * c + 0.5)); - } - return; - - case TRANSFORM2D: { - r_dst = a._data._transform2d->interpolate_with(*b._data._transform2d, c); - } - return; - case PLANE: { - r_dst = a; - } - return; - case QUATERNION: { - r_dst = reinterpret_cast<const Quaternion *>(a._data._mem)->slerp(*reinterpret_cast<const Quaternion *>(b._data._mem), c); - } - return; - case AABB: { - 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: { - r_dst = a._data._basis->lerp(*b._data._basis, c); - } - return; - case TRANSFORM3D: { - r_dst = a._data._transform3d->interpolate_with(*b._data._transform3d, c); - } - return; - case COLOR: { - r_dst = reinterpret_cast<const Color *>(a._data._mem)->lerp(*reinterpret_cast<const Color *>(b._data._mem), c); - } - return; - case STRING_NAME: { - r_dst = a; - } - return; - case NODE_PATH: { - r_dst = a; - } - return; - case RID: { - r_dst = a; - } - return; - case OBJECT: { - r_dst = a; - } - return; - case DICTIONARY: { - } - return; - case ARRAY: { - r_dst = a; - } - return; - case PACKED_BYTE_ARRAY: { - r_dst = a; - } - return; - case PACKED_INT32_ARRAY: { - const Vector<int32_t> *arr_a = &PackedArrayRef<int32_t>::get_array(a._data.packed_array); - const Vector<int32_t> *arr_b = &PackedArrayRef<int32_t>::get_array(b._data.packed_array); - int32_t sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<int32_t> v; - v.resize(sz); - { - int32_t *vw = v.ptrw(); - const int32_t *ar = arr_a->ptr(); - const int32_t *br = arr_b->ptr(); - - Variant va; - for (int32_t i = 0; i < sz; i++) { - Variant::interpolate(ar[i], br[i], c, va); - vw[i] = va; - } - } - r_dst = v; - } - } - return; - case PACKED_INT64_ARRAY: { - const Vector<int64_t> *arr_a = &PackedArrayRef<int64_t>::get_array(a._data.packed_array); - const Vector<int64_t> *arr_b = &PackedArrayRef<int64_t>::get_array(b._data.packed_array); - int64_t sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<int64_t> v; - v.resize(sz); - { - int64_t *vw = v.ptrw(); - const int64_t *ar = arr_a->ptr(); - const int64_t *br = arr_b->ptr(); - - Variant va; - for (int64_t i = 0; i < sz; i++) { - Variant::interpolate(ar[i], br[i], c, va); - vw[i] = va; - } - } - r_dst = v; - } - } - return; - case PACKED_FLOAT32_ARRAY: { - const Vector<float> *arr_a = &PackedArrayRef<float>::get_array(a._data.packed_array); - const Vector<float> *arr_b = &PackedArrayRef<float>::get_array(b._data.packed_array); - int sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<float> v; - v.resize(sz); - { - float *vw = v.ptrw(); - const float *ar = arr_a->ptr(); - const float *br = arr_b->ptr(); - - Variant va; - for (int i = 0; i < sz; i++) { - Variant::interpolate(ar[i], br[i], c, va); - vw[i] = va; - } - } - r_dst = v; - } - } - return; - case PACKED_FLOAT64_ARRAY: { - const Vector<double> *arr_a = &PackedArrayRef<double>::get_array(a._data.packed_array); - const Vector<double> *arr_b = &PackedArrayRef<double>::get_array(b._data.packed_array); - int sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<double> v; - v.resize(sz); - { - double *vw = v.ptrw(); - const double *ar = arr_a->ptr(); - const double *br = arr_b->ptr(); - - Variant va; - for (int i = 0; i < sz; i++) { - Variant::interpolate(ar[i], br[i], c, va); - vw[i] = va; - } - } - r_dst = v; - } - } - return; - case PACKED_STRING_ARRAY: { - r_dst = a; - } - return; - case PACKED_VECTOR2_ARRAY: { - const Vector<Vector2> *arr_a = &PackedArrayRef<Vector2>::get_array(a._data.packed_array); - const Vector<Vector2> *arr_b = &PackedArrayRef<Vector2>::get_array(b._data.packed_array); - int sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<Vector2> v; - v.resize(sz); - { - Vector2 *vw = v.ptrw(); - const Vector2 *ar = arr_a->ptr(); - const Vector2 *br = arr_b->ptr(); - - for (int i = 0; i < sz; i++) { - vw[i] = ar[i].lerp(br[i], c); - } - } - r_dst = v; - } - } - return; - case PACKED_VECTOR3_ARRAY: { - const Vector<Vector3> *arr_a = &PackedArrayRef<Vector3>::get_array(a._data.packed_array); - const Vector<Vector3> *arr_b = &PackedArrayRef<Vector3>::get_array(b._data.packed_array); - int sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<Vector3> v; - v.resize(sz); - { - Vector3 *vw = v.ptrw(); - const Vector3 *ar = arr_a->ptr(); - const Vector3 *br = arr_b->ptr(); - - for (int i = 0; i < sz; i++) { - vw[i] = ar[i].lerp(br[i], c); - } - } - r_dst = v; - } - } - return; - case PACKED_COLOR_ARRAY: { - const Vector<Color> *arr_a = &PackedArrayRef<Color>::get_array(a._data.packed_array); - const Vector<Color> *arr_b = &PackedArrayRef<Color>::get_array(b._data.packed_array); - int sz = arr_a->size(); - if (sz == 0 || arr_b->size() != sz) { - r_dst = a; - } else { - Vector<Color> v; - v.resize(sz); - { - Color *vw = v.ptrw(); - const Color *ar = arr_a->ptr(); - const Color *br = arr_b->ptr(); - - for (int i = 0; i < sz; i++) { - vw[i] = ar[i].lerp(br[i], c); - } - } - r_dst = v; - } - } - return; - default: { - r_dst = a; - } - } -} - void Variant::_register_variant_setters_getters() { register_named_setters_getters(); register_indexed_setters_getters(); diff --git a/doc/Makefile b/doc/Makefile index ecc5e51dd6..c8bf32d6e2 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,4 +1,4 @@ -BASEDIR = $(CURDIR) +BASEDIR = . CLASSES = $(BASEDIR)/classes/ $(BASEDIR)/../modules/ OUTPUTDIR = $(BASEDIR)/_build TOOLSDIR = $(BASEDIR)/tools diff --git a/doc/class.xsd b/doc/class.xsd index 7681ddad3d..d29d053006 100644 --- a/doc/class.xsd +++ b/doc/class.xsd @@ -95,6 +95,8 @@ </xs:sequence> <xs:attribute type="xs:string" name="name" use="optional" /> <xs:attribute type="xs:string" name="qualifiers" use="optional" /> + <xs:attribute type="xs:boolean" name="is_deprecated" use="optional" /> + <xs:attribute type="xs:boolean" name="is_experimental" use="optional" /> </xs:complexType> </xs:element> </xs:sequence> @@ -114,6 +116,8 @@ <xs:attribute type="xs:string" name="overrides" use="optional" /> <xs:attribute type="xs:string" name="enum" use="optional" /> <xs:attribute type="xs:string" name="default" use="optional" /> + <xs:attribute type="xs:boolean" name="is_deprecated" use="optional" /> + <xs:attribute type="xs:boolean" name="is_experimental" use="optional" /> </xs:extension> </xs:simpleContent> </xs:complexType> @@ -156,6 +160,8 @@ <xs:attribute type="xs:string" name="value" /> <xs:attribute type="xs:string" name="enum" use="optional" /> <xs:attribute type="xs:boolean" name="is_bitfield" use="optional" /> + <xs:attribute type="xs:boolean" name="is_deprecated" use="optional" /> + <xs:attribute type="xs:boolean" name="is_experimental" use="optional" /> </xs:extension> </xs:simpleContent> </xs:complexType> @@ -256,6 +262,8 @@ </xs:sequence> <xs:attribute type="xs:string" name="name" /> <xs:attribute type="xs:string" name="inherits" /> + <xs:attribute type="xs:boolean" name="is_deprecated" use="optional" /> + <xs:attribute type="xs:boolean" name="is_experimental" use="optional" /> <xs:attribute type="xs:float" name="version" /> </xs:complexType> </xs:element> diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index 41d1ccf2ea..3d01c60aea 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -1443,385 +1443,385 @@ <constant name="KEY_NONE" value="0" enum="Key"> Enum value which doesn't correspond to any key. This is used to initialize [enum Key] properties with a generic state. </constant> - <constant name="KEY_SPECIAL" value="16777216" enum="Key"> + <constant name="KEY_SPECIAL" value="4194304" enum="Key"> Keycodes with this bit applied are non-printable. </constant> - <constant name="KEY_ESCAPE" value="16777217" enum="Key"> + <constant name="KEY_ESCAPE" value="4194305" enum="Key"> Escape key. </constant> - <constant name="KEY_TAB" value="16777218" enum="Key"> + <constant name="KEY_TAB" value="4194306" enum="Key"> Tab key. </constant> - <constant name="KEY_BACKTAB" value="16777219" enum="Key"> + <constant name="KEY_BACKTAB" value="4194307" enum="Key"> Shift + Tab key. </constant> - <constant name="KEY_BACKSPACE" value="16777220" enum="Key"> + <constant name="KEY_BACKSPACE" value="4194308" enum="Key"> Backspace key. </constant> - <constant name="KEY_ENTER" value="16777221" enum="Key"> + <constant name="KEY_ENTER" value="4194309" enum="Key"> Return key (on the main keyboard). </constant> - <constant name="KEY_KP_ENTER" value="16777222" enum="Key"> + <constant name="KEY_KP_ENTER" value="4194310" enum="Key"> Enter key on the numeric keypad. </constant> - <constant name="KEY_INSERT" value="16777223" enum="Key"> + <constant name="KEY_INSERT" value="4194311" enum="Key"> Insert key. </constant> - <constant name="KEY_DELETE" value="16777224" enum="Key"> + <constant name="KEY_DELETE" value="4194312" enum="Key"> Delete key. </constant> - <constant name="KEY_PAUSE" value="16777225" enum="Key"> + <constant name="KEY_PAUSE" value="4194313" enum="Key"> Pause key. </constant> - <constant name="KEY_PRINT" value="16777226" enum="Key"> + <constant name="KEY_PRINT" value="4194314" enum="Key"> Print Screen key. </constant> - <constant name="KEY_SYSREQ" value="16777227" enum="Key"> + <constant name="KEY_SYSREQ" value="4194315" enum="Key"> System Request key. </constant> - <constant name="KEY_CLEAR" value="16777228" enum="Key"> + <constant name="KEY_CLEAR" value="4194316" enum="Key"> Clear key. </constant> - <constant name="KEY_HOME" value="16777229" enum="Key"> + <constant name="KEY_HOME" value="4194317" enum="Key"> Home key. </constant> - <constant name="KEY_END" value="16777230" enum="Key"> + <constant name="KEY_END" value="4194318" enum="Key"> End key. </constant> - <constant name="KEY_LEFT" value="16777231" enum="Key"> + <constant name="KEY_LEFT" value="4194319" enum="Key"> Left arrow key. </constant> - <constant name="KEY_UP" value="16777232" enum="Key"> + <constant name="KEY_UP" value="4194320" enum="Key"> Up arrow key. </constant> - <constant name="KEY_RIGHT" value="16777233" enum="Key"> + <constant name="KEY_RIGHT" value="4194321" enum="Key"> Right arrow key. </constant> - <constant name="KEY_DOWN" value="16777234" enum="Key"> + <constant name="KEY_DOWN" value="4194322" enum="Key"> Down arrow key. </constant> - <constant name="KEY_PAGEUP" value="16777235" enum="Key"> + <constant name="KEY_PAGEUP" value="4194323" enum="Key"> Page Up key. </constant> - <constant name="KEY_PAGEDOWN" value="16777236" enum="Key"> + <constant name="KEY_PAGEDOWN" value="4194324" enum="Key"> Page Down key. </constant> - <constant name="KEY_SHIFT" value="16777237" enum="Key"> + <constant name="KEY_SHIFT" value="4194325" enum="Key"> Shift key. </constant> - <constant name="KEY_CTRL" value="16777238" enum="Key"> + <constant name="KEY_CTRL" value="4194326" enum="Key"> Control key. </constant> - <constant name="KEY_META" value="16777239" enum="Key"> + <constant name="KEY_META" value="4194327" enum="Key"> Meta key. </constant> - <constant name="KEY_ALT" value="16777240" enum="Key"> + <constant name="KEY_ALT" value="4194328" enum="Key"> Alt key. </constant> - <constant name="KEY_CAPSLOCK" value="16777241" enum="Key"> + <constant name="KEY_CAPSLOCK" value="4194329" enum="Key"> Caps Lock key. </constant> - <constant name="KEY_NUMLOCK" value="16777242" enum="Key"> + <constant name="KEY_NUMLOCK" value="4194330" enum="Key"> Num Lock key. </constant> - <constant name="KEY_SCROLLLOCK" value="16777243" enum="Key"> + <constant name="KEY_SCROLLLOCK" value="4194331" enum="Key"> Scroll Lock key. </constant> - <constant name="KEY_F1" value="16777244" enum="Key"> + <constant name="KEY_F1" value="4194332" enum="Key"> F1 key. </constant> - <constant name="KEY_F2" value="16777245" enum="Key"> + <constant name="KEY_F2" value="4194333" enum="Key"> F2 key. </constant> - <constant name="KEY_F3" value="16777246" enum="Key"> + <constant name="KEY_F3" value="4194334" enum="Key"> F3 key. </constant> - <constant name="KEY_F4" value="16777247" enum="Key"> + <constant name="KEY_F4" value="4194335" enum="Key"> F4 key. </constant> - <constant name="KEY_F5" value="16777248" enum="Key"> + <constant name="KEY_F5" value="4194336" enum="Key"> F5 key. </constant> - <constant name="KEY_F6" value="16777249" enum="Key"> + <constant name="KEY_F6" value="4194337" enum="Key"> F6 key. </constant> - <constant name="KEY_F7" value="16777250" enum="Key"> + <constant name="KEY_F7" value="4194338" enum="Key"> F7 key. </constant> - <constant name="KEY_F8" value="16777251" enum="Key"> + <constant name="KEY_F8" value="4194339" enum="Key"> F8 key. </constant> - <constant name="KEY_F9" value="16777252" enum="Key"> + <constant name="KEY_F9" value="4194340" enum="Key"> F9 key. </constant> - <constant name="KEY_F10" value="16777253" enum="Key"> + <constant name="KEY_F10" value="4194341" enum="Key"> F10 key. </constant> - <constant name="KEY_F11" value="16777254" enum="Key"> + <constant name="KEY_F11" value="4194342" enum="Key"> F11 key. </constant> - <constant name="KEY_F12" value="16777255" enum="Key"> + <constant name="KEY_F12" value="4194343" enum="Key"> F12 key. </constant> - <constant name="KEY_F13" value="16777256" enum="Key"> + <constant name="KEY_F13" value="4194344" enum="Key"> F13 key. </constant> - <constant name="KEY_F14" value="16777257" enum="Key"> + <constant name="KEY_F14" value="4194345" enum="Key"> F14 key. </constant> - <constant name="KEY_F15" value="16777258" enum="Key"> + <constant name="KEY_F15" value="4194346" enum="Key"> F15 key. </constant> - <constant name="KEY_F16" value="16777259" enum="Key"> + <constant name="KEY_F16" value="4194347" enum="Key"> F16 key. </constant> - <constant name="KEY_F17" value="16777260" enum="Key"> + <constant name="KEY_F17" value="4194348" enum="Key"> F17 key. </constant> - <constant name="KEY_F18" value="16777261" enum="Key"> + <constant name="KEY_F18" value="4194349" enum="Key"> F18 key. </constant> - <constant name="KEY_F19" value="16777262" enum="Key"> + <constant name="KEY_F19" value="4194350" enum="Key"> F19 key. </constant> - <constant name="KEY_F20" value="16777263" enum="Key"> + <constant name="KEY_F20" value="4194351" enum="Key"> F20 key. </constant> - <constant name="KEY_F21" value="16777264" enum="Key"> + <constant name="KEY_F21" value="4194352" enum="Key"> F21 key. </constant> - <constant name="KEY_F22" value="16777265" enum="Key"> + <constant name="KEY_F22" value="4194353" enum="Key"> F22 key. </constant> - <constant name="KEY_F23" value="16777266" enum="Key"> + <constant name="KEY_F23" value="4194354" enum="Key"> F23 key. </constant> - <constant name="KEY_F24" value="16777267" enum="Key"> + <constant name="KEY_F24" value="4194355" enum="Key"> F24 key. </constant> - <constant name="KEY_F25" value="16777268" enum="Key"> + <constant name="KEY_F25" value="4194356" enum="Key"> F25 key. Only supported on macOS and Linux due to a Windows limitation. </constant> - <constant name="KEY_F26" value="16777269" enum="Key"> + <constant name="KEY_F26" value="4194357" enum="Key"> F26 key. Only supported on macOS and Linux due to a Windows limitation. </constant> - <constant name="KEY_F27" value="16777270" enum="Key"> + <constant name="KEY_F27" value="4194358" enum="Key"> F27 key. Only supported on macOS and Linux due to a Windows limitation. </constant> - <constant name="KEY_F28" value="16777271" enum="Key"> + <constant name="KEY_F28" value="4194359" enum="Key"> F28 key. Only supported on macOS and Linux due to a Windows limitation. </constant> - <constant name="KEY_F29" value="16777272" enum="Key"> + <constant name="KEY_F29" value="4194360" enum="Key"> F29 key. Only supported on macOS and Linux due to a Windows limitation. </constant> - <constant name="KEY_F30" value="16777273" enum="Key"> + <constant name="KEY_F30" value="4194361" enum="Key"> F30 key. Only supported on macOS and Linux due to a Windows limitation. </constant> - <constant name="KEY_F31" value="16777274" enum="Key"> + <constant name="KEY_F31" value="4194362" enum="Key"> F31 key. Only supported on macOS and Linux due to a Windows limitation. </constant> - <constant name="KEY_F32" value="16777275" enum="Key"> + <constant name="KEY_F32" value="4194363" enum="Key"> F32 key. Only supported on macOS and Linux due to a Windows limitation. </constant> - <constant name="KEY_F33" value="16777276" enum="Key"> + <constant name="KEY_F33" value="4194364" enum="Key"> F33 key. Only supported on macOS and Linux due to a Windows limitation. </constant> - <constant name="KEY_F34" value="16777277" enum="Key"> + <constant name="KEY_F34" value="4194365" enum="Key"> F34 key. Only supported on macOS and Linux due to a Windows limitation. </constant> - <constant name="KEY_F35" value="16777278" enum="Key"> + <constant name="KEY_F35" value="4194366" enum="Key"> F35 key. Only supported on macOS and Linux due to a Windows limitation. </constant> - <constant name="KEY_KP_MULTIPLY" value="16777345" enum="Key"> + <constant name="KEY_KP_MULTIPLY" value="4194433" enum="Key"> Multiply (*) key on the numeric keypad. </constant> - <constant name="KEY_KP_DIVIDE" value="16777346" enum="Key"> + <constant name="KEY_KP_DIVIDE" value="4194434" enum="Key"> Divide (/) key on the numeric keypad. </constant> - <constant name="KEY_KP_SUBTRACT" value="16777347" enum="Key"> + <constant name="KEY_KP_SUBTRACT" value="4194435" enum="Key"> Subtract (-) key on the numeric keypad. </constant> - <constant name="KEY_KP_PERIOD" value="16777348" enum="Key"> + <constant name="KEY_KP_PERIOD" value="4194436" enum="Key"> Period (.) key on the numeric keypad. </constant> - <constant name="KEY_KP_ADD" value="16777349" enum="Key"> + <constant name="KEY_KP_ADD" value="4194437" enum="Key"> Add (+) key on the numeric keypad. </constant> - <constant name="KEY_KP_0" value="16777350" enum="Key"> + <constant name="KEY_KP_0" value="4194438" enum="Key"> Number 0 on the numeric keypad. </constant> - <constant name="KEY_KP_1" value="16777351" enum="Key"> + <constant name="KEY_KP_1" value="4194439" enum="Key"> Number 1 on the numeric keypad. </constant> - <constant name="KEY_KP_2" value="16777352" enum="Key"> + <constant name="KEY_KP_2" value="4194440" enum="Key"> Number 2 on the numeric keypad. </constant> - <constant name="KEY_KP_3" value="16777353" enum="Key"> + <constant name="KEY_KP_3" value="4194441" enum="Key"> Number 3 on the numeric keypad. </constant> - <constant name="KEY_KP_4" value="16777354" enum="Key"> + <constant name="KEY_KP_4" value="4194442" enum="Key"> Number 4 on the numeric keypad. </constant> - <constant name="KEY_KP_5" value="16777355" enum="Key"> + <constant name="KEY_KP_5" value="4194443" enum="Key"> Number 5 on the numeric keypad. </constant> - <constant name="KEY_KP_6" value="16777356" enum="Key"> + <constant name="KEY_KP_6" value="4194444" enum="Key"> Number 6 on the numeric keypad. </constant> - <constant name="KEY_KP_7" value="16777357" enum="Key"> + <constant name="KEY_KP_7" value="4194445" enum="Key"> Number 7 on the numeric keypad. </constant> - <constant name="KEY_KP_8" value="16777358" enum="Key"> + <constant name="KEY_KP_8" value="4194446" enum="Key"> Number 8 on the numeric keypad. </constant> - <constant name="KEY_KP_9" value="16777359" enum="Key"> + <constant name="KEY_KP_9" value="4194447" enum="Key"> Number 9 on the numeric keypad. </constant> - <constant name="KEY_SUPER_L" value="16777280" enum="Key"> + <constant name="KEY_SUPER_L" value="4194368" enum="Key"> Left Super key (Windows key). </constant> - <constant name="KEY_SUPER_R" value="16777281" enum="Key"> + <constant name="KEY_SUPER_R" value="4194369" enum="Key"> Right Super key (Windows key). </constant> - <constant name="KEY_MENU" value="16777282" enum="Key"> + <constant name="KEY_MENU" value="4194370" enum="Key"> Context menu key. </constant> - <constant name="KEY_HYPER_L" value="16777283" enum="Key"> + <constant name="KEY_HYPER_L" value="4194371" enum="Key"> Left Hyper key. </constant> - <constant name="KEY_HYPER_R" value="16777284" enum="Key"> + <constant name="KEY_HYPER_R" value="4194372" enum="Key"> Right Hyper key. </constant> - <constant name="KEY_HELP" value="16777285" enum="Key"> + <constant name="KEY_HELP" value="4194373" enum="Key"> Help key. </constant> - <constant name="KEY_DIRECTION_L" value="16777286" enum="Key"> + <constant name="KEY_DIRECTION_L" value="4194374" enum="Key"> Left Direction key. </constant> - <constant name="KEY_DIRECTION_R" value="16777287" enum="Key"> + <constant name="KEY_DIRECTION_R" value="4194375" enum="Key"> Right Direction key. </constant> - <constant name="KEY_BACK" value="16777288" enum="Key"> + <constant name="KEY_BACK" value="4194376" enum="Key"> Media back key. Not to be confused with the Back button on an Android device. </constant> - <constant name="KEY_FORWARD" value="16777289" enum="Key"> + <constant name="KEY_FORWARD" value="4194377" enum="Key"> Media forward key. </constant> - <constant name="KEY_STOP" value="16777290" enum="Key"> + <constant name="KEY_STOP" value="4194378" enum="Key"> Media stop key. </constant> - <constant name="KEY_REFRESH" value="16777291" enum="Key"> + <constant name="KEY_REFRESH" value="4194379" enum="Key"> Media refresh key. </constant> - <constant name="KEY_VOLUMEDOWN" value="16777292" enum="Key"> + <constant name="KEY_VOLUMEDOWN" value="4194380" enum="Key"> Volume down key. </constant> - <constant name="KEY_VOLUMEMUTE" value="16777293" enum="Key"> + <constant name="KEY_VOLUMEMUTE" value="4194381" enum="Key"> Mute volume key. </constant> - <constant name="KEY_VOLUMEUP" value="16777294" enum="Key"> + <constant name="KEY_VOLUMEUP" value="4194382" enum="Key"> Volume up key. </constant> - <constant name="KEY_BASSBOOST" value="16777295" enum="Key"> + <constant name="KEY_BASSBOOST" value="4194383" enum="Key"> Bass Boost key. </constant> - <constant name="KEY_BASSUP" value="16777296" enum="Key"> + <constant name="KEY_BASSUP" value="4194384" enum="Key"> Bass up key. </constant> - <constant name="KEY_BASSDOWN" value="16777297" enum="Key"> + <constant name="KEY_BASSDOWN" value="4194385" enum="Key"> Bass down key. </constant> - <constant name="KEY_TREBLEUP" value="16777298" enum="Key"> + <constant name="KEY_TREBLEUP" value="4194386" enum="Key"> Treble up key. </constant> - <constant name="KEY_TREBLEDOWN" value="16777299" enum="Key"> + <constant name="KEY_TREBLEDOWN" value="4194387" enum="Key"> Treble down key. </constant> - <constant name="KEY_MEDIAPLAY" value="16777300" enum="Key"> + <constant name="KEY_MEDIAPLAY" value="4194388" enum="Key"> Media play key. </constant> - <constant name="KEY_MEDIASTOP" value="16777301" enum="Key"> + <constant name="KEY_MEDIASTOP" value="4194389" enum="Key"> Media stop key. </constant> - <constant name="KEY_MEDIAPREVIOUS" value="16777302" enum="Key"> + <constant name="KEY_MEDIAPREVIOUS" value="4194390" enum="Key"> Previous song key. </constant> - <constant name="KEY_MEDIANEXT" value="16777303" enum="Key"> + <constant name="KEY_MEDIANEXT" value="4194391" enum="Key"> Next song key. </constant> - <constant name="KEY_MEDIARECORD" value="16777304" enum="Key"> + <constant name="KEY_MEDIARECORD" value="4194392" enum="Key"> Media record key. </constant> - <constant name="KEY_HOMEPAGE" value="16777305" enum="Key"> + <constant name="KEY_HOMEPAGE" value="4194393" enum="Key"> Home page key. </constant> - <constant name="KEY_FAVORITES" value="16777306" enum="Key"> + <constant name="KEY_FAVORITES" value="4194394" enum="Key"> Favorites key. </constant> - <constant name="KEY_SEARCH" value="16777307" enum="Key"> + <constant name="KEY_SEARCH" value="4194395" enum="Key"> Search key. </constant> - <constant name="KEY_STANDBY" value="16777308" enum="Key"> + <constant name="KEY_STANDBY" value="4194396" enum="Key"> Standby key. </constant> - <constant name="KEY_OPENURL" value="16777309" enum="Key"> + <constant name="KEY_OPENURL" value="4194397" enum="Key"> Open URL / Launch Browser key. </constant> - <constant name="KEY_LAUNCHMAIL" value="16777310" enum="Key"> + <constant name="KEY_LAUNCHMAIL" value="4194398" enum="Key"> Launch Mail key. </constant> - <constant name="KEY_LAUNCHMEDIA" value="16777311" enum="Key"> + <constant name="KEY_LAUNCHMEDIA" value="4194399" enum="Key"> Launch Media key. </constant> - <constant name="KEY_LAUNCH0" value="16777312" enum="Key"> + <constant name="KEY_LAUNCH0" value="4194400" enum="Key"> Launch Shortcut 0 key. </constant> - <constant name="KEY_LAUNCH1" value="16777313" enum="Key"> + <constant name="KEY_LAUNCH1" value="4194401" enum="Key"> Launch Shortcut 1 key. </constant> - <constant name="KEY_LAUNCH2" value="16777314" enum="Key"> + <constant name="KEY_LAUNCH2" value="4194402" enum="Key"> Launch Shortcut 2 key. </constant> - <constant name="KEY_LAUNCH3" value="16777315" enum="Key"> + <constant name="KEY_LAUNCH3" value="4194403" enum="Key"> Launch Shortcut 3 key. </constant> - <constant name="KEY_LAUNCH4" value="16777316" enum="Key"> + <constant name="KEY_LAUNCH4" value="4194404" enum="Key"> Launch Shortcut 4 key. </constant> - <constant name="KEY_LAUNCH5" value="16777317" enum="Key"> + <constant name="KEY_LAUNCH5" value="4194405" enum="Key"> Launch Shortcut 5 key. </constant> - <constant name="KEY_LAUNCH6" value="16777318" enum="Key"> + <constant name="KEY_LAUNCH6" value="4194406" enum="Key"> Launch Shortcut 6 key. </constant> - <constant name="KEY_LAUNCH7" value="16777319" enum="Key"> + <constant name="KEY_LAUNCH7" value="4194407" enum="Key"> Launch Shortcut 7 key. </constant> - <constant name="KEY_LAUNCH8" value="16777320" enum="Key"> + <constant name="KEY_LAUNCH8" value="4194408" enum="Key"> Launch Shortcut 8 key. </constant> - <constant name="KEY_LAUNCH9" value="16777321" enum="Key"> + <constant name="KEY_LAUNCH9" value="4194409" enum="Key"> Launch Shortcut 9 key. </constant> - <constant name="KEY_LAUNCHA" value="16777322" enum="Key"> + <constant name="KEY_LAUNCHA" value="4194410" enum="Key"> Launch Shortcut A key. </constant> - <constant name="KEY_LAUNCHB" value="16777323" enum="Key"> + <constant name="KEY_LAUNCHB" value="4194411" enum="Key"> Launch Shortcut B key. </constant> - <constant name="KEY_LAUNCHC" value="16777324" enum="Key"> + <constant name="KEY_LAUNCHC" value="4194412" enum="Key"> Launch Shortcut C key. </constant> - <constant name="KEY_LAUNCHD" value="16777325" enum="Key"> + <constant name="KEY_LAUNCHD" value="4194413" enum="Key"> Launch Shortcut D key. </constant> - <constant name="KEY_LAUNCHE" value="16777326" enum="Key"> + <constant name="KEY_LAUNCHE" value="4194414" enum="Key"> Launch Shortcut E key. </constant> - <constant name="KEY_LAUNCHF" value="16777327" enum="Key"> + <constant name="KEY_LAUNCHF" value="4194415" enum="Key"> Launch Shortcut F key. </constant> - <constant name="KEY_UNKNOWN" value="33554431" enum="Key"> + <constant name="KEY_UNKNOWN" value="16777215" enum="Key"> Unknown key. </constant> <constant name="KEY_SPACE" value="32" enum="Key"> @@ -2229,27 +2229,27 @@ <constant name="KEY_YDIAERESIS" value="255" enum="Key"> ÿ key. </constant> - <constant name="KEY_CODE_MASK" value="33554431" enum="KeyModifierMask"> + <constant name="KEY_CODE_MASK" value="8388607" enum="KeyModifierMask"> Key Code mask. </constant> - <constant name="KEY_MODIFIER_MASK" value="2130706432" enum="KeyModifierMask"> + <constant name="KEY_MODIFIER_MASK" value="532676608" enum="KeyModifierMask"> Modifier key mask. </constant> + <constant name="KEY_MASK_CMD_OR_CTRL" value="16777216" enum="KeyModifierMask"> + Automatically remapped to [constant KEY_META] on macOS and [constant KEY_CTRL] on other platforms, this mask is never set in the actual events, and should be used for key mapping only. + </constant> <constant name="KEY_MASK_SHIFT" value="33554432" enum="KeyModifierMask"> Shift key mask. </constant> <constant name="KEY_MASK_ALT" value="67108864" enum="KeyModifierMask"> - Alt key mask. + Alt or Option (on macOS) key mask. </constant> <constant name="KEY_MASK_META" value="134217728" enum="KeyModifierMask"> - Meta key mask. + Command (on macOS) or Meta/Windows key mask. </constant> <constant name="KEY_MASK_CTRL" value="268435456" enum="KeyModifierMask"> Ctrl key mask. </constant> - <constant name="KEY_MASK_CMD" value="platform-dependent" enum="KeyModifierMask"> - 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. - </constant> <constant name="KEY_MASK_KPAD" value="536870912" enum="KeyModifierMask"> Keypad key mask. </constant> diff --git a/doc/classes/AESContext.xml b/doc/classes/AESContext.xml index 69cd54a79b..7f582e4be7 100644 --- a/doc/classes/AESContext.xml +++ b/doc/classes/AESContext.xml @@ -45,6 +45,7 @@ public class Example : Node { public AESContext Aes = new AESContext(); + public override void _Ready() { string key = "My secret key!!!"; // Key must be either 16 or 32 bytes. diff --git a/doc/classes/AStarGrid2D.xml b/doc/classes/AStarGrid2D.xml index 19cd9d21d7..331862ebfa 100644 --- a/doc/classes/AStarGrid2D.xml +++ b/doc/classes/AStarGrid2D.xml @@ -6,14 +6,24 @@ <description> Compared to [AStar2D] you don't need to manually create points or connect them together. It also supports multiple type of heuristics and modes for diagonal movement. This class also provides a jumping mode which is faster to calculate than without it in the [AStar2D] class. In contrast to [AStar2D], you only need set the [member size] of the grid, optionally set the [member cell_size] and then call the [method update] method: - [codeblock] + [codeblocks] + [gdscript] var astar_grid = AStarGrid2D.new() astar_grid.size = Vector2i(32, 32) astar_grid.cell_size = Vector2(16, 16) astar_grid.update() print(astar_grid.get_id_path(Vector2i(0, 0), Vector2i(3, 4))) # prints (0, 0), (1, 1), (2, 2), (3, 3), (3, 4) print(astar_grid.get_point_path(Vector2i(0, 0), Vector2i(3, 4))) # prints (0, 0), (16, 16), (32, 32), (48, 48), (48, 64) - [/codeblock] + [/gdscript] + [csharp] + AStarGrid2D astarGrid = new AStarGrid2D(); + astarGrid.Size = new Vector2i(32, 32); + astarGrid.CellSize = new Vector2i(16, 16); + astarGrid.Update(); + GD.Print(astarGrid.GetIdPath(Vector2i.Zero, new Vector2i(3, 4))); // prints (0, 0), (1, 1), (2, 2), (3, 3), (3, 4) + GD.Print(astarGrid.GetPointPath(Vector2i.Zero, new Vector2i(3, 4))); // prints (0, 0), (16, 16), (32, 32), (48, 48), (48, 64) + [/csharp] + [/codeblocks] </description> <tutorials> </tutorials> diff --git a/doc/classes/AnimatedSprite2D.xml b/doc/classes/AnimatedSprite2D.xml index b207eda27f..afbe34816a 100644 --- a/doc/classes/AnimatedSprite2D.xml +++ b/doc/classes/AnimatedSprite2D.xml @@ -5,6 +5,8 @@ </brief_description> <description> [AnimatedSprite2D] is similar to the [Sprite2D] node, except it carries multiple textures as animation frames. Animations are created using a [SpriteFrames] resource, which allows you to import image files (or a folder containing said files) to provide the animation frames for the sprite. The [SpriteFrames] resource can be configured in the editor via the SpriteFrames bottom panel. + After setting up [member frames], [method play] may be called. It's also possible to select an [member animation] and toggle [member playing], even within the editor. + To pause the current animation, call [method stop] or set [member playing] to [code]false[/code]. Alternatively, setting [member speed_scale] to [code]0[/code] also preserves the current frame's elapsed time. [b]Note:[/b] You can associate a set of normal or specular maps by creating additional [SpriteFrames] resources with a [code]_normal[/code] or [code]_specular[/code] suffix. For example, having 3 [SpriteFrames] resources [code]run[/code], [code]run_normal[/code], and [code]run_specular[/code] will make it so the [code]run[/code] animation uses normal and specular maps. </description> <tutorials> @@ -17,13 +19,14 @@ <param index="0" name="anim" type="StringName" default="&""" /> <param index="1" name="backwards" type="bool" default="false" /> <description> - Plays the animation named [param anim]. If no [param anim] is provided, the current animation is played. If [code]backwards[/code] is [code]true[/code], the animation will be played in reverse. + Plays the animation named [param anim]. If no [param anim] is provided, the current animation is played. If [param backwards] is [code]true[/code], the animation is played in reverse. </description> </method> <method name="stop"> <return type="void" /> <description> - Stops the current animation (does not reset the frame counter). + Stops the current [member animation] at the current [member frame]. + [b]Note:[/b] This method resets the current frame's elapsed time. If this behavior is undesired, consider setting [member speed_scale] to [code]0[/code], instead. </description> </method> </methods> @@ -50,10 +53,10 @@ The texture's drawing offset. </member> <member name="playing" type="bool" setter="set_playing" getter="is_playing" default="false"> - If [code]true[/code], the [member animation] is currently playing. + If [code]true[/code], the [member animation] is currently playing. Setting this property to [code]false[/code] is the equivalent of calling [method stop]. </member> <member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale" default="1.0"> - The animation speed is multiplied by this value. + The animation speed is multiplied by this value. If set to a negative value, the animation is played in reverse. If set to [code]0[/code], the animation is paused, preserving the current frame's elapsed time. </member> </members> <signals> diff --git a/doc/classes/AnimatedSprite3D.xml b/doc/classes/AnimatedSprite3D.xml index 0bc5484e3a..09baf882fb 100644 --- a/doc/classes/AnimatedSprite3D.xml +++ b/doc/classes/AnimatedSprite3D.xml @@ -4,7 +4,9 @@ 2D sprite node in 3D world, that can use multiple 2D textures for animation. </brief_description> <description> - Animations are created using a [SpriteFrames] resource, which can be configured in the editor via the SpriteFrames panel. + [AnimatedSprite3D] is similar to the [Sprite3D] node, except it carries multiple textures as animation [member frames]. Animations are created using a [SpriteFrames] resource, which allows you to import image files (or a folder containing said files) to provide the animation frames for the sprite. The [SpriteFrames] resource can be configured in the editor via the SpriteFrames bottom panel. + After setting up [member frames], [method play] may be called. It's also possible to select an [member animation] and toggle [member playing], even within the editor. + To pause the current animation, call [method stop] or set [member playing] to [code]false[/code]. Alternatively, setting [member speed_scale] to [code]0[/code] also preserves the current frame's elapsed time. </description> <tutorials> <link title="2D Sprite animation (also applies to 3D)">$DOCS_URL/tutorials/2d/2d_sprite_animation.html</link> @@ -13,14 +15,16 @@ <method name="play"> <return type="void" /> <param index="0" name="anim" type="StringName" default="&""" /> + <param index="1" name="backwards" type="bool" default="false" /> <description> - Plays the animation named [param anim]. If no [param anim] is provided, the current animation is played. + Plays the animation named [param anim]. If no [param anim] is provided, the current animation is played. If [param backwards] is [code]true[/code], the animation is played in reverse. </description> </method> <method name="stop"> <return type="void" /> <description> - Stops the current animation (does not reset the frame counter). + Stops the current [member animation] at the current [member frame]. + [b]Note:[/b] This method resets the current frame's elapsed time. If this behavior is undesired, consider setting [member speed_scale] to [code]0[/code], instead. </description> </method> </methods> @@ -35,7 +39,10 @@ The [SpriteFrames] resource containing the animation(s). </member> <member name="playing" type="bool" setter="set_playing" getter="is_playing" default="false"> - If [code]true[/code], the [member animation] is currently playing. + If [code]true[/code], the [member animation] is currently playing. Setting this property to [code]false[/code] is the equivalent of calling [method stop]. + </member> + <member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale" default="1.0"> + The animation speed is multiplied by this value. If set to a negative value, the animation is played in reverse. If set to [code]0[/code], the animation is paused, preserving the current frame's elapsed time. </member> </members> <signals> diff --git a/doc/classes/AnimatedTexture.xml b/doc/classes/AnimatedTexture.xml index d2fa7bb1e9..f0c86ba47b 100644 --- a/doc/classes/AnimatedTexture.xml +++ b/doc/classes/AnimatedTexture.xml @@ -5,18 +5,18 @@ </brief_description> <description> [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]. - 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. + The playback of the animation is controlled by the [member speed_scale] property, as well as each frame's duration (see [method set_frame_duration]). The animation loops, i.e. it will restart at frame 0 automatically after playing the last frame. [AnimatedTexture] currently requires all frame textures to have the same size, otherwise the bigger ones will be cropped to match the smallest one. [b]Note:[/b] AnimatedTexture doesn't support using [AtlasTexture]s. Each frame needs to be a separate [Texture2D]. </description> <tutorials> </tutorials> <methods> - <method name="get_frame_delay" qualifiers="const"> + <method name="get_frame_duration" qualifiers="const"> <return type="float" /> <param index="0" name="frame" type="int" /> <description> - Returns the given frame's delay value. + Returns the given [param frame]'s duration, in seconds. </description> </method> <method name="get_frame_texture" qualifiers="const"> @@ -26,19 +26,12 @@ Returns the given frame's [Texture2D]. </description> </method> - <method name="set_frame_delay"> + <method name="set_frame_duration"> <return type="void" /> <param index="0" name="frame" type="int" /> - <param index="1" name="delay" type="float" /> + <param index="1" name="duration" type="float" /> <description> - 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]. - 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: - [codeblock] - Frame 0: 0.5 s (1 / fps) - Frame 1: 1.7 s (1 / fps + 1.2) - Frame 2: 0.5 s (1 / fps) - Total duration: 2.7 s - [/codeblock] + Sets the duration of any given [param frame]. The final duration is affected by the [member speed_scale]. If set to [code]0[/code], the frame is skipped during playback. </description> </method> <method name="set_frame_texture"> @@ -55,10 +48,6 @@ <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. - </member> <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> @@ -68,6 +57,9 @@ <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> + <member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale" default="1.0"> + The animation speed is multiplied by this value. If set to a negative value, the animation is played in reverse. + </member> </members> <constants> <constant name="MAX_FRAMES" value="256"> diff --git a/doc/classes/AnimationNodeBlendTree.xml b/doc/classes/AnimationNodeBlendTree.xml index 4c7943ece3..2a765ac8d6 100644 --- a/doc/classes/AnimationNodeBlendTree.xml +++ b/doc/classes/AnimationNodeBlendTree.xml @@ -87,6 +87,14 @@ The global offset of all sub-nodes. </member> </members> + <signals> + <signal name="node_changed"> + <param index="0" name="node_name" type="StringName" /> + <description> + Emitted when the input port information is changed. + </description> + </signal> + </signals> <constants> <constant name="CONNECTION_OK" value="0"> The connection was successful. diff --git a/doc/classes/AnimationPlayer.xml b/doc/classes/AnimationPlayer.xml index 710dc55a4b..d24703203b 100644 --- a/doc/classes/AnimationPlayer.xml +++ b/doc/classes/AnimationPlayer.xml @@ -268,6 +268,11 @@ [b]Note:[/b] This signal is not emitted if an animation is looping. </description> </signal> + <signal name="animation_list_changed"> + <description> + Notifies when an animation list is changed. + </description> + </signal> <signal name="animation_started"> <param index="0" name="anim_name" type="StringName" /> <description> diff --git a/doc/classes/AnimationTree.xml b/doc/classes/AnimationTree.xml index f2bf74f495..27797b00b5 100644 --- a/doc/classes/AnimationTree.xml +++ b/doc/classes/AnimationTree.xml @@ -54,6 +54,13 @@ The root animation node of this [AnimationTree]. See [AnimationNode]. </member> </members> + <signals> + <signal name="animation_player_changed"> + <description> + Emitted when the [member anim_player] is changed. + </description> + </signal> + </signals> <constants> <constant name="ANIMATION_PROCESS_PHYSICS" value="0" enum="AnimationProcessCallback"> The animations will progress during the physics frame (i.e. [method Node._physics_process]). diff --git a/doc/classes/Area2D.xml b/doc/classes/Area2D.xml index f1e40d4979..29592f133d 100644 --- a/doc/classes/Area2D.xml +++ b/doc/classes/Area2D.xml @@ -25,10 +25,24 @@ <method name="get_overlapping_bodies" qualifiers="const"> <return type="Node2D[]" /> <description> - Returns a list of intersecting [PhysicsBody2D]s. The overlapping body's [member CollisionObject2D.collision_layer] must be part of this area's [member CollisionObject2D.collision_mask] in order to be detected. + Returns a list of intersecting [PhysicsBody2D]s and [TileMap]s. The overlapping body's [member CollisionObject2D.collision_layer] must be part of this area's [member CollisionObject2D.collision_mask] in order to be detected. 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="has_overlapping_areas" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if intersecting any [Area2D]s, otherwise returns [code]false[/code]. The overlapping area's [member CollisionObject2D.collision_layer] must be part of this area's [member CollisionObject2D.collision_mask] in order to be detected. + For performance reasons (collisions are all processed at the same time) the list of overlapping areas is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. + </description> + </method> + <method name="has_overlapping_bodies" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if intersecting any [PhysicsBody2D]s or [TileMap]s, otherwise returns [code]false[/code]. The overlapping body's [member CollisionObject2D.collision_layer] must be part of this area's [member CollisionObject2D.collision_mask] in order to be detected. + For performance reasons (collisions are all processed at the same time) the list of overlapping bodies is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. + </description> + </method> <method name="overlaps_area" qualifiers="const"> <return type="bool" /> <param index="0" name="area" type="Node" /> diff --git a/doc/classes/Area3D.xml b/doc/classes/Area3D.xml index 14081918cf..ce49be9bc1 100644 --- a/doc/classes/Area3D.xml +++ b/doc/classes/Area3D.xml @@ -23,10 +23,24 @@ <method name="get_overlapping_bodies" qualifiers="const"> <return type="Node3D[]" /> <description> - Returns a list of intersecting [PhysicsBody3D]s. The overlapping body's [member CollisionObject3D.collision_layer] must be part of this area's [member CollisionObject3D.collision_mask] in order to be detected. + Returns a list of intersecting [PhysicsBody3D]s and [GridMap]s. The overlapping body's [member CollisionObject3D.collision_layer] must be part of this area's [member CollisionObject3D.collision_mask] in order to be detected. 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="has_overlapping_areas" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if intersecting any [Area3D]s, otherwise returns [code]false[/code]. The overlapping area's [member CollisionObject3D.collision_layer] must be part of this area's [member CollisionObject3D.collision_mask] in order to be detected. + For performance reasons (collisions are all processed at the same time) the list of overlapping areas is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. + </description> + </method> + <method name="has_overlapping_bodies" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if intersecting any [PhysicsBody3D]s or [GridMap]s, otherwise returns [code]false[/code]. The overlapping body's [member CollisionObject3D.collision_layer] must be part of this area's [member CollisionObject3D.collision_mask] in order to be detected. + For performance reasons (collisions are all processed at the same time) the list of overlapping bodies is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. + </description> + </method> <method name="overlaps_area" qualifiers="const"> <return type="bool" /> <param index="0" name="area" type="Node" /> diff --git a/doc/classes/BaseMaterial3D.xml b/doc/classes/BaseMaterial3D.xml index ee28675d89..cbb58a3e1e 100644 --- a/doc/classes/BaseMaterial3D.xml +++ b/doc/classes/BaseMaterial3D.xml @@ -28,7 +28,7 @@ <return type="Texture2D" /> <param index="0" name="param" type="int" enum="BaseMaterial3D.TextureParam" /> <description> - Returns the [Texture] associated with the specified [enum TextureParam]. + Returns the [Texture2D] associated with the specified [enum TextureParam]. </description> </method> <method name="set_feature"> diff --git a/doc/classes/BoneAttachment3D.xml b/doc/classes/BoneAttachment3D.xml index dc3d448621..f29525038e 100644 --- a/doc/classes/BoneAttachment3D.xml +++ b/doc/classes/BoneAttachment3D.xml @@ -16,10 +16,11 @@ Returns the [NodePath] to the external [Skeleton3D] node, if one has been set. </description> </method> - <method name="get_override_mode" qualifiers="const"> + <method name="get_override_mode" qualifiers="const" is_deprecated="true"> <return type="int" /> <description> - Returns the override mode for the BoneAttachment3D node. + Deprecated. Local pose overrides will be removed. + Returns the override mode for the BoneAttachment3D node (0=global / 1=local). </description> </method> <method name="get_override_pose" qualifiers="const"> @@ -48,11 +49,12 @@ Sets the [NodePath] to the external skeleton that the BoneAttachment3D node should use. The external [Skeleton3D] node is only used when [code]use_external_skeleton[/code] is set to [code]true[/code]. </description> </method> - <method name="set_override_mode"> + <method name="set_override_mode" is_deprecated="true"> <return type="void" /> <param index="0" name="override_mode" type="int" /> <description> - Sets the override mode for the BoneAttachment3D node. The override mode defines which of the bone poses the BoneAttachment3D node will override. + Deprecated. Local pose overrides will be removed. + Sets the override mode for the BoneAttachment3D node (0=global / 1=local). The override mode defines which of the bone poses the BoneAttachment3D node will override. </description> </method> <method name="set_override_pose"> diff --git a/doc/classes/Camera2D.xml b/doc/classes/Camera2D.xml index bb78d537ad..a1d24f778d 100644 --- a/doc/classes/Camera2D.xml +++ b/doc/classes/Camera2D.xml @@ -124,6 +124,9 @@ <member name="editor_draw_screen" type="bool" setter="set_screen_drawing_enabled" getter="is_screen_drawing_enabled" default="true"> If [code]true[/code], draws the camera's screen rectangle in the editor. </member> + <member name="ignore_rotation" type="bool" setter="set_ignore_rotation" getter="is_ignoring_rotation" default="true"> + If [code]true[/code], the camera's rendered view is not affected by its [member Node2D.rotation] and [member Node2D.global_rotation]. + </member> <member name="limit_bottom" type="int" setter="set_limit" getter="get_limit" default="10000000"> Bottom scroll limit in pixels. The camera stops moving when reaching this value, but [member offset] can push the view past the limit. </member> @@ -147,9 +150,6 @@ <member name="process_callback" type="int" setter="set_process_callback" getter="get_process_callback" enum="Camera2D.Camera2DProcessCallback" default="1"> The camera's process callback. See [enum Camera2DProcessCallback]. </member> - <member name="rotating" type="bool" setter="set_rotating" getter="is_rotating" default="false"> - If [code]true[/code], the camera view rotates with the target. - </member> <member name="smoothing_enabled" type="bool" setter="set_enable_follow_smoothing" getter="is_follow_smoothing_enabled" default="false"> If [code]true[/code], the camera smoothly moves towards the target at [member smoothing_speed]. </member> diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml index d8c1af0b3c..d74f49c897 100644 --- a/doc/classes/CanvasItem.xml +++ b/doc/classes/CanvasItem.xml @@ -310,16 +310,16 @@ # If using this method in a script that redraws constantly, move the # `default_font` declaration to a member variable assigned in `_ready()` # so the Control is only created once. - var default_font = Control.new().get_font("font") - var default_font_size = Control.new().get_font_size("font_size") - draw_string(default_font, Vector2(64, 64), "Hello world", HORIZONTAL_ALIGNMENT_LEFT, -1, font_size) + var default_font = ThemeDB.fallback_font + var default_font_size = ThemeDB.fallback_font_size + draw_string(default_font, Vector2(64, 64), "Hello world", HORIZONTAL_ALIGNMENT_LEFT, -1, default_font_size) [/gdscript] [csharp] // If using this method in a script that redraws constantly, move the - // `default_font` declaration to a member variable assigned in `_ready()` + // `default_font` declaration to a member variable assigned in `_Ready()` // so the Control is only created once. - Font defaultFont = new Control().GetFont("font"); - int defaultFontSize = new Control().GetFontSize("font_size"); + Font defaultFont = ThemeDB.FallbackFont; + int defaultFontSize = ThemeDB.FallbackFontSize; DrawString(defaultFont, new Vector2(64, 64), "Hello world", HORIZONTAL_ALIGNMENT_LEFT, -1, defaultFontSize); [/csharp] [/codeblocks] @@ -500,6 +500,13 @@ Transformations issued by [param event]'s inputs are applied in local space instead of global space. </description> </method> + <method name="move_to_front"> + <return type="void" /> + <description> + Moves this node to display on top of its siblings. This has more use in [Control], as [Node2D] can be ordered with [member Node2D.z_index]. + Internally, the node is moved to the bottom of parent's children list. The method has no effect on nodes without a parent. + </description> + </method> <method name="queue_redraw"> <return type="void" /> <description> diff --git a/doc/classes/Control.xml b/doc/classes/Control.xml index 71798d2574..7b9bf0fa37 100644 --- a/doc/classes/Control.xml +++ b/doc/classes/Control.xml @@ -972,7 +972,7 @@ <member name="clip_contents" type="bool" setter="set_clip_contents" getter="is_clipping_contents" default="false"> 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 and won't receive input. </member> - <member name="custom_minimum_size" type="Vector2" setter="set_custom_minimum_size" getter="get_custom_minimum_size" default="Vector2(0, 0)"> + <member name="custom_minimum_size" type="Vector2i" setter="set_custom_minimum_size" getter="get_custom_minimum_size" default="Vector2i(0, 0)"> 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. </member> <member name="focus_mode" type="int" setter="set_focus_mode" getter="get_focus_mode" enum="Control.FocusMode" default="0"> diff --git a/doc/classes/Cubemap.xml b/doc/classes/Cubemap.xml index 7173388027..0cdebeda95 100644 --- a/doc/classes/Cubemap.xml +++ b/doc/classes/Cubemap.xml @@ -4,9 +4,9 @@ 6-sided texture typically used in 3D rendering. </brief_description> <description> - A cubemap is a 6-sided texture typically used for faking reflections in 3D rendering. It can be used to make an object look as if it's reflecting its surroundings. This usually delivers much better performance than other reflection methods. + A cubemap is made of 6 textures organized in layers. They are typically used for faking reflections (see [ReflectionProbe]) in 3D rendering. It can be used to make an object look as if it's reflecting its surroundings. This usually delivers much better performance than other reflection methods. This resource is typically used as a uniform in custom shaders. Few core Godot methods make use of Cubemap resources. - [b]Note:[/b] Godot doesn't support using cubemaps as a [PanoramaSkyMaterial]. 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. + [b]Note:[/b] Godot doesn't support using cubemaps in a [PanoramaSkyMaterial]. You can use [url=https://danilw.github.io/GLSL-howto/cubemap_to_panorama_js/cubemap_to_panorama.html]this tool[/url] to convert a cubemap to an equirectangular sky map. </description> <tutorials> </tutorials> diff --git a/doc/classes/CubemapArray.xml b/doc/classes/CubemapArray.xml index 4fca842b5a..7f001155e4 100644 --- a/doc/classes/CubemapArray.xml +++ b/doc/classes/CubemapArray.xml @@ -1,8 +1,13 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="CubemapArray" inherits="ImageTextureLayered" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + A single composite texture resource which consists of multiple [Cubemap]s. </brief_description> <description> + [CubemapArray]s are made of an array of [Cubemap]s. Accordingly, like [Cubemap]s they are made of multiple textures the amount of which must be divisible by 6 (one image for each face of the cube). The primary benefit of [CubemapArray]s is that they can be accessed in shader code using a single texture reference. In other words, you can pass multiple [Cubemap]s into a shader using a single [CubemapArray]. + Generally, [CubemapArray]s provide a more efficent way for storing multiple [Cubemap]s, than storing multiple [Cubemap]s themselves in an array. + Internally Godot, uses [CubemapArray]s for many effects including the [Sky], if you set [member ProjectSettings.rendering/reflections/sky_reflections/texture_array_reflections] to [code]true[/code]. + [b]Note:[/b] [CubemapArray] is not supported in the OpenGL 3 rendering backend. </description> <tutorials> </tutorials> diff --git a/doc/classes/Directory.xml b/doc/classes/DirAccess.xml index c9a9f346a5..cb7bf56f11 100644 --- a/doc/classes/Directory.xml +++ b/doc/classes/DirAccess.xml @@ -1,18 +1,27 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="Directory" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="DirAccess" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Type used to handle the filesystem. </brief_description> <description> Directory type. It is used to manage directories and their content (not restricted to the project folder). - When creating a new [Directory], it must be explicitly opened using [method open] before most methods can be used. However, [method file_exists] and [method dir_exists] can be used without opening a directory. If so, they use a path relative to [code]res://[/code]. + [DirAccess] can't be instantiated directly. Instead it is created with a static method that takes a path for which it will be opened. + Most of the methods have a static alternative that can be used without creating a [DirAccess]. Static methods only support absolute paths (including [code]res://[/code] and [code]user://[/code]). + [codeblock] + # Standard + var dir = Directory.new() + dir.open("user://levels") + dir.make_dir("world1") + # Static + Directory.make_dir_absolute("user://levels/world1") + [/codeblock] [b]Note:[/b] Many resources types are imported (e.g. textures or sound files), and their source asset will not be included in the exported game, as only the imported version is used. Use [ResourceLoader] to access imported resources. Here is an example on how to iterate through the files of a directory: [codeblocks] [gdscript] func dir_contents(path): - var dir = Directory.new() - if dir.open(path) == OK: + var dir = DirAccess.open(path) + if dir: dir.list_dir_begin() var file_name = dir.get_next() while file_name != "": @@ -27,8 +36,8 @@ [csharp] public void DirContents(string path) { - var dir = new Directory(); - if (dir.Open(path) == Error.Ok) + using var dir = DirAccess.Open(path); + if (dir != null) { dir.ListDirBegin(); string fileName = dir.GetNext(); @@ -59,7 +68,7 @@ <methods> <method name="change_dir"> <return type="int" enum="Error" /> - <param index="0" name="todir" type="String" /> + <param index="0" name="to_dir" type="String" /> <description> 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]). Returns one of the [enum Error] code constants ([code]OK[/code] on success). @@ -69,11 +78,22 @@ <return type="int" enum="Error" /> <param index="0" name="from" type="String" /> <param index="1" name="to" type="String" /> + <param index="2" name="chmod_flags" type="int" default="-1" /> <description> Copies the [param from] file to the [param to] 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. + If [param chmod_flags] is different than [code]-1[/code], the unix permissions for the destination path will be set to the provided value, if available on the current operating system. Returns one of the [enum Error] code constants ([code]OK[/code] on success). </description> </method> + <method name="copy_absolute" qualifiers="static"> + <return type="int" enum="Error" /> + <param index="0" name="from" type="String" /> + <param index="1" name="to" type="String" /> + <param index="2" name="chmod_flags" type="int" default="-1" /> + <description> + Static version of [method copy]. Supports only absolute paths. + </description> + </method> <method name="current_is_dir" qualifiers="const"> <return type="bool" /> <description> @@ -85,7 +105,13 @@ <param index="0" name="path" type="String" /> <description> Returns whether the target directory exists. The argument can be relative to the current directory, or an absolute path. - If the [Directory] is not open, the path is relative to [code]res://[/code]. + </description> + </method> + <method name="dir_exists_absolute" qualifiers="static"> + <return type="bool" /> + <param index="0" name="path" type="String" /> + <description> + Static version of [method dir_exists]. Supports only absolute paths. </description> </method> <method name="file_exists"> @@ -93,11 +119,12 @@ <param index="0" name="path" type="String" /> <description> Returns whether the target file exists. The argument can be relative to the current directory, or an absolute path. - If the [Directory] is not open, the path is relative to [code]res://[/code]. + For a static equivalent, use [method FileAccess.file_exists]. </description> </method> - <method name="get_current_dir"> + <method name="get_current_dir" qualifiers="const"> <return type="String" /> + <param index="0" name="include_drive" type="bool" default="true" /> <description> Returns the absolute path to the currently opened directory (e.g. [code]res://folder[/code] or [code]C:\tmp\folder[/code]). </description> @@ -105,7 +132,7 @@ <method name="get_current_drive"> <return type="int" /> <description> - Returns the currently opened directory's drive index. See [method get_drive] to convert returned index to the name of the drive. + Returns the currently opened directory's drive index. See [method get_drive_name] to convert returned index to the name of the drive. </description> </method> <method name="get_directories"> @@ -115,17 +142,15 @@ Affected by [member include_hidden] and [member include_navigational]. </description> </method> - <method name="get_drive"> - <return type="String" /> - <param index="0" name="idx" type="int" /> + <method name="get_directories_at" qualifiers="static"> + <return type="PackedStringArray" /> + <param index="0" name="path" type="String" /> <description> - On Windows, returns the name of the drive (partition) passed as an argument (e.g. [code]C:[/code]). - On macOS, returns the path to the mounted volume passed as an argument. - On Linux, returns the path to the mounted volume or GTK 3 bookmark passed as an argument. - On other platforms, or if the requested drive does not exist, the method returns an empty String. + Returns a [PackedStringArray] containing filenames of the directory contents, excluding files, at the given [param path]. The array is sorted alphabetically. + Use [method get_directories] if you want more control of what gets included. </description> </method> - <method name="get_drive_count"> + <method name="get_drive_count" qualifiers="static"> <return type="int" /> <description> On Windows, returns the number of drives (partitions) mounted on the current filesystem. @@ -134,6 +159,16 @@ On other platforms, the method returns 0. </description> </method> + <method name="get_drive_name" qualifiers="static"> + <return type="String" /> + <param index="0" name="idx" type="int" /> + <description> + On Windows, returns the name of the drive (partition) passed as an argument (e.g. [code]C:[/code]). + On macOS, returns the path to the mounted volume passed as an argument. + On Linux, returns the path to the mounted volume or GTK 3 bookmark passed as an argument. + On other platforms, or if the requested drive does not exist, the method returns an empty String. + </description> + </method> <method name="get_files"> <return type="PackedStringArray" /> <description> @@ -141,11 +176,25 @@ Affected by [member include_hidden]. </description> </method> + <method name="get_files_at" qualifiers="static"> + <return type="PackedStringArray" /> + <param index="0" name="path" type="String" /> + <description> + Returns a [PackedStringArray] containing filenames of the directory contents, excluding directories, at the given [param path]. The array is sorted alphabetically. + Use [method get_files] if you want more control of what gets included. + </description> + </method> <method name="get_next"> <return type="String" /> <description> - 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]). - 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). + Returns the next element (file or directory) in the current directory. + 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). + </description> + </method> + <method name="get_open_error" qualifiers="static"> + <return type="int" enum="Error" /> + <description> + Returns the result of the last [method open] call in the current thread. </description> </method> <method name="get_space_left"> @@ -176,6 +225,13 @@ Returns one of the [enum Error] code constants ([code]OK[/code] on success). </description> </method> + <method name="make_dir_absolute" qualifiers="static"> + <return type="int" enum="Error" /> + <param index="0" name="path" type="String" /> + <description> + Static version of [method make_dir]. Supports only absolute paths. + </description> + </method> <method name="make_dir_recursive"> <return type="int" enum="Error" /> <param index="0" name="path" type="String" /> @@ -184,12 +240,19 @@ Returns one of the [enum Error] code constants ([code]OK[/code] on success). </description> </method> - <method name="open"> + <method name="make_dir_recursive_absolute" qualifiers="static"> <return type="int" enum="Error" /> <param index="0" name="path" type="String" /> <description> - Opens an existing directory of the filesystem. The [param path] 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]). - Returns one of the [enum Error] code constants ([code]OK[/code] on success). + Static version of [method make_dir_recursive]. Supports only absolute paths. + </description> + </method> + <method name="open" qualifiers="static"> + <return type="DirAccess" /> + <param index="0" name="path" type="String" /> + <description> + Creates a new [DirAccess] object and opens an existing directory of the filesystem. The [param path] 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]). + Returns [code]null[/code] if opening the directory failed. You can use [method get_open_error] to check the error that ocurred. </description> </method> <method name="remove"> @@ -201,6 +264,13 @@ Returns one of the [enum Error] code constants ([code]OK[/code] on success). </description> </method> + <method name="remove_absolute" qualifiers="static"> + <return type="int" enum="Error" /> + <param index="0" name="path" type="String" /> + <description> + Static version of [method remove]. Supports only absolute paths. + </description> + </method> <method name="rename"> <return type="int" enum="Error" /> <param index="0" name="from" type="String" /> @@ -210,13 +280,21 @@ Returns one of the [enum Error] code constants ([code]OK[/code] on success). </description> </method> + <method name="rename_absolute" qualifiers="static"> + <return type="int" enum="Error" /> + <param index="0" name="from" type="String" /> + <param index="1" name="to" type="String" /> + <description> + Static version of [method rename]. Supports only absolute paths. + </description> + </method> </methods> <members> - <member name="include_hidden" type="bool" setter="set_include_hidden" getter="get_include_hidden" default="false"> + <member name="include_hidden" type="bool" setter="set_include_hidden" getter="get_include_hidden"> If [code]true[/code], hidden files are included when the navigating directory. Affects [method list_dir_begin], [method get_directories] and [method get_files]. </member> - <member name="include_navigational" type="bool" setter="set_include_navigational" getter="get_include_navigational" default="false"> + <member name="include_navigational" type="bool" setter="set_include_navigational" getter="get_include_navigational"> If [code]true[/code], [code].[/code] and [code]..[/code] are included when navigating the directory. Affects [method list_dir_begin] and [method get_directories]. </member> diff --git a/doc/classes/DisplayServer.xml b/doc/classes/DisplayServer.xml index d22d64c276..a1dee7ecc7 100644 --- a/doc/classes/DisplayServer.xml +++ b/doc/classes/DisplayServer.xml @@ -1336,6 +1336,15 @@ Depending on the platform and used renderer, the engine will fall back to [constant VSYNC_ENABLED], if the desired mode is not supported. </description> </method> + <method name="window_set_window_buttons_offset"> + <return type="void" /> + <param index="0" name="offset" type="Vector2i" /> + <param index="1" name="window_id" type="int" default="0" /> + <description> + When [constant WINDOW_FLAG_EXTEND_TO_TITLE] flag is set, set offset to the center of the first titlebar button. + [b]Note:[/b] This flag is implemented on macOS. + </description> + </method> <method name="window_set_window_event_callback"> <return type="void" /> <param index="0" name="callback" type="Callable" /> diff --git a/doc/classes/EditorInspector.xml b/doc/classes/EditorInspector.xml index 280a7bf34a..a1a43dd5bf 100644 --- a/doc/classes/EditorInspector.xml +++ b/doc/classes/EditorInspector.xml @@ -13,6 +13,14 @@ </description> <tutorials> </tutorials> + <methods> + <method name="get_selected_path" qualifiers="const"> + <return type="String" /> + <description> + Gets the path of the currently selected property. + </description> + </method> + </methods> <members> <member name="horizontal_scroll_mode" type="int" setter="set_horizontal_scroll_mode" getter="get_horizontal_scroll_mode" overrides="ScrollContainer" enum="ScrollContainer.ScrollMode" default="0" /> </members> diff --git a/doc/classes/EditorPlugin.xml b/doc/classes/EditorPlugin.xml index 3c0d3ec6be..27cf410c15 100644 --- a/doc/classes/EditorPlugin.xml +++ b/doc/classes/EditorPlugin.xml @@ -64,8 +64,8 @@ if event is InputEventMouseMotion: # Redraw viewport when cursor is moved. update_overlays() - return true - return false + return EditorPlugin.AFTER_GUI_INPUT_STOP + return EditorPlugin.AFTER_GUI_INPUT_PASS [/gdscript] [csharp] public override void _Forward3dDrawOverViewport(Godot.Control overlay) @@ -74,15 +74,15 @@ overlay.DrawCircle(overlay.GetLocalMousePosition(), 64, Colors.White); } - public override bool _Forward3dGuiInput(Godot.Camera3D camera, InputEvent @event) + public override EditorPlugin.AfterGUIInput _Forward3dGuiInput(Godot.Camera3D camera, InputEvent @event) { if (@event is InputEventMouseMotion) { // Redraw viewport when cursor is moved. UpdateOverlays(); - return true; + return EditorPlugin.AFTER_GUI_INPUT_STOP; } - return false; + return EditorPlugin.AFTER_GUI_INPUT_PASS; [/csharp] [/codeblocks] </description> @@ -100,33 +100,33 @@ <param index="0" name="viewport_camera" type="Camera3D" /> <param index="1" name="event" type="InputEvent" /> <description> - 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 [param event], otherwise forwards [param event] to other Editor classes. Example: + Called when there is a root node in the current edited scene, [method _handles] is implemented, and an [InputEvent] happens in the 3D viewport. The return value decides whether the [InputEvent] is consumed or forwarded to other [EditorPlugin]s. See [enum AfterGUIInput] for options. Example: [codeblocks] [gdscript] - # Prevents the InputEvent to reach other Editor classes. + # Prevents the InputEvent from reaching other Editor classes. func _forward_3d_gui_input(camera, event): return EditorPlugin.AFTER_GUI_INPUT_STOP [/gdscript] [csharp] - // Prevents the InputEvent to reach other Editor classes. - public override bool _Forward3dGuiInput(Camera3D camera, InputEvent @event) + // Prevents the InputEvent from reaching other Editor classes. + public override EditorPlugin.AfterGUIInput _Forward3dGuiInput(Camera3D camera, InputEvent @event) { return EditorPlugin.AFTER_GUI_INPUT_STOP; } [/csharp] [/codeblocks] - Must [code]return false[/code] in order to forward the [InputEvent] to other Editor classes. Example: + Must [code]return EditorPlugin.AFTER_GUI_INPUT_PASS[/code] in order to forward the [InputEvent] to other Editor classes. Example: [codeblocks] [gdscript] # Consumes InputEventMouseMotion and forwards other InputEvent types. func _forward_3d_gui_input(camera, event): - return event is InputEventMouseMotion + return EditorPlugin.AFTER_GUI_INPUT_STOP if event is InputEventMouseMotion else EditorPlugin.AFTER_GUI_INPUT_PASS [/gdscript] [csharp] // Consumes InputEventMouseMotion and forwards other InputEvent types. - public override bool _Forward3dGuiInput(Camera3D camera, InputEvent @event) + public override EditorPlugin.AfterGUIInput _Forward3dGuiInput(Camera3D camera, InputEvent @event) { - return @event is InputEventMouseMotion; + return @event is InputEventMouseMotion ? EditorPlugin.AFTER_GUI_INPUT_STOP : EditorPlugin.AFTER_GUI_INPUT_PASS; } [/csharp] [/codeblocks] @@ -185,12 +185,12 @@ 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 [param event], otherwise forwards [param event] to other Editor classes. Example: [codeblocks] [gdscript] - # Prevents the InputEvent to reach other Editor classes. + # Prevents the InputEvent from reaching other Editor classes. func _forward_canvas_gui_input(event): return true [/gdscript] [csharp] - // Prevents the InputEvent to reach other Editor classes. + // Prevents the InputEvent from reaching other Editor classes. public override bool ForwardCanvasGuiInput(InputEvent @event) { return true; @@ -237,7 +237,7 @@ # You can use a custom icon: return preload("res://addons/my_plugin/my_plugin_icon.svg") # Or use a built-in icon: - return get_editor_interface().get_base_control().get_icon("Node", "EditorIcons") + return get_editor_interface().get_base_control().get_theme_icon("Node", "EditorIcons") [/gdscript] [csharp] public override Texture2D GetPluginIcon() @@ -245,7 +245,7 @@ // You can use a custom icon: return ResourceLoader.Load<Texture2D>("res://addons/my_plugin/my_plugin_icon.svg"); // Or use a built-in icon: - return GetEditorInterface().GetBaseControl().GetIcon("Node", "EditorIcons"); + return GetEditorInterface().GetBaseControl().GetThemeIcon("Node", "EditorIcons"); } [/csharp] [/codeblocks] @@ -755,5 +755,14 @@ <constant name="DOCK_SLOT_MAX" value="8" enum="DockSlot"> Represents the size of the [enum DockSlot] enum. </constant> + <constant name="AFTER_GUI_INPUT_PASS" value="0" enum="AfterGUIInput"> + Forwards the [InputEvent] to other EditorPlugins. + </constant> + <constant name="AFTER_GUI_INPUT_STOP" value="1" enum="AfterGUIInput"> + Prevents the [InputEvent] from reaching other Editor classes. + </constant> + <constant name="AFTER_GUI_INPUT_CUSTOM" value="2" enum="AfterGUIInput"> + Pass the [InputEvent] to other editor plugins except the main [Node3D] one. This can be used to prevent node selection changes and work with sub-gizmos instead. + </constant> </constants> </class> diff --git a/doc/classes/EditorProperty.xml b/doc/classes/EditorProperty.xml index 7bac4bf7ac..9170c449bf 100644 --- a/doc/classes/EditorProperty.xml +++ b/doc/classes/EditorProperty.xml @@ -9,6 +9,13 @@ <tutorials> </tutorials> <methods> + <method name="_set_read_only" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="read_only" type="bool" /> + <description> + Called when the read-only status of the property is changed. It may be used to change custom controls into a read-only or modifiable state. + </description> + </method> <method name="_update_property" qualifiers="virtual"> <return type="void" /> <description> diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml index d509ee386b..6007128965 100644 --- a/doc/classes/EditorSettings.xml +++ b/doc/classes/EditorSettings.xml @@ -405,7 +405,7 @@ If [code]true[/code], allows panning by holding down [kbd]Space[/kbd] in the 2D editor viewport (in addition to panning with the middle or right mouse buttons). If [code]false[/code], the left mouse button must be held down while holding down [kbd]Space[/kbd] to pan in the 2D editor viewport. </member> <member name="editors/panning/sub_editors_panning_scheme" type="int" setter="" getter=""> - Controls whether the mouse wheel scroll zooms or pans in subeditors. The list of affected subeditors is: animation blend tree editor, [Polygon2D] editor, tileset editor, texture region editor, visual shader editor and visual script editor. See also [member editors/panning/2d_editor_panning_scheme] and [member editors/panning/animation_editors_panning_scheme]. + Controls whether the mouse wheel scroll zooms or pans in subeditors. The list of affected subeditors is: animation blend tree editor, [Polygon2D] editor, tileset editor, texture region editor and visual shader editor. See also [member editors/panning/2d_editor_panning_scheme] and [member editors/panning/animation_editors_panning_scheme]. </member> <member name="editors/panning/warped_mouse_panning" type="bool" setter="" getter=""> If [code]true[/code], warps the mouse around the 2D viewport while panning in the 2D editor. This makes it possible to pan over a large area without having to exit panning then mouse the mouse back constantly. @@ -424,10 +424,10 @@ [b]Note:[/b] Only effective if [member editors/tiles_editor/display_grid] is [code]true[/code]. </member> <member name="editors/visual_editors/lines_curvature" type="float" setter="" getter=""> - The curvature to use for connection lines in the visual script and visual shader editors. Higher values will make connection lines appear more curved, with values above [code]0.5[/code] resulting in more "angular" turns in the middle of connection lines. + The curvature to use for connection lines in the visual shader editor. Higher values will make connection lines appear more curved, with values above [code]0.5[/code] resulting in more "angular" turns in the middle of connection lines. </member> <member name="editors/visual_editors/minimap_opacity" type="float" setter="" getter=""> - The opacity of the minimap displayed in the bottom-right corner of the visual script and visual shader editors. + The opacity of the minimap displayed in the bottom-right corner of the visual shader editor. </member> <member name="editors/visual_editors/visual_shader/port_preview_size" type="int" setter="" getter=""> The size to use for port previews in the visual shader uniforms (toggled by clicking the "eye" icon next to an output). The value is defined in pixels at 100% zoom, and will scale with zoom automatically. @@ -616,8 +616,8 @@ The port number to use to contact the HTTP and HTTPS proxy in the editor (for the asset library and export template downloads). See also [member network/http_proxy/host]. [b]Note:[/b] Godot currently doesn't automatically use system proxy settings, so you have to enter them manually here if needed. </member> - <member name="network/ssl/editor_ssl_certificates" type="String" setter="" getter=""> - The SSL certificate bundle to use for HTTP requests made within the editor (e.g. from the AssetLib tab). If left empty, the [url=https://github.com/godotengine/godot/blob/master/thirdparty/certs/ca-certificates.crt]included Mozilla certificate bundle[/url] will be used. + <member name="network/tls/editor_tls_certificates" type="String" setter="" getter=""> + The TLS certificate bundle to use for HTTP requests made within the editor (e.g. from the AssetLib tab). If left empty, the [url=https://github.com/godotengine/godot/blob/master/thirdparty/certs/ca-certificates.crt]included Mozilla certificate bundle[/url] will be used. </member> <member name="project_manager/sorting_order" type="int" setter="" getter=""> The sorting order to use in the project manager. When changing the sorting order in the project manager, this setting is set permanently in the editor settings. diff --git a/doc/classes/EditorTranslationParserPlugin.xml b/doc/classes/EditorTranslationParserPlugin.xml index d028996db8..08986781cd 100644 --- a/doc/classes/EditorTranslationParserPlugin.xml +++ b/doc/classes/EditorTranslationParserPlugin.xml @@ -72,7 +72,7 @@ msgidsContextPlural.Add(new Godot.Collections.Array{"Only with context", "a friendly context", ""}); [/csharp] [/codeblocks] - [b]Note:[/b] If you override parsing logic for standard script types (GDScript, C#, etc.), it would be better to load the [code]path[/code] argument using [method ResourceLoader.load]. This is because built-in scripts are loaded as [Resource] type, not [File] type. + [b]Note:[/b] If you override parsing logic for standard script types (GDScript, C#, etc.), it would be better to load the [code]path[/code] argument using [method ResourceLoader.load]. This is because built-in scripts are loaded as [Resource] type, not [FileAccess] type. For example: [codeblocks] [gdscript] diff --git a/doc/classes/Engine.xml b/doc/classes/Engine.xml index 301a3e55fb..ecf3d87a70 100644 --- a/doc/classes/Engine.xml +++ b/doc/classes/Engine.xml @@ -14,12 +14,20 @@ <description> Returns the name of the CPU architecture the Godot binary was built for. Possible return values are [code]x86_64[/code], [code]x86_32[/code], [code]arm64[/code], [code]armv7[/code], [code]rv64[/code], [code]riscv[/code], [code]ppc64[/code], [code]ppc[/code], [code]wasm64[/code] and [code]wasm32[/code]. To detect whether the current CPU architecture is 64-bit, you can use the fact that all 64-bit architecture names have [code]64[/code] in their name: - [codeblock] + [codeblocks] + [gdscript] if "64" in Engine.get_architecture_name(): print("Running on 64-bit CPU.") else: print("Running on 32-bit CPU.") - [/codeblock] + [/gdscript] + [csharp] + if (Engine.GetArchitectureName().Contains("64")) + GD.Print("Running on 64-bit CPU."); + else + GD.Print("Running on 32-bit CPU."); + [/csharp] + [/codeblocks] [b]Note:[/b] [method get_architecture_name] does [i]not[/i] return the name of the host CPU architecture. For example, if running an x86_32 Godot binary on a x86_64 system, the returned value will be [code]x86_32[/code]. </description> </method> @@ -83,11 +91,24 @@ <description> Returns the total number of frames passed since engine initialization which is advanced on each [b]physics frame[/b]. See also [method get_process_frames]. [method get_physics_frames] can be used to run expensive logic less often without relying on a [Timer]: - [codeblock] + [codeblocks] + [gdscript] func _physics_process(_delta): if Engine.get_physics_frames() % 2 == 0: pass # Run expensive logic only once every 2 physics frames here. - [/codeblock] + [/gdscript] + [csharp] + public override void _PhysicsProcess(double delta) + { + base._PhysicsProcess(delta); + + if (Engine.GetPhysicsFrames() % 2 == 0) + { + // Run expensive logic only once every 2 physics frames here. + } + } + [/csharp] + [/codeblocks] </description> </method> <method name="get_physics_interpolation_fraction" qualifiers="const"> @@ -101,11 +122,24 @@ <description> Returns the total number of frames passed since engine initialization which is advanced on each [b]process frame[/b], regardless of whether the render loop is enabled. See also [method get_frames_drawn] and [method get_physics_frames]. [method get_process_frames] can be used to run expensive logic less often without relying on a [Timer]: - [codeblock] + [codeblocks] + [gdscript] func _process(_delta): if Engine.get_process_frames() % 2 == 0: pass # Run expensive logic only once every 2 process (render) frames here. - [/codeblock] + [/gdscript] + [csharp] + public override void _Process(double delta) + { + base._Process(delta); + + if (Engine.GetProcessFrames() % 2 == 0) + { + // Run expensive logic only once every 2 physics frames here. + } + } + [/csharp] + [/codeblocks] </description> </method> <method name="get_script_language" qualifiers="const"> @@ -182,12 +216,20 @@ <return type="bool" /> <description> Returns [code]true[/code] if the script is currently running inside the editor, [code]false[/code] otherwise. This is useful for [code]@tool[/code] scripts to conditionally draw editor helpers, or prevent accidentally running "game" code that would affect the scene state while in the editor: - [codeblock] + [codeblocks] + [gdscript] if Engine.is_editor_hint(): draw_gizmos() else: simulate_physics() - [/codeblock] + [/gdscript] + [csharp] + if (Engine.IsEditorHint()) + DrawGizmos(); + else + SimulatePhysics(); + [/csharp] + [/codeblocks] See [url=$DOCS_URL/tutorials/plugins/running_code_in_the_editor.html]Running code in the editor[/url] in the documentation for more information. [b]Note:[/b] To detect whether the script is run from an editor [i]build[/i] (e.g. when pressing [kbd]F5[/kbd]), use [method OS.has_feature] with the [code]"editor"[/code] argument instead. [code]OS.has_feature("editor")[/code] will evaluate to [code]true[/code] both when the code is running in the editor and when running the project from the editor, but it will evaluate to [code]false[/code] when the code is run from an exported project. </description> diff --git a/doc/classes/Environment.xml b/doc/classes/Environment.xml index 695f2cbc66..243a28e73d 100644 --- a/doc/classes/Environment.xml +++ b/doc/classes/Environment.xml @@ -86,7 +86,7 @@ This is useful to simulate [url=https://en.wikipedia.org/wiki/Aerial_perspective]aerial perspective[/url] in large scenes with low density fog. However, it is not very useful for high-density fog, as the sky will shine through. When set to [code]1.0[/code], the fog color comes completely from the [Sky]. If set to [code]0.0[/code], aerial perspective is disabled. </member> <member name="fog_density" type="float" setter="set_fog_density" getter="get_fog_density" default="0.01"> - The exponential fog density to use. Higher values result in a more dense fog. + The [i]exponential[/i] fog density to use. Higher values result in a more dense fog. Fog rendering is exponential as in real life. </member> <member name="fog_enabled" type="bool" setter="set_fog_enabled" getter="is_fog_enabled" default="false"> If [code]true[/code], fog effects are enabled. @@ -292,13 +292,15 @@ The [Color] of the volumetric fog when interacting with lights. Mist and fog have an albedo close to [code]Color(1, 1, 1, 1)[/code] while smoke has a darker albedo. </member> <member name="volumetric_fog_ambient_inject" type="float" setter="set_volumetric_fog_ambient_inject" getter="get_volumetric_fog_ambient_inject" default="0.0"> - Scales the strength of ambient light used in the volumetric fog. A value of [code]0[/code] means that ambient light will not impact the volumetric fog. + Scales the strength of ambient light used in the volumetric fog. A value of [code]0.0[/code] means that ambient light will not impact the volumetric fog. [member volumetric_fog_ambient_inject] has a small performance cost when set above [code]0.0[/code]. + [b]Note:[/b] This has no visible effect if [member volumetric_fog_density] is [code]0.0[/code] or if [member volumetric_fog_albedo] is a fully black color. </member> <member name="volumetric_fog_anisotropy" type="float" setter="set_volumetric_fog_anisotropy" getter="get_volumetric_fog_anisotropy" default="0.2"> - The direction of scattered light as it goes through the volumetric fog. A value close [code]1[/code] means almost all light is scattered forward. A value close to [code]0[/code] means light is scattered equally in all directions. A value close to [code]-1[/code] means light is scattered mostly backward. Fog and mist scatter light slightly forward, while smoke scatters light equally in all directions. + The direction of scattered light as it goes through the volumetric fog. A value close to [code]1.0[/code] means almost all light is scattered forward. A value close to [code]0.0[/code] means light is scattered equally in all directions. A value close to [code]-1.0[/code] means light is scattered mostly backward. Fog and mist scatter light slightly forward, while smoke scatters light equally in all directions. </member> <member name="volumetric_fog_density" type="float" setter="set_volumetric_fog_density" getter="get_volumetric_fog_density" default="0.05"> - The base density of the volumetric fog. Set this to the lowest density you want to have globally. + The base [i]exponential[/i] density of the volumetric fog. Set this to the lowest density you want to have globally. [FogVolume]s can be used to add to or subtract from this density in specific areas. Fog rendering is exponential as in real life. + A value of [code]0.0[/code] disables global volumetric fog while allowing [FogVolume]s to display volumetric fog in specific areas. </member> <member name="volumetric_fog_detail_spread" type="float" setter="set_volumetric_fog_detail_spread" getter="get_volumetric_fog_detail_spread" default="2.0"> The distribution of size down the length of the froxel buffer. A higher value compresses the froxels closer to the camera and places more detail closer to the camera. @@ -311,22 +313,25 @@ </member> <member name="volumetric_fog_enabled" type="bool" setter="set_volumetric_fog_enabled" getter="is_volumetric_fog_enabled" default="false"> Enables the volumetric fog effect. Volumetric fog uses a screen-aligned froxel buffer to calculate accurate volumetric scattering in the short to medium range. Volumetric fog interacts with [FogVolume]s and lights to calculate localized and global fog. Volumetric fog uses a PBR single-scattering model based on extinction, scattering, and emission which it exposes to users as density, albedo, and emission. + [b]Note:[/b] Volumetric fog is only available in the forward plus renderer. It is not available in the mobile renderer or the compatibility renderer. </member> <member name="volumetric_fog_gi_inject" type="float" setter="set_volumetric_fog_gi_inject" getter="get_volumetric_fog_gi_inject" default="1.0"> - Scales the strength of Global Illumination used in the volumetric fog. A value of [code]0.0[/code] means that Global Illumination will not impact the volumetric fog. + Scales the strength of Global Illumination used in the volumetric fog's albedo color. A value of [code]0.0[/code] means that Global Illumination will not impact the volumetric fog. [member volumetric_fog_gi_inject] has a small performance cost when set above [code]0.0[/code]. + [b]Note:[/b] This has no visible effect if [member volumetric_fog_density] is [code]0.0[/code] or if [member volumetric_fog_albedo] is a fully black color. [b]Note:[/b] Only [VoxelGI] and SDFGI ([member Environment.sdfgi_enabled]) are taken into account when using [member volumetric_fog_gi_inject]. Global illumination from [LightmapGI], [ReflectionProbe] and SSIL (see [member ssil_enabled]) will be ignored by volumetric fog. </member> <member name="volumetric_fog_length" type="float" setter="set_volumetric_fog_length" getter="get_volumetric_fog_length" default="64.0"> - The distance over which the volumetric fog is computed. Increase to compute fog over a greater range, decrease to add more detail when a long range is not needed. For best quality fog, keep this as low as possible. + The distance over which the volumetric fog is computed. Increase to compute fog over a greater range, decrease to add more detail when a long range is not needed. For best quality fog, keep this as low as possible. See also [member ProjectSettings.rendering/environment/volumetric_fog/volume_depth]. </member> <member name="volumetric_fog_sky_affect" type="float" setter="set_volumetric_fog_sky_affect" getter="get_volumetric_fog_sky_affect" default="1.0"> The factor to use when affecting the sky with volumetric fog. [code]1.0[/code] means that volumetric fog can fully obscure the sky. Lower values reduce the impact of volumetric fog on sky rendering, with [code]0.0[/code] not affecting sky rendering at all. + [b]Note:[/b] [member volumetric_fog_sky_affect] also affects [FogVolume]s, even if [member volumetric_fog_density] is [code]0.0[/code]. If you notice [FogVolume]s are disappearing when looking towards the sky, set [member volumetric_fog_sky_affect] to [code]1.0[/code]. </member> <member name="volumetric_fog_temporal_reprojection_amount" type="float" setter="set_volumetric_fog_temporal_reprojection_amount" getter="get_volumetric_fog_temporal_reprojection_amount" default="0.9"> The amount by which to blend the last frame with the current frame. A higher number results in smoother volumetric fog, but makes "ghosting" much worse. A lower value reduces ghosting but can result in the per-frame temporal jitter becoming visible. </member> <member name="volumetric_fog_temporal_reprojection_enabled" type="bool" setter="set_volumetric_fog_temporal_reprojection_enabled" getter="is_volumetric_fog_temporal_reprojection_enabled" default="true"> - Enables temporal reprojection in the volumetric fog. Temporal reprojection blends the current frame's volumetric fog with the last frame's volumetric fog to smooth out jagged edges. The performance cost is minimal, however it does lead to moving [FogVolume]s and [Light3D]s "ghosting" and leaving a trail behind them. When temporal reprojection is enabled, try to avoid moving [FogVolume]s or [Light3D]s too fast. + Enables temporal reprojection in the volumetric fog. Temporal reprojection blends the current frame's volumetric fog with the last frame's volumetric fog to smooth out jagged edges. The performance cost is minimal; however, it leads to moving [FogVolume]s and [Light3D]s "ghosting" and leaving a trail behind them. When temporal reprojection is enabled, try to avoid moving [FogVolume]s or [Light3D]s too fast. Short-lived dynamic lighting effects should have [member Light3D.light_volumetric_fog_energy] set to [code]0.0[/code] to avoid ghosting. </member> </members> <constants> diff --git a/doc/classes/File.xml b/doc/classes/FileAccess.xml index 76c6a4871c..adc0f4c3dd 100644 --- a/doc/classes/File.xml +++ b/doc/classes/FileAccess.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="File" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="FileAccess" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Type to handle file reading and writing operations. </brief_description> @@ -9,39 +9,42 @@ [codeblocks] [gdscript] func save(content): - var file = File.new() - file.open("user://save_game.dat", File.WRITE) + var file = FileAccess.open("user://save_game.dat", FileAccess.WRITE) file.store_string(content) - file.close() func load(): - var file = File.new() - file.open("user://save_game.dat", File.READ) + var file = FileAccess.open("user://save_game.dat", FileAccess.READ) var content = file.get_as_text() - file.close() return content [/gdscript] [csharp] public void Save(string content) { - var file = new File(); - file.Open("user://save_game.dat", File.ModeFlags.Write); + using var file = FileAccess.Open("user://save_game.dat", File.ModeFlags.Write); file.StoreString(content); - file.Close(); } public string Load() { - var file = new File(); - file.Open("user://save_game.dat", File.ModeFlags.Read); + using var file = FileAccess.Open("user://save_game.dat", File.ModeFlags.Read); string content = file.GetAsText(); - file.Close(); return content; } [/csharp] [/codeblocks] In the example above, the file will be saved in the user data folder as specified in the [url=$DOCS_URL/tutorials/io/data_paths.html]Data paths[/url] documentation. - [b]Note:[/b] To access project resources once exported, it is recommended to use [ResourceLoader] instead of the [File] API, as some files are converted to engine-specific formats and their original source files might not be present in the exported PCK package. + There is no method to close a file in order to free it from use. Instead, [FileAccess] will close when it's freed, which happens when it goes out of scope or when it gets assigned with [code]null[/code]. In C# the reference must be disposed after we are done using it, this can be done with the [code]using[/code] statement or calling the [code]Dispose[/code] method directly. + [codeblocks] + [gdscript] + var file = FileAccess.open("res://something") # File is opened and locked for use. + file = null # File is closed. + [/gdscript] + [csharp] + using var file = FileAccess.Open("res://something"); // File is opened and locked for use. + // The using statement calls Dispose when going out of scope. + [/csharp] + [/codeblocks] + [b]Note:[/b] To access project resources once exported, it is recommended to use [ResourceLoader] instead of the [FileAccess] API, as some files are converted to engine-specific formats and their original source files might not be present in the exported PCK package. [b]Note:[/b] Files are automatically closed only if the process exits "normally" (such as by clicking the window manager's close button or pressing [b]Alt + F4[/b]). If you stop the project execution by pressing [b]F8[/b] while the project is running, the file won't be closed as the game process will be killed. You can work around this by calling [method flush] at regular intervals. </description> <tutorials> @@ -49,12 +52,6 @@ <link title="3D Voxel Demo">https://godotengine.org/asset-library/asset/676</link> </tutorials> <methods> - <method name="close"> - <return type="void" /> - <description> - Closes the currently opened file and prevents subsequent read/write operations. Use [method flush] to persist the data to disk without closing the file. - </description> - </method> <method name="eof_reached" qualifiers="const"> <return type="bool" /> <description> @@ -80,12 +77,13 @@ <description> Returns [code]true[/code] if the file exists in the given path. [b]Note:[/b] Many resources types are imported (e.g. textures or sound files), and their source asset will not be included in the exported game, as only the imported version is used. See [method ResourceLoader.exists] for an alternative approach that takes resource remapping into account. + For a non-static, relative equivalent, use [method DirAccess.file_exists]. </description> </method> <method name="flush"> <return type="void" /> <description> - Writes the file's buffer to disk. Flushing is automatically performed when the file is closed. This means you don't need to call [method flush] manually before closing a file using [method close]. Still, calling [method flush] can be used to ensure the data is safe even if the project crashes instead of being closed gracefully. + Writes the file's buffer to disk. Flushing is automatically performed when the file is closed. This means you don't need to call [method flush] manually before closing a file. Still, calling [method flush] can be used to ensure the data is safe even if the project crashes instead of being closed gracefully. [b]Note:[/b] Only call [method flush] when you actually need it. Otherwise, it will decrease performance due to constant disk writes. </description> </method> @@ -174,20 +172,26 @@ Text is interpreted as being UTF-8 encoded. </description> </method> - <method name="get_md5" qualifiers="const"> + <method name="get_md5" qualifiers="static"> <return type="String" /> <param index="0" name="path" type="String" /> <description> Returns an MD5 String representing the file at the given path or an empty [String] on failure. </description> </method> - <method name="get_modified_time" qualifiers="const"> + <method name="get_modified_time" qualifiers="static"> <return type="int" /> <param index="0" name="file" type="String" /> <description> Returns the last time the [param file] was modified in Unix timestamp format or returns a [String] "ERROR IN [code]file[/code]". This Unix timestamp can be converted to another format using the [Time] singleton. </description> </method> + <method name="get_open_error" qualifiers="static"> + <return type="int" enum="Error" /> + <description> + Returns the result of the last [method open] call in the current thread. + </description> + </method> <method name="get_pascal_string"> <return type="String" /> <description> @@ -219,7 +223,7 @@ Returns the next bits from the file as a floating-point number. </description> </method> - <method name="get_sha256" qualifiers="const"> + <method name="get_sha256" qualifiers="static"> <return type="String" /> <param index="0" name="path" type="String" /> <description> @@ -240,41 +244,45 @@ Returns [code]true[/code] if the file is currently opened. </description> </method> - <method name="open"> - <return type="int" enum="Error" /> + <method name="open" qualifiers="static"> + <return type="FileAccess" /> <param index="0" name="path" type="String" /> - <param index="1" name="flags" type="int" enum="File.ModeFlags" /> + <param index="1" name="flags" type="int" enum="FileAccess.ModeFlags" /> <description> - Opens the file for writing or reading, depending on the flags. + Creates a new [FileAccess] object and opens the file for writing or reading, depending on the flags. + Returns [code]null[/code] if opening the file failed. You can use [method get_open_error] to check the error that ocurred. </description> </method> - <method name="open_compressed"> - <return type="int" enum="Error" /> + <method name="open_compressed" qualifiers="static"> + <return type="FileAccess" /> <param index="0" name="path" type="String" /> - <param index="1" name="mode_flags" type="int" enum="File.ModeFlags" /> - <param index="2" name="compression_mode" type="int" enum="File.CompressionMode" default="0" /> + <param index="1" name="mode_flags" type="int" enum="FileAccess.ModeFlags" /> + <param index="2" name="compression_mode" type="int" enum="FileAccess.CompressionMode" default="0" /> <description> - Opens a compressed file for reading or writing. + Creates a new [FileAccess] object and opens a compressed file for reading or writing. [b]Note:[/b] [method open_compressed] can only read files that were saved by Godot, not third-party compression formats. See [url=https://github.com/godotengine/godot/issues/28999]GitHub issue #28999[/url] for a workaround. + Returns [code]null[/code] if opening the file failed. You can use [method get_open_error] to check the error that ocurred. </description> </method> - <method name="open_encrypted"> - <return type="int" enum="Error" /> + <method name="open_encrypted" qualifiers="static"> + <return type="FileAccess" /> <param index="0" name="path" type="String" /> - <param index="1" name="mode_flags" type="int" enum="File.ModeFlags" /> + <param index="1" name="mode_flags" type="int" enum="FileAccess.ModeFlags" /> <param index="2" name="key" type="PackedByteArray" /> <description> - Opens an encrypted file in write or read mode. You need to pass a binary key to encrypt/decrypt it. + Creates a new [FileAccess] object and opens an encrypted file in write or read mode. You need to pass a binary key to encrypt/decrypt it. [b]Note:[/b] The provided key must be 32 bytes long. + Returns [code]null[/code] if opening the file failed. You can use [method get_open_error] to check the error that ocurred. </description> </method> - <method name="open_encrypted_with_pass"> - <return type="int" enum="Error" /> + <method name="open_encrypted_with_pass" qualifiers="static"> + <return type="FileAccess" /> <param index="0" name="path" type="String" /> - <param index="1" name="mode_flags" type="int" enum="File.ModeFlags" /> + <param index="1" name="mode_flags" type="int" enum="FileAccess.ModeFlags" /> <param index="2" name="pass" type="String" /> <description> - Opens an encrypted file in write or read mode. You need to pass a password to encrypt/decrypt it. + Creates a new [FileAccess] object and opens an encrypted file in write or read mode. You need to pass a password to encrypt/decrypt it. + Returns [code]null[/code] if opening the file failed. You can use [method get_open_error] to check the error that ocurred. </description> </method> <method name="seek"> @@ -432,7 +440,7 @@ </method> </methods> <members> - <member name="big_endian" type="bool" setter="set_big_endian" getter="is_big_endian" default="false"> + <member name="big_endian" type="bool" setter="set_big_endian" getter="is_big_endian"> If [code]true[/code], the file is read with big-endian [url=https://en.wikipedia.org/wiki/Endianness]endianness[/url]. If [code]false[/code], the file is read with little-endian endianness. If in doubt, leave this to [code]false[/code] as most files are written with little-endian endianness. [b]Note:[/b] [member big_endian] is only about the file format, not the CPU type. The CPU endianness doesn't affect the default endianness for files written. [b]Note:[/b] This is always reset to [code]false[/code] whenever you open the file. Therefore, you must set [member big_endian] [i]after[/i] opening the file, not before. diff --git a/doc/classes/FogMaterial.xml b/doc/classes/FogMaterial.xml index e63d4ddf3e..7428d6169a 100644 --- a/doc/classes/FogMaterial.xml +++ b/doc/classes/FogMaterial.xml @@ -5,27 +5,28 @@ </brief_description> <description> A [Material] resource that can be used by [FogVolume]s to draw volumetric effects. + If you need more advanced effects, use a custom [url=$DOCS_URL/tutorials/shaders/shader_reference/fog_shader.html]fog shader[/url]. </description> <tutorials> </tutorials> <members> <member name="albedo" type="Color" setter="set_albedo" getter="get_albedo" default="Color(1, 1, 1, 1)"> - Sets the single-scattering [Color] of the [FogVolume]. Internally [member albedo] is converted into single-scattering which is additively blended with other [FogVolume]s and the [member Environment.volumetric_fog_albedo]. + The single-scattering [Color] of the [FogVolume]. Internally, [member albedo] is converted into single-scattering, which is additively blended with other [FogVolume]s and the [member Environment.volumetric_fog_albedo]. </member> <member name="density" type="float" setter="set_density" getter="get_density" default="1.0"> - Sets the density of the [FogVolume]. Denser objects are more opaque, but may suffer from under-sampling artifacts that look like stripes. + The density of the [FogVolume]. Denser objects are more opaque, but may suffer from under-sampling artifacts that look like stripes. Negative values can be used to subtract fog from other [FogVolume]s or global volumetric fog. </member> <member name="density_texture" type="Texture3D" setter="set_density_texture" getter="get_density_texture"> - Sets a 3D texture that is used to scale the [member density] of the [FogVolume]. + The 3D texture that is used to scale the [member density] of the [FogVolume]. This can be used to vary fog density within the [FogVolume] with any kind of static pattern. For animated effects, consider using a custom [url=$DOCS_URL/tutorials/shaders/shader_reference/fog_shader.html]fog shader[/url]. </member> <member name="edge_fade" type="float" setter="set_edge_fade" getter="get_edge_fade" default="0.1"> - Sets the hardness of the edges of the [FogVolume]. A higher number will result in softer edges while a lower number will result in harder edges. + The hardness of the edges of the [FogVolume]. A higher value will result in softer edges, while a lower value will result in harder edges. </member> <member name="emission" type="Color" setter="set_emission" getter="get_emission" default="Color(0, 0, 0, 1)"> - Sets the [Color] of the light emitted by the [FogVolume]. Emitted light will not cast light or shadows on other objects, but can be useful for modulating the [Color] of the [FogVolume] independently from light sources. + The [Color] of the light emitted by the [FogVolume]. Emitted light will not cast light or shadows on other objects, but can be useful for modulating the [Color] of the [FogVolume] independently from light sources. </member> <member name="height_falloff" type="float" setter="set_height_falloff" getter="get_height_falloff" default="0.0"> - Sets the rate by which the height-based fog decreases in density as height increases in world space. A high falloff will result in a sharp transition, while a low falloff will result in a smoother transition. A value of [code]0[/code] results in uniform-density fog. The height threshold is determined by the height of the associated [FogVolume]. + The rate by which the height-based fog decreases in density as height increases in world space. A high falloff will result in a sharp transition, while a low falloff will result in a smoother transition. A value of [code]0.0[/code] results in uniform-density fog. The height threshold is determined by the height of the associated [FogVolume]. </member> </members> </class> diff --git a/doc/classes/FogVolume.xml b/doc/classes/FogVolume.xml index 3f2ee3035c..d9fa2e6ebb 100644 --- a/doc/classes/FogVolume.xml +++ b/doc/classes/FogVolume.xml @@ -4,22 +4,23 @@ A node used to add local fog with the volumetric fog effect. </brief_description> <description> - [FogVolume]s are used to add localized fog into the global volumetric fog effect. + [FogVolume]s are used to add localized fog into the global volumetric fog effect. [FogVolume]s can also remove volumetric fog from specific areas if using a [FogMaterial] with a negative [member FogMaterial.density]. Performance of [FogVolume]s is directly related to their relative size on the screen and the complexity of their attached [FogMaterial]. It is best to keep [FogVolume]s relatively small and simple where possible. + [b]Note:[/b] [FogVolume]s only have a visible effect if [member Environment.volumetric_fog_enabled] is [code]true[/code]. If you don't want fog to be globally visible (but only within [FogVolume] nodes), set [member Environment.volumetric_fog_density] to [code]0.0[/code]. </description> <tutorials> </tutorials> <members> <member name="extents" type="Vector3" setter="set_extents" getter="get_extents" default="Vector3(1, 1, 1)"> - Sets the size of the [FogVolume] when [member shape] is [constant RenderingServer.FOG_VOLUME_SHAPE_ELLIPSOID], [constant RenderingServer.FOG_VOLUME_SHAPE_CONE], [constant RenderingServer.FOG_VOLUME_SHAPE_CYLINDER] or [constant RenderingServer.FOG_VOLUME_SHAPE_BOX]. + The size of the [FogVolume] when [member shape] is [constant RenderingServer.FOG_VOLUME_SHAPE_ELLIPSOID], [constant RenderingServer.FOG_VOLUME_SHAPE_CONE], [constant RenderingServer.FOG_VOLUME_SHAPE_CYLINDER] or [constant RenderingServer.FOG_VOLUME_SHAPE_BOX]. [b]Note:[/b] Thin fog volumes may appear to flicker when the camera moves or rotates. This can be alleviated by increasing [member ProjectSettings.rendering/environment/volumetric_fog/volume_depth] (at a performance cost) or by decreasing [member Environment.volumetric_fog_length] (at no performance cost, but at the cost of lower fog range). Alternatively, the [FogVolume] can be made thicker and use a lower density in the [member material]. [b]Note:[/b] If [member shape] is [constant RenderingServer.FOG_VOLUME_SHAPE_CONE] or [constant RenderingServer.FOG_VOLUME_SHAPE_CYLINDER], the cone/cylinder will be adjusted to fit within the extents. Non-uniform scaling of cone/cylinder shapes via the [member extents] property is not supported, but you can scale the [FogVolume] node instead. </member> <member name="material" type="Material" setter="set_material" getter="get_material"> - Sets the [Material] to be used by the [FogVolume]. Can be either a [FogMaterial] or a custom [ShaderMaterial]. + The [Material] used by the [FogVolume]. Can be either a built-in [FogMaterial] or a custom [ShaderMaterial]. </member> <member name="shape" type="int" setter="set_shape" getter="get_shape" enum="RenderingServer.FogVolumeShape" default="3"> - Sets the shape of the [FogVolume] to either [constant RenderingServer.FOG_VOLUME_SHAPE_ELLIPSOID], [constant RenderingServer.FOG_VOLUME_SHAPE_CONE], [constant RenderingServer.FOG_VOLUME_SHAPE_CYLINDER], [constant RenderingServer.FOG_VOLUME_SHAPE_BOX] or [constant RenderingServer.FOG_VOLUME_SHAPE_WORLD]. + The shape of the [FogVolume]. This can be set to either [constant RenderingServer.FOG_VOLUME_SHAPE_ELLIPSOID], [constant RenderingServer.FOG_VOLUME_SHAPE_CONE], [constant RenderingServer.FOG_VOLUME_SHAPE_CYLINDER], [constant RenderingServer.FOG_VOLUME_SHAPE_BOX] or [constant RenderingServer.FOG_VOLUME_SHAPE_WORLD]. </member> </members> </class> diff --git a/doc/classes/Font.xml b/doc/classes/Font.xml index ad3a16afbb..6a42b62bcf 100644 --- a/doc/classes/Font.xml +++ b/doc/classes/Font.xml @@ -228,9 +228,15 @@ <description> Returns the size of a bounding box of a single-line string, taking kerning and advance into account. See also [method get_multiline_string_size] and [method draw_string]. For example, to get the string size as displayed by a single-line Label, use: - [codeblock] + [codeblocks] + [gdscript] var string_size = $Label.get_theme_font("font").get_string_size($Label.text, HORIZONTAL_ALIGNMENT_LEFT, -1, $Label.get_theme_font_size("font_size")) - [/codeblock] + [/gdscript] + [csharp] + Label label = GetNode<Label>("Label"); + Vector2 stringSize = label.GetThemeFont("font").GetStringSize(label.Text, HorizontalAlignment.Left, -1, label.GetThemeFontSize("font_size")); + [/csharp] + [/codeblocks] [b]Note:[/b] Real height of the string is context-dependent and can be significantly different from the value returned by [method get_height]. </description> </method> diff --git a/doc/classes/Geometry2D.xml b/doc/classes/Geometry2D.xml index 392ca2cabb..e613ab1a55 100644 --- a/doc/classes/Geometry2D.xml +++ b/doc/classes/Geometry2D.xml @@ -126,7 +126,7 @@ <return type="Dictionary" /> <param index="0" name="sizes" type="PackedVector2Array" /> <description> - Given an array of [Vector2]s representing tiles, builds an atlas. The returned dictionary has two keys: [code]points[/code] is an array of [Vector2] that specifies the positions of each tile, [code]size[/code] contains the overall size of the whole atlas as [Vector2]. + Given an array of [Vector2]s representing tiles, builds an atlas. The returned dictionary has two keys: [code]points[/code] is a [PackedVector2Array] that specifies the positions of each tile, [code]size[/code] contains the overall size of the whole atlas as [Vector2i]. </description> </method> <method name="merge_polygons"> diff --git a/doc/classes/GraphEdit.xml b/doc/classes/GraphEdit.xml index dc093acdcd..5050ce7715 100644 --- a/doc/classes/GraphEdit.xml +++ b/doc/classes/GraphEdit.xml @@ -1,37 +1,38 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="GraphEdit" inherits="Control" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - GraphEdit is an area capable of showing various GraphNodes. It manages connection events between them. + GraphEdit is a control responsible for displaying and manipulating graph-like data using [GraphNode]s. It provides access to creation, removal, connection, and disconnection of nodes. </brief_description> <description> - 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. - It is greatly advised to enable low-processor usage mode (see [member OS.low_processor_usage_mode]) when using GraphEdits. + GraphEdit provides tools for creation, manipulation, and display of various graphs. Its main purpose in the engine is to power the visual programming systems, such as visual shaders, but it is also available for use in user projects. + GraphEdit by itself is only an empty container, representing an infinite grid where [GraphNode]s can be placed. Each [GraphNode] represent a node in the graph, a single unit of data in the connected scheme. GraphEdit, in turn, helps to control various interactions with nodes and between nodes. When the user attempts to connect, disconnect, or close a [GraphNode], a signal is emitted in the GraphEdit, but no action is taken by default. It is the responsibility of the programmer utilizing this control to implement the necessary logic to determine how each request should be handled. + [b]Performance:[/b] It is greatly advised to enable low-processor usage mode (see [member OS.low_processor_usage_mode]) when using GraphEdits. </description> <tutorials> </tutorials> <methods> <method name="_get_connection_line" qualifiers="virtual const"> <return type="PackedVector2Array" /> - <param index="0" name="from" type="Vector2" /> - <param index="1" name="to" type="Vector2" /> + <param index="0" name="from_position" type="Vector2" /> + <param index="1" name="to_position" type="Vector2" /> <description> Virtual method which can be overridden to customize how connections are drawn. </description> </method> <method name="_is_in_input_hotzone" qualifiers="virtual"> <return type="bool" /> - <param index="0" name="graph_node" type="Object" /> - <param index="1" name="slot_index" type="int" /> + <param index="0" name="in_node" type="Object" /> + <param index="1" name="in_port" type="int" /> <param index="2" name="mouse_position" type="Vector2" /> <description> Returns whether the [param mouse_position] is in the input hot zone. - By default, a hot zone is a [Rect2] positioned such that its center is at [param graph_node].[method GraphNode.get_connection_input_position]([param slot_index]) (For output's case, call [method GraphNode.get_connection_output_position] instead). The hot zone's width is twice the Theme Property [code]port_grab_distance_horizontal[/code], and its height is twice the [code]port_grab_distance_vertical[/code]. + By default, a hot zone is a [Rect2] positioned such that its center is at [param in_node].[method GraphNode.get_connection_input_position]([param in_port]) (For output's case, call [method GraphNode.get_connection_output_position] instead). The hot zone's width is twice the Theme Property [code]port_grab_distance_horizontal[/code], and its height is twice the [code]port_grab_distance_vertical[/code]. Below is a sample code to help get started: [codeblock] - func _is_in_input_hotzone(graph_node, slot_index, mouse_position): - var slot_size : Vector2 = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical")) - var slot_pos : Vector2 = graph_node.get_position() + graph_node.get_connection_input_position(slot_index) - slot_size / 2 - var rect = Rect2(slot_pos, slot_size) + func _is_in_input_hotzone(in_node, in_port, mouse_position): + var port_size : Vector2 = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical")) + var port_pos : Vector2 = in_node.get_position() + in_node.get_connection_input_position(in_port) - port_size / 2 + var rect = Rect2(port_pos, port_size) return rect.has_point(mouse_position) [/codeblock] @@ -39,17 +40,17 @@ </method> <method name="_is_in_output_hotzone" qualifiers="virtual"> <return type="bool" /> - <param index="0" name="graph_node" type="Object" /> - <param index="1" name="slot_index" type="int" /> + <param index="0" name="in_node" type="Object" /> + <param index="1" name="in_port" type="int" /> <param index="2" name="mouse_position" type="Vector2" /> <description> Returns whether the [param mouse_position] is in the output hot zone. For more information on hot zones, see [method _is_in_input_hotzone]. Below is a sample code to help get started: [codeblock] - func _is_in_output_hotzone(graph_node, slot_index, mouse_position): - var slot_size : Vector2 = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical")) - var slot_pos : Vector2 = graph_node.get_position() + graph_node.get_connection_output_position(slot_index) - slot_size / 2 - var rect = Rect2(slot_pos, slot_size) + func _is_in_output_hotzone(in_node, in_port, mouse_position): + var port_size : Vector2 = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical")) + var port_pos : Vector2 = in_node.get_position() + in_node.get_connection_output_position(in_port) - port_size / 2 + var rect = Rect2(port_pos, port_size) return rect.has_point(mouse_position) [/codeblock] @@ -57,17 +58,17 @@ </method> <method name="_is_node_hover_valid" qualifiers="virtual"> <return type="bool" /> - <param index="0" name="from" type="StringName" /> - <param index="1" name="from_slot" type="int" /> - <param index="2" name="to" type="StringName" /> - <param index="3" name="to_slot" type="int" /> + <param index="0" name="from_node" type="StringName" /> + <param index="1" name="from_port" type="int" /> + <param index="2" name="to_node" type="StringName" /> + <param index="3" name="to_port" type="int" /> <description> This virtual method can be used to insert additional error detection while the user is dragging a connection over a valid port. Return [code]true[/code] if the connection is indeed valid or return [code]false[/code] if the connection is impossible. If the connection is impossible, no snapping to the port and thus no connection request to that port will happen. In this example a connection to same node is suppressed: [codeblocks] [gdscript] - func _is_node_hover_valid(from, from_slot, to, to_slot): + func _is_node_hover_valid(from, from_port, to, to_port): return from != to [/gdscript] [csharp] @@ -83,21 +84,22 @@ <param index="0" name="from_type" type="int" /> <param index="1" name="to_type" type="int" /> <description> - Makes possible the connection between two different slot types. The type is defined with the [method GraphNode.set_slot] method. + Allows the connection between two different port types. The port type is defined individually for the left and the right port of each slot with the [method GraphNode.set_slot] method. + See also [method is_valid_connection_type] and [method remove_valid_connection_type]. </description> </method> <method name="add_valid_left_disconnect_type"> <return type="void" /> <param index="0" name="type" type="int" /> <description> - Makes possible to disconnect nodes when dragging from the slot at the left if it has the specified type. + Allows to disconnect nodes when dragging from the left port of the [GraphNode]'s slot if it has the specified type. See also [method remove_valid_left_disconnect_type]. </description> </method> <method name="add_valid_right_disconnect_type"> <return type="void" /> <param index="0" name="type" type="int" /> <description> - Makes possible to disconnect nodes when dragging from the slot at the right if it has the specified type. + Allows to disconnect nodes when dragging from the right port of the [GraphNode]'s slot if it has the specified type. See also [method remove_valid_right_disconnect_type]. </description> </method> <method name="arrange_nodes"> @@ -114,22 +116,22 @@ </method> <method name="connect_node"> <return type="int" enum="Error" /> - <param index="0" name="from" type="StringName" /> + <param index="0" name="from_node" type="StringName" /> <param index="1" name="from_port" type="int" /> - <param index="2" name="to" type="StringName" /> + <param index="2" name="to_node" type="StringName" /> <param index="3" name="to_port" type="int" /> <description> - Create a connection between the [param from_port] slot of the [param from] GraphNode and the [param to_port] slot of the [param to] GraphNode. If the connection already exists, no connection is created. + Create a connection between the [param from_port] of the [param from_node] [GraphNode] and the [param to_port] of the [param to_node] [GraphNode]. If the connection already exists, no connection is created. </description> </method> <method name="disconnect_node"> <return type="void" /> - <param index="0" name="from" type="StringName" /> + <param index="0" name="from_node" type="StringName" /> <param index="1" name="from_port" type="int" /> - <param index="2" name="to" type="StringName" /> + <param index="2" name="to_node" type="StringName" /> <param index="3" name="to_port" type="int" /> <description> - Removes the connection between the [param from_port] slot of the [param from] GraphNode and the [param to_port] slot of the [param to] GraphNode. If the connection does not exist, no connection is removed. + Removes the connection between the [param from_port] of the [param from_node] [GraphNode] and the [param to_port] of the [param to_node] [GraphNode]. If the connection does not exist, no connection is removed. </description> </method> <method name="force_connection_drag_end"> @@ -142,10 +144,10 @@ </method> <method name="get_connection_line"> <return type="PackedVector2Array" /> - <param index="0" name="from" type="Vector2" /> - <param index="1" name="to" type="Vector2" /> + <param index="0" name="from_node" type="Vector2" /> + <param index="1" name="to_node" type="Vector2" /> <description> - Returns the points which would make up a connection between [param from] and [param to]. + Returns the points which would make up a connection between [param from_node] and [param to_node]. </description> </method> <method name="get_connection_list" qualifiers="const"> @@ -163,12 +165,12 @@ </method> <method name="is_node_connected"> <return type="bool" /> - <param index="0" name="from" type="StringName" /> + <param index="0" name="from_node" type="StringName" /> <param index="1" name="from_port" type="int" /> - <param index="2" name="to" type="StringName" /> + <param index="2" name="to_node" type="StringName" /> <param index="3" name="to_port" type="int" /> <description> - Returns [code]true[/code] if the [param from_port] slot of the [param from] GraphNode is connected to the [param to_port] slot of the [param to] GraphNode. + Returns [code]true[/code] if the [param from_port] of the [param from_node] [GraphNode] is connected to the [param to_port] of the [param to_node] [GraphNode]. </description> </method> <method name="is_valid_connection_type" qualifiers="const"> @@ -176,7 +178,8 @@ <param index="0" name="from_type" type="int" /> <param index="1" name="to_type" type="int" /> <description> - Returns whether it's possible to connect slots of the specified types. + Returns whether it's possible to make a connection between two different port types. The port type is defined individually for the left and the right port of each slot with the [method GraphNode.set_slot] method. + See also [method add_valid_connection_type] and [method remove_valid_connection_type]. </description> </method> <method name="remove_valid_connection_type"> @@ -184,32 +187,33 @@ <param index="0" name="from_type" type="int" /> <param index="1" name="to_type" type="int" /> <description> - Makes it not possible to connect between two different slot types. The type is defined with the [method GraphNode.set_slot] method. + Disallows the connection between two different port types previously allowed by [method add_valid_connection_type]. The port type is defined individually for the left and the right port of each slot with the [method GraphNode.set_slot] method. + See also [method is_valid_connection_type]. </description> </method> <method name="remove_valid_left_disconnect_type"> <return type="void" /> <param index="0" name="type" type="int" /> <description> - Removes the possibility to disconnect nodes when dragging from the slot at the left if it has the specified type. + Disallows to disconnect nodes when dragging from the left port of the [GraphNode]'s slot if it has the specified type. Use this to disable disconnection previously allowed with [method add_valid_left_disconnect_type]. </description> </method> <method name="remove_valid_right_disconnect_type"> <return type="void" /> <param index="0" name="type" type="int" /> <description> - Removes the possibility to disconnect nodes when dragging from the slot at the right if it has the specified type. + Disallows to disconnect nodes when dragging from the right port of the [GraphNode]'s slot if it has the specified type. Use this to disable disconnection previously allowed with [method add_valid_right_disconnect_type]. </description> </method> <method name="set_connection_activity"> <return type="void" /> - <param index="0" name="from" type="StringName" /> + <param index="0" name="from_node" type="StringName" /> <param index="1" name="from_port" type="int" /> - <param index="2" name="to" type="StringName" /> + <param index="2" name="to_node" type="StringName" /> <param index="3" name="to_port" type="int" /> <param index="4" name="amount" type="float" /> <description> - Sets the coloration of the connection between [param from]'s [param from_port] and [param to]'s [param to_port] with the color provided in the [theme_item activity] theme property. + Sets the coloration of the connection between [param from_node]'s [param from_port] and [param to_node]'s [param to_port] with the color provided in the [theme_item activity] theme property. </description> </method> <method name="set_selected"> @@ -287,36 +291,36 @@ </description> </signal> <signal name="connection_drag_started"> - <param index="0" name="from" type="String" /> - <param index="1" name="slot" type="int" /> + <param index="0" name="from_node" type="String" /> + <param index="1" name="from_port" type="int" /> <param index="2" name="is_output" type="bool" /> <description> Emitted at the beginning of a connection drag. </description> </signal> <signal name="connection_from_empty"> - <param index="0" name="to" type="StringName" /> - <param index="1" name="to_slot" type="int" /> + <param index="0" name="to_node" type="StringName" /> + <param index="1" name="to_port" type="int" /> <param index="2" name="release_position" type="Vector2" /> <description> - Emitted when user dragging connection from input port into empty space of the graph. + Emitted when user drags a connection from an input port into the empty space of the graph. </description> </signal> <signal name="connection_request"> - <param index="0" name="from" type="StringName" /> - <param index="1" name="from_slot" type="int" /> - <param index="2" name="to" type="StringName" /> - <param index="3" name="to_slot" type="int" /> + <param index="0" name="from_node" type="StringName" /> + <param index="1" name="from_port" type="int" /> + <param index="2" name="to_node" type="StringName" /> + <param index="3" name="to_port" type="int" /> <description> - Emitted to the GraphEdit when the connection between the [param from_slot] slot of the [param from] GraphNode and the [param to_slot] slot of the [param to] GraphNode is attempted to be created. + Emitted to the GraphEdit when the connection between the [param from_port] of the [param from_node] [GraphNode] and the [param to_port] of the [param to_node] [GraphNode] is attempted to be created. </description> </signal> <signal name="connection_to_empty"> - <param index="0" name="from" type="StringName" /> - <param index="1" name="from_slot" type="int" /> + <param index="0" name="from_node" type="StringName" /> + <param index="1" name="from_port" type="int" /> <param index="2" name="release_position" type="Vector2" /> <description> - Emitted when user dragging connection from output port into empty space of the graph. + Emitted when user drags a connection from an output port into the empty space of the graph. </description> </signal> <signal name="copy_nodes_request"> @@ -331,12 +335,12 @@ </description> </signal> <signal name="disconnection_request"> - <param index="0" name="from" type="StringName" /> - <param index="1" name="from_slot" type="int" /> - <param index="2" name="to" type="StringName" /> - <param index="3" name="to_slot" type="int" /> + <param index="0" name="from_node" type="StringName" /> + <param index="1" name="from_port" type="int" /> + <param index="2" name="to_node" type="StringName" /> + <param index="3" name="to_port" type="int" /> <description> - Emitted to the GraphEdit when the connection between [param from_slot] slot of [param from] GraphNode and [param to_slot] slot of [param to] GraphNode is attempted to be removed. + Emitted to the GraphEdit when the connection between [param from_port] of [param from_node] [GraphNode] and [param to_port] of [param to_node] [GraphNode] is attempted to be removed. </description> </signal> <signal name="duplicate_nodes_request"> diff --git a/doc/classes/GraphNode.xml b/doc/classes/GraphNode.xml index a80dd0d47f..16386ff81b 100644 --- a/doc/classes/GraphNode.xml +++ b/doc/classes/GraphNode.xml @@ -1,12 +1,13 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="GraphNode" inherits="Container" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - A GraphNode is a container with potentially several input and output slots allowing connections between GraphNodes. Slots can have different, incompatible types. + GraphNode is a [Container] control that represents a single data unit in a [GraphEdit] graph. You can customize the number, type, and color of left- and right-side connection ports. </brief_description> <description> - 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. - 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. - 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. + GraphNode allows to create nodes for a [GraphEdit] graph with customizable content based on its child [Control]s. GraphNode is a [Container] and is responsible for placing its children on screen. This works similar to [VBoxContainer]. Children, in turn, provide GraphNode with so-called slots, each of which can have a connection port on either side. This is similar to how [TabContainer] uses children to create the tabs. + Each GraphNode slot is defined by its index and can provide the node with up to two ports: one on the left, and one on the right. By convention the left port is also referred to as the input port and the right port is referred to as the output port. Each port can be enabled and configured individually, using different type and color. The type is an arbitrary value that you can define using your own considerations. The parent [GraphEdit] will receive this information on each connect and disconnect request. + Slots can be configured in the Inspector dock once you add at least one child [Control]. The properties are grouped by each slot's index in the "Slot" section. + [b]Note:[/b] While GraphNode is set up using slots and slot indices, connections are made between the ports which are enabled. Because of that [GraphEdit] uses port's index and not slot's index. You can use [method get_connection_input_slot] and [method get_connection_output_slot] to get the slot index from the port index. </description> <tutorials> </tutorials> @@ -19,16 +20,16 @@ </method> <method name="clear_slot"> <return type="void" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Disables input and output slot whose index is [param idx]. + Disables input and output slot whose index is [param slot_index]. </description> </method> <method name="get_connection_input_color"> <return type="Color" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the [Color] of the input connection [param idx]. + Returns the [Color] of the input connection [param port]. </description> </method> <method name="get_connection_input_count"> @@ -39,30 +40,37 @@ </method> <method name="get_connection_input_height"> <return type="int" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the height of the input connection [param idx]. + Returns the height of the input connection [param port]. </description> </method> <method name="get_connection_input_position"> <return type="Vector2" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> + <description> + Returns the position of the input connection [param port]. + </description> + </method> + <method name="get_connection_input_slot"> + <return type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the position of the input connection [param idx]. + Returns the corresponding slot index of the input connection [param port]. </description> </method> <method name="get_connection_input_type"> <return type="int" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the type of the input connection [param idx]. + Returns the type of the input connection [param port]. </description> </method> <method name="get_connection_output_color"> <return type="Color" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the [Color] of the output connection [param idx]. + Returns the [Color] of the output connection [param port]. </description> </method> <method name="get_connection_output_count"> @@ -73,150 +81,157 @@ </method> <method name="get_connection_output_height"> <return type="int" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the height of the output connection [param idx]. + Returns the height of the output connection [param port]. </description> </method> <method name="get_connection_output_position"> <return type="Vector2" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> + <description> + Returns the position of the output connection [param port]. + </description> + </method> + <method name="get_connection_output_slot"> + <return type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the position of the output connection [param idx]. + Returns the corresponding slot index of the output connection [param port]. </description> </method> <method name="get_connection_output_type"> <return type="int" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="port" type="int" /> <description> - Returns the type of the output connection [param idx]. + Returns the type of the output connection [param port]. </description> </method> <method name="get_slot_color_left" qualifiers="const"> <return type="Color" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns the left (input) [Color] of the slot [param idx]. + Returns the left (input) [Color] of the slot [param slot_index]. </description> </method> <method name="get_slot_color_right" qualifiers="const"> <return type="Color" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns the right (output) [Color] of the slot [param idx]. + Returns the right (output) [Color] of the slot [param slot_index]. </description> </method> <method name="get_slot_type_left" qualifiers="const"> <return type="int" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns the left (input) type of the slot [param idx]. + Returns the left (input) type of the slot [param slot_index]. </description> </method> <method name="get_slot_type_right" qualifiers="const"> <return type="int" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns the right (output) type of the slot [param idx]. + Returns the right (output) type of the slot [param slot_index]. </description> </method> <method name="is_slot_draw_stylebox" qualifiers="const"> <return type="bool" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns true if the background [StyleBox] of the slot [param idx] is drawn. + Returns true if the background [StyleBox] of the slot [param slot_index] is drawn. </description> </method> <method name="is_slot_enabled_left" qualifiers="const"> <return type="bool" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns [code]true[/code] if left (input) side of the slot [param idx] is enabled. + Returns [code]true[/code] if left (input) side of the slot [param slot_index] is enabled. </description> </method> <method name="is_slot_enabled_right" qualifiers="const"> <return type="bool" /> - <param index="0" name="idx" type="int" /> + <param index="0" name="slot_index" type="int" /> <description> - Returns [code]true[/code] if right (output) side of the slot [param idx] is enabled. + Returns [code]true[/code] if right (output) side of the slot [param slot_index] is enabled. </description> </method> <method name="set_slot"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="enable_left" type="bool" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="enable_left_port" type="bool" /> <param index="2" name="type_left" type="int" /> <param index="3" name="color_left" type="Color" /> - <param index="4" name="enable_right" type="bool" /> + <param index="4" name="enable_right_port" type="bool" /> <param index="5" name="type_right" type="int" /> <param index="6" name="color_right" type="Color" /> - <param index="7" name="custom_left" type="Texture2D" default="null" /> - <param index="8" name="custom_right" type="Texture2D" default="null" /> - <param index="9" name="enable" type="bool" default="true" /> - <description> - Sets properties of the slot with ID [param idx]. - If [param enable_left]/[param enable_right], a port will appear and the slot will be able to be connected from this side. - [param type_left]/[param type_right] is an arbitrary type of the port. Only ports with the same type values can be connected and negative values will disallow all connections to be made via user inputs. - [param color_left]/[param color_right] is the tint of the port's icon on this side. - [param custom_left]/[param custom_right] is a custom texture for this side's port. - [b]Note:[/b] This method only sets properties of the slot. To create the slot, add a [Control]-derived child to the GraphNode. - Individual properties can be set using one of the [code]set_slot_*[/code] methods. You must enable at least one side of the slot to do so. + <param index="7" name="custom_icon_left" type="Texture2D" default="null" /> + <param index="8" name="custom_icon_right" type="Texture2D" default="null" /> + <param index="9" name="draw_stylebox" type="bool" default="true" /> + <description> + Sets properties of the slot with the [param slot_index] index. + If [param enable_left_port]/[param enable_right_port] is [code]true[/code], a port will appear and the slot will be able to be connected from this side. + With [param type_left]/[param type_right] an arbitrary type can be assigned to each port. Two ports can be connected if they share the same type, or if the connection between their types is allowed in the parent [GraphEdit] (see [method GraphEdit.add_valid_connection_type]). Keep in mind that the [GraphEdit] has the final say in accepting the connection. Type compatibility simply allows the [signal GraphEdit.connection_request] signal to be emitted. + Ports can be further customized using [param color_left]/[param color_right] and [param custom_icon_left]/[param custom_icon_right]. The color parameter adds a tint to the icon. The custom icon can be used to override the default port dot. + Additionally, [param draw_stylebox] can be used to enable or disable drawing of the background stylebox for each slot. See [theme_item slot]. + Individual properties can also be set using one of the [code]set_slot_*[/code] methods. + [b]Note:[/b] This method only sets properties of the slot. To create the slot itself, add a [Control]-derived child to the GraphNode. </description> </method> <method name="set_slot_color_left"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="color_left" type="Color" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="color" type="Color" /> <description> - Sets the [Color] of the left (input) side of the slot [param idx] to [param color_left]. + Sets the [Color] of the left (input) side of the slot [param slot_index] to [param color]. </description> </method> <method name="set_slot_color_right"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="color_right" type="Color" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="color" type="Color" /> <description> - Sets the [Color] of the right (output) side of the slot [param idx] to [param color_right]. + Sets the [Color] of the right (output) side of the slot [param slot_index] to [param color]. </description> </method> <method name="set_slot_draw_stylebox"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="draw_stylebox" type="bool" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="enable" type="bool" /> <description> - Toggles the background [StyleBox] of the slot [param idx]. + Toggles the background [StyleBox] of the slot [param slot_index]. </description> </method> <method name="set_slot_enabled_left"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="enable_left" type="bool" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="enable" type="bool" /> <description> - Toggles the left (input) side of the slot [param idx]. If [param enable_left] is [code]true[/code], a port will appear on the left side and the slot will be able to be connected from this side. + Toggles the left (input) side of the slot [param slot_index]. If [param enable] is [code]true[/code], a port will appear on the left side and the slot will be able to be connected from this side. </description> </method> <method name="set_slot_enabled_right"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="enable_right" type="bool" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="enable" type="bool" /> <description> - Toggles the right (output) side of the slot [param idx]. If [param enable_right] is [code]true[/code], a port will appear on the right side and the slot will be able to be connected from this side. + Toggles the right (output) side of the slot [param slot_index]. If [param enable] is [code]true[/code], a port will appear on the right side and the slot will be able to be connected from this side. </description> </method> <method name="set_slot_type_left"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="type_left" type="int" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="type" type="int" /> <description> - Sets the left (input) type of the slot [param idx] to [param type_left]. If the value is negative, all connections will be disallowed to be created via user inputs. + Sets the left (input) type of the slot [param slot_index] to [param type]. If the value is negative, all connections will be disallowed to be created via user inputs. </description> </method> <method name="set_slot_type_right"> <return type="void" /> - <param index="0" name="idx" type="int" /> - <param index="1" name="type_right" type="int" /> + <param index="0" name="slot_index" type="int" /> + <param index="1" name="type" type="int" /> <description> - Sets the right (output) type of the slot [param idx] to [param type_right]. If the value is negative, all connections will be disallowed to be created via user inputs. + Sets the right (output) type of the slot [param slot_index] to [param type]. If the value is negative, all connections will be disallowed to be created via user inputs. </description> </method> </methods> diff --git a/doc/classes/HMACContext.xml b/doc/classes/HMACContext.xml index 52d4fce28f..706ee30963 100644 --- a/doc/classes/HMACContext.xml +++ b/doc/classes/HMACContext.xml @@ -32,22 +32,22 @@ public class CryptoNode : Node { private HMACContext ctx = new HMACContext(); + public override void _Ready() { - PackedByteArray key = String("supersecret").to_utf8(); - Error err = ctx.Start(HashingContext.HASH_SHA256, key); - GD.Assert(err == OK); - PackedByteArray msg1 = String("this is ").to_utf8(); - PackedByteArray msg2 = String("super duper secret").to_utf8(); + byte[] key = "supersecret".ToUTF8(); + Error err = ctx.Start(HashingContext.HashType.Sha256, key); + Debug.Assert(err == Error.Ok); + byte[] msg1 = "this is ".ToUTF8(); + byte[] msg2 = "super duper secret".ToUTF8(); err = ctx.Update(msg1); - GD.Assert(err == OK); + Debug.Assert(err == Error.Ok); err = ctx.Update(msg2); - GD.Assert(err == OK); - PackedByteArray hmac = ctx.Finish(); + Debug.Assert(err == Error.Ok); + byte[] hmac = ctx.Finish(); GD.Print(hmac.HexEncode()); } } - [/csharp] [/codeblocks] </description> diff --git a/doc/classes/HTTPClient.xml b/doc/classes/HTTPClient.xml index 332ce9d8f4..b3ed38d250 100644 --- a/doc/classes/HTTPClient.xml +++ b/doc/classes/HTTPClient.xml @@ -7,17 +7,17 @@ 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 the [HTTPRequest] node for a higher-level alternative. [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. - 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. + A [HTTPClient] should be reused between multiple requests or to connect to different hosts instead of creating one client per request. Supports Transport Layer Security (TLS), including 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. 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). [b]Note:[/b] When exporting to Android, make sure to enable the [code]INTERNET[/code] permission in the Android export preset before exporting the project or using one-click deploy. Otherwise, network communication of any kind will be blocked by Android. - [b]Note:[/b] It's recommended to use transport encryption (SSL/TLS) and to avoid sending sensitive information (such as login credentials) in HTTP GET URL parameters. Consider using HTTP POST requests or HTTP headers for such information instead. + [b]Note:[/b] It's recommended to use transport encryption (TLS) and to avoid sending sensitive information (such as login credentials) in HTTP GET URL parameters. Consider using HTTP POST requests or HTTP headers for such information instead. [b]Note:[/b] When performing HTTP requests from a project exported to Web, keep in mind the remote server may not allow requests from foreign origins due to [url=https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS]CORS[/url]. If you host the server in question, you should modify its backend to allow requests from foreign origins by adding the [code]Access-Control-Allow-Origin: *[/code] HTTP header. - [b]Note:[/b] SSL/TLS support is currently limited to TLS 1.0, TLS 1.1, and TLS 1.2. Attempting to connect to a TLS 1.3-only server will return an error. - [b]Warning:[/b] SSL/TLS certificate revocation and certificate pinning are currently not supported. Revoked certificates are accepted as long as they are otherwise valid. If this is a concern, you may want to use automatically managed certificates with a short validity period. + [b]Note:[/b] TLS support is currently limited to TLS 1.0, TLS 1.1, and TLS 1.2. Attempting to connect to a TLS 1.3-only server will return an error. + [b]Warning:[/b] TLS certificate revocation and certificate pinning are currently not supported. Revoked certificates are accepted as long as they are otherwise valid. If this is a concern, you may want to use automatically managed certificates with a short validity period. </description> <tutorials> <link title="HTTP client class">$DOCS_URL/tutorials/networking/http_client_class.html</link> - <link title="SSL certificates">$DOCS_URL/tutorials/networking/ssl_certificates.html</link> + <link title="TLS certificates">$DOCS_URL/tutorials/networking/ssl_certificates.html</link> </tutorials> <methods> <method name="close"> @@ -30,13 +30,13 @@ <return type="int" enum="Error" /> <param index="0" name="host" type="String" /> <param index="1" name="port" type="int" default="-1" /> - <param index="2" name="use_ssl" type="bool" default="false" /> + <param index="2" name="use_tls" type="bool" default="false" /> <param index="3" name="verify_host" type="bool" default="true" /> <description> Connects to a host. This needs to be done before any requests are sent. The host should not have http:// prepended but will strip the protocol identifier if provided. - If no [param port] is specified (or [code]-1[/code] is used), it is automatically set to 80 for HTTP and 443 for HTTPS (if [param use_ssl] is enabled). - [param verify_host] will check the SSL identity of the host if set to [code]true[/code]. + If no [param port] is specified (or [code]-1[/code] is used), it is automatically set to 80 for HTTP and 443 for HTTPS (if [param use_tls] is enabled). + [param verify_host] will check the TLS identity of the host if set to [code]true[/code]. </description> </method> <method name="get_response_body_length" qualifiers="const"> @@ -262,8 +262,8 @@ <constant name="STATUS_CONNECTION_ERROR" value="8" enum="Status"> Status: Error in HTTP connection. </constant> - <constant name="STATUS_SSL_HANDSHAKE_ERROR" value="9" enum="Status"> - Status: Error in SSL handshake. + <constant name="STATUS_TLS_HANDSHAKE_ERROR" value="9" enum="Status"> + Status: Error in TLS handshake. </constant> <constant name="RESPONSE_CONTINUE" value="100" enum="ResponseCode"> 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). diff --git a/doc/classes/HTTPRequest.xml b/doc/classes/HTTPRequest.xml index 4b098bf585..64a3315308 100644 --- a/doc/classes/HTTPRequest.xml +++ b/doc/classes/HTTPRequest.xml @@ -6,7 +6,7 @@ <description> A node with the ability to send HTTP requests. Uses [HTTPClient] internally. Can be used to make HTTP requests, i.e. download or upload files or web content via HTTP. - [b]Warning:[/b] See the notes and warnings on [HTTPClient] for limitations, especially regarding SSL security. + [b]Warning:[/b] See the notes and warnings on [HTTPClient] for limitations, especially regarding TLS security. [b]Note:[/b] When exporting to Android, make sure to enable the [code]INTERNET[/code] permission in the Android export preset before exporting the project or using one-click deploy. Otherwise, network communication of any kind will be blocked by Android. [b]Example of contacting a REST API and printing one of its returned fields:[/b] [codeblocks] @@ -157,7 +157,7 @@ </description> <tutorials> <link title="Making HTTP requests">$DOCS_URL/tutorials/networking/http_request_class.html</link> - <link title="SSL certificates">$DOCS_URL/tutorials/networking/ssl_certificates.html</link> + <link title="TLS certificates">$DOCS_URL/tutorials/networking/ssl_certificates.html</link> </tutorials> <methods> <method name="cancel_request"> @@ -189,21 +189,21 @@ <return type="int" enum="Error" /> <param index="0" name="url" type="String" /> <param index="1" name="custom_headers" type="PackedStringArray" default="PackedStringArray()" /> - <param index="2" name="ssl_validate_domain" type="bool" default="true" /> + <param index="2" name="tls_validate_domain" type="bool" default="true" /> <param index="3" name="method" type="int" enum="HTTPClient.Method" default="0" /> <param index="4" name="request_data" type="String" default="""" /> <description> 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]. 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. [b]Note:[/b] When [param method] is [constant HTTPClient.METHOD_GET], the payload sent via [param request_data] might be ignored by the server or even cause the server to reject the request (check [url=https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.1]RFC 7231 section 4.3.1[/url] for more details). As a workaround, you can send data as a query string in the URL (see [method String.uri_encode] for an example). - [b]Note:[/b] It's recommended to use transport encryption (SSL/TLS) and to avoid sending sensitive information (such as login credentials) in HTTP GET URL parameters. Consider using HTTP POST requests or HTTP headers for such information instead. + [b]Note:[/b] It's recommended to use transport encryption (TLS) and to avoid sending sensitive information (such as login credentials) in HTTP GET URL parameters. Consider using HTTP POST requests or HTTP headers for such information instead. </description> </method> <method name="request_raw"> <return type="int" enum="Error" /> <param index="0" name="url" type="String" /> <param index="1" name="custom_headers" type="PackedStringArray" default="PackedStringArray()" /> - <param index="2" name="ssl_validate_domain" type="bool" default="true" /> + <param index="2" name="tls_validate_domain" type="bool" default="true" /> <param index="3" name="method" type="int" enum="HTTPClient.Method" default="0" /> <param index="4" name="request_data_raw" type="PackedByteArray" default="PackedByteArray()" /> <description> @@ -283,8 +283,8 @@ <constant name="RESULT_CONNECTION_ERROR" value="4" enum="Result"> Request failed due to connection (read/write) error. </constant> - <constant name="RESULT_SSL_HANDSHAKE_ERROR" value="5" enum="Result"> - Request failed on SSL handshake. + <constant name="RESULT_TLS_HANDSHAKE_ERROR" value="5" enum="Result"> + Request failed on TLS handshake. </constant> <constant name="RESULT_NO_RESPONSE" value="6" enum="Result"> Request does not have a response (yet). diff --git a/doc/classes/ImageFormatLoader.xml b/doc/classes/ImageFormatLoader.xml new file mode 100644 index 0000000000..c6b1ec922a --- /dev/null +++ b/doc/classes/ImageFormatLoader.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="ImageFormatLoader" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + Base class to add support for specific image formats. + </brief_description> + <description> + The engine supports multiple image formats out of the box (PNG, SVG, JPEG, WebP to name a few), but you can choose to implement support for additional image formats by extending [ImageFormatLoaderExtension]. + </description> + <tutorials> + </tutorials> + <constants> + <constant name="FLAG_NONE" value="0" enum="LoaderFlags" is_bitfield="true"> + </constant> + <constant name="FLAG_FORCE_LINEAR" value="1" enum="LoaderFlags" is_bitfield="true"> + </constant> + <constant name="FLAG_CONVERT_COLORS" value="2" enum="LoaderFlags" is_bitfield="true"> + </constant> + </constants> +</class> diff --git a/doc/classes/ImageFormatLoaderExtension.xml b/doc/classes/ImageFormatLoaderExtension.xml new file mode 100644 index 0000000000..b2a7ebc60f --- /dev/null +++ b/doc/classes/ImageFormatLoaderExtension.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="ImageFormatLoaderExtension" inherits="ImageFormatLoader" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + Base class for creating [ImageFormatLoader] extensions (adding support for extra image formats). + </brief_description> + <description> + The engine supports multiple image formats out of the box (PNG, SVG, JPEG, WebP to name a few), but you can choose to implement support for additional image formats by extending this class. + Be sure to respect the documented return types and values. You should create an instance of it, and call [method add_format_loader] to register that loader during the initializaiton phase. + </description> + <tutorials> + </tutorials> + <methods> + <method name="_get_recognized_extensions" qualifiers="virtual const"> + <return type="PackedStringArray" /> + <description> + Returns the list of file extensions for this image format. Files with the given extentions will be treated as image file and loaded using this class. + </description> + </method> + <method name="_load_image" qualifiers="virtual"> + <return type="int" enum="Error" /> + <param index="0" name="image" type="Image" /> + <param index="1" name="fileaccess" type="FileAccess" /> + <param index="2" name="flags" type="int" enum="ImageFormatLoader.LoaderFlags" /> + <param index="3" name="scale" type="float" /> + <description> + Loads the content of [param fileaccess] into the provided [param image]. + </description> + </method> + <method name="add_format_loader"> + <return type="void" /> + <description> + Add this format loader to the engine, allowing it to recognize the file extensions returned by [method _get_recognized_extensions]. + </description> + </method> + <method name="remove_format_loader"> + <return type="void" /> + <description> + Remove this format loader from the engine. + </description> + </method> + </methods> +</class> diff --git a/doc/classes/ImageTextureLayered.xml b/doc/classes/ImageTextureLayered.xml index f5b338542b..f5786f070a 100644 --- a/doc/classes/ImageTextureLayered.xml +++ b/doc/classes/ImageTextureLayered.xml @@ -11,6 +11,8 @@ <return type="int" enum="Error" /> <param index="0" name="images" type="Image[]" /> <description> + Creates an [ImageTextureLayered] from an array of [Image]s. The first image decides the width, height, image format and mipmapping setting. The other images must have the same width, height, image format and mipmapping setting. + Each [Image] represents one [code]layer[/code]. </description> </method> <method name="update_layer"> @@ -18,6 +20,10 @@ <param index="0" name="image" type="Image" /> <param index="1" name="layer" type="int" /> <description> + Replaces the existing [Image] data at the given [code]layer[/code] with this new image. + The given [Image] must have the same width, height, image format and mipmapping setting (a [code]bool[/code] value) as the rest of the referenced images. + If the image format is unsupported, it will be decompressed and converted to a similar and supported [enum Image.Format]. + The update is immediate: synced with the draw. </description> </method> </methods> diff --git a/doc/classes/ImporterMesh.xml b/doc/classes/ImporterMesh.xml index 3c3dbe4d87..1c9655c266 100644 --- a/doc/classes/ImporterMesh.xml +++ b/doc/classes/ImporterMesh.xml @@ -43,10 +43,12 @@ <return type="void" /> <param index="0" name="normal_merge_angle" type="float" /> <param index="1" name="normal_split_angle" type="float" /> + <param index="2" name="bone_transform_array" type="Array" /> <description> Generates all lods for this ImporterMesh. [param normal_merge_angle] and [param normal_split_angle] are in degrees and used in the same way as the importer settings in [code]lods[/code]. As a good default, use 25 and 60 respectively. The number of generated lods can be accessed using [method get_surface_lod_count], and each LOD is available in [method get_surface_lod_size] and [method get_surface_lod_indices]. + [param bone_transform_array] is an [Array] which can be either empty or contain [Transform3D]s which, for each of the mesh's bone IDs, will apply mesh skinning when generating the LOD mesh variations. This is usually used to account for discrepancies in scale between the mesh itself and its skinning data. </description> </method> <method name="get_blend_shape_count" qualifiers="const"> diff --git a/doc/classes/InputEventWithModifiers.xml b/doc/classes/InputEventWithModifiers.xml index b4a276f6ac..d0453156d5 100644 --- a/doc/classes/InputEventWithModifiers.xml +++ b/doc/classes/InputEventWithModifiers.xml @@ -9,27 +9,30 @@ <tutorials> <link title="InputEvent">$DOCS_URL/tutorials/inputs/inputevent.html</link> </tutorials> + <methods> + <method name="is_command_or_control_pressed" qualifiers="const"> + <return type="bool" /> + <description> + On macOS, returns [code]true[/code] if [kbd]Meta[/kbd] ([kbd]Command[/kbd]) is pressed. + On other platforms, returns [code]true[/code] if [kbd]Ctrl[/kbd] is pressed. + </description> + </method> + </methods> <members> <member name="alt_pressed" type="bool" setter="set_alt_pressed" getter="is_alt_pressed" default="false"> State of the [kbd]Alt[/kbd] modifier. </member> - <member name="command_pressed" type="bool" setter="set_command_pressed" getter="is_command_pressed" default="false"> - State of the [kbd]Cmd[/kbd] modifier. On macOS, this is equivalent to [member meta_pressed]. On other platforms, this is equivalent to [member ctrl_pressed]. - This modifier should be preferred to [member ctrl_pressed] or [member meta_pressed] for system shortcuts, as it maintains better cross-platform compatibility. + <member name="command_or_control_autoremap" type="bool" setter="set_command_or_control_autoremap" getter="is_command_or_control_autoremap" default="false"> + Automaticaly use [kbd]Meta[/kbd] ([kbd]Command[/kbd]) on macOS and [kbd]Ctrl[/kbd] on other platforms. If [code]true[/code], [member ctrl_pressed] and [member meta_pressed] cannot be set. </member> <member name="ctrl_pressed" type="bool" setter="set_ctrl_pressed" getter="is_ctrl_pressed" default="false"> State of the [kbd]Ctrl[/kbd] modifier. </member> <member name="meta_pressed" type="bool" setter="set_meta_pressed" getter="is_meta_pressed" default="false"> - State of the [kbd]Meta[/kbd] modifier. On Windows and Linux, this represents the Windows key (sometimes called "meta" or "super" on Linux). On macOS, this represents the Command key, and is equivalent to [member command_pressed]. - For better cross-system compatibility, use [member command_pressed] instead. + State of the [kbd]Meta[/kbd] modifier. On Windows and Linux, this represents the Windows key (sometimes called "meta" or "super" on Linux). On macOS, this represents the Command key. </member> <member name="shift_pressed" type="bool" setter="set_shift_pressed" getter="is_shift_pressed" default="false"> State of the [kbd]Shift[/kbd] modifier. </member> - <member name="store_command" type="bool" setter="set_store_command" getter="is_storing_command" default="true"> - If [code]true[/code], pressing [kbd]Cmd[/kbd] on macOS or [kbd]Ctrl[/kbd] on all other platforms will both be serialized as [member command_pressed]. If [code]false[/code], those same keys will be serialized as [member meta_pressed] on macOS and [member ctrl_pressed] on all other platforms. - This aids with cross-platform compatibility when developing e.g. on Windows for macOS, or vice-versa. - </member> </members> </class> diff --git a/doc/classes/ItemList.xml b/doc/classes/ItemList.xml index 55d794ae59..844f260971 100644 --- a/doc/classes/ItemList.xml +++ b/doc/classes/ItemList.xml @@ -349,7 +349,7 @@ The width all columns will be adjusted to. 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. </member> - <member name="fixed_icon_size" type="Vector2" setter="set_fixed_icon_size" getter="get_fixed_icon_size" default="Vector2(0, 0)"> + <member name="fixed_icon_size" type="Vector2i" setter="set_fixed_icon_size" getter="get_fixed_icon_size" default="Vector2i(0, 0)"> The size all icons will be adjusted to. If either X or Y component is not greater than zero, icon size won't be affected. </member> diff --git a/doc/classes/JSON.xml b/doc/classes/JSON.xml index 46e46cc164..125d016632 100644 --- a/doc/classes/JSON.xml +++ b/doc/classes/JSON.xml @@ -6,7 +6,7 @@ <description> The [JSON] enables all data types to be converted to and from a JSON string. This useful for serializing data to save to a file or send over the network. [method stringify] is used to convert any data type into a JSON string. - [method parse] is used to convert any existing JSON data into a [Variant] that can be used within Godot. If successfully parsed, use [method get_data] to retrieve the [Variant], and use [code]typeof[/code] to check if the Variant's type is what you expect. JSON Objects are converted into a [Dictionary], but JSON data can be used to store [Array]s, numbers, [String]s and even just a boolean. + [method parse] is used to convert any existing JSON data into a [Variant] that can be used within Godot. If successfully parsed, use [member data] to retrieve the [Variant], and use [code]typeof[/code] to check if the Variant's type is what you expect. JSON Objects are converted into a [Dictionary], but JSON data can be used to store [Array]s, numbers, [String]s and even just a boolean. [b]Example[/b] [codeblock] var data_to_send = ["a", "b", "c"] @@ -16,7 +16,7 @@ # Retrieve data var error = json.parse(json_string) if error == OK: - var data_received = json.get_data() + var data_received = json.data if typeof(data_received) == TYPE_ARRAY: print(data_received) # Prints array else: @@ -28,17 +28,15 @@ [codeblock] var data = JSON.parse_string(json_string) # Returns null if parsing failed. [/codeblock] + [b]Note:[/b] Both parse methods do not fully comply with the JSON specification: + - Trailing commas in arrays or objects are ignored, instead of causing a parser error. + - New line and tab characters are accepted in string literals, and are treated like their corresponding escape sequences [code]\n[/code] and [code]\t[/code]. + - Numbers are parsed using [method String.to_float] which is generally more lax than the JSON specification. + - Certain errors, such as invalid Unicode sequences, do not cause a parser error. Instead, the string is cleansed and an error is logged to the console. </description> <tutorials> </tutorials> <methods> - <method name="get_data" qualifiers="const"> - <return type="Variant" /> - <description> - Returns the [Variant] containing the data of a successful [method parse]. - [b]Note:[/b] It will return [code]Null[/code] if the last call to parse was unsuccessful or [method parse] has not yet been called. - </description> - </method> <method name="get_error_line" qualifiers="const"> <return type="int" /> <description> @@ -56,7 +54,7 @@ <param index="0" name="json_string" type="String" /> <description> Attempts to parse the [param json_string] provided. - Returns an [enum Error]. If the parse was successful, it returns [code]OK[/code] and the result can be retrieved using [method get_data]. If unsuccessful, use [method get_error_line] and [method get_error_message] for identifying the source of the failure. + Returns an [enum Error]. If the parse was successful, it returns [code]OK[/code] and the result can be retrieved using [member data]. If unsuccessful, use [method get_error_line] and [method get_error_message] for identifying the source of the failure. Non-static variant of [method parse_string], if you want custom error handling. </description> </method> @@ -118,4 +116,9 @@ </description> </method> </methods> + <members> + <member name="data" type="Variant" setter="set_data" getter="get_data" default="null"> + Contains the parsed JSON data in [Variant] form. + </member> + </members> </class> diff --git a/doc/classes/LightmapGI.xml b/doc/classes/LightmapGI.xml index dd8c7be489..53dae1a8e6 100644 --- a/doc/classes/LightmapGI.xml +++ b/doc/classes/LightmapGI.xml @@ -17,7 +17,7 @@ <member name="bias" type="float" setter="set_bias" getter="get_bias" default="0.0005"> The bias to use when computing shadows. Increasing [member bias] can fix shadow acne on the resulting baked lightmap, but can introduce peter-panning (shadows not connecting to their casters). Real-time [Light3D] shadows are not affected by this [member bias] property. </member> - <member name="bounces" type="int" setter="set_bounces" getter="get_bounces" default="1"> + <member name="bounces" type="int" setter="set_bounces" getter="get_bounces" default="3"> Number of light bounces that are taken into account during baking. Higher values result in brighter, more realistic lighting, at the cost of longer bake times. If set to [code]0[/code], only environment lighting, direct light and emissive lighting is baked. </member> <member name="camera_attributes" type="CameraAttributes" setter="set_camera_attributes" getter="get_camera_attributes"> @@ -36,10 +36,10 @@ <member name="environment_custom_sky" type="Sky" setter="set_environment_custom_sky" getter="get_environment_custom_sky"> The sky to use as a source of environment lighting. Only effective if [member environment_mode] is [constant ENVIRONMENT_MODE_CUSTOM_SKY]. </member> - <member name="environment_mode" type="int" setter="set_environment_mode" getter="get_environment_mode" enum="LightmapGI.EnvironmentMode" default="0"> + <member name="environment_mode" type="int" setter="set_environment_mode" getter="get_environment_mode" enum="LightmapGI.EnvironmentMode" default="1"> The environment mode to use when baking lightmaps. </member> - <member name="generate_probes_subdiv" type="int" setter="set_generate_probes" getter="get_generate_probes" enum="LightmapGI.GenerateProbes" default="0"> + <member name="generate_probes_subdiv" type="int" setter="set_generate_probes" getter="get_generate_probes" enum="LightmapGI.GenerateProbes" default="2"> The level of subdivision to use when automatically generating [LightmapProbe]s for dynamic object lighting. Higher values result in more accurate indirect lighting on dynamic objects, at the cost of longer bake times and larger file sizes. [b]Note:[/b] Automatically generated [LightmapProbe]s are not visible as nodes in the Scene tree dock, and cannot be modified this way after they are generated. [b]Note:[/b] Regardless of [member generate_probes_subdiv], direct lighting on dynamic objects is always applied using [Light3D] nodes in real-time. diff --git a/doc/classes/MultiMesh.xml b/doc/classes/MultiMesh.xml index bae2335cfb..ce2b5f2584 100644 --- a/doc/classes/MultiMesh.xml +++ b/doc/classes/MultiMesh.xml @@ -1,13 +1,15 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="MultiMesh" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - Provides high-performance mesh instancing. + Provides high-performance drawing of a mesh multiple times using GPU instancing. </brief_description> <description> 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. MultiMesh is much faster as it can draw thousands of instances with a single draw call, resulting in less API overhead. As a drawback, if the instances are too far away from each other, performance may be reduced as every single instance will always render (they are spatially indexed as one, for the whole object). Since instances may have any behavior, the AABB used for visibility must be provided by the user. + [b]Note:[/b] A MultiMesh is a single object, therefore the same maximum lights per object restriction applies. This means, that once the maximum lights are consumed by one or more instances, the rest of the MultiMesh instances will [b]not[/b] receive any lighting. + [b]Note:[/b] Blend Shapes will be ignored if used in a MultiMesh. </description> <tutorials> <link title="Animating thousands of fish with MultiMeshInstance">$DOCS_URL/tutorials/performance/vertex_animation/animating_thousands_of_fish.html</link> @@ -24,7 +26,7 @@ <return type="Color" /> <param index="0" name="instance" type="int" /> <description> - Gets a specific instance's color. + Gets a specific instance's color multiplier. </description> </method> <method name="get_instance_custom_data" qualifiers="const"> @@ -53,8 +55,8 @@ <param index="0" name="instance" type="int" /> <param index="1" name="color" type="Color" /> <description> - Sets the color of a specific instance by [i]multiplying[/i] the mesh's existing vertex colors. - 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. If the color doesn't look as expected, make sure the material's albedo color is set to pure white ([code]Color(1, 1, 1)[/code]). + Sets the color of a specific instance by [i]multiplying[/i] the mesh's existing vertex colors. This allows for different color tinting per instance. + 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. If you intend to set an absolute color instead of tinting, make sure the material's albedo color is set to pure white ([code]Color(1, 1, 1)[/code]). </description> </method> <method name="set_instance_custom_data"> @@ -64,6 +66,7 @@ <description> Sets custom data for a specific instance. Although [Color] is used, it is just a container for 4 floating point numbers. For the custom data to be used, ensure that [member use_custom_data] is [code]true[/code]. + This custom instance data has to be manually accessed in your custom shader using [code]INSTANCE_CUSTOM[/code]. </description> </method> <method name="set_instance_transform"> @@ -87,28 +90,33 @@ <member name="buffer" type="PackedFloat32Array" setter="set_buffer" getter="get_buffer" default="PackedFloat32Array()"> </member> <member name="color_array" type="PackedColorArray" setter="_set_color_array" getter="_get_color_array"> + See [method set_instance_color]. </member> <member name="custom_data_array" type="PackedColorArray" setter="_set_custom_data_array" getter="_get_custom_data_array"> + See [method set_instance_custom_data]. </member> <member name="instance_count" type="int" setter="set_instance_count" getter="get_instance_count" default="0"> Number of instances that will get drawn. This clears and (re)sizes the buffers. Setting data format or flags afterwards will have no effect. By default, all instances are drawn but you can limit this with [member visible_instance_count]. </member> <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh"> - Mesh to be drawn. + [Mesh] resource to be instanced. + The looks of the individual instances can be modified using [method set_instance_color] and [method set_instance_custom_data]. </member> <member name="transform_2d_array" type="PackedVector2Array" setter="_set_transform_2d_array" getter="_get_transform_2d_array"> + See [method set_instance_transform_2d]. </member> <member name="transform_array" type="PackedVector3Array" setter="_set_transform_array" getter="_get_transform_array"> + See [method set_instance_transform]. </member> <member name="transform_format" type="int" setter="set_transform_format" getter="get_transform_format" enum="MultiMesh.TransformFormat" default="0"> Format of transform used to transform mesh, either 2D or 3D. </member> <member name="use_colors" type="bool" setter="set_use_colors" getter="is_using_colors" default="false"> - If [code]true[/code], the [MultiMesh] will use color data (see [member color_array]). + If [code]true[/code], the [MultiMesh] will use color data (see [method set_instance_color]). Can only be set when [member instance_count] is [code]0[/code] or less. This means that you need to call this method before setting the instance count, or temporarily reset it to [code]0[/code]. </member> <member name="use_custom_data" type="bool" setter="set_use_custom_data" getter="is_using_custom_data" default="false"> - If [code]true[/code], the [MultiMesh] will use custom data (see [member custom_data_array]). + If [code]true[/code], the [MultiMesh] will use custom data (see [method set_instance_custom_data]). Can only be set when [member instance_count] is [code]0[/code] or less. This means that you need to call this method before setting the instance count, or temporarily reset it to [code]0[/code]. </member> <member name="visible_instance_count" type="int" setter="set_visible_instance_count" getter="get_visible_instance_count" default="-1"> Limits the number of instances drawn, -1 draws all instances. Changing this does not change the sizes of the buffers. diff --git a/doc/classes/NavigationObstacle2D.xml b/doc/classes/NavigationObstacle2D.xml index 4ecdc06645..6d05e220e3 100644 --- a/doc/classes/NavigationObstacle2D.xml +++ b/doc/classes/NavigationObstacle2D.xml @@ -10,12 +10,25 @@ <tutorials> </tutorials> <methods> + <method name="get_navigation_map" qualifiers="const"> + <return type="RID" /> + <description> + Returns the [RID] of the navigation map for this NavigationObstacle node. This function returns always the map set on the NavigationObstacle node and not the map of the abstract agent on the NavigationServer. If the agent map is changed directly with the NavigationServer API the NavigationObstacle node will not be aware of the map change. Use [method set_navigation_map] to change the navigation map for the NavigationObstacle and also update the agent on the NavigationServer. + </description> + </method> <method name="get_rid" qualifiers="const"> <return type="RID" /> <description> Returns the [RID] of this obstacle on the [NavigationServer2D]. </description> </method> + <method name="set_navigation_map"> + <return type="void" /> + <param index="0" name="navigation_map" type="RID" /> + <description> + Sets the [RID] of the navigation map this NavigationObstacle node should use and also updates the [code]agent[/code] on the NavigationServer. + </description> + </method> </methods> <members> <member name="estimate_radius" type="bool" setter="set_estimate_radius" getter="is_radius_estimated" default="true"> diff --git a/doc/classes/NavigationObstacle3D.xml b/doc/classes/NavigationObstacle3D.xml index ed8af3883c..f5a0bde089 100644 --- a/doc/classes/NavigationObstacle3D.xml +++ b/doc/classes/NavigationObstacle3D.xml @@ -10,12 +10,25 @@ <tutorials> </tutorials> <methods> + <method name="get_navigation_map" qualifiers="const"> + <return type="RID" /> + <description> + Returns the [RID] of the navigation map for this NavigationObstacle node. This function returns always the map set on the NavigationObstacle node and not the map of the abstract agent on the NavigationServer. If the agent map is changed directly with the NavigationServer API the NavigationObstacle node will not be aware of the map change. Use [method set_navigation_map] to change the navigation map for the NavigationObstacle and also update the agent on the NavigationServer. + </description> + </method> <method name="get_rid" qualifiers="const"> <return type="RID" /> <description> Returns the [RID] of this obstacle on the [NavigationServer3D]. </description> </method> + <method name="set_navigation_map"> + <return type="void" /> + <param index="0" name="navigation_map" type="RID" /> + <description> + Sets the [RID] of the navigation map this NavigationObstacle node should use and also updates the [code]agent[/code] on the NavigationServer. + </description> + </method> </methods> <members> <member name="estimate_radius" type="bool" setter="set_estimate_radius" getter="is_radius_estimated" default="true"> diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml index a0c5bfd4bb..d9732da3a3 100644 --- a/doc/classes/Node.xml +++ b/doc/classes/Node.xml @@ -179,9 +179,14 @@ <return type="Tween" /> <description> Creates a new [Tween] and binds it to this node. This is equivalent of doing: - [codeblock] + [codeblocks] + [gdscript] get_tree().create_tween().bind_node(self) - [/codeblock] + [/gdscript] + [csharp] + GetTree().CreateTween().BindNode(this); + [/csharp] + [/codeblocks] </description> </method> <method name="duplicate" qualifiers="const"> @@ -267,13 +272,24 @@ Returns an array listing the groups that the node is a member of. [b]Note:[/b] For performance reasons, the order of node groups is [i]not[/i] guaranteed. The order of node groups should not be relied upon as it can vary across project runs. [b]Note:[/b] The engine uses some group names internally (all starting with an underscore). To avoid conflicts with internal groups, do not add custom groups whose name starts with an underscore. To exclude internal groups while looping over [method get_groups], use the following snippet: - [codeblock] + [codeblocks] + [gdscript] # Stores the node's non-internal groups only (as an array of Strings). var non_internal_groups = [] for group in get_groups(): if not group.begins_with("_"): non_internal_groups.push_back(group) - [/codeblock] + [/gdscript] + [csharp] + // Stores the node's non-internal groups only (as a List of strings). + List<string> nonInternalGroups = new List<string>(); + foreach (string group in GetGroups()) + { + if (!group.BeginsWith("_")) + nonInternalGroups.Add(group); + } + [/csharp] + [/codeblocks] </description> </method> <method name="get_index" qualifiers="const"> @@ -514,7 +530,7 @@ <param index="0" name="child_node" type="Node" /> <param index="1" name="to_position" type="int" /> <description> - 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. + 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. If [param to_position] is negative, the index will be counted from the end. [b]Note:[/b] Internal children can only be moved within their expected "internal range" (see [code]internal[/code] parameter in [method add_child]). </description> </method> @@ -577,18 +593,6 @@ 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. </description> </method> - <method name="raise"> - <return type="void" /> - <description> - 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. The top Node is drawn first, then any siblings below the top Node in the hierarchy are successively drawn on top of it. After using [code]raise[/code], a Control will be drawn on top of its siblings. - </description> - </method> - <method name="remove_and_skip"> - <return type="void" /> - <description> - 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. - </description> - </method> <method name="remove_child"> <return type="void" /> <param index="0" name="node" type="Node" /> diff --git a/doc/classes/Node3D.xml b/doc/classes/Node3D.xml index c8e2f1ac68..96ce10745d 100644 --- a/doc/classes/Node3D.xml +++ b/doc/classes/Node3D.xml @@ -331,6 +331,10 @@ <constant name="NOTIFICATION_VISIBILITY_CHANGED" value="43"> Node3D nodes receives this notification when their visibility changes. </constant> + <constant name="NOTIFICATION_LOCAL_TRANSFORM_CHANGED" value="44"> + Node3D nodes receives this notification when their local transform changes. This is not received when the transform of a parent node is changed. + In order for [constant NOTIFICATION_LOCAL_TRANSFORM_CHANGED] to work, users first need to ask for it, with [method set_notify_local_transform]. + </constant> <constant name="ROTATION_EDIT_MODE_EULER" value="0" enum="RotationEditMode"> </constant> <constant name="ROTATION_EDIT_MODE_QUATERNION" value="1" enum="RotationEditMode"> diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index 059766656f..be7bacd994 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -216,6 +216,15 @@ Not to be confused with [method get_user_data_dir], which returns the [i]project-specific[/i] user data path. </description> </method> + <method name="get_distribution_name" qualifiers="const"> + <return type="String" /> + <description> + Returns the name of the distribution for Linux and BSD platforms (e.g. Ubuntu, Manjaro, OpenBSD, etc.). + Returns the same value as [method get_name] for stock Android ROMs, but attempts to return the custom ROM name for popular Android derivatives such as LineageOS. + Returns the same value as [method get_name] for other platforms. + [b]Note:[/b] This method is not supported on the web platform. It returns an empty string. + </description> + </method> <method name="get_environment" qualifiers="const"> <return type="String" /> <param index="0" name="variable" type="String" /> @@ -430,6 +439,18 @@ Not to be confused with [method get_data_dir], which returns the [i]global[/i] (non-project-specific) user home directory. </description> </method> + <method name="get_version" qualifiers="const"> + <return type="String" /> + <description> + Returns the exact production and build version of the operating system. This is different from the branded version used in marketing. This helps to distinguish between different releases of operating systems, including minor versions, and insider and custom builds. + For Windows, the major and minor version are returned, as well as the build number. For example, the returned string can look like [code]10.0.9926[/code] for a build of Windows 10, and it can look like [code]6.1.7601[/code] for a build of Windows 7 SP1. + For rolling distributions, such as Arch Linux, an empty string is returned. + For macOS and iOS, the major and minor version are returned, as well as the patch number. + For UWP, the device family version is returned. + For Android, the SDK version and the incremental build number are returned. If it's a custom ROM, it attempts to return its version instead. + [b]Note:[/b] This method is not supported on the web platform. It returns an empty string. + </description> + </method> <method name="has_environment" qualifiers="const"> <return type="bool" /> <param index="0" name="variable" type="String" /> @@ -501,13 +522,19 @@ <return type="int" enum="Error" /> <param index="0" name="path" type="String" /> <description> - Moves the file or directory to the system's recycle bin. See also [method Directory.remove]. + Moves the file or directory to the system's recycle bin. See also [method DirAccess.remove]. The method takes only global paths, so you may need to use [method ProjectSettings.globalize_path]. Do not use it for files in [code]res://[/code] as it will not work in exported project. [b]Note:[/b] If the user has disabled the recycle bin on their system, the file will be permanently deleted instead. - [codeblock] + [codeblocks] + [gdscript] var file_to_remove = "user://slot1.sav" OS.move_to_trash(ProjectSettings.globalize_path(file_to_remove)) - [/codeblock] + [/gdscript] + [csharp] + var fileToRemove = "user://slot1.sav"; + OS.MoveToTrash(ProjectSettings.GlobalizePath(fileToRemove)); + [/csharp] + [/codeblocks] </description> </method> <method name="open_midi_inputs"> diff --git a/doc/classes/PackedByteArray.xml b/doc/classes/PackedByteArray.xml index efb559522a..ccf012f82c 100644 --- a/doc/classes/PackedByteArray.xml +++ b/doc/classes/PackedByteArray.xml @@ -65,7 +65,7 @@ <return type="PackedByteArray" /> <param index="0" name="compression_mode" type="int" default="0" /> <description> - Returns a new [PackedByteArray] with the data compressed. Set the compression mode using one of [enum File.CompressionMode]'s constants. + Returns a new [PackedByteArray] with the data compressed. Set the compression mode using one of [enum FileAccess.CompressionMode]'s constants. </description> </method> <method name="count" qualifiers="const"> @@ -173,7 +173,7 @@ <param index="0" name="buffer_size" type="int" /> <param index="1" name="compression_mode" type="int" default="0" /> <description> - Returns a new [PackedByteArray] with the data decompressed. Set [param buffer_size] to the size of the uncompressed data. Set the compression mode using one of [enum File.CompressionMode]'s constants. + Returns a new [PackedByteArray] with the data decompressed. Set [param buffer_size] to the size of the uncompressed data. Set the compression mode using one of [enum FileAccess.CompressionMode]'s constants. </description> </method> <method name="decompress_dynamic" qualifiers="const"> @@ -181,7 +181,7 @@ <param index="0" name="max_output_size" type="int" /> <param index="1" name="compression_mode" type="int" default="0" /> <description> - Returns a new [PackedByteArray] with the data decompressed. Set the compression mode using one of [enum File.CompressionMode]'s constants. [b]This method only accepts gzip and deflate compression modes.[/b] + Returns a new [PackedByteArray] with the data decompressed. Set the compression mode using one of [enum FileAccess.CompressionMode]'s constants. [b]This method only accepts gzip and deflate compression modes.[/b] This method is potentially slower than [code]decompress[/code], as it may have to re-allocate its output buffer multiple times while decompressing, whereas [code]decompress[/code] knows it's output buffer size from the beginning. GZIP has a maximal compression ratio of 1032:1, meaning it's very possible for a small compressed payload to decompress to a potentially very large output. To guard against this, you may provide a maximum size this function is allowed to allocate in bytes via [param max_output_size]. Passing -1 will allow for unbounded output. If any positive value is passed, and the decompression exceeds that amount in bytes, then an error will be returned. </description> diff --git a/doc/classes/PacketPeerDTLS.xml b/doc/classes/PacketPeerDTLS.xml index e9918bdd3a..db8403a56b 100644 --- a/doc/classes/PacketPeerDTLS.xml +++ b/doc/classes/PacketPeerDTLS.xml @@ -6,7 +6,7 @@ <description> 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]. [b]Note:[/b] When exporting to Android, make sure to enable the [code]INTERNET[/code] permission in the Android export preset before exporting the project or using one-click deploy. Otherwise, network communication of any kind will be blocked by Android. - [b]Warning:[/b] SSL/TLS certificate revocation and certificate pinning are currently not supported. Revoked certificates are accepted as long as they are otherwise valid. If this is a concern, you may want to use automatically managed certificates with a short validity period. + [b]Warning:[/b] TLS certificate revocation and certificate pinning are currently not supported. Revoked certificates are accepted as long as they are otherwise valid. If this is a concern, you may want to use automatically managed certificates with a short validity period. </description> <tutorials> </tutorials> diff --git a/doc/classes/PacketPeerUDP.xml b/doc/classes/PacketPeerUDP.xml index b635757b2b..9107937183 100644 --- a/doc/classes/PacketPeerUDP.xml +++ b/doc/classes/PacketPeerUDP.xml @@ -34,7 +34,7 @@ <param index="1" name="port" type="int" /> <description> Calling this method connects this UDP peer to the given [param host]/[param port] 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]. - [b]Note:[/b] 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. + [b]Note:[/b] Connecting to the remote peer does not help to protect from malicious attacks like IP spoofing, etc. Think about using an encryption technique like TLS or DTLS if you feel like your application is transferring sensitive information. </description> </method> <method name="get_local_port" qualifiers="const"> diff --git a/doc/classes/PanoramaSkyMaterial.xml b/doc/classes/PanoramaSkyMaterial.xml index 21c7f29585..0c27037f28 100644 --- a/doc/classes/PanoramaSkyMaterial.xml +++ b/doc/classes/PanoramaSkyMaterial.xml @@ -4,9 +4,9 @@ A [Material] used with [Sky] to draw a background texture. </brief_description> <description> - 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. + 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 cubemap. 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. - 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. + You can use [url=https://danilw.github.io/GLSL-howto/cubemap_to_panorama_js/cubemap_to_panorama.html]this tool[/url] to convert a cubemap to an equirectangular sky map. </description> <tutorials> </tutorials> diff --git a/doc/classes/PhysicsBody2D.xml b/doc/classes/PhysicsBody2D.xml index e8d7ac9920..59660b4de5 100644 --- a/doc/classes/PhysicsBody2D.xml +++ b/doc/classes/PhysicsBody2D.xml @@ -28,11 +28,13 @@ <param index="0" name="distance" type="Vector2" /> <param index="1" name="test_only" type="bool" default="false" /> <param index="2" name="safe_margin" type="float" default="0.08" /> + <param index="3" name="recovery_as_collision" type="bool" default="false" /> <description> Moves the body along the vector [param distance]. In order to be frame rate independent in [method Node._physics_process] or [method Node._process], [param distance] should be computed using [code]delta[/code]. Returns a [KinematicCollision2D], which contains information about the collision when stopped, or when touching another body along the motion. If [param test_only] is [code]true[/code], the body does not move but the would-be collision information is given. [param safe_margin] is the extra margin used for collision recovery (see [member CharacterBody2D.safe_margin] for more details). + If [param recovery_as_collision] is [code]true[/code], any depenetration from the recovery phase is also reported as a collision; this is used e.g. by [CharacterBody2D] for improving floor detection during floor snapping. </description> </method> <method name="remove_collision_exception_with"> @@ -48,11 +50,13 @@ <param index="1" name="distance" type="Vector2" /> <param index="2" name="collision" type="KinematicCollision2D" default="null" /> <param index="3" name="safe_margin" type="float" default="0.08" /> + <param index="4" name="recovery_as_collision" type="bool" default="false" /> <description> Checks for collisions without moving the body. In order to be frame rate independent in [method Node._physics_process] or [method Node._process], [param distance] should be computed using [code]delta[/code]. Virtually sets the node's position, scale and rotation to that of the given [Transform2D], then tries to move the body along the vector [param distance]. Returns [code]true[/code] if a collision would stop the body from moving along the whole path. [param collision] is an optional object of type [KinematicCollision2D], which contains additional information about the collision when stopped, or when touching another body along the motion. [param safe_margin] is the extra margin used for collision recovery (see [member CharacterBody2D.safe_margin] for more details). + If [param recovery_as_collision] is [code]true[/code], any depenetration from the recovery phase is also reported as a collision; this is useful for checking whether the body would [i]touch[/i] any other bodies. </description> </method> </methods> diff --git a/doc/classes/PhysicsBody3D.xml b/doc/classes/PhysicsBody3D.xml index 310671274f..bf7882a1ea 100644 --- a/doc/classes/PhysicsBody3D.xml +++ b/doc/classes/PhysicsBody3D.xml @@ -35,12 +35,14 @@ <param index="0" name="distance" type="Vector3" /> <param index="1" name="test_only" type="bool" default="false" /> <param index="2" name="safe_margin" type="float" default="0.001" /> - <param index="3" name="max_collisions" type="int" default="1" /> + <param index="3" name="recovery_as_collision" type="bool" default="false" /> + <param index="4" name="max_collisions" type="int" default="1" /> <description> Moves the body along the vector [param distance]. In order to be frame rate independent in [method Node._physics_process] or [method Node._process], [param distance] should be computed using [code]delta[/code]. The body will stop if it collides. Returns a [KinematicCollision3D], which contains information about the collision when stopped, or when touching another body along the motion. If [param test_only] is [code]true[/code], the body does not move but the would-be collision information is given. [param safe_margin] is the extra margin used for collision recovery (see [member CharacterBody3D.safe_margin] for more details). + If [param recovery_as_collision] is [code]true[/code], any depenetration from the recovery phase is also reported as a collision; this is used e.g. by [CharacterBody3D] for improving floor detection during floor snapping. [param max_collisions] allows to retrieve more than one collision result. </description> </method> @@ -65,12 +67,14 @@ <param index="1" name="distance" type="Vector3" /> <param index="2" name="collision" type="KinematicCollision3D" default="null" /> <param index="3" name="safe_margin" type="float" default="0.001" /> - <param index="4" name="max_collisions" type="int" default="1" /> + <param index="4" name="recovery_as_collision" type="bool" default="false" /> + <param index="5" name="max_collisions" type="int" default="1" /> <description> Checks for collisions without moving the body. In order to be frame rate independent in [method Node._physics_process] or [method Node._process], [param distance] should be computed using [code]delta[/code]. Virtually sets the node's position, scale and rotation to that of the given [Transform3D], then tries to move the body along the vector [param distance]. Returns [code]true[/code] if a collision would stop the body from moving along the whole path. [param collision] is an optional object of type [KinematicCollision3D], which contains additional information about the collision when stopped, or when touching another body along the motion. [param safe_margin] is the extra margin used for collision recovery (see [member CharacterBody3D.safe_margin] for more details). + If [param recovery_as_collision] is [code]true[/code], any depenetration from the recovery phase is also reported as a collision; this is useful for checking whether the body would [i]touch[/i] any other bodies. [param max_collisions] allows to retrieve more than one collision result. </description> </method> diff --git a/doc/classes/PhysicsServer2DExtension.xml b/doc/classes/PhysicsServer2DExtension.xml index 4a5425bd63..518862bb28 100644 --- a/doc/classes/PhysicsServer2DExtension.xml +++ b/doc/classes/PhysicsServer2DExtension.xml @@ -142,6 +142,13 @@ <description> </description> </method> + <method name="_area_set_pickable" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="area" type="RID" /> + <param index="1" name="pickable" type="bool" /> + <description> + </description> + </method> <method name="_area_set_shape" qualifiers="virtual"> <return type="void" /> <param index="0" name="area" type="RID" /> @@ -282,6 +289,19 @@ <description> </description> </method> + <method name="_body_collide_shape" qualifiers="virtual"> + <return type="bool" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="body_shape" type="int" /> + <param index="2" name="shape" type="RID" /> + <param index="3" name="shape_xform" type="Transform2D" /> + <param index="4" name="motion" type="Vector2" /> + <param index="5" name="results" type="void*" /> + <param index="6" name="result_max" type="int" /> + <param index="7" name="result_count" type="int32_t*" /> + <description> + </description> + </method> <method name="_body_create" qualifiers="virtual"> <return type="RID" /> <description> @@ -293,6 +313,12 @@ <description> </description> </method> + <method name="_body_get_collision_exceptions" qualifiers="virtual const"> + <return type="RID[]" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> <method name="_body_get_collision_layer" qualifiers="virtual const"> <return type="int" /> <param index="0" name="body" type="RID" /> @@ -323,6 +349,12 @@ <description> </description> </method> + <method name="_body_get_contacts_reported_depth_threshold" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> <method name="_body_get_continuous_collision_detection_mode" qualifiers="virtual const"> <return type="int" enum="PhysicsServer2D.CCDMode" /> <param index="0" name="body" type="RID" /> @@ -461,6 +493,13 @@ <description> </description> </method> + <method name="_body_set_contacts_reported_depth_threshold" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="threshold" type="float" /> + <description> + </description> + </method> <method name="_body_set_continuous_collision_detection_mode" qualifiers="virtual"> <return type="void" /> <param index="0" name="body" type="RID" /> @@ -505,6 +544,13 @@ <description> </description> </method> + <method name="_body_set_pickable" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="pickable" type="bool" /> + <description> + </description> + </method> <method name="_body_set_shape" qualifiers="virtual"> <return type="void" /> <param index="0" name="body" type="RID" /> @@ -553,6 +599,13 @@ <description> </description> </method> + <method name="_body_set_state_sync_callback" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="callable" type="Callable" /> + <description> + </description> + </method> <method name="_body_test_motion" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="body" type="RID" /> @@ -648,6 +701,13 @@ <description> </description> </method> + <method name="_joint_disable_collisions_between_bodies" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="joint" type="RID" /> + <param index="1" name="disable" type="bool" /> + <description> + </description> + </method> <method name="_joint_get_param" qualifiers="virtual const"> <return type="float" /> <param index="0" name="joint" type="RID" /> @@ -661,6 +721,12 @@ <description> </description> </method> + <method name="_joint_is_disabled_collisions_between_bodies" qualifiers="virtual const"> + <return type="bool" /> + <param index="0" name="joint" type="RID" /> + <description> + </description> + </method> <method name="_joint_make_damped_spring" qualifiers="virtual"> <return type="void" /> <param index="0" name="joint" type="RID" /> @@ -735,6 +801,26 @@ <description> </description> </method> + <method name="_shape_collide" qualifiers="virtual"> + <return type="bool" /> + <param index="0" name="shape_A" type="RID" /> + <param index="1" name="xform_A" type="Transform2D" /> + <param index="2" name="motion_A" type="Vector2" /> + <param index="3" name="shape_B" type="RID" /> + <param index="4" name="xform_B" type="Transform2D" /> + <param index="5" name="motion_B" type="Vector2" /> + <param index="6" name="results" type="void*" /> + <param index="7" name="result_max" type="int" /> + <param index="8" name="result_count" type="int32_t*" /> + <description> + </description> + </method> + <method name="_shape_get_custom_solver_bias" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="shape" type="RID" /> + <description> + </description> + </method> <method name="_shape_get_data" qualifiers="virtual const"> <return type="Variant" /> <param index="0" name="shape" type="RID" /> @@ -747,6 +833,13 @@ <description> </description> </method> + <method name="_shape_set_custom_solver_bias" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="shape" type="RID" /> + <param index="1" name="bias" type="float" /> + <description> + </description> + </method> <method name="_shape_set_data" qualifiers="virtual"> <return type="void" /> <param index="0" name="shape" type="RID" /> @@ -759,6 +852,18 @@ <description> </description> </method> + <method name="_space_get_contact_count" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="space" type="RID" /> + <description> + </description> + </method> + <method name="_space_get_contacts" qualifiers="virtual const"> + <return type="PackedVector2Array" /> + <param index="0" name="space" type="RID" /> + <description> + </description> + </method> <method name="_space_get_direct_state" qualifiers="virtual"> <return type="PhysicsDirectSpaceState2D" /> <param index="0" name="space" type="RID" /> @@ -785,6 +890,13 @@ <description> </description> </method> + <method name="_space_set_debug_contacts" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="space" type="RID" /> + <param index="1" name="max_contacts" type="int" /> + <description> + </description> + </method> <method name="_space_set_param" qualifiers="virtual"> <return type="void" /> <param index="0" name="space" type="RID" /> diff --git a/doc/classes/PhysicsServer3DExtension.xml b/doc/classes/PhysicsServer3DExtension.xml index 46d3c8ae3e..ab00f63359 100644 --- a/doc/classes/PhysicsServer3DExtension.xml +++ b/doc/classes/PhysicsServer3DExtension.xml @@ -274,6 +274,12 @@ <description> </description> </method> + <method name="_body_get_collision_exceptions" qualifiers="virtual const"> + <return type="RID[]" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> <method name="_body_get_collision_layer" qualifiers="virtual const"> <return type="int" /> <param index="0" name="body" type="RID" /> @@ -304,6 +310,12 @@ <description> </description> </method> + <method name="_body_get_contacts_reported_depth_threshold" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> <method name="_body_get_direct_state" qualifiers="virtual"> <return type="PhysicsDirectBodyState3D" /> <param index="0" name="body" type="RID" /> @@ -368,6 +380,12 @@ <description> </description> </method> + <method name="_body_get_user_flags" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> <method name="_body_is_axis_locked" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="body" type="RID" /> @@ -457,6 +475,13 @@ <description> </description> </method> + <method name="_body_set_contacts_reported_depth_threshold" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="threshold" type="float" /> + <description> + </description> + </method> <method name="_body_set_enable_continuous_collision_detection" qualifiers="virtual"> <return type="void" /> <param index="0" name="body" type="RID" /> @@ -547,6 +572,20 @@ <description> </description> </method> + <method name="_body_set_state_sync_callback" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="callable" type="Callable" /> + <description> + </description> + </method> + <method name="_body_set_user_flags" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="flags" type="int" /> + <description> + </description> + </method> <method name="_body_test_motion" qualifiers="virtual const"> <return type="bool" /> <param index="0" name="body" type="RID" /> @@ -763,6 +802,18 @@ <description> </description> </method> + <method name="_joint_make_hinge_simple" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="joint" type="RID" /> + <param index="1" name="body_A" type="RID" /> + <param index="2" name="pivot_A" type="Vector3" /> + <param index="3" name="axis_A" type="Vector3" /> + <param index="4" name="body_B" type="RID" /> + <param index="5" name="pivot_B" type="Vector3" /> + <param index="6" name="axis_B" type="Vector3" /> + <description> + </description> + </method> <method name="_joint_make_pin" qualifiers="virtual"> <return type="void" /> <param index="0" name="joint" type="RID" /> @@ -842,18 +893,37 @@ <description> </description> </method> + <method name="_shape_get_custom_solver_bias" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="shape" type="RID" /> + <description> + </description> + </method> <method name="_shape_get_data" qualifiers="virtual const"> <return type="Variant" /> <param index="0" name="shape" type="RID" /> <description> </description> </method> + <method name="_shape_get_margin" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="shape" type="RID" /> + <description> + </description> + </method> <method name="_shape_get_type" qualifiers="virtual const"> <return type="int" enum="PhysicsServer3D.ShapeType" /> <param index="0" name="shape" type="RID" /> <description> </description> </method> + <method name="_shape_set_custom_solver_bias" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="shape" type="RID" /> + <param index="1" name="bias" type="float" /> + <description> + </description> + </method> <method name="_shape_set_data" qualifiers="virtual"> <return type="void" /> <param index="0" name="shape" type="RID" /> @@ -861,6 +931,13 @@ <description> </description> </method> + <method name="_shape_set_margin" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="shape" type="RID" /> + <param index="1" name="margin" type="float" /> + <description> + </description> + </method> <method name="_slider_joint_get_param" qualifiers="virtual const"> <return type="float" /> <param index="0" name="joint" type="RID" /> @@ -876,17 +953,250 @@ <description> </description> </method> + <method name="_soft_body_add_collision_exception" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="body_b" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_create" qualifiers="virtual"> + <return type="RID" /> + <description> + </description> + </method> <method name="_soft_body_get_bounds" qualifiers="virtual const"> <return type="AABB" /> <param index="0" name="body" type="RID" /> <description> </description> </method> + <method name="_soft_body_get_collision_exceptions" qualifiers="virtual const"> + <return type="RID[]" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_collision_layer" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_collision_mask" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_damping_coefficient" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_drag_coefficient" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_linear_stiffness" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_point_global_position" qualifiers="virtual const"> + <return type="Vector3" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="point_index" type="int" /> + <description> + </description> + </method> + <method name="_soft_body_get_pressure_coefficient" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_simulation_precision" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_space" qualifiers="virtual const"> + <return type="RID" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_get_state" qualifiers="virtual const"> + <return type="Variant" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="state" type="int" enum="PhysicsServer3D.BodyState" /> + <description> + </description> + </method> + <method name="_soft_body_get_total_mass" qualifiers="virtual const"> + <return type="float" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_is_point_pinned" qualifiers="virtual const"> + <return type="bool" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="point_index" type="int" /> + <description> + </description> + </method> + <method name="_soft_body_move_point" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="point_index" type="int" /> + <param index="2" name="global_position" type="Vector3" /> + <description> + </description> + </method> + <method name="_soft_body_pin_point" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="point_index" type="int" /> + <param index="2" name="pin" type="bool" /> + <description> + </description> + </method> + <method name="_soft_body_remove_all_pinned_points" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_remove_collision_exception" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="body_b" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_set_collision_layer" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="layer" type="int" /> + <description> + </description> + </method> + <method name="_soft_body_set_collision_mask" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="mask" type="int" /> + <description> + </description> + </method> + <method name="_soft_body_set_damping_coefficient" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="damping_coefficient" type="float" /> + <description> + </description> + </method> + <method name="_soft_body_set_drag_coefficient" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="drag_coefficient" type="float" /> + <description> + </description> + </method> + <method name="_soft_body_set_linear_stiffness" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="linear_stiffness" type="float" /> + <description> + </description> + </method> + <method name="_soft_body_set_mesh" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="mesh" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_set_pressure_coefficient" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="pressure_coefficient" type="float" /> + <description> + </description> + </method> + <method name="_soft_body_set_ray_pickable" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="enable" type="bool" /> + <description> + </description> + </method> + <method name="_soft_body_set_simulation_precision" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="simulation_precision" type="int" /> + <description> + </description> + </method> + <method name="_soft_body_set_space" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="space" type="RID" /> + <description> + </description> + </method> + <method name="_soft_body_set_state" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="state" type="int" enum="PhysicsServer3D.BodyState" /> + <param index="2" name="variant" type="Variant" /> + <description> + </description> + </method> + <method name="_soft_body_set_total_mass" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="total_mass" type="float" /> + <description> + </description> + </method> + <method name="_soft_body_set_transform" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="transform" type="Transform3D" /> + <description> + </description> + </method> + <method name="_soft_body_update_rendering_server" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="body" type="RID" /> + <param index="1" name="rendering_server_handler" type="PhysicsServer3DRenderingServerHandler" /> + <description> + </description> + </method> <method name="_space_create" qualifiers="virtual"> <return type="RID" /> <description> </description> </method> + <method name="_space_get_contact_count" qualifiers="virtual const"> + <return type="int" /> + <param index="0" name="space" type="RID" /> + <description> + </description> + </method> + <method name="_space_get_contacts" qualifiers="virtual const"> + <return type="PackedVector3Array" /> + <param index="0" name="space" type="RID" /> + <description> + </description> + </method> <method name="_space_get_direct_state" qualifiers="virtual"> <return type="PhysicsDirectSpaceState3D" /> <param index="0" name="space" type="RID" /> @@ -913,6 +1223,13 @@ <description> </description> </method> + <method name="_space_set_debug_contacts" qualifiers="virtual"> + <return type="void" /> + <param index="0" name="space" type="RID" /> + <param index="1" name="max_contacts" type="int" /> + <description> + </description> + </method> <method name="_space_set_param" qualifiers="virtual"> <return type="void" /> <param index="0" name="space" type="RID" /> diff --git a/doc/classes/PhysicsTestMotionParameters2D.xml b/doc/classes/PhysicsTestMotionParameters2D.xml index 4f2b62f2d9..d8f96511dd 100644 --- a/doc/classes/PhysicsTestMotionParameters2D.xml +++ b/doc/classes/PhysicsTestMotionParameters2D.xml @@ -29,8 +29,8 @@ Motion vector to define the length and direction of the motion to test. </member> <member name="recovery_as_collision" type="bool" setter="set_recovery_as_collision_enabled" getter="is_recovery_as_collision_enabled" default="false"> - If set to [code]true[/code], any depenetration from the recovery phase is reported as a collision; this is used e.g. by [method CharacterBody2D.move_and_slide] for improving floor detection when floor snapping is disabled. - If set to [code]false[/code], only collisions resulting from the motion are reported; this is used e.g. by [method PhysicsBody2D.move_and_collide]. + If set to [code]true[/code], any depenetration from the recovery phase is reported as a collision; this is used e.g. by [CharacterBody2D] for improving floor detection during floor snapping. + If set to [code]false[/code], only collisions resulting from the motion are reported, which is generally the desired behaviour. </member> </members> </class> diff --git a/doc/classes/PhysicsTestMotionParameters3D.xml b/doc/classes/PhysicsTestMotionParameters3D.xml index 5b07796a10..e8f80ae131 100644 --- a/doc/classes/PhysicsTestMotionParameters3D.xml +++ b/doc/classes/PhysicsTestMotionParameters3D.xml @@ -32,8 +32,8 @@ Motion vector to define the length and direction of the motion to test. </member> <member name="recovery_as_collision" type="bool" setter="set_recovery_as_collision_enabled" getter="is_recovery_as_collision_enabled" default="false"> - If set to [code]true[/code], any depenetration from the recovery phase is reported as a collision; this is used e.g. by [method CharacterBody3D.move_and_slide] for improving floor detection when floor snapping is disabled. - If set to [code]false[/code], only collisions resulting from the motion are detected; this is used e.g. by [method PhysicsBody3D.move_and_collide]. + If set to [code]true[/code], any depenetration from the recovery phase is reported as a collision; this is used e.g. by [CharacterBody3D] for improving floor detection during floor snapping. + If set to [code]false[/code], only collisions resulting from the motion are reported, which is generally the desired behaviour. </member> </members> </class> diff --git a/doc/classes/PlaneMesh.xml b/doc/classes/PlaneMesh.xml index 564b6fe743..1dceac70b0 100644 --- a/doc/classes/PlaneMesh.xml +++ b/doc/classes/PlaneMesh.xml @@ -31,10 +31,10 @@ [PlaneMesh] will face the positive X-axis. </constant> <constant name="FACE_Y" value="1" enum="Orientation"> - [PlaneMesh] will face the positive Y-axis. This matches the behaviour of the [PlaneMesh] in Godot 3.x. + [PlaneMesh] will face the positive Y-axis. This matches the behavior of the [PlaneMesh] in Godot 3.x. </constant> <constant name="FACE_Z" value="2" enum="Orientation"> - [PlaneMesh] will face the positive Z-axis. This matches the behvaiour of the QuadMesh in Godot 3.x. + [PlaneMesh] will face the positive Z-axis. This matches the behavior of the QuadMesh in Godot 3.x. </constant> </constants> </class> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 1145798240..4c2cf330af 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -159,6 +159,15 @@ Sets the order of a configuration value (influences when saved to the config file). </description> </method> + <method name="set_restart_if_changed"> + <return type="void" /> + <param index="0" name="name" type="String" /> + <param index="1" name="restart" type="bool" /> + <description> + Sets whether a setting requires restarting the editor to properly take effect. + [b]Note:[/b] This is just a hint to display to the user that the editor must be restarted for changes to take effect. Enabling [method set_restart_if_changed] does [i]not[/i] delay the setting being set when changed. + </description> + </method> <method name="set_setting"> <return type="void" /> <param index="0" name="name" type="String" /> @@ -477,9 +486,6 @@ <member name="debug/shapes/collision/shape_color" type="Color" setter="" getter="" default="Color(0, 0.6, 0.7, 0.42)"> Color of the collision shapes, visible when "Visible Collision Shapes" is enabled in the Debug menu. </member> - <member name="debug/shapes/navigation/disabled_geometry_color" type="Color" setter="" getter="" default="Color(1, 0.7, 0.1, 0.4)"> - Color of the disabled navigation geometry, visible when "Visible Navigation" is enabled in the Debug menu. - </member> <member name="debug/shapes/navigation/edge_connection_color" type="Color" setter="" getter="" default="Color(1, 0, 1, 1)"> Color to display edge connections between navigation regions, visible when "Visible Navigation" is enabled in the Debug menu. </member> @@ -504,9 +510,6 @@ <member name="debug/shapes/navigation/enable_link_connections_xray" type="bool" setter="" getter="" default="true"> If enabled, displays navigation link connections through geometry when "Visible Navigation" is enabled in the Debug menu. </member> - <member name="debug/shapes/navigation/geometry_color" type="Color" setter="" getter="" default="Color(0.1, 1, 0.7, 0.4)"> - Color of the navigation geometry, visible when "Visible Navigation" is enabled in the Debug menu. - </member> <member name="debug/shapes/navigation/geometry_edge_color" type="Color" setter="" getter="" default="Color(0.5, 1, 1, 1)"> Color to display enabled navigation mesh polygon edges, visible when "Visible Navigation" is enabled in the Debug menu. </member> @@ -646,10 +649,22 @@ If [code]true[/code], Blender 3D scene files with the [code].blend[/code] extension will be imported by converting them to glTF 2.0. This requires configuring a path to a Blender executable in the editor settings at [code]filesystem/import/blender/blender3_path[/code]. Blender 3.0 or later is required. </member> + <member name="filesystem/import/blender/enabled.android" type="bool" setter="" getter="" default="false"> + Override for [member filesystem/import/blender/enabled] on Android where Blender can't easily be accessed from Godot. + </member> + <member name="filesystem/import/blender/enabled.web" type="bool" setter="" getter="" default="false"> + Override for [member filesystem/import/blender/enabled] on the Web where Blender can't easily be accessed from Godot. + </member> <member name="filesystem/import/fbx/enabled" type="bool" setter="" getter="" default="true"> If [code]true[/code], Autodesk FBX 3D scene files with the [code].fbx[/code] extension will be imported by converting them to glTF 2.0. This requires configuring a path to a FBX2glTF executable in the editor settings at [code]filesystem/import/fbx/fbx2gltf_path[/code]. </member> + <member name="filesystem/import/fbx/enabled.android" type="bool" setter="" getter="" default="false"> + Override for [member filesystem/import/fbx/enabled] on Android where FBX2glTF can't easily be accessed from Godot. + </member> + <member name="filesystem/import/fbx/enabled.web" type="bool" setter="" getter="" default="false"> + Override for [member filesystem/import/fbx/enabled] on the Web where FBX2glTF can't easily be accessed from Godot. + </member> <member name="gui/common/default_scroll_deadzone" type="int" setter="" getter="" default="0"> Default value for [member ScrollContainer.scroll_deadzone], which will be used for all [ScrollContainer]s unless overridden. </member> @@ -1494,8 +1509,8 @@ <member name="network/remote_fs/page_size" type="int" setter="" getter="" default="65536"> Page size used by remote filesystem (in bytes). </member> - <member name="network/ssl/certificate_bundle_override" type="String" setter="" getter="" default=""""> - The CA certificates bundle to use for SSL connections. If this is set to a non-empty value, this will [i]override[/i] Godot's default [url=https://github.com/godotengine/godot/blob/master/thirdparty/certs/ca-certificates.crt]Mozilla certificate bundle[/url]. If left empty, the default certificate bundle will be used. + <member name="network/tls/certificate_bundle_override" type="String" setter="" getter="" default=""""> + The CA certificates bundle to use for TLS connections. If this is set to a non-empty value, this will [i]override[/i] Godot's default [url=https://github.com/godotengine/godot/blob/master/thirdparty/certs/ca-certificates.crt]Mozilla certificate bundle[/url]. If left empty, the default certificate bundle will be used. If in doubt, leave this setting empty. </member> <member name="physics/2d/default_angular_damp" type="float" setter="" getter="" default="1.0"> @@ -1699,13 +1714,6 @@ If [code]true[/code], performs a previous depth pass before rendering 3D materials. This increases performance significantly in scenes with high overdraw, when complex materials and lighting are used. However, in scenes with few occluded surfaces, the depth prepass may reduce performance. If your game is viewed from a fixed angle that makes it easy to avoid overdraw (such as top-down or side-scrolling perspective), consider disabling the depth prepass to improve performance. This setting can be changed at run-time to optimize performance depending on the scene currently being viewed. [b]Note:[/b] Only supported when using the Vulkan Clustered backend or the OpenGL backend. When using Vulkan Mobile there is no depth prepass performed. </member> - <member name="rendering/driver/driver_name" type="String" setter="" getter="" default=""vulkan""> - The video driver to use. - [b]Note:[/b] OpenGL support is currently incomplete. Only basic rendering is supported. - [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/driver/threads/thread_model" type="int" setter="" getter="" default="1"> Thread model for rendering. Rendering on a thread can vastly improve performance, but synchronizing to the main thread can cause a bit more jitter. </member> @@ -1776,11 +1784,32 @@ Enables filtering of the volumetric fog effect prior to integration. This substantially blurs the fog which reduces fine details but also smooths out harsh edges and aliasing artifacts. Disable when more detail is required. </member> <member name="rendering/environment/volumetric_fog/volume_depth" type="int" setter="" getter="" default="64"> - Number of slices to use along the depth of the froxel buffer for volumetric fog. A lower number will be more efficient but may result in artifacts appearing during camera movement. + Number of slices to use along the depth of the froxel buffer for volumetric fog. A lower number will be more efficient but may result in artifacts appearing during camera movement. See also [member Environment.volumetric_fog_length]. </member> <member name="rendering/environment/volumetric_fog/volume_size" type="int" setter="" getter="" default="64"> Base size used to determine size of froxel buffer in the camera X-axis and Y-axis. The final size is scaled by the aspect ratio of the screen, so actual values may differ from what is set. Set a larger size for more detailed fog, set a smaller size for better performance. </member> + <member name="rendering/gl_compatibility/driver" type="String" setter="" getter="" default=""opengl3""> + Sets the driver to be used by the renderer when using the Compatibility renderer. This property can not be edited directly, instead, set the driver using the platform-specific overrides. + </member> + <member name="rendering/gl_compatibility/driver.android" type="String" setter="" getter="" default=""opengl3""> + Android override for [member rendering/gl_compatibility/driver]. + </member> + <member name="rendering/gl_compatibility/driver.ios" type="String" setter="" getter="" default=""opengl3""> + iOS override for [member rendering/gl_compatibility/driver]. + </member> + <member name="rendering/gl_compatibility/driver.linuxbsd" type="String" setter="" getter="" default=""opengl3""> + LinuxBSD override for [member rendering/gl_compatibility/driver]. + </member> + <member name="rendering/gl_compatibility/driver.macos" type="String" setter="" getter="" default=""opengl3""> + macOS override for [member rendering/gl_compatibility/driver]. + </member> + <member name="rendering/gl_compatibility/driver.web" type="String" setter="" getter="" default=""opengl3""> + Web override for [member rendering/gl_compatibility/driver]. + </member> + <member name="rendering/gl_compatibility/driver.windows" type="String" setter="" getter="" default=""opengl3""> + Windows override for [member rendering/gl_compatibility/driver]. + </member> <member name="rendering/global_illumination/gi/use_half_resolution" type="bool" setter="" getter="" default="false"> If [code]true[/code], renders [VoxelGI] and SDFGI ([member Environment.sdfgi_enabled]) buffers at halved resolution (e.g. 960×540 when the viewport size is 1920×1080). This improves performance significantly when VoxelGI or SDFGI is enabled, at the cost of artifacts that may be visible on polygon edges. The loss in quality becomes less noticeable as the viewport resolution increases. [LightmapGI] rendering is not affected by this setting. [b]Note:[/b] This property is only read when the project starts. To set half-resolution GI at run-time, call [method RenderingServer.gi_set_use_half_resolution] instead. @@ -1941,6 +1970,44 @@ <member name="rendering/reflections/sky_reflections/texture_array_reflections.mobile" type="bool" setter="" getter="" default="false"> Lower-end override for [member rendering/reflections/sky_reflections/texture_array_reflections] on mobile devices, due to performance concerns or driver support. </member> + <member name="rendering/renderer/rendering_method" type="String" setter="" getter="" default=""forward_plus""> + Sets the renderer that will be used by the project. Options are: + [b]Clustered[/b]: High-end renderer designed for Desktop devices. Has a higher base overhead, but scales well with complex scenes. Not suitable for older devices or mobile. + [b]Mobile[/b]: Modern renderer designed for mobile devices. Has a lower base overhead than Clustered, but does not scale as well to large scenes with many elements. + [b]Compatibility[/b]: Low-end renderer designed for older devices. Based on the limitations of the OpenGL 3.3/ OpenGL ES 3.0 / WebGL 2 APIs. + </member> + <member name="rendering/renderer/rendering_method.mobile" type="String" setter="" getter="" default=""forward_plus""> + Override for [member rendering/renderer/rendering_method] on mobile devices. + </member> + <member name="rendering/renderer/rendering_method.web" type="String" setter="" getter="" default=""gl_compatibility""> + Override for [member rendering/renderer/rendering_method] on web. + </member> + <member name="rendering/rendering_device/descriptor_pools/max_descriptors_per_pool" type="int" setter="" getter="" default="64"> + </member> + <member name="rendering/rendering_device/driver" type="String" setter="" getter="" default=""vulkan""> + Sets the driver to be used by the renderer when using a RenderingDevice-based renderer like the clustered renderer or the mobile renderer. This property can not be edited directly, instead, set the driver using the platform-specific overrides. + </member> + <member name="rendering/rendering_device/driver.android" type="String" setter="" getter="" default=""vulkan""> + Android override for [member rendering/rendering_device/driver]. + </member> + <member name="rendering/rendering_device/driver.ios" type="String" setter="" getter="" default=""vulkan""> + iOS override for [member rendering/rendering_device/driver]. + </member> + <member name="rendering/rendering_device/driver.linuxbsd" type="String" setter="" getter="" default=""vulkan""> + LinuxBSD override for [member rendering/rendering_device/driver]. + </member> + <member name="rendering/rendering_device/driver.macos" type="String" setter="" getter="" default=""vulkan""> + macOS override for [member rendering/rendering_device/driver]. + </member> + <member name="rendering/rendering_device/driver.windows" type="String" setter="" getter="" default=""vulkan""> + Windows override for [member rendering/rendering_device/driver]. + </member> + <member name="rendering/rendering_device/staging_buffer/block_size_kb" type="int" setter="" getter="" default="256"> + </member> + <member name="rendering/rendering_device/staging_buffer/max_size_mb" type="int" setter="" getter="" default="128"> + </member> + <member name="rendering/rendering_device/staging_buffer/texture_upload_region_size_px" type="int" setter="" getter="" default="64"> + </member> <member name="rendering/scaling_3d/fsr_sharpness" type="float" setter="" getter="" default="0.2"> Determines how sharp the upscaled image will be when using the FSR upscaling mode. Sharpness halves with every whole number. Values go from 0.0 (sharpest) to 2.0. Values above 2.0 won't make a visible difference. </member> @@ -2022,18 +2089,6 @@ <member name="rendering/vrs/texture" type="String" setter="" getter="" default=""""> If [member rendering/vrs/mode] is set to texture, this is the path to default texture loaded as the VRS image. </member> - <member name="rendering/vulkan/descriptor_pools/max_descriptors_per_pool" type="int" setter="" getter="" default="64"> - </member> - <member name="rendering/vulkan/rendering/back_end" type="int" setter="" getter="" default="0"> - </member> - <member name="rendering/vulkan/rendering/back_end.mobile" type="int" setter="" getter="" default="1"> - </member> - <member name="rendering/vulkan/staging_buffer/block_size_kb" type="int" setter="" getter="" default="256"> - </member> - <member name="rendering/vulkan/staging_buffer/max_size_mb" type="int" setter="" getter="" default="128"> - </member> - <member name="rendering/vulkan/staging_buffer/texture_upload_region_size_px" type="int" setter="" getter="" default="64"> - </member> <member name="threading/worker_pool/low_priority_thread_ratio" type="float" setter="" getter="" default="0.3"> </member> <member name="threading/worker_pool/max_threads" type="int" setter="" getter="" default="-1"> diff --git a/doc/classes/QuadMesh.xml b/doc/classes/QuadMesh.xml new file mode 100644 index 0000000000..7469338ef9 --- /dev/null +++ b/doc/classes/QuadMesh.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="QuadMesh" inherits="PlaneMesh" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + Class representing a square mesh facing the camera. + </brief_description> + <description> + 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 rotation is more suited for use with billboarded materials. A [QuadMesh] is equivalent to a [PlaneMesh] except its default [member PlaneMesh.orientation] is [constant PlaneMesh.FACE_Z]. + </description> + <tutorials> + <link title="GUI in 3D Demo">https://godotengine.org/asset-library/asset/127</link> + <link title="2D in 3D Demo">https://godotengine.org/asset-library/asset/129</link> + </tutorials> + <members> + <member name="orientation" type="int" setter="set_orientation" getter="get_orientation" overrides="PlaneMesh" enum="PlaneMesh.Orientation" default="2" /> + </members> +</class> diff --git a/doc/classes/Quaternion.xml b/doc/classes/Quaternion.xml index a521af5709..f21ebf57e2 100644 --- a/doc/classes/Quaternion.xml +++ b/doc/classes/Quaternion.xml @@ -71,7 +71,7 @@ <param index="0" name="to" type="Quaternion" /> <description> Returns the angle between this quaternion and [param to]. This is the magnitude of the angle you would need to rotate by to get from one to the other. - [b]Note:[/b] This method has an abnormally high number of floating-point errors, so methods such as [code]is_zero_approx[/code] will not work reliably. + [b]Note:[/b] The magnitude of the floating-point error for this method is abnormally high, so methods such as [code]is_zero_approx[/code] will not work reliably. </description> </method> <method name="dot" qualifiers="const"> diff --git a/doc/classes/ResourceSaver.xml b/doc/classes/ResourceSaver.xml index b0c9056cbc..8cd701e0d8 100644 --- a/doc/classes/ResourceSaver.xml +++ b/doc/classes/ResourceSaver.xml @@ -62,10 +62,10 @@ Do not save editor-specific metadata (identified by their [code]__editor[/code] prefix). </constant> <constant name="FLAG_SAVE_BIG_ENDIAN" value="16" enum="SaverFlags" is_bitfield="true"> - Save as big endian (see [member File.big_endian]). + Save as big endian (see [member FileAccess.big_endian]). </constant> <constant name="FLAG_COMPRESS" value="32" enum="SaverFlags" is_bitfield="true"> - Compress the resource on save using [constant File.COMPRESSION_ZSTD]. Only available for binary resource types. + Compress the resource on save using [constant FileAccess.COMPRESSION_ZSTD]. Only available for binary resource types. </constant> <constant name="FLAG_REPLACE_SUBRESOURCE_PATHS" value="64" enum="SaverFlags" is_bitfield="true"> Take over the paths of the saved subresources (see [method Resource.take_over_path]). diff --git a/doc/classes/SceneTree.xml b/doc/classes/SceneTree.xml index 221e627e35..070b98f21d 100644 --- a/doc/classes/SceneTree.xml +++ b/doc/classes/SceneTree.xml @@ -36,22 +36,22 @@ [b]Note:[/b] Group call flags are used to control the method calling behavior. By default, methods will be called immediately in a way similar to [method call_group]. However, if the [constant GROUP_CALL_DEFERRED] flag is present in the [param flags] argument, methods will be called with a one-frame delay in a way similar to [method Object.set_deferred]. </description> </method> - <method name="change_scene"> + <method name="change_scene_to_file"> <return type="int" enum="Error" /> <param index="0" name="path" type="String" /> <description> Changes the running scene to the one at the given [param path], after loading it into a [PackedScene] and creating a new instance. Returns [constant OK] on success, [constant ERR_CANT_OPEN] if the [param path] cannot be loaded into a [PackedScene], or [constant ERR_CANT_CREATE] if that scene cannot be instantiated. - [b]Note:[/b] The scene change is deferred, which means that the new scene node is added on the next idle frame. You won't be able to access it immediately after the [method change_scene] call. + [b]Note:[/b] The scene change is deferred, which means that the new scene node is added on the next idle frame. You won't be able to access it immediately after the [method change_scene_to_file] call. </description> </method> - <method name="change_scene_to"> + <method name="change_scene_to_packed"> <return type="int" enum="Error" /> <param index="0" name="packed_scene" type="PackedScene" /> <description> Changes the running scene to a new instance of the given [PackedScene]. Returns [constant OK] on success or [constant ERR_CANT_CREATE] if the scene cannot be instantiated. - [b]Note:[/b] The scene change is deferred, which means that the new scene node is added on the next idle frame. You won't be able to access it immediately after the [method change_scene_to] call. + [b]Note:[/b] The scene change is deferred, which means that the new scene node is added on the next idle frame. You won't be able to access it immediately after the [method change_scene_to_packed] call. </description> </method> <method name="create_timer"> diff --git a/doc/classes/ScriptEditorBase.xml b/doc/classes/ScriptEditorBase.xml index c365e0971b..68834839f3 100644 --- a/doc/classes/ScriptEditorBase.xml +++ b/doc/classes/ScriptEditorBase.xml @@ -19,14 +19,14 @@ <method name="get_base_editor" qualifiers="const"> <return type="Control" /> <description> - Returns the underlying [Control] used for editing scripts. This can be either [CodeEdit] (for text scripts) or [GraphEdit] (for visual scripts). + Returns the underlying [Control] used for editing scripts. For text scripts, this is a [CodeEdit]. </description> </method> </methods> <signals> <signal name="edited_script_changed"> <description> - Emitted after script validation. For visual scripts on modification. + Emitted after script validation. </description> </signal> <signal name="go_to_help"> @@ -37,13 +37,13 @@ </signal> <signal name="name_changed"> <description> - Emitted after script validation or when the edited resource has changed. Not used by visual scripts. + Emitted after script validation or when the edited resource has changed. </description> </signal> <signal name="replace_in_files_requested"> <param index="0" name="text" type="String" /> <description> - Emitted when the user request to find and replace text in the file system. Not used by visual scripts. + Emitted when the user request to find and replace text in the file system. </description> </signal> <signal name="request_help"> @@ -67,7 +67,7 @@ <signal name="search_in_files_requested"> <param index="0" name="text" type="String" /> <description> - Emitted when the user request to search text in the file system. Not used by visual scripts. + Emitted when the user request to search text in the file system. </description> </signal> </signals> diff --git a/doc/classes/Skeleton3D.xml b/doc/classes/Skeleton3D.xml index 5a0766263a..3bd0e04b92 100644 --- a/doc/classes/Skeleton3D.xml +++ b/doc/classes/Skeleton3D.xml @@ -32,9 +32,10 @@ Removes the global pose override on all bones in the skeleton. </description> </method> - <method name="clear_bones_local_pose_override"> + <method name="clear_bones_local_pose_override" is_deprecated="true"> <return type="void" /> <description> + Deprecated. Local pose overrides will be removed. Removes the local pose override on all bones in the skeleton. </description> </method> @@ -43,7 +44,7 @@ <description> </description> </method> - <method name="execute_modifications"> + <method name="execute_modifications" is_deprecated="true"> <return type="void" /> <param index="0" name="delta" type="float" /> <param index="1" name="execution_mode" type="int" /> @@ -58,7 +59,7 @@ Returns the bone index that matches [param name] as its name. </description> </method> - <method name="force_update_all_bone_transforms"> + <method name="force_update_all_bone_transforms" is_deprecated="true"> <return type="void" /> <description> Force updates the bone transforms/poses for all bones in the skeleton. @@ -166,7 +167,7 @@ Returns the rest transform for a bone [param bone_idx]. </description> </method> - <method name="get_modification_stack"> + <method name="get_modification_stack" is_deprecated="true"> <return type="SkeletonModificationStack3D" /> <description> Returns the modification stack attached to this skeleton, if one exists. @@ -178,7 +179,7 @@ Returns an array with all of the bones that are parentless. Another way to look at this is that it returns the indexes of all the bones that are not dependent or modified by other bones in the Skeleton. </description> </method> - <method name="global_pose_to_local_pose"> + <method name="global_pose_to_local_pose" is_deprecated="true"> <return type="Transform3D" /> <param index="0" name="bone_idx" type="int" /> <param index="1" name="global_pose" type="Transform3D" /> @@ -187,15 +188,16 @@ This can be used to easily convert a global pose from [method get_bone_global_pose] to a global transform in [method set_bone_local_pose_override]. </description> </method> - <method name="global_pose_to_world_transform"> + <method name="global_pose_to_world_transform" is_deprecated="true"> <return type="Transform3D" /> <param index="0" name="global_pose" type="Transform3D" /> <description> + Deprecated. Use [Node3D] apis instead. Takes the passed-in global pose and converts it to a world transform. This can be used to easily convert a global pose from [method get_bone_global_pose] to a global transform usable with a node's transform, like [member Node3D.global_transform] for example. </description> </method> - <method name="global_pose_z_forward_to_bone_forward"> + <method name="global_pose_z_forward_to_bone_forward" is_deprecated="true"> <return type="Basis" /> <param index="0" name="bone_idx" type="int" /> <param index="1" name="basis" type="Basis" /> @@ -211,7 +213,7 @@ Returns whether the bone pose for the bone at [param bone_idx] is enabled. </description> </method> - <method name="local_pose_to_global_pose"> + <method name="local_pose_to_global_pose" is_deprecated="true"> <return type="Transform3D" /> <param index="0" name="bone_idx" type="int" /> <param index="1" name="local_pose" type="Transform3D" /> @@ -293,16 +295,17 @@ <description> Sets the global pose transform, [param pose], for the bone at [param bone_idx]. [param amount] is the interpolation strength that will be used when applying the pose, and [param persistent] determines if the applied pose will remain. - [b]Note:[/b] The pose transform needs to be a global pose! Use [method world_transform_to_global_pose] to convert a world transform, like one you can get from a [Node3D], to a global pose. + [b]Note:[/b] The pose transform needs to be a global pose! To convert a world transform from a [Node3D] to a global bone pose, multiply the [method Transform3D.affine_inverse] of the node's [member Node3D.global_transform] by the desired world transform </description> </method> - <method name="set_bone_local_pose_override"> + <method name="set_bone_local_pose_override" is_deprecated="true"> <return type="void" /> <param index="0" name="bone_idx" type="int" /> <param index="1" name="pose" type="Transform3D" /> <param index="2" name="amount" type="float" /> <param index="3" name="persistent" type="bool" default="false" /> <description> + Deprecated. Local pose overrides will be removed. Sets the local pose transform, [param pose], for the bone at [param bone_idx]. [param amount] is the interpolation strength that will be used when applying the pose, and [param persistent] determines if the applied pose will remain. [b]Note:[/b] The pose transform needs to be a local pose! Use [method global_pose_to_local_pose] to convert a global pose to a local pose. @@ -353,7 +356,7 @@ Sets the rest transform for bone [param bone_idx]. </description> </method> - <method name="set_modification_stack"> + <method name="set_modification_stack" is_deprecated="true"> <return type="void" /> <param index="0" name="modification_stack" type="SkeletonModificationStack3D" /> <description> @@ -367,10 +370,11 @@ Unparents the bone at [param bone_idx] and sets its rest position to that of its parent prior to being reset. </description> </method> - <method name="world_transform_to_global_pose"> + <method name="world_transform_to_global_pose" is_deprecated="true"> <return type="Transform3D" /> <param index="0" name="world_transform" type="Transform3D" /> <description> + Deprecated. Use [Node3D] apis instead. Takes the passed-in global transform and converts it to a global pose. This can be used to easily convert a global transform from [member Node3D.global_transform] to a global pose usable with [method set_bone_global_pose_override], for example. </description> diff --git a/doc/classes/SkeletonIK3D.xml b/doc/classes/SkeletonIK3D.xml index 788ba3e248..1d50a97954 100644 --- a/doc/classes/SkeletonIK3D.xml +++ b/doc/classes/SkeletonIK3D.xml @@ -1,8 +1,29 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonIK3D" inherits="Node" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonIK3D" inherits="Node" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + SkeletonIK3D is used to place the end bone of a [Skeleton3D] bone chain at a certain point in 3D by rotating all bones in the chain accordingly. </brief_description> <description> + SkeletonIK3D is used to place the end bone of a [Skeleton3D] bone chain at a certain point in 3D by rotating all bones in the chain accordingly. A typical scenario for IK in games is to place a characters feet on the ground or a characters hands on a currently hold object. SkeletonIK uses FabrikInverseKinematic internally to solve the bone chain and applies the results to the [Skeleton3D] [code]bones_global_pose_override[/code] property for all affected bones in the chain. If fully applied this overwrites any bone transform from [Animation]s or bone custom poses set by users. The applied amount can be controlled with the [code]interpolation[/code] property. + [codeblock] + # Apply IK effect automatically on every new frame (not the current) + skeleton_ik_node.start() + + # Apply IK effect only on the current frame + skeleton_ik_node.start(true) + + # Stop IK effect and reset bones_global_pose_override on Skeleton + skeleton_ik_node.stop() + + # Apply full IK effect + skeleton_ik_node.set_interpolation(1.0) + + # Apply half IK effect + skeleton_ik_node.set_interpolation(0.5) + + # Apply zero IK effect (a value at or below 0.01 also removes bones_global_pose_override on Skeleton) + skeleton_ik_node.set_interpolation(0.0) + [/codeblock] </description> <tutorials> <link title="3D Inverse Kinematics Demo">https://godotengine.org/asset-library/asset/523</link> @@ -11,45 +32,59 @@ <method name="get_parent_skeleton" qualifiers="const"> <return type="Skeleton3D" /> <description> + Returns the parent [Skeleton3D] Node that was present when SkeletonIK entered the [SceneTree]. Returns null if the parent node was not a [Skeleton3D] Node when SkeletonIK3D entered the [SceneTree]. </description> </method> <method name="is_running"> <return type="bool" /> <description> + Returns [code]true[/code] if SkeletonIK is applying IK effects on continues frames to the [Skeleton3D] bones. Returns [code]false[/code] if SkeletonIK is stopped or [method start] was used with the [code]one_time[/code] parameter set to [code]true[/code]. </description> </method> <method name="start"> <return type="void" /> <param index="0" name="one_time" type="bool" default="false" /> <description> + Starts applying IK effects on each frame to the [Skeleton3D] bones but will only take effect starting on the next frame. If [code]one_time[/code] is [code]true[/code], this will take effect immediately but also reset on the next frame. </description> </method> <method name="stop"> <return type="void" /> <description> + Stops applying IK effects on each frame to the [Skeleton3D] bones and also calls [method Skeleton3D.clear_bones_global_pose_override] to remove existing overrides on all bones. </description> </method> </methods> <members> <member name="interpolation" type="float" setter="set_interpolation" getter="get_interpolation" default="1.0"> + Interpolation value for how much the IK results are applied to the current skeleton bone chain. A value of [code]1.0[/code] will overwrite all skeleton bone transforms completely while a value of [code]0.0[/code] will visually disable the SkeletonIK. A value at or below [code]0.01[/code] also calls [method Skeleton3D.clear_bones_global_pose_override]. </member> <member name="magnet" type="Vector3" setter="set_magnet_position" getter="get_magnet_position" default="Vector3(0, 0, 0)"> + Secondary target position (first is [member target] property or [member target_node]) for the IK chain. Use magnet position (pole target) to control the bending of the IK chain. Only works if the bone chain has more than 2 bones. The middle chain bone position will be linearly interpolated with the magnet position. </member> <member name="max_iterations" type="int" setter="set_max_iterations" getter="get_max_iterations" default="10"> + Number of iteration loops used by the IK solver to produce more accurate (and elegant) bone chain results. </member> <member name="min_distance" type="float" setter="set_min_distance" getter="get_min_distance" default="0.01"> + The minimum distance between bone and goal target. If the distance is below this value, the IK solver stops further iterations. </member> <member name="override_tip_basis" type="bool" setter="set_override_tip_basis" getter="is_override_tip_basis" default="true"> + If [code]true[/code] overwrites the rotation of the tip bone with the rotation of the [member target] (or [member target_node] if defined). </member> <member name="root_bone" type="StringName" setter="set_root_bone" getter="get_root_bone" default="&"""> + The name of the current root bone, the first bone in the IK chain. </member> <member name="target" type="Transform3D" setter="set_target_transform" getter="get_target_transform" default="Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)"> + First target of the IK chain where the tip bone is placed and, if [member override_tip_basis] is [code]true[/code], how the tip bone is rotated. If a [member target_node] path is available the nodes transform is used instead and this property is ignored. </member> <member name="target_node" type="NodePath" setter="set_target_node" getter="get_target_node" default="NodePath("")"> + Target node [NodePath] for the IK chain. If available, the node's current [Transform3D] is used instead of the [member target] property. </member> <member name="tip_bone" type="StringName" setter="set_tip_bone" getter="get_tip_bone" default="&"""> + The name of the current tip bone, the last bone in the IK chain placed at the [member target] transform (or [member target_node] if defined). </member> <member name="use_magnet" type="bool" setter="set_use_magnet" getter="is_using_magnet" default="false"> + If [code]true[/code], instructs the IK solver to consider the secondary magnet target (pole target) when calculating the bone chain. Use the magnet position (pole target) to control the bending of the IK chain. </member> </members> </class> diff --git a/doc/classes/SkeletonModification2D.xml b/doc/classes/SkeletonModification2D.xml index 46d32aef41..77aaf0213b 100644 --- a/doc/classes/SkeletonModification2D.xml +++ b/doc/classes/SkeletonModification2D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2D" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2D" inherits="Resource" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A resource that operates on [Bone2D] nodes in a [Skeleton2D]. </brief_description> diff --git a/doc/classes/SkeletonModification2DCCDIK.xml b/doc/classes/SkeletonModification2DCCDIK.xml index c8fee3f94d..0d80b1b914 100644 --- a/doc/classes/SkeletonModification2DCCDIK.xml +++ b/doc/classes/SkeletonModification2DCCDIK.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DCCDIK" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DCCDIK" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that uses CCDIK to manipulate a series of bones to reach a target in 2D. </brief_description> diff --git a/doc/classes/SkeletonModification2DFABRIK.xml b/doc/classes/SkeletonModification2DFABRIK.xml index ff3a65fe1a..8d1cd4b4d4 100644 --- a/doc/classes/SkeletonModification2DFABRIK.xml +++ b/doc/classes/SkeletonModification2DFABRIK.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DFABRIK" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DFABRIK" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that uses FABRIK to manipulate a series of [Bone2D] nodes to reach a target. </brief_description> diff --git a/doc/classes/SkeletonModification2DJiggle.xml b/doc/classes/SkeletonModification2DJiggle.xml index 7329b2d865..3321fffe1b 100644 --- a/doc/classes/SkeletonModification2DJiggle.xml +++ b/doc/classes/SkeletonModification2DJiggle.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DJiggle" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DJiggle" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that jiggles [Bone2D] nodes as they move towards a target. </brief_description> diff --git a/doc/classes/SkeletonModification2DLookAt.xml b/doc/classes/SkeletonModification2DLookAt.xml index 4747b06056..136fed37de 100644 --- a/doc/classes/SkeletonModification2DLookAt.xml +++ b/doc/classes/SkeletonModification2DLookAt.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DLookAt" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DLookAt" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that rotates a [Bone2D] node to look at a target. </brief_description> diff --git a/doc/classes/SkeletonModification2DPhysicalBones.xml b/doc/classes/SkeletonModification2DPhysicalBones.xml index d5f46b2ea0..209602e974 100644 --- a/doc/classes/SkeletonModification2DPhysicalBones.xml +++ b/doc/classes/SkeletonModification2DPhysicalBones.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DPhysicalBones" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DPhysicalBones" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that applies the transforms of [PhysicalBone2D] nodes to [Bone2D] nodes. </brief_description> <description> This modification takes the transforms of [PhysicalBone2D] nodes and applies them to [Bone2D] nodes. This allows the [Bone2D] nodes to react to physics thanks to the linked [PhysicalBone2D] nodes. + Experimental. Physical bones may be changed in the future to perform the position update of [Bone2D] on their own. </description> <tutorials> </tutorials> diff --git a/doc/classes/SkeletonModification2DStackHolder.xml b/doc/classes/SkeletonModification2DStackHolder.xml index 791dea2fb1..85df111c0d 100644 --- a/doc/classes/SkeletonModification2DStackHolder.xml +++ b/doc/classes/SkeletonModification2DStackHolder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DStackHolder" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DStackHolder" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that holds and executes a [SkeletonModificationStack2D]. </brief_description> diff --git a/doc/classes/SkeletonModification2DTwoBoneIK.xml b/doc/classes/SkeletonModification2DTwoBoneIK.xml index edd5431a0c..c476d71d44 100644 --- a/doc/classes/SkeletonModification2DTwoBoneIK.xml +++ b/doc/classes/SkeletonModification2DTwoBoneIK.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification2DTwoBoneIK" inherits="SkeletonModification2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification2DTwoBoneIK" inherits="SkeletonModification2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that rotates two bones using the law of cosigns to reach the target. </brief_description> diff --git a/doc/classes/SkeletonModification3D.xml b/doc/classes/SkeletonModification3D.xml index 8457179651..25431ea96f 100644 --- a/doc/classes/SkeletonModification3D.xml +++ b/doc/classes/SkeletonModification3D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3D" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3D" inherits="Resource" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A resource that operates on bones in a [Skeleton3D]. </brief_description> diff --git a/doc/classes/SkeletonModification3DCCDIK.xml b/doc/classes/SkeletonModification3DCCDIK.xml index dec0fbe99f..90b2e78449 100644 --- a/doc/classes/SkeletonModification3DCCDIK.xml +++ b/doc/classes/SkeletonModification3DCCDIK.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3DCCDIK" inherits="SkeletonModification3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3DCCDIK" inherits="SkeletonModification3D" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that uses CCDIK to manipulate a series of bones to reach a target. </brief_description> diff --git a/doc/classes/SkeletonModification3DFABRIK.xml b/doc/classes/SkeletonModification3DFABRIK.xml index 325cc2a12e..a2bec2b559 100644 --- a/doc/classes/SkeletonModification3DFABRIK.xml +++ b/doc/classes/SkeletonModification3DFABRIK.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3DFABRIK" inherits="SkeletonModification3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3DFABRIK" inherits="SkeletonModification3D" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that uses FABRIK to manipulate a series of bones to reach a target. </brief_description> diff --git a/doc/classes/SkeletonModification3DJiggle.xml b/doc/classes/SkeletonModification3DJiggle.xml index ef469d42ea..304f08bb20 100644 --- a/doc/classes/SkeletonModification3DJiggle.xml +++ b/doc/classes/SkeletonModification3DJiggle.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3DJiggle" inherits="SkeletonModification3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3DJiggle" inherits="SkeletonModification3D" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that jiggles bones as they move towards a target. </brief_description> diff --git a/doc/classes/SkeletonModification3DLookAt.xml b/doc/classes/SkeletonModification3DLookAt.xml index 3602cfad95..aeed953ca9 100644 --- a/doc/classes/SkeletonModification3DLookAt.xml +++ b/doc/classes/SkeletonModification3DLookAt.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3DLookAt" inherits="SkeletonModification3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3DLookAt" inherits="SkeletonModification3D" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that rotates a bone to look at a target. </brief_description> diff --git a/doc/classes/SkeletonModification3DStackHolder.xml b/doc/classes/SkeletonModification3DStackHolder.xml index 24240236a4..9448e2c783 100644 --- a/doc/classes/SkeletonModification3DStackHolder.xml +++ b/doc/classes/SkeletonModification3DStackHolder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3DStackHolder" inherits="SkeletonModification3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3DStackHolder" inherits="SkeletonModification3D" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that holds and executes a [SkeletonModificationStack3D]. </brief_description> diff --git a/doc/classes/SkeletonModification3DTwoBoneIK.xml b/doc/classes/SkeletonModification3DTwoBoneIK.xml index 6618ebbcfb..0e7ffd5c80 100644 --- a/doc/classes/SkeletonModification3DTwoBoneIK.xml +++ b/doc/classes/SkeletonModification3DTwoBoneIK.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModification3DTwoBoneIK" inherits="SkeletonModification3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModification3DTwoBoneIK" inherits="SkeletonModification3D" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A modification that moves two bones to reach the target. </brief_description> diff --git a/doc/classes/SkeletonModificationStack2D.xml b/doc/classes/SkeletonModificationStack2D.xml index 950e52e622..d96833e335 100644 --- a/doc/classes/SkeletonModificationStack2D.xml +++ b/doc/classes/SkeletonModificationStack2D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModificationStack2D" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModificationStack2D" inherits="Resource" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A resource that holds a stack of [SkeletonModification2D]s. </brief_description> diff --git a/doc/classes/SkeletonModificationStack3D.xml b/doc/classes/SkeletonModificationStack3D.xml index 34c7099bca..9eaeeefd8e 100644 --- a/doc/classes/SkeletonModificationStack3D.xml +++ b/doc/classes/SkeletonModificationStack3D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="SkeletonModificationStack3D" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="SkeletonModificationStack3D" inherits="Resource" is_deprecated="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A resource that holds a stack of [SkeletonModification3D]s. </brief_description> diff --git a/doc/classes/StreamPeerBuffer.xml b/doc/classes/StreamPeerBuffer.xml index 4bef9f44b7..f33c38e595 100644 --- a/doc/classes/StreamPeerBuffer.xml +++ b/doc/classes/StreamPeerBuffer.xml @@ -4,7 +4,7 @@ Data buffer stream peer. </brief_description> <description> - Data buffer stream peer that uses a byte array as the stream. This object can be used to handle binary data from network sessions. To handle binary data stored in files, [File] can be used directly. + Data buffer stream peer that uses a byte array as the stream. This object can be used to handle binary data from network sessions. To handle binary data stored in files, [FileAccess] can be used directly. A [StreamPeerBuffer] object keeps an internal cursor which is the offset in bytes to the start of the buffer. Get and put operations are performed at the cursor position and will move the cursor accordingly. </description> <tutorials> diff --git a/doc/classes/StreamPeerGZIP.xml b/doc/classes/StreamPeerGZIP.xml new file mode 100644 index 0000000000..71dd36160d --- /dev/null +++ b/doc/classes/StreamPeerGZIP.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="StreamPeerGZIP" inherits="StreamPeer" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> + <brief_description> + Stream peer handling GZIP and deflate compression/decompresison. + </brief_description> + <description> + This class allows to compress or decompress data using GZIP/deflate in a streaming fashion. This is particularly useful when compressing or decompressing files that has to be sent through the network without having to allocate them all in memory. + After starting the stream via [method start_compression] (or [method start_decompression]), calling [method StreamPeer.put_partial_data] on this stream will compress (or decompress) the data, writing it to the internal buffer. Calling [method StreamPeer.get_available_bytes] will return the pending bytes in the internal buffer, and [method StreamPeer.get_partial_data] will retrieve the compressed (or decompressed) bytes from it. When the stream is over, you must call [method finish] to ensure the internal buffer is properly flushed (make sure to call [method StreamPeer.get_available_bytes] on last time to check if more data needs to be read after that). + </description> + <tutorials> + </tutorials> + <methods> + <method name="clear"> + <return type="void" /> + <description> + Clears this stream, resetting the internal state. + </description> + </method> + <method name="finish"> + <return type="int" enum="Error" /> + <description> + Finalizes the stream, compressing or decompressing any buffered chunk left. + </description> + </method> + <method name="start_compression"> + <return type="int" enum="Error" /> + <param index="0" name="use_deflate" type="bool" default="false" /> + <param index="1" name="buffer_size" type="int" default="65535" /> + <description> + Start the stream in compression mode with the given [param buffer_size], if [param use_deflate] is [code]true[/code] uses deflate instead of GZIP. + </description> + </method> + <method name="start_decompression"> + <return type="int" enum="Error" /> + <param index="0" name="use_deflate" type="bool" default="false" /> + <param index="1" name="buffer_size" type="int" default="65535" /> + <description> + Start the stream in decompression mode with the given [param buffer_size], if [param use_deflate] is [code]true[/code] uses deflate instead of GZIP. + </description> + </method> + </methods> +</class> diff --git a/doc/classes/StreamPeerTLS.xml b/doc/classes/StreamPeerTLS.xml index f26c635aaa..d1ddb3d441 100644 --- a/doc/classes/StreamPeerTLS.xml +++ b/doc/classes/StreamPeerTLS.xml @@ -1,14 +1,14 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="StreamPeerTLS" inherits="StreamPeer" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - SSL stream peer. + TLS stream peer. </brief_description> <description> - SSL stream peer. This object can be used to connect to an SSL server or accept a single SSL client connection. + TLS stream peer. This object can be used to connect to an TLS server or accept a single TLS client connection. [b]Note:[/b] When exporting to Android, make sure to enable the [code]INTERNET[/code] permission in the Android export preset before exporting the project or using one-click deploy. Otherwise, network communication of any kind will be blocked by Android. </description> <tutorials> - <link title="SSL certificates">$DOCS_URL/tutorials/networking/ssl_certificates.html</link> + <link title="TLS certificates">$DOCS_URL/tutorials/networking/ssl_certificates.html</link> </tutorials> <methods> <method name="accept_stream"> @@ -75,7 +75,7 @@ A status representing a [StreamPeerTLS] in error state. </constant> <constant name="STATUS_ERROR_HOSTNAME_MISMATCH" value="4" enum="Status"> - An error status that shows a mismatch in the SSL certificate domain presented by the host and the domain requested for validation. + An error status that shows a mismatch in the TLS certificate domain presented by the host and the domain requested for validation. </constant> </constants> </class> diff --git a/doc/classes/TextServer.xml b/doc/classes/TextServer.xml index 0db16b491d..2e67c61e54 100644 --- a/doc/classes/TextServer.xml +++ b/doc/classes/TextServer.xml @@ -1720,6 +1720,7 @@ </constant> <constant name="HINTING_NORMAL" value="2" enum="Hinting"> Use the default font hinting mode (crisper but less smooth). + [b]Note:[/b] This hinting mode changes both horizontal and vertical glyph metrics. If applied to monospace font, some glyphs might have different width. </constant> <constant name="SUBPIXEL_POSITIONING_DISABLED" value="0" enum="SubpixelPositioning"> Glyph horizontal position is rounded to the whole pixel size, each glyph is rasterized once. diff --git a/doc/classes/Texture2DArray.xml b/doc/classes/Texture2DArray.xml index 6f059b5fbf..113f37f974 100644 --- a/doc/classes/Texture2DArray.xml +++ b/doc/classes/Texture2DArray.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="Texture2DArray" inherits="ImageTextureLayered" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + A single texture resource which consists of multiple, separate images. Each image has the same dimensions and number of mipmap levels. </brief_description> <description> + A Texture2DArray is different from a Texture3D: The Texture2DArray does not support trilinear interpolation between the [Image]s, i.e. no blending. + A Texture2DArray is also different from an [AtlasTexture]: In a Texture2DArray, all images are treated separately. In an atlas, the regions (i.e. the single images) can be of different sizes. Furthermore, you usually need to add a padding around the regions, to prevent accidental UV mapping to more than one region. The same goes for mipmapping: Mipmap chains are handled separately for each layer. In an atlas, the slicing has to be done manually in the fragment shader. </description> <tutorials> </tutorials> diff --git a/doc/classes/TextureLayered.xml b/doc/classes/TextureLayered.xml index 7b528e2082..5e6afcbc5c 100644 --- a/doc/classes/TextureLayered.xml +++ b/doc/classes/TextureLayered.xml @@ -1,10 +1,15 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="TextureLayered" inherits="Texture" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - Base class for 3D texture types. + Base class for texture types which contain the data of multiple [Image]s. Each image is of the same size and format. </brief_description> <description> - 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. + 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. + All images need to have the same width, height and number of mipmap levels. + A [TextureLayered] can be loaded with [code]method ResourceFormatLoader.load[/code]. + To create such a texture file yourself, re-import your image files using the Godot Editor import presets. + Internally, Godot maps these files to their respective counterparts in the target rendering driver (GLES3, Vulkan). </description> <tutorials> </tutorials> @@ -72,6 +77,7 @@ <method name="get_layers" qualifiers="const"> <return type="int" /> <description> + Returns the number of referenced [Image]s. </description> </method> <method name="get_width" qualifiers="const"> @@ -83,6 +89,7 @@ <method name="has_mipmaps" qualifiers="const"> <return type="bool" /> <description> + Returns [code]true[/code] if the layers have generated mipmaps. </description> </method> </methods> diff --git a/doc/classes/Time.xml b/doc/classes/Time.xml index cdbe30c444..1abe017a4d 100644 --- a/doc/classes/Time.xml +++ b/doc/classes/Time.xml @@ -17,7 +17,7 @@ <return type="Dictionary" /> <param index="0" name="utc" type="bool" default="false" /> <description> - Returns the current date as a dictionary of keys: [code]year[/code], [code]month[/code], [code]day[/code], [code]weekday[/code], and [code]dst[/code] (Daylight Savings Time). + Returns the current date as a dictionary of keys: [code]year[/code], [code]month[/code], [code]day[/code], and [code]weekday[/code]. The returned values are in the system's local time when [param utc] is [code]false[/code], otherwise they are in UTC. </description> </method> @@ -57,7 +57,7 @@ <return type="Dictionary" /> <param index="0" name="utc" type="bool" default="false" /> <description> - Returns the current date as a dictionary of keys: [code]year[/code], [code]month[/code], [code]day[/code], [code]weekday[/code], [code]hour[/code], [code]minute[/code], and [code]second[/code]. + Returns the current date as a dictionary of keys: [code]year[/code], [code]month[/code], [code]day[/code], [code]weekday[/code], [code]hour[/code], [code]minute[/code], [code]second[/code], and [code]dst[/code] (Daylight Savings Time). </description> </method> <method name="get_datetime_dict_from_unix_time" qualifiers="const"> diff --git a/doc/classes/Tween.xml b/doc/classes/Tween.xml index c7fc78c1d3..acf900ae55 100644 --- a/doc/classes/Tween.xml +++ b/doc/classes/Tween.xml @@ -8,37 +8,89 @@ [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]; it would be difficult to do the same thing with an [AnimationPlayer] node. Tweens are also more light-weight than [AnimationPlayer], so they are very much suited for simple animations or general tasks that don't require visual tweaking provided by the editor. They can be used in a fire-and-forget manner for some logic that normally would be done by code. You can e.g. make something shoot periodically by using a looped [CallbackTweener] with a delay. A [Tween] can be created by using either [method SceneTree.create_tween] or [method Node.create_tween]. [Tween]s created manually (i.e. by using [code]Tween.new()[/code]) are invalid and can't be used for tweening values. A tween animation is created by adding [Tweener]s to the [Tween] object, using [method tween_property], [method tween_interval], [method tween_callback] or [method tween_method]: - [codeblock] + [codeblocks] + [gdscript] var tween = get_tree().create_tween() tween.tween_property($Sprite, "modulate", Color.red, 1) tween.tween_property($Sprite, "scale", Vector2(), 1) tween.tween_callback($Sprite.queue_free) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = GetTree().CreateTween(); + tween.TweenProperty(GetNode("Sprite"), "modulate", Colors.Red, 1.0f); + tween.TweenProperty(GetNode("Sprite"), "scale", Vector2.Zero, 1.0f); + tween.TweenCallback(new Callable(GetNode("Sprite").QueueFree)); + [/csharp] + [/codeblocks] This sequence will make the [code]$Sprite[/code] node turn red, then shrink, before finally calling [method Node.queue_free] to free the sprite. [Tweener]s are executed one after another by default. This behavior can be changed using [method parallel] and [method set_parallel]. When a [Tweener] is created with one of the [code]tween_*[/code] methods, a chained method call can be used to tweak the properties of this [Tweener]. For example, if you want to set a different transition type in the above example, you can use [method set_trans]: - [codeblock] + [codeblocks] + [gdscript] var tween = get_tree().create_tween() tween.tween_property($Sprite, "modulate", Color.red, 1).set_trans(Tween.TRANS_SINE) tween.tween_property($Sprite, "scale", Vector2(), 1).set_trans(Tween.TRANS_BOUNCE) tween.tween_callback($Sprite.queue_free) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = GetTree().CreateTween(); + tween.TweenProperty(GetNode("Sprite"), "modulate", Colors.Red, 1.0f).SetTrans(Tween.TransitionType.Sine); + tween.TweenProperty(GetNode("Sprite"), "scale", Vector2.Zero, 1.0f).SetTrans(Tween.TransitionType.Bounce); + tween.TweenCallback(new Callable(GetNode("Sprite").QueueFree)); + [/csharp] + [/codeblocks] Most of the [Tween] methods can be chained this way too. In the following example the [Tween] is bound to the running script's node and a default transition is set for its [Tweener]s: - [codeblock] + [codeblocks] + [gdscript] var tween = get_tree().create_tween().bind_node(self).set_trans(Tween.TRANS_ELASTIC) tween.tween_property($Sprite, "modulate", Color.red, 1) tween.tween_property($Sprite, "scale", Vector2(), 1) tween.tween_callback($Sprite.queue_free) - [/codeblock] + [/gdscript] + [csharp] + var tween = GetTree().CreateTween().BindNode(this).SetTrans(Tween.TransitionType.Elastic); + tween.TweenProperty(GetNode("Sprite"), "modulate", Colors.Red, 1.0f); + tween.TweenProperty(GetNode("Sprite"), "scale", Vector2.Zero, 1.0f); + tween.TweenCallback(new Callable(GetNode("Sprite").QueueFree)); + [/csharp] + [/codeblocks] Another interesting use for [Tween]s is animating arbitrary sets of objects: - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween() for sprite in get_children(): tween.tween_property(sprite, "position", Vector2(0, 0), 1) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween(); + foreach (Node sprite in GetChildren()) + tween.TweenProperty(sprite, "position", Vector2.Zero, 1.0f); + [/csharp] + [/codeblocks] In the example above, all children of a node are moved one after another to position (0, 0). + You should avoid using more than one [Tween] per object's property. If two or more tweens animate one property at the same time, the last one created will take priority and assign the final value. If you want to interrupt and restart an animation, consider assigning the [Tween] to a variable: + [codeblocks] + [gdscript] + var tween + func animate(): + if tween: + tween.kill() # Abort the previous animation. + tween = create_tween() + [/gdscript] + [csharp] + private Tween tween; + + public void Animate() + { + if (tween != null) + tween.Kill(); // Abort the previous animation + tween = CreateTween(); + } + [/csharp] + [/codeblocks] Some [Tweener]s use transitions and eases. The first accepts a [enum TransitionType] constant, and refers to the way the timing of the animation is handled (see [url=https://easings.net/]easings.net[/url] for some examples). The second accepts an [enum EaseType] constant, and controls where the [code]trans_type[/code] is applied to the interpolation (in the beginning, the end, or both). If you don't know which transition and easing to pick, you can try different [enum TransitionType] constants with [constant EASE_IN_OUT], and use the one that looks best. [url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url] [b]Note:[/b] All [Tween]s will automatically start by default. To prevent a [Tween] from autostarting, you can call [method stop] immediately after it is created. + [b]Note:[/b] [Tween]s are processing after all of nodes in the current frame, i.e. after [method Node._process] or [method Node._physics_process] (depending on [enum TweenProcessMode]). </description> <tutorials> </tutorials> @@ -55,12 +107,20 @@ <return type="Tween" /> <description> Used to chain two [Tweener]s after [method set_parallel] is called with [code]true[/code]. - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween().set_parallel(true) tween.tween_property(...) tween.tween_property(...) # Will run parallelly with above. tween.chain().tween_property(...) # Will run after two above are finished. - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween().SetParallel(true); + tween.TweenProperty(...); + tween.TweenProperty(...); // Will run parallelly with above. + tween.Chain().TweenProperty(...); // Will run after two above are finished. + [/csharp] + [/codeblocks] </description> </method> <method name="custom_step"> @@ -118,12 +178,20 @@ <return type="Tween" /> <description> Makes the next [Tweener] run parallelly to the previous one. Example: - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween() tween.tween_property(...) tween.parallel().tween_property(...) tween.parallel().tween_property(...) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween(); + tween.TweenProperty(...); + tween.Parallel().TweenProperty(...); + tween.Parallel().TweenProperty(...); + [/csharp] + [/codeblocks] All [Tweener]s in the example will run at the same time. You can make the [Tween] parallel by default by using [method set_parallel]. </description> @@ -205,16 +273,30 @@ <description> Creates and appends a [CallbackTweener]. This method can be used to call an arbitrary method in any object. Use [method Callable.bind] to bind additional arguments for the call. Example: object that keeps shooting every 1 second. - [codeblock] + [codeblocks] + [gdscript] var tween = get_tree().create_tween().set_loops() tween.tween_callback(shoot).set_delay(1) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = GetTree().CreateTween().SetLoops(); + tween.TweenCallback(new Callable(Shoot)).SetDelay(1.0f); + [/csharp] + [/codeblocks] Example: turning a sprite red and then blue, with 2 second delay. - [codeblock] + [codeblocks] + [gdscript] var tween = get_tree().create_tween() tween.tween_callback($Sprite.set_modulate.bind(Color.red)).set_delay(2) tween.tween_callback($Sprite.set_modulate.bind(Color.blue)).set_delay(2) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = GetTree().CreateTween(); + Sprite2D sprite = GetNode<Sprite2D>("Sprite"); + tween.TweenCallback(new Callable(() => sprite.Modulate = Colors.Red)).SetDelay(2.0f); + tween.TweenCallback(new Callable(() => sprite.Modulate = Colors.Blue)).SetDelay(2.0f); + [/csharp] + [/codeblocks] </description> </method> <method name="tween_interval"> @@ -223,13 +305,21 @@ <description> Creates and appends an [IntervalTweener]. This method can be used to create delays in the tween animation, as an alternative to using the delay in other [Tweener]s, or when there's no animation (in which case the [Tween] acts as a timer). [param time] is the length of the interval, in seconds. Example: creating an interval in code execution. - [codeblock] + [codeblocks] + [gdscript] # ... some code await create_tween().tween_interval(2).finished # ... more code - [/codeblock] + [/gdscript] + [csharp] + // ... some code + await ToSignal(CreateTween().TweenInterval(2.0f), Tween.SignalName.Finished); + // ... more code + [/csharp] + [/codeblocks] Example: creating an object that moves back and forth and jumps every few seconds. - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween().set_loops() tween.tween_property($Sprite, "position:x", 200.0, 1).as_relative() tween.tween_callback(jump) @@ -237,7 +327,17 @@ tween.tween_property($Sprite, "position:x", -200.0, 1).as_relative() tween.tween_callback(jump) tween.tween_interval(2) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween().SetLoops(); + tween.TweenProperty(GetNode("Sprite"), "position:x", 200.0f, 1.0f).AsRelative(); + tween.TweenCallback(new Callable(Jump)); + tween.TweenInterval(2.0f); + tween.TweenProperty(GetNode("Sprite"), "position:x", -200.0f, 1.0f).AsRelative(); + tween.TweenCallback(new Callable(Jump)); + tween.TweenInterval(2.0f); + [/csharp] + [/codeblocks] </description> </method> <method name="tween_method"> @@ -249,19 +349,41 @@ <description> Creates and appends a [MethodTweener]. This method is similar to a combination of [method tween_callback] and [method tween_property]. It calls a method over time with a tweened value provided as an argument. The value is tweened between [param from] and [param to] over the time specified by [param duration], in seconds. Use [method Callable.bind] to bind additional arguments for the call. You can use [method MethodTweener.set_ease] and [method MethodTweener.set_trans] to tweak the easing and transition of the value or [method MethodTweener.set_delay] to delay the tweening. Example: making a 3D object look from one point to another point. - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween() tween.tween_method(look_at.bind(Vector3.UP), Vector3(-1, 0, -1), Vector3(1, 0, -1), 1) # The look_at() method takes up vector as second argument. - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween(); + tween.TweenMethod(new Callable(() => LookAt(Vector3.Up)), new Vector3(-1.0f, 0.0f, -1.0f), new Vector3(1.0f, 0.0f, -1.0f), 1.0f); // The LookAt() method takes up vector as second argument. + [/csharp] + [/codeblocks] Example: setting a text of a [Label], using an intermediate method and after a delay. - [codeblock] + [codeblocks] + [gdscript] func _ready(): var tween = create_tween() tween.tween_method(set_label_text, 0, 10, 1).set_delay(1) func set_label_text(value: int): $Label.text = "Counting " + str(value) - [/codeblock] + [/gdscript] + [csharp] + public override void _Ready() + { + base._Ready(); + + Tween tween = CreateTween(); + tween.TweenMethod(new Callable(SetLabelText), 0.0f, 10.0f, 1.0f).SetDelay(1.0f); + } + + private void SetLabelText(int value) + { + GetNode<Label>("Label").Text = $"Counting {value}"; + } + [/csharp] + [/codeblocks] </description> </method> <method name="tween_property"> @@ -272,19 +394,33 @@ <param index="3" name="duration" type="float" /> <description> Creates and appends a [PropertyTweener]. This method tweens a [param property] of an [param object] between an initial value and [param final_val] in a span of time equal to [param duration], in seconds. The initial value by default is the property's value at the time the tweening of the [PropertyTweener] starts. For example: - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween() tween.tween_property($Sprite, "position", Vector2(100, 200), 1) tween.tween_property($Sprite, "position", Vector2(200, 300), 1) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween(); + tween.TweenProperty(GetNode("Sprite"), "position", new Vector2(100.0f, 200.0f), 1.0f); + tween.TweenProperty(GetNode("Sprite"), "position", new Vector2(200.0f, 300.0f), 1.0f); + [/csharp] + [/codeblocks] will move the sprite to position (100, 200) and then to (200, 300). If you use [method PropertyTweener.from] or [method PropertyTweener.from_current], the starting position will be overwritten by the given value instead. See other methods in [PropertyTweener] to see how the tweening can be tweaked further. [b]Note:[/b] 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. Example: moving object twice from the same position, with different transition types. - [codeblock] + [codeblocks] + [gdscript] var tween = create_tween() tween.tween_property($Sprite, "position", Vector2.RIGHT * 300, 1).as_relative().set_trans(Tween.TRANS_SINE) tween.tween_property($Sprite, "position", Vector2.RIGHT * 300, 1).as_relative().from_current().set_trans(Tween.TRANS_EXPO) - [/codeblock] + [/gdscript] + [csharp] + Tween tween = CreateTween(); + tween.TweenProperty(GetNode("Sprite"), "position", Vector2.Right * 300.0f, 1.0f).AsRelative().SetTrans(Tween.TransitionType.Sine); + tween.TweenProperty(GetNode("Sprite"), "position", Vector2.Right * 300.0f, 1.0f).AsRelative().FromCurrent().SetTrans(Tween.TransitionType.Expo); + [/csharp] + [/codeblocks] </description> </method> </methods> diff --git a/doc/classes/UndoRedo.xml b/doc/classes/UndoRedo.xml index 3ef59b1c39..7258efbdda 100644 --- a/doc/classes/UndoRedo.xml +++ b/doc/classes/UndoRedo.xml @@ -62,12 +62,11 @@ <tutorials> </tutorials> <methods> - <method name="add_do_method" qualifiers="vararg"> + <method name="add_do_method"> <return type="void" /> - <param index="0" name="object" type="Object" /> - <param index="1" name="method" type="StringName" /> + <param index="0" name="callable" type="Callable" /> <description> - Register a [param method] that will be called when the action is committed. + Register a [Callable] that will be called when the action is committed. </description> </method> <method name="add_do_property"> @@ -86,12 +85,11 @@ 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. </description> </method> - <method name="add_undo_method" qualifiers="vararg"> + <method name="add_undo_method"> <return type="void" /> - <param index="0" name="object" type="Object" /> - <param index="1" name="method" type="StringName" /> + <param index="0" name="callable" type="Callable" /> <description> - Register a [param method] that will be called when the action is undone. + Register a [Callable] that will be called when the action is undone. </description> </method> <method name="add_undo_property"> diff --git a/doc/classes/X509Certificate.xml b/doc/classes/X509Certificate.xml index 94784583ad..37b202a513 100644 --- a/doc/classes/X509Certificate.xml +++ b/doc/classes/X509Certificate.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="X509Certificate" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - An X509 certificate (e.g. for SSL). + An X509 certificate (e.g. for TLS). </brief_description> <description> The X509Certificate class represents an X509 certificate. Certificates can be loaded and saved like any other [Resource]. - They can be used as the server certificate in [method StreamPeerTLS.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 StreamPeerTLS.connect_to_stream]. + They can be used as the server certificate in [method StreamPeerTLS.accept_stream] (along with the proper [CryptoKey]), and to specify the only certificate that should be accepted when connecting to an TLS server via [method StreamPeerTLS.connect_to_stream]. </description> <tutorials> </tutorials> diff --git a/doc/tools/make_rst.py b/doc/tools/make_rst.py index cd7de085d8..a8569413ec 100755 --- a/doc/tools/make_rst.py +++ b/doc/tools/make_rst.py @@ -1480,6 +1480,8 @@ def format_text_block( ) tag_text = f"``{link_target}``" + escape_pre = True + escape_post = True # Formatting directives. diff --git a/doc/translations/ar.po b/doc/translations/ar.po index 43e62ecab2..bc3fa60d84 100644 --- a/doc/translations/ar.po +++ b/doc/translations/ar.po @@ -693,8 +693,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -704,7 +705,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -758,7 +760,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -770,7 +773,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1191,10 +1195,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -5013,19 +5022,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5046,21 +5057,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5070,9 +5085,10 @@ msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة ظل الزاوية للمَعلم." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5724,9 +5740,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5900,8 +5916,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8903,8 +8919,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8955,10 +8972,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9201,12 +9228,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9752,7 +9773,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9913,12 +9939,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10066,6 +10096,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10206,7 +10251,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11886,7 +11934,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11979,7 +12027,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12007,9 +12057,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12509,13 +12559,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12541,8 +12592,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12855,12 +12908,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12905,8 +12958,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12954,8 +13009,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13017,7 +13075,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13142,7 +13200,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16138,7 +16199,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18869,7 +18932,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19018,16 +19083,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19173,18 +19239,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة الجيب العكسية للمَعلم." @@ -24099,8 +24153,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24721,7 +24779,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26309,10 +26369,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27721,8 +27784,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -30024,11 +30087,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30874,7 +30940,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30886,6 +30956,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33246,14 +33326,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33261,22 +33341,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/Line2D.xml msgid "" @@ -34853,9 +34937,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35316,7 +35400,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36453,7 +36539,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37279,13 +37365,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40955,7 +41053,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46342,7 +46442,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/PopupMenu.xml @@ -46581,7 +46683,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47311,7 +47415,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49992,8 +50100,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54012,7 +54131,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54156,13 +54277,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55352,7 +55479,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55971,6 +56101,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56305,7 +56443,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57738,7 +57878,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59005,6 +59145,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -59066,6 +59209,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -59088,7 +59234,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60225,6 +60374,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60255,6 +60409,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60296,7 +60455,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65177,21 +65338,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65204,7 +65369,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65233,7 +65398,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65243,22 +65440,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65271,8 +65481,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65470,16 +65682,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74136,7 +74348,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/ca.po b/doc/translations/ca.po index 2fce9a4d08..7c687eaf1a 100644 --- a/doc/translations/ca.po +++ b/doc/translations/ca.po @@ -653,8 +653,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -664,7 +665,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -718,7 +720,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -730,7 +733,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1145,10 +1149,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4959,19 +4968,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4992,21 +5003,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5015,9 +5030,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5669,9 +5685,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5845,8 +5861,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8848,8 +8864,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8900,10 +8917,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9145,12 +9172,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9696,7 +9717,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9857,12 +9883,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10010,6 +10040,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10150,7 +10195,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11828,7 +11876,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11921,7 +11969,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11949,9 +11999,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12448,13 +12498,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12480,8 +12531,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12794,12 +12847,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12844,8 +12897,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12893,8 +12948,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12956,7 +13014,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13081,7 +13139,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16077,7 +16138,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18802,7 +18865,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18951,16 +19016,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19105,18 +19171,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -24023,8 +24077,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24644,7 +24702,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26228,10 +26288,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27638,8 +27701,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29939,11 +30002,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30788,7 +30854,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30800,6 +30870,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33157,14 +33237,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33172,21 +33252,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34763,9 +34843,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35224,7 +35304,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36336,7 +36418,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37151,13 +37233,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40821,7 +40915,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46185,7 +46281,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46424,7 +46522,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47153,7 +47253,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49834,8 +49938,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53852,7 +53967,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53996,13 +54113,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55192,7 +55315,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55811,6 +55937,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56145,7 +56279,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57578,7 +57714,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58843,6 +58979,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58904,6 +59043,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58926,7 +59068,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60063,6 +60208,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60092,6 +60241,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60133,7 +60286,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64998,21 +65153,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65025,7 +65184,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65054,7 +65213,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65064,22 +65255,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65092,8 +65296,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65291,16 +65497,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73930,7 +74136,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/classes.pot b/doc/translations/classes.pot index b8187d24d5..f8e32bbc21 100644 --- a/doc/translations/classes.pot +++ b/doc/translations/classes.pot @@ -533,8 +533,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -544,7 +545,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -598,7 +600,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -610,7 +613,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1025,10 +1029,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4839,19 +4848,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4872,21 +4883,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4895,9 +4910,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5549,9 +5565,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5725,8 +5741,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8728,8 +8744,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8780,10 +8797,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9025,12 +9052,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9576,7 +9597,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9737,12 +9763,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9890,6 +9920,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10030,7 +10075,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11708,7 +11756,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11801,7 +11849,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11829,9 +11879,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12328,13 +12378,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12360,8 +12411,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12674,12 +12727,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12724,8 +12777,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12773,8 +12828,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12836,7 +12894,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12961,7 +13019,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15957,7 +16018,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18682,7 +18745,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18831,16 +18896,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18985,18 +19051,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23900,8 +23954,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24521,7 +24579,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26105,10 +26165,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27515,8 +27578,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29816,11 +29879,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30665,7 +30731,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30677,6 +30747,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33034,14 +33114,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33049,21 +33129,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34640,9 +34720,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35101,7 +35181,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36213,7 +36295,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37028,13 +37110,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40698,7 +40792,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46062,7 +46158,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46301,7 +46399,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47030,7 +47130,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49711,8 +49815,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53729,7 +53844,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53873,13 +53990,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55069,7 +55192,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55688,6 +55814,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56022,7 +56156,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57455,7 +57591,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58720,6 +58856,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58781,6 +58920,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58803,7 +58945,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59940,6 +60085,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59969,6 +60118,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60010,7 +60163,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64875,21 +65030,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64902,7 +65061,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64931,7 +65090,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64941,22 +65132,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64969,8 +65173,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65168,16 +65374,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73807,7 +74013,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/cs.po b/doc/translations/cs.po index 878b7e9aae..50eb59aa1c 100644 --- a/doc/translations/cs.po +++ b/doc/translations/cs.po @@ -14,12 +14,13 @@ # DomcaSuzi <dominio122@gmail.com>, 2021. # Tomas Dostal <tomas.dostal.cz@gmail.com>, 2021. # JoeMoos <josephmoose13@gmail.com>, 2022. +# Mirinek <mirek.nozicka77@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-03-17 13:59+0000\n" -"Last-Translator: JoeMoos <josephmoose13@gmail.com>\n" +"PO-Revision-Date: 2022-08-28 00:17+0000\n" +"Last-Translator: Mirinek <mirek.nozicka77@gmail.com>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot-" "class-reference/cs/>\n" "Language: cs\n" @@ -27,7 +28,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -92,15 +93,16 @@ msgstr "VýchozÃ" #: doc/tools/make_rst.py msgid "Setter" -msgstr "" +msgstr "Setter" #: doc/tools/make_rst.py msgid "value" msgstr "hodnota" #: doc/tools/make_rst.py +#, fuzzy msgid "Getter" -msgstr "" +msgstr "Getter" #: doc/tools/make_rst.py msgid "" @@ -789,8 +791,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -800,7 +803,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -875,7 +879,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -887,7 +892,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Lineárnà interpolace mezi dvÄ›ma hodnotami normalizovanou hodnout. Toto je " "opak [method inverse_lerp].\n" @@ -1478,16 +1484,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Mapuje [code]hodnotu[/code] z rozsahu [code][istart, istop][/code] na [code]" -"[ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Vracà 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -5345,19 +5351,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5378,21 +5386,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5402,9 +5414,10 @@ msgstr "Vrátà tangens parametru." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -6056,9 +6069,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -6232,8 +6245,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -9238,8 +9251,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9290,10 +9304,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9539,12 +9563,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10090,7 +10108,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10251,12 +10274,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10407,6 +10434,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10547,7 +10589,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12228,7 +12273,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12321,7 +12366,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12349,9 +12396,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12854,13 +12901,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12886,8 +12934,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13200,12 +13250,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13250,8 +13300,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13299,8 +13351,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13362,7 +13417,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13487,7 +13542,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16489,7 +16547,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19244,7 +19304,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19393,16 +19455,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19548,18 +19611,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Vrátà arkus sinus parametru." @@ -24481,8 +24532,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25103,7 +25158,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26691,10 +26748,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28108,8 +28168,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -30412,11 +30472,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31265,7 +31328,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31277,6 +31344,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33640,14 +33717,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33655,22 +33732,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Vrátà sinus parametru." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Line2D.xml msgid "" @@ -35249,9 +35330,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35712,7 +35793,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36853,7 +36936,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37682,13 +37765,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41362,7 +41457,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46761,7 +46858,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/PopupMenu.xml @@ -47000,7 +47099,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47730,7 +47831,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50411,8 +50516,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54438,7 +54554,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54583,13 +54701,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55779,7 +55903,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56399,6 +56526,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56733,7 +56868,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58167,7 +58304,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59440,6 +59577,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -59501,6 +59641,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -59523,7 +59666,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60661,6 +60807,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60691,6 +60842,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60732,7 +60888,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65646,21 +65804,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65673,7 +65835,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65702,7 +65864,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65712,22 +65906,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65740,8 +65947,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65939,16 +66148,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74620,7 +74829,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/de.po b/doc/translations/de.po index 0cf8d9ae17..868315c7fe 100644 --- a/doc/translations/de.po +++ b/doc/translations/de.po @@ -48,12 +48,16 @@ # Christian Packenius <christian@packenius.com>, 2022. # Hannes Petersen <01zustrom.baklava@icloud.com>, 2022. # Hans Peter <figefi6308@runqx.com>, 2022. +# Tim <sakul8826@gmail.com>, 2022. +# Anonynonymouse <tom.spaine60388@gmail.com>, 2022. +# Felix Bitsch <felix.a.bitsch@gmail.com>, 2022. +# Coxcopi <master.vogel2015@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-23 03:56+0000\n" -"Last-Translator: Hans Peter <figefi6308@runqx.com>\n" +"PO-Revision-Date: 2022-09-04 02:43+0000\n" +"Last-Translator: Coxcopi <master.vogel2015@gmail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/de/>\n" "Language: de\n" @@ -61,7 +65,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -89,7 +93,7 @@ msgstr "Signale" #: doc/tools/make_rst.py msgid "Enumerations" -msgstr "Aufzählungstypen" +msgstr "Aufzählungen" #: doc/tools/make_rst.py msgid "Constants" @@ -563,7 +567,7 @@ msgstr "" "- Für [code]Dictionary[/code]s, prüft [code]==[/code] nur, ob es dasselbe " "Objekt ist .\n" "- Für [code]Array[/code]s, [code]==[/code] werden die Arrays elementweise " -"mit [code]==[/code] verglichen. Der Elemente-Vergleich ist also wieder " +"mit [code]==[/code] verglichen. Der Elemente-Vergleich ist also wieder " "einfach, nicht tief.\n" "Zusammengefasst, immer wenn möglicherweise ein [code]Dictionary[/code] " "involviert ist und du einen echten Inhaltsvergleich brauchst, verwende " @@ -859,6 +863,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -866,8 +871,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -877,7 +883,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Gibt zurück einen Inter- bzw. Extrapolationsfaktor unter Berücksichtigung " "des Zahlenraums von [code]from[/code] bis [code]to[/code], und dem " @@ -968,12 +975,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -985,7 +994,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Interpoliert linear zwischen zwei Werten mit dem in [code]weight[/code] " "definierten Faktor. Um eine Interpolation durchzuführen, sollte " @@ -1721,16 +1731,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Bildet den Wert [code]value[/code] von einem Zahlenbereich [code]istart, " -"istop[/code] auf einen anderen [code]ostart, ostop[/code] ab.\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Ergibt 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -4091,18 +4101,27 @@ msgid "" "MIDI system exclusive message. This has behavior exclusive to the device " "you're receiving input from. Getting this data is not implemented in Godot." msgstr "" +"MIDI-System-exklusive Nachricht. Dieses Verhalten gilt nur für das Gerät, " +"von dem Sie Eingaben empfangen. Das Abrufen dieser Daten ist in Godot nicht " +"implementiert." #: doc/classes/@GlobalScope.xml msgid "" "MIDI quarter frame message. Contains timing information that is used to " "synchronize MIDI devices. Getting this data is not implemented in Godot." msgstr "" +"MIDI-Viertel-Frame-Meldung. Enthält Zeitinformationen, die zur " +"Synchronisierung von MIDI-Geräten verwendet werden. Das Abrufen dieser Daten " +"ist in Godot nicht implementiert." #: doc/classes/@GlobalScope.xml msgid "" "MIDI song position pointer message. Gives the number of 16th notes since the " "start of the song. Getting this data is not implemented in Godot." msgstr "" +"MIDI-Songpositionszeiger-Meldung. Gibt die Anzahl der 16tel-Noten seit " +"Beginn des Liedes an. Das Abrufen dieser Daten ist in Godot nicht " +"implementiert." #: doc/classes/@GlobalScope.xml msgid "" @@ -4118,6 +4137,8 @@ msgid "" "MIDI tune request message. Upon receiving a tune request, all analog " "synthesizers should tune their oscillators." msgstr "" +"MIDI Tune Request Nachricht. Beim Empfang einer Tune-Anforderung sollten " +"alle analogen Synthesizer ihre Oszillatoren stimmen." #: doc/classes/@GlobalScope.xml msgid "" @@ -4150,6 +4171,8 @@ msgid "" "MIDI active sensing message. This message is intended to be sent repeatedly " "to tell the receiver that a connection is alive." msgstr "" +"MIDI active sensing message. Diese Meldung soll wiederholt gesendet werden, " +"um dem Empfänger mitzuteilen, dass eine Verbindung besteht." #: doc/classes/@GlobalScope.xml msgid "" @@ -4436,6 +4459,15 @@ msgid "" "specified by appending [code]:integer[/code] to the name, e.g. [code]\"Zero," "One,Three:3,Four,Six:6\"[/code]." msgstr "" +"Weist darauf hin, dass eine Integer-, Float- oder String-Eigenschaft ein " +"Aufzählungswert ist, der in einer über eine Hinweiszeichenfolge angegebenen " +"Liste auszuwählen ist.\n" +"Die Hinweiszeichenkette ist eine durch Kommata getrennte Liste von Namen wie " +"z. B. [code]\"Hallo,Etwas,Sonst\"[/code]. Bei Integer- und Float-" +"Eigenschaften hat der erste Name in der Liste den Wert 0, der nächste den " +"Wert 1 und so weiter. Explizite Werte können auch durch Anhängen von [code]:" +"integer[/code] an den Namen angegeben werden, z. B. [code]\"Null,Eins,Drei:3," +"Vier,Sechs:6\"[/code]." #: doc/classes/@GlobalScope.xml msgid "" @@ -4445,6 +4477,12 @@ msgid "" "arbitrary values and can be empty. The list of values serves to suggest " "possible values." msgstr "" +"weist darauf hin, dass eine Zeichenketteneigenschaft ein Aufzählungswert " +"sein kann, der aus einer Liste ausgewählt werden kann, die über eine " +"Hinweiszeichenfolge wie [code]\"Hallo,Etwas,Sonst\"[/code]\n" +"m Gegensatz zu [constant PROPERTY_HINT_ENUM] akzeptiert eine Eigenschaft mit " +"diesem Hinweis weiterhin beliebige Werte und kann leer sein. Die Liste der " +"Werte dient dazu, mögliche Werte vorzuschlagen." #: doc/classes/@GlobalScope.xml msgid "" @@ -4998,6 +5036,16 @@ msgid "" "var box2 = box.expand(Vector3(0, -1, 2))\n" "[/codeblock]" msgstr "" +"Gibt eine Kopie dieses [AABB] zurück, erweitert um einen bestimmten Punkt " +"einzuschließen.\n" +"[b]Beispiel:[/b]\n" +"[codeblock]\n" +"# Position (-3, 2, 0), Größe (1, 1, 1)\n" +"var box = AABB(Vector3(-3, 2, 0), Vector3(1, 1, 1))\n" +"# Position (-3, -1, 0), Größe (3, 4, 2), so dass wir sowohl das " +"ursprüngliche AABB als auch Vector3(0, -1, 2) unterbringen\n" +"var box2 = box.expand(Vector3(0, -1, 2))\n" +"[/codeblock]" #: doc/classes/AABB.xml msgid "Returns the volume of the [AABB]." @@ -5193,6 +5241,11 @@ msgid "" "may cause a crash. If you wish to hide it or any of its children, use their " "[member CanvasItem.visible] property." msgstr "" +"Gibt die für den eingebauten Text verwendete Bezeichnung zurück.\n" +"[b]Warnung:[/b] Dies ist ein erforderlicher interner Knoten; das Entfernen " +"und Freigeben dieses Knotens kann zu einem Absturz führen. Wenn Sie ihn oder " +"eines seiner Kinder ausblenden möchten, verwenden Sie deren Eigenschaft " +"[member CanvasItem.visible]." #: doc/classes/AcceptDialog.xml msgid "" @@ -5201,6 +5254,11 @@ msgid "" "may cause a crash. If you wish to hide it or any of its children, use their " "[member CanvasItem.visible] property." msgstr "" +"Gibt die OK [Button]-Instanz zurück.\n" +"[b]Warnung:[/b] Dies ist ein erforderlicher interner Knoten; das Entfernen " +"und Freigeben dieses Knotens kann zu einem Absturz führen. Wenn Sie ihn oder " +"eines seiner Kinder ausblenden möchten, verwenden Sie deren Eigenschaft " +"[member CanvasItem.visible]." #: doc/classes/AcceptDialog.xml msgid "" @@ -5218,6 +5276,12 @@ msgid "" "the [code]button[/code] will no longer emit this dialog's [signal " "custom_action] signal or cancel this dialog." msgstr "" +"Entfernt den [code]button[/code] aus dem Dialog. Gibt den [code]button[/" +"code] NICHT frei. Der [code]button[/code] muss ein [Button] sein, der mit " +"der [method add_button] oder [method add_cancel] Methode hinzugefügt wurde. " +"Nach dem Entfernen wird das Drücken des [code]button[/code] nicht mehr das " +"[signal custom_action]-Signal dieses Dialogs auslösen oder diesen Dialog " +"abbrechen." #: doc/classes/AcceptDialog.xml msgid "Sets autowrapping for the text in the dialog." @@ -5433,6 +5497,18 @@ msgid "" "code] will make it so the [code]run[/code] animation uses normal and " "specular maps." msgstr "" +"[AnimatedSprite] ähnelt dem [Sprite]-Knoten, außer dass er mehrere Texturen " +"als Animationsrahmen enthält. Animationen werden mit einer [SpriteFrames]-" +"Ressource erstellt, die es Ihnen ermöglicht, Bilddateien (oder einen Ordner " +"mit diesen Dateien) zu importieren, um die Animationsrahmen für das Sprite " +"bereitzustellen. Die [SpriteFrames]-Ressource kann im Editor über die untere " +"Leiste SpriteFrames konfiguriert werden.\n" +"[b]Hinweis:[/b] Du kannst eine Reihe von Normal- oder Specular-Maps " +"zuordnen, indem du zusätzliche [SpriteFrames]-Ressourcen mit einem " +"[code]_normal[/code] oder [code]_specular[/code] Suffix erstellst. Wenn du " +"zum Beispiel 3 [SpriteFrames]-Ressourcen [code]run[/code], [code]run_normal[/" +"code] und [code]run_specular[/code] hast, wird die [code]run[/code]-" +"Animation normale und spekulare Maps verwenden." #: doc/classes/AnimatedSprite.xml doc/classes/AnimationPlayer.xml msgid "2D Sprite animation" @@ -5498,6 +5574,9 @@ msgid "" "option to load, edit, clear, make unique and save the states of the " "[SpriteFrames] resource." msgstr "" +"Die [SpriteFrames]-Ressource, die die Animation(en) enthält. Ermöglicht es " +"Ihnen, die Zustände der [SpriteFrames]-Ressource zu laden, zu bearbeiten, zu " +"löschen, eindeutig zu machen und zu speichern." #: doc/classes/AnimatedSprite.xml doc/classes/Sprite.xml #: doc/classes/SpriteBase3D.xml @@ -6398,26 +6477,22 @@ msgstr "" "Knoten nicht zur Addition anzeigen." #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" -"Ruft die Textbeschriftung für diesen Knoten ab (wird von einigen Editoren " -"verwendet)." #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" -"Ruft einen untergeordneten Knoten nach Index ab (wird von Editoren " -"verwendet, die von [AnimationRootNode] erben)." #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" -"Ruft alle Kindknoten in der Reihenfolge als [code]Name: Knoten[/code]-" -"Wörterbuch ab. Nur nützlich beim Erben von [AnimationRootNode]." #: doc/classes/AnimationNode.xml msgid "" @@ -6441,17 +6516,22 @@ msgstr "" "Bäumen wiederverwendet werden kann." #: doc/classes/AnimationNode.xml +#, fuzzy 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" "Ruft den Standardwert eines Parameters ab. Parameter sind benutzerdefinierte " "lokale Speicher, die für Ihre Knoten verwendet werden, da eine Ressource in " "mehreren Bäumen wiederverwendet werden kann." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 "" @@ -6461,9 +6541,11 @@ msgstr "" "ist ähnlich wie bei [method Object.get_property_list]." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" "Gibt [code]true[/code] zurück, ob der Mischbaum-Editor die Filterbearbeitung " "an diesem Node anzeigen soll." @@ -6474,10 +6556,12 @@ msgid "Returns whether the given path is filtered." msgstr "Gibt [code]true[/code] zurück, ob ein gegebener Pfad gefiltert ist." #: doc/classes/AnimationNode.xml +#, fuzzy 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -6633,7 +6717,7 @@ msgstr "AnimationTree" #: doc/classes/Quat.xml doc/classes/Skeleton.xml doc/classes/SpotLight.xml #: doc/classes/StaticBody.xml doc/classes/WorldEnvironment.xml msgid "Third Person Shooter Demo" -msgstr "" +msgstr "Third Person Shooter Demo" #: doc/classes/AnimationNodeAnimation.xml msgid "Input animation to use in an [AnimationNodeBlendTree]." @@ -6659,7 +6743,7 @@ msgstr "" #: doc/classes/MeshInstance.xml doc/classes/MeshLibrary.xml #: doc/classes/ProjectSettings.xml doc/classes/Transform.xml msgid "3D Platformer Demo" -msgstr "" +msgstr "3D Platformer Demo" #: doc/classes/AnimationNodeAnimation.xml msgid "" @@ -7332,9 +7416,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -7454,6 +7538,24 @@ msgid "" "animation_tree[\"parameters/Seek/seek_position\"] = 12.0\n" "[/codeblock]" msgstr "" +"Dieser Knoten kann verwendet werden, um einen Suchbefehl für alle " +"Unterkinder des Animationsgraphen auszuführen. Verwenden Sie diesen " +"Knotentyp, um eine [Animation] ab dem Start oder einer bestimmten " +"Abspielposition innerhalb des [AnimationNodeBlendTree] abzuspielen. Nach dem " +"Einstellen der Zeit und dem Ändern der Animationswiedergabe geht der " +"Suchknoten beim nächsten Prozessbild automatisch in den Schlafmodus, indem " +"er seinen Wert [code]seek_position[/code] auf [code]-1.0[/code] setzt.\n" +"[codeblock]\n" +"# Kind-Animation von Anfang an abspielen.\n" +"animation_tree.set(\"parameters/Seek/seek_position\", 0.0)\n" +"# Alternativer Syntax (gleiches Ergebnis wie oben).\n" +"animation_tree[\"parameters/Seek/seek_position\"] = 0.0\n" +"\n" +"# Kind-Animation ab dem 12 Sekunden Zeitstempel abspielen.\n" +"animation_tree.set(\"parameters/Seek/seek_position\", 12.0)\n" +"# Alternativer Syntax (gleiches Ergebnis wie oben).\n" +"animation_tree[\"parameters/Seek/seek_position\"] = 12.0\n" +"[/codeblock]" #: doc/classes/AnimationNodeTransition.xml msgid "A generic animation transition node for [AnimationTree]." @@ -7570,9 +7672,10 @@ msgstr "" "Zeichenkette, wenn nicht gefunden." #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" "Liefert die [Animation] mit dem Schlüssel [code]name[/code] oder [code]null[/" "code], wenn nicht gefunden." @@ -7761,6 +7864,15 @@ msgid "" "get the currently playing animation, and internally for animation playback " "tracks. For more information, see [Animation]." msgstr "" +"Der Name der aktuell abgespielten Animation. Wenn keine Animation abgespielt " +"wird, ist der Wert der Eigenschaft eine leere Zeichenkette. Eine Änderung " +"dieses Wertes führt nicht zum Neustart der Animation. Weitere Informationen " +"über das Abspielen von Animationen finden Sie unter [method play].\n" +"[b]Hinweis:[/b] Diese Eigenschaft wird zwar im Inspektor angezeigt, ist aber " +"nicht zum Bearbeiten gedacht und wird nicht in der Szene gespeichert. Diese " +"Eigenschaft wird hauptsächlich verwendet, um die aktuell abgespielte " +"Animation zu erhalten, und intern für Animationswiedergabespuren. Für " +"weitere Informationen, siehe [Animation]." #: doc/classes/AnimationPlayer.xml msgid "The length (in seconds) of the currently being played animation." @@ -7814,6 +7926,13 @@ msgid "" "defined by the reset animation, if any, with the editor keeping the values " "that the nodes had before saving." msgstr "" +"Dies wird vom Editor verwendet. Wenn es auf [code]true[/code] gesetzt wird, " +"wird die Szene mit den Effekten der Reset-Animation gespeichert (als ob sie " +"auf Zeit 0 gesucht worden wäre), und nach dem Speichern wieder " +"zurückgesetzt.\n" +"Mit anderen Worten, die gespeicherte Szenendatei enthält die \"Standard-" +"Pose\", wie sie durch die Rücksetz-Animation definiert ist, und der Editor " +"behält die Werte bei, die die Knoten vor dem Speichern hatten." #: doc/classes/AnimationPlayer.xml msgid "The node from which node path references will travel." @@ -8073,6 +8192,8 @@ msgid "" "Binds a new [Animation] from the [member master_player] to the " "[AnimationTreePlayer]'s animation node with name [code]id[/code]." msgstr "" +"Bindet eine neue [Animation] aus dem [member master_player] an den " +"Animationsknoten des [AnimationTreePlayer] mit dem Namen [code]id[/code]." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8080,12 +8201,18 @@ msgid "" "[code]id[/code] turns off the track modifying the property at [code]path[/" "code]. The modified node's children continue to animate." msgstr "" +"Wenn [code]enable[/code] [code]true[/code] ist, schaltet der " +"Animationsknoten mit der ID [code]id[/code] die Spur aus, die die " +"Eigenschaft bei [code]path[/code] ändert. Die Kinder des geänderten Knotens " +"werden weiterhin animiert." #: doc/classes/AnimationTreePlayer.xml msgid "" "Binds the [Animation] named [code]source[/code] from [member master_player] " "to the animation node [code]id[/code]. Recalculates caches." msgstr "" +"Bindet die [Animation] namens [code]source[/code] vom [member master_player] " +"an den Animationsknoten [code]id[/code]. Berechnet die Caches neu." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8109,6 +8236,12 @@ msgid "" "At 0, output is input A. Towards 1, the influence of A gets lessened, the " "influence of B gets raised. At 1, output is input B." msgstr "" +"Legt den Überblendungswert eines Blend2-Knotens mit seinem Namen und Wert " +"fest.\n" +"Ein Blend2-Knoten überblendet zwei Animationen (A und B) mit einem Wert " +"zwischen 0 und 1.\n" +"Bei 0 ist die Ausgabe die Eingabe A. In Richtung 1 wird der Einfluss von A " +"verringert, der Einfluss von B erhöht. Bei 1 ist die Ausgabe die Eingabe B." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8116,6 +8249,10 @@ msgid "" "[code]id[/code] turns off the track modifying the property at [code]path[/" "code]. The modified node's children continue to animate." msgstr "" +"Wenn [code]enable[/code] [code]true[/code] ist, schaltet der Blend2-Knoten " +"mit dem Namen [code]id[/code] die Spur aus, die die Eigenschaft bei " +"[code]path[/code] ändert. Die Kinder des geänderten Knotens werden weiterhin " +"animiert." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8132,6 +8269,15 @@ msgid "" "input A. From 0 to 1, the influence of A gets lessened, the influence of B+ " "gets raised and the influence of B+ is 0. At 1, output is input B+." msgstr "" +"Legt den Überblendungsgrad eines Blend3-Knotens mit seinem Namen und Wert " +"fest.\n" +"Ein Blend3-Knoten überblendet drei Animationen (A, B-, B+) mit einem Wert " +"zwischen -1 und 1.\n" +"Bei -1 ist die Ausgabe die Eingabe B-. Von -1 bis 0 wird der Einfluss von B- " +"verringert, der Einfluss von A wird erhöht und der Einfluss von B+ ist 0. " +"Bei 0 ist die Ausgabe die Eingabe A. Von 0 bis 1 wird der Einfluss von A " +"verringert, der Einfluss von B+ wird erhöht und der Einfluss von B+ ist 0. " +"Bei 1 ist die Ausgabe die Eingabe B+." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8144,6 +8290,10 @@ msgid "" "A Blend4 Node blends two pairs of animations.\n" "The two pairs are blended like Blend2 and then added together." msgstr "" +"Legt den Überblendungsgrad eines Blend4-Knotens mit seinem Namen und Wert " +"fest.\n" +"Ein Blend4-Knoten blendet zwei Paare von Animationen.\n" +"Die beiden Paare werden wie Blend2 überblendet und dann addiert." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8160,7 +8310,7 @@ msgstr "Trennt das Node, der mit dem angegebenen Eingang verbunden ist." #: doc/classes/AnimationTreePlayer.xml msgid "Returns a [PoolStringArray] containing the name of all nodes." -msgstr "" +msgstr "Gibt ein [PoolStringArray] zurück, das die Namen aller Knoten enthält." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8172,16 +8322,22 @@ msgid "" "Sets the mix amount of a Mix node given its name and value.\n" "A Mix node adds input b to input a by the amount given by ratio." msgstr "" +"Legt die Mischmenge eines Mix-Knotens fest, dessen Name und Wert angegeben " +"ist.\n" +"Ein Mix-Knoten fügt Eingang B zu Eingang A um den durch ratio angegebenen " +"Betrag hinzu." #: doc/classes/AnimationTreePlayer.xml msgid "Check if a node exists (by name)." -msgstr "" +msgstr "Prüfen, ob ein Knoten existiert (nach Name)." #: doc/classes/AnimationTreePlayer.xml msgid "" "Returns the input count for a given node. Different types of nodes have " "different amount of inputs." msgstr "" +"Gibt die Anzahl der Eingaben für einen bestimmten Knoten zurück. " +"Verschiedene Knotentypen haben eine unterschiedliche Anzahl von Eingängen." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8196,6 +8352,7 @@ msgstr "Gibt das AnimationNode mit dem gegebenen Namen zurück." #: doc/classes/AnimationTreePlayer.xml msgid "Gets the node type, will return from [enum NodeType] enum." msgstr "" +"Ruft den Knotentyp ab, wird von der Aufzählung [enum NodeType] zurückgegeben." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8243,28 +8400,38 @@ msgstr "Gibt das AnimationNode mit dem gegebenen Namen zurück." msgid "" "Sets the autorestart property of a OneShot node given its name and value." msgstr "" +"Legt die Autorestart-Eigenschaft eines OneShot-Knotens mit dessen Namen und " +"Wert fest." #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the autorestart delay of a OneShot node given its name and value in " "seconds." msgstr "" +"Legt die Autostart-Verzögerung eines OneShot-Knotens fest, wobei der Name " +"und der Wert in Sekunden angegeben werden." #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the autorestart random delay of a OneShot node given its name and value " "in seconds." msgstr "" +"Legt die Zufallsverzögerung für den Autorestart eines OneShot-Knotens fest, " +"wobei der Name und der Wert in Sekunden angegeben werden." #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the fade in time of a OneShot node given its name and value in seconds." msgstr "" +"Legt die Einblendzeit eines OneShot-Knotens mit seinem Namen und einem Wert " +"in Sekunden fest." #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the fade out time of a OneShot node given its name and value in seconds." msgstr "" +"Legt die Ausblendzeit eines OneShot-Knotens fest, wobei der Name und der " +"Wert in Sekunden angegeben werden." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8272,6 +8439,9 @@ msgid "" "[code]id[/code] turns off the track modifying the property at [code]path[/" "code]. The modified node's children continue to animate." msgstr "" +"Wenn [code]enable[/code] [code]true[/code] ist, schaltet der OneShot-Knoten " +"mit der ID [code]id[/code] die Spur aus, die die Eigenschaft bei [code]path[/" +"code] ändert. Die Kinder des geänderten Knotens werden weiterhin animiert" #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8289,6 +8459,9 @@ msgid "" "animation nodes. Needed when external sources modify the animation nodes' " "state." msgstr "" +"Berechnet den Cache der von Animationsknoten erzeugten Spurinformationen " +"manuell neu. Wird benötigt, wenn externe Quellen den Zustand der " +"Animationsknoten ändern." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8297,7 +8470,7 @@ msgstr "Entfernt die Animation mit dem key [code]name[/code]." #: doc/classes/AnimationTreePlayer.xml msgid "Resets this [AnimationTreePlayer]." -msgstr "" +msgstr "Setzt diesen [AnimationTreePlayer] zurück." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8314,6 +8487,12 @@ msgid "" "If applied after a blend or mix, affects all input animations to that blend " "or mix." msgstr "" +"Setzt die Zeitskala des TimeScale-Knotens mit dem Namen [code]id[/code] auf " +"[code]scale[/code].\n" +"Der TimeScale-Knoten wird verwendet, um [Animationen] zu beschleunigen, wenn " +"die Skala über 1 liegt, oder sie zu verlangsamen, wenn sie unter 1 liegt.\n" +"Wenn er nach einer Überblendung oder Mischung angewendet wird, wirkt er sich " +"auf alle Eingangsanimationen für diese Überblendung oder Mischung aus." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8322,6 +8501,10 @@ msgid "" "This functions as a seek in the [Animation] or the blend or mix of " "[Animation]s input in it." msgstr "" +"Setzt den Zeitsuchwert des TimeSeek-Knotens mit dem Namen [code]id[/code] " +"auf [code]seconds[/code].\n" +"Dies funktioniert wie ein Suchlauf in der [Animation] oder der Mischung oder " +"dem Mix von [Animation]en, die darin eingegeben werden." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8346,6 +8529,9 @@ msgid "" "Returns the number of inputs for the transition node with name [code]id[/" "code]. You can add inputs by right-clicking on the transition node." msgstr "" +"Gibt die Anzahl der Eingänge für den Übergangsknoten mit dem Namen [code]id[/" +"code] zurück. Sie können Eingaben hinzufügen, indem Sie mit der rechten " +"Maustaste auf den Übergangsknoten klicken." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8360,6 +8546,9 @@ msgid "" "transition node with name [code]id[/code] is set to automatically advance to " "the next input upon completion." msgstr "" +"Gibt [code]true[/code] zurück, wenn die Eingabe an [code]input_idx[/code] " +"auf dem Übergangsknoten mit dem Namen [code]id[/code] so eingestellt ist, " +"dass sie nach Abschluss automatisch zur nächsten Eingabe übergeht." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8375,12 +8564,17 @@ msgid "" "The transition node with name [code]id[/code] advances to its next input " "automatically when the input at [code]input_idx[/code] completes." msgstr "" +"Der Übergangsknoten mit dem Namen [code]id[/code] geht automatisch zu seiner " +"nächsten Eingabe über, wenn die Eingabe an [code]input_idx[/code] " +"abgeschlossen ist." #: doc/classes/AnimationTreePlayer.xml msgid "" "Resizes the number of inputs available for the transition node with name " "[code]id[/code]." msgstr "" +"Verändert die Anzahl der verfügbaren Eingänge für den Übergangsknoten mit " +"dem Namen [code]id[/code]." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8403,6 +8597,9 @@ msgid "" "It accesses the bones, so it should point to the same node the " "[AnimationPlayer] would point its Root Node at." msgstr "" +"Der Knoten, von dem aus relativ auf andere Knoten zugegriffen werden kann.\n" +"Er greift auf die Bones zu, sollte also auf denselben Knoten zeigen, auf den " +"der [AnimationPlayer] seinen Root Knoten zeigen würde." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8410,6 +8607,10 @@ msgid "" "binds animations to animation nodes.\n" "Once set, [Animation] nodes can be added to the [AnimationTreePlayer]." msgstr "" +"Der Pfad zum [AnimationPlayer], von dem dieser [AnimationTreePlayer] " +"Animationen an Animationsknoten bindet.\n" +"Einmal festgelegt, können [Animation]-Knoten zum [AnimationTreePlayer] " +"hinzugefügt werden." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8418,7 +8619,7 @@ msgstr "Die Prozessmeldung, in der die Animationen aktualisiert werden sollen." #: doc/classes/AnimationTreePlayer.xml msgid "Output node." -msgstr "" +msgstr "Ausgangsknoten." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8432,27 +8633,27 @@ msgstr "Einmaliger Timer." #: doc/classes/AnimationTreePlayer.xml msgid "Mix node." -msgstr "" +msgstr "Mischknoten." #: doc/classes/AnimationTreePlayer.xml msgid "Blend2 node." -msgstr "" +msgstr "Blend2 Knoten." #: doc/classes/AnimationTreePlayer.xml msgid "Blend3 node." -msgstr "" +msgstr "Blend3 Knoten." #: doc/classes/AnimationTreePlayer.xml msgid "Blend4 node." -msgstr "" +msgstr "Blend4 Knoten." #: doc/classes/AnimationTreePlayer.xml msgid "TimeScale node." -msgstr "" +msgstr "TimeScale Knoten." #: doc/classes/AnimationTreePlayer.xml msgid "TimeSeek node." -msgstr "" +msgstr "TimeSeek Knoten." #: doc/classes/AnimationTreePlayer.xml #, fuzzy @@ -8478,7 +8679,7 @@ msgstr "" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml #: doc/classes/ViewportTexture.xml msgid "GUI in 3D Demo" -msgstr "" +msgstr "Benutzeroberfläche in 3D-Demo" #: doc/classes/Area.xml msgid "" @@ -8645,10 +8846,15 @@ 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 "" +"Der Grad, in dem dieser Bereich Hall auf das zugehörige Audiomaterial " +"anwendet. Der Bereich reicht von [code]0[/code] bis [code]1[/code] mit einer " +"Genauigkeit von [code]0.1[/code]." #: doc/classes/Area.xml msgid "If [code]true[/code], the area applies reverb to its associated audio." msgstr "" +"Wenn [code]true[/code], wendet der Bereich Hall auf das zugehörige " +"Audiomaterial an." #: doc/classes/Area.xml msgid "The reverb bus name to use for this area's associated audio." @@ -8677,6 +8883,9 @@ msgid "" "be set to [code]true[/code].\n" "[code]area[/code] the other Area." msgstr "" +"Wird ausgesendet, wenn ein anderer Bereich diesen Bereich betritt. " +"Erfordert, dass [member monitoring] auf [code]true[/code] gesetzt ist.\n" +"[code]area[/code] der andere Bereich." #: doc/classes/Area.xml msgid "" @@ -8684,6 +8893,9 @@ msgid "" "be set to [code]true[/code].\n" "[code]area[/code] the other Area." msgstr "" +"Wird ausgesendet, wenn ein anderer Bereich diesen Bereich verlässt. " +"Erfordert, dass [member monitoring] auf [code]true[/code] gesetzt ist.\n" +"[code]area[/code] der andere Bereich." #: doc/classes/Area.xml msgid "" @@ -8699,6 +8911,18 @@ msgid "" "the [PhysicsServer]. Get the [CollisionShape] node with [code]self." "shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Wird ausgesendet, wenn [Shape]s eines anderen Bereichs in [Shape]s dieses " +"Bereichs eintreten. Erfordert, dass [member monitoring] auf [code]true[/" +"code] gesetzt ist.\n" +"[code]area_rid[/code] die [RID] des vom [PhysicsServer] verwendeten " +"[CollisionObject] des anderen Bereichs.\n" +"[code]area[/code] die andere Area.\n" +"[code]area_shape_index[/code] der Index des [Shape] des anderen Bereichs, " +"der vom [PhysicsServer] verwendet wird. Holen Sie den [CollisionShape] " +"Knoten mit [code]area.shape_owner_get_owner(area_shape_index)[/code].\n" +"[code]local_shape_index[/code] der Index des [Shape] dieses Bereichs, der " +"vom [PhysicsServer] verwendet wird. Holen Sie den [CollisionShape] Knoten " +"mit [code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Area.xml msgid "" @@ -8708,6 +8932,12 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody] or [GridMap]." msgstr "" +"Wird ausgesendet, wenn ein [PhysicsBody] oder eine [GridMap] diesen Bereich " +"betritt. Erfordert, dass [member monitoring] auf [code]true[/code] gesetzt " +"ist. [GridMap]s werden erkannt, wenn die [MeshLibrary] Kollisions-[Shape]s " +"hat.\n" +"[code]body[/code] die [Node] des anderen [PhysicsBody] oder der [GridMap], " +"wenn er im Baum existiert." #: doc/classes/Area.xml msgid "" @@ -8717,6 +8947,12 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody] or [GridMap]." msgstr "" +"Wird ausgesendet, wenn ein [PhysicsBody] oder eine [GridMap] diesen Bereich " +"verlässt. Erfordert, dass [member monitoring] auf [code]true[/code] gesetzt " +"ist. [GridMap]s werden erkannt, wenn die [MeshLibrary] Kollisions-[Shape]s " +"hat.\n" +"[code]body[/code] der [Node], falls im Baum vorhanden, des anderen " +"[PhysicsBody] oder der [GridMap]." #: doc/classes/Area.xml msgid "" @@ -8734,6 +8970,21 @@ msgid "" "the [PhysicsServer]. Get the [CollisionShape] node with [code]self." "shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Wird ausgesendet, wenn eine [Shape] eines [PhysicsBody] oder einer [GridMap] " +"in eine [Shape] dieses Bereichs eintritt. Erfordert, dass [member " +"monitoring] auf [code]true[/code] gesetzt ist. [GridMap]s werden erkannt, " +"wenn die [MeshLibrary] Kollisions-[Shape]s hat.\n" +"[code]body_rid[/code] die [RID] des [PhysicsBody]s oder [MeshLibrary]s " +"[CollisionObject], das vom [PhysicsServer] verwendet wird.\n" +"[code]body[/code] der [Node] des [PhysicsBody] oder der [GridMap], wenn er " +"im Baum existiert.\n" +"[code]body_shape_index[/code] der Index des [Shape]s des [PhysicsBody] oder " +"der [GridMap], der vom [PhysicsServer] verwendet wird. Holen Sie den " +"[CollisionShape] Knoten mit [code]body." +"shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] der Index des [Shape]s dieses Bereichs, der " +"vom [PhysicsServer] verwendet wird. Holen Sie den [CollisionShape] Knoten " +"mit [code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Area.xml doc/classes/Area2D.xml msgid "This area does not affect gravity/damping." @@ -8744,24 +8995,34 @@ msgid "" "This area adds its gravity/damping values to whatever has been calculated so " "far (in [member priority] order)." msgstr "" +"Dieser Bereich addiert seine Schwerkraft-/Dämpfungswerte zu den bisher " +"berechneten Werten (in der Reihenfolge der [member priority])." #: doc/classes/Area.xml doc/classes/Area2D.xml 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 "" +"Dieser Bereich addiert seine Schwere-/Dämpfungswerte zu den bisher " +"berechneten Werten (in der Reihenfolge der [member priority]) und ignoriert " +"alle Bereiche mit niedrigerer Priorität." #: doc/classes/Area.xml doc/classes/Area2D.xml msgid "" "This area replaces any gravity/damping, even the defaults, ignoring any " "lower priority areas." msgstr "" +"Dieser Bereich ersetzt jede Schwerkraft/Dämpfung, auch die Standardwerte, " +"und ignoriert alle Bereiche mit niedrigerer Priorität." #: doc/classes/Area.xml doc/classes/Area2D.xml msgid "" "This area replaces any gravity/damping calculated so far (in [member " "priority] order), but keeps calculating the rest of the areas." msgstr "" +"Dieser Bereich ersetzt alle bisher berechneten Schwerkraft-/Dämpfungswerte " +"(in der Reihenfolge der [member priority]), berechnet aber weiterhin die " +"übrigen Bereiche." #: doc/classes/Area2D.xml #, fuzzy @@ -8786,13 +9047,13 @@ msgstr "Verwendung von Area2D" #: doc/classes/Area2D.xml doc/classes/CollisionShape2D.xml #: doc/classes/RectangleShape2D.xml msgid "2D Pong Demo" -msgstr "" +msgstr "2D Pong Demo" #: doc/classes/Area2D.xml doc/classes/Camera2D.xml #: doc/classes/KinematicBody2D.xml doc/classes/TileMap.xml #: doc/classes/TileSet.xml msgid "2D Platformer Demo" -msgstr "" +msgstr "2D Platformer Demo" #: doc/classes/Area2D.xml msgid "" @@ -8905,6 +9166,9 @@ msgid "" "to be set to [code]true[/code].\n" "[code]area[/code] the other Area2D." msgstr "" +"Wird ausgesendet, wenn ein anderes Area2D dieses Area2D betritt. Erfordert, " +"dass [member monitoring] auf [code]true[/code] gesetzt ist.\n" +"[code]area[/code] die andere Area2D." #: doc/classes/Area2D.xml msgid "" @@ -8912,6 +9176,9 @@ msgid "" "to be set to [code]true[/code].\n" "[code]area[/code] the other Area2D." msgstr "" +"Wird ausgesendet, wenn ein anderes Area2D dieses Area2D verlässt. Erfordert, " +"dass [member monitoring] auf [code]true[/code] gesetzt ist.\n" +"[code]area[/code] die andere Area2D." #: doc/classes/Area2D.xml msgid "" @@ -8927,6 +9194,18 @@ msgid "" "used by the [Physics2DServer]. Get the [CollisionShape2D] node with " "[code]self.shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Wird ausgesendet, wenn [Shape2D]s eines anderen Area2Ds in [Shape2D]s dieses " +"Area2Ds verlassen. Erfordert, dass [member monitoring] auf [code]true[/code] " +"gesetzt ist.\n" +"[code]area_rid[/code] die [RID] des anderen Area2D's [CollisionObject2D], " +"das vom [Physics2DServer] verwendet wird.\n" +"[code]area[/code] die andere Area2D.\n" +"[code]area_shape_index[/code] der Index des [Shape2D]s des anderen Area2Ds, " +"das vom [Physics2DServer] verwendet wird. Holen Sie den [CollisionShape2D] " +"Knoten mit [code]area.shape_owner_get_owner(area_shape_index)[/code].\n" +"[code]local_shape_index[/code] der Index des [Shape2D]s dieses Area2Ds, der " +"vom [Physics2DServer] verwendet wird. Holen Sie den [CollisionShape2D] " +"Knoten mit [code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Area2D.xml msgid "" @@ -8942,6 +9221,18 @@ msgid "" "used by the [Physics2DServer]. Get the [CollisionShape2D] node with " "[code]self.shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Wird ausgesendet, wenn [Shape2D]s eines anderen Area2Ds [Shape2D]s dieses " +"Area2D verlassen. Erfordert, dass [member monitoring] auf [code]true[/code] " +"gesetzt ist.\n" +"[code]area_rid[/code] die [RID] des anderen Area2D's [CollisionObject2D], " +"das vom [Physics2DServer] verwendet wird.\n" +"[code]area[/code] die andere Area2D.\n" +"[code]area_shape_index[/code] der Index des [Shape2D]s des anderen Area2Ds, " +"das vom [Physics2DServer] verwendet wird. Holen Sie den [CollisionShape2D] " +"Knoten mit [code]area.shape_owner_get_owner(area_shape_index)[/code].\n" +"[code]local_shape_index[/code] der Index des [Shape2D]s dieses Area2Ds, der " +"vom [Physics2DServer] verwendet wird. Holen Sie den [CollisionShape2D] " +"Knoten mit [code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Area2D.xml msgid "" @@ -8951,6 +9242,12 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody2D] or [TileMap]." msgstr "" +"Wird ausgesendet, wenn ein [PhysicsBody2D] oder eine [TileMap] diesen Area2D " +"betritt. Erfordert, dass [member monitoring] auf [code]true[/code] gesetzt " +"ist. [TileMap]s werden erkannt, wenn das [TileSet] Kollisions-[Shape2D]s " +"hat.\n" +"[code]body[/code] der [Node], falls im Baum vorhanden, des anderen " +"[PhysicsBody2D] oder [TileMap]." #: doc/classes/Area2D.xml msgid "" @@ -8960,6 +9257,12 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody2D] or [TileMap]." msgstr "" +"Wird ausgesendet, wenn ein [PhysicsBody2D] oder eine [TileMap] diesen Area2D " +"verlässt. Erfordert, dass [member monitoring] auf [code]true[/code] gesetzt " +"ist. [TileMap]s werden erkannt, wenn das [TileSet] Kollisions-[Shape2D]s " +"hat.\n" +"[code]body[/code] der [Node], falls im Baum vorhanden, des anderen " +"[PhysicsBody2D] oder [TileMap]." #: doc/classes/Area2D.xml msgid "" @@ -8979,6 +9282,21 @@ msgid "" "used by the [Physics2DServer]. Get the [CollisionShape2D] node with " "[code]self.shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Wird ausgesendet, wenn eine der [Shape2D]s eines [PhysicsBody2D] oder einer " +"[TileMap] in eine der [Shape2D]s dieser Area2D eintritt. Erfordert, dass " +"[member monitoring] auf [code]true[/code] gesetzt ist. [TileMap]s werden " +"erkannt, wenn das [TileSet] Kollisions-[Shape2D]s hat.\n" +"[code]body_rid[/code] die [RID] des [PhysicsBody2D] oder [TileSet]'s " +"[CollisionObject2D], das vom [Physics2DServer] verwendet wird.\n" +"[code]body[/code] der [Node] des [PhysicsBody2D] oder der [TileMap], wenn er " +"im Baum existiert.\n" +"[code]body_shape_index[/code] der Index des [Shape2D]s des [PhysicsBody2D]s " +"oder der [TileMap], der vom [Physics2DServer] verwendet wird. Holen Sie sich " +"den [CollisionShape2D] Knoten mit [code]body." +"shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] der Index des [Shape2D]s dieses Area2Ds, der " +"vom [Physics2DServer] verwendet wird. Holen Sie den [CollisionShape2D] " +"Knoten mit [code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Area2D.xml msgid "" @@ -8998,10 +9316,25 @@ msgid "" "used by the [Physics2DServer]. Get the [CollisionShape2D] node with " "[code]self.shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Wird ausgesendet, wenn eine der [Shape2D]s eines [PhysicsBody2D] oder einer " +"[TileMap] eine der [Shape2D]s dieser Area2D verlässt. Erfordert, dass " +"[member monitoring] auf [code]true[/code] gesetzt ist. [TileMap]s werden " +"erkannt, wenn das [TileSet] Kollisions-[Shape2D]s hat.\n" +"[code]body_rid[/code] die [RID] des [PhysicsBody2D] oder [TileSet]'s " +"[CollisionObject2D], das vom [Physics2DServer] verwendet wird.\n" +"[code]body[/code] der [Node] des [PhysicsBody2D] oder der [TileMap], wenn er " +"im Baum existiert.\n" +"[code]body_shape_index[/code] der Index des [Shape2D]s des [PhysicsBody2D]s " +"oder der [TileMap], der vom [Physics2DServer] verwendet wird. Holen Sie sich " +"den [CollisionShape2D] Knoten mit [code]body." +"shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] der Index des [Shape2D]s dieses Area2Ds, der " +"vom [Physics2DServer] verwendet wird. Holen Sie den [CollisionShape2D] " +"Knoten mit [code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Array.xml msgid "A generic array datatype." -msgstr "" +msgstr "Ein generischer Array Datentyp." #: doc/classes/Array.xml msgid "" @@ -9035,6 +9368,37 @@ msgid "" "pushing/removing elements. Using [code]const[/code] will only prevent " "assigning the constant with another value after it was initialized." msgstr "" +"Ein generisches Array, das mehrere Elemente beliebiger Typen enthalten kann, " +"die über einen numerischen Index ab 0 zugänglich sind. Negative Indizes " +"können verwendet werden, um von hinten zu zählen, wie in Python (-1 ist das " +"letzte Element, -2 das vorletzte usw.).\n" +"[b]Zum Beispiel:[/b]\n" +"[codeblock]\n" +"var array = [\"Eins\", 2, 3, \"Vier\"]\n" +"print(array[0]) # Eins.\n" +"print(array[2]) # 3.\n" +"print(array[-1]) # Vier.\n" +"array[2] = \"Drei\"\n" +"print(array[-2]) # Drei.\n" +"[/codeblock]\n" +"Arrays können mit dem Operator [code]+[/code] verbunden werden:\n" +"[codeblock]\n" +"var array1 = [\"Eins\", 2]\n" +"var array2 = [3, \"Vier\"]\n" +"print(array1 + array2) # [\"Eins\", 2, 3, \"Vier\"]\n" +"[/codeblock]\n" +"[b]Hinweis:[/b] Die Verkettung mit dem Operator [code]+=[/code] erzeugt ein " +"neues Array, was mit Kosten verbunden ist. Wenn Sie ein weiteres Array an " +"ein bestehendes Array anhängen wollen, ist die [method append_array] " +"effizienter.\n" +"[b]Hinweis:[/b] Arrays werden immer per Referenz übergeben. Um eine Kopie " +"eines Arrays zu erhalten, die unabhängig vom ursprünglichen Array verändert " +"werden kann, verwenden Sie [method duplicate].\n" +"[b]Hinweis:[/b] Wenn ein Array mit [code]const[/code] deklariert wird, kann " +"das Array selbst immer noch verändert werden, indem die Werte an einzelnen " +"Indizes definiert oder Elemente verschoben/entfernt werden. Die Verwendung " +"von [code]const[/code] verhindert nur, dass der Konstante ein anderer Wert " +"zugewiesen wird, nachdem sie initialisiert wurde." #: doc/classes/Array.xml #, fuzzy @@ -9090,6 +9454,13 @@ msgid "" "print(array1) # Prints [1, 2, 3, 4, 5, 6].\n" "[/codeblock]" msgstr "" +"Hängt ein weiteres Array an das Ende dieses Array an.\n" +"[codeblock]\n" +"var array1 = [1, 2, 3]\n" +"var array2 = [4, 5, 6]\n" +"array1.append_array(array2)\n" +"print(array1) # Prints [1, 2, 3, 4, 5, 6].\n" +"[/codeblock]" #: doc/classes/Array.xml msgid "" @@ -9099,6 +9470,12 @@ msgid "" "[/code]. If the array is empty, accessing by index will pause project " "execution when running from the editor." msgstr "" +"Gibt das letzte Element des Arrays zurück. Gibt einen Fehler aus und liefert " +"[code]null[/code], wenn das Array leer ist.\n" +"[b]Hinweis:[/b] Der Aufruf dieser Funktion ist nicht dasselbe wie das " +"Schreiben von [code]array[-1][/code]. Wenn das Array leer ist, führt der " +"Zugriff über den Index zu einer Unterbrechung der Projektausführung, wenn es " +"vom Editor aus ausgeführt wird." #: doc/classes/Array.xml msgid "" @@ -9110,6 +9487,13 @@ msgid "" "[b]Note:[/b] Calling [method bsearch] on an unsorted array results in " "unexpected behavior." msgstr "" +"Findet den Index eines vorhandenen Wertes (oder den Einfügeindex, der die " +"Sortierreihenfolge beibehält, wenn der Wert noch nicht im Array vorhanden " +"ist) mithilfe der binären Suche. Optional kann ein [code]before[/code]-" +"Spezifizierer übergeben werden. Falls [code]false[/code], kommt der " +"zurückgegebene Index nach allen vorhandenen Einträgen des Wertes im Array.\n" +"[b]Hinweis:[/b] Der Aufruf der [method bsearch] auf einem unsortierten Array " +"führt zu unerwartetem Verhalten." #: doc/classes/Array.xml msgid "" @@ -9149,19 +9533,57 @@ msgid "" "[b]Note:[/b] Calling [method bsearch_custom] on an unsorted array results in " "unexpected behavior." msgstr "" +"Findet den Index eines vorhandenen Wertes (oder den Einfügeindex, der die " +"Sortierreihenfolge beibehält, wenn der Wert noch nicht im Array vorhanden " +"ist) mithilfe der binären Suche und eine benutzerdefinierte " +"Vergleichsmethode, die im [code]obj[/code] deklariert ist. Optional kann ein " +"[code]before[/code]-Spezifizierer übergeben werden. Wenn [code]false[/code], " +"kommt der zurückgegebene Index nach allen vorhandenen Einträgen des Wertes " +"im Array. Die benutzerdefinierte Methode erhält zwei Argumente (ein Element " +"aus dem Array und den gesuchten Wert) und muss [code]true[/code] " +"zurückgeben, wenn das erste Argument kleiner als das zweite ist, und " +"ansonsten [code]false[/code].\n" +"[codeblock]\n" +"func cardinal_to_algebraic(a):\n" +" match a:\n" +" \"eins\":\n" +" return 1\n" +" \"zwei\":\n" +" return 2\n" +" \"drei\":\n" +" return 3\n" +" \"vier\":\n" +" return 4\n" +" _:\n" +" return 0\n" +"\n" +"func compare(a, b):\n" +" return cardinal_to_algebraic(a) < cardinal_to_algebraic(b)\n" +"\n" +"func _ready():\n" +" var a = [\"one\", \"two\", \"three\", \"four\"]\n" +" # `compare`ist in diesem Objekt definiert, also benutzen wir `self` als " +"den `obj` Parameter.\n" +" print(a.bsearch_custom(\"three\", self, \"compare\", true)) # Expected " +"value is 2.\n" +"[/codeblock]\n" +"[b]Hinweis:[/b] Der Aufruf der [method bsearch_custom] auf einem " +"unsortierten Array führt zu unerwartetem Verhalten." #: doc/classes/Array.xml msgid "" "Clears the array. This is equivalent to using [method resize] with a size of " "[code]0[/code]." msgstr "" +"Löscht das Array. Dies entspricht der Verwendung von [method resize] mit " +"einer Größe von [code]0[/code]." #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml #: doc/classes/PoolRealArray.xml doc/classes/PoolStringArray.xml #: doc/classes/PoolVector2Array.xml doc/classes/PoolVector3Array.xml msgid "Returns the number of times an element is in the array." -msgstr "" +msgstr "Gibt die Anzahl der Vorkommen eines Elements im Array zurück." #: doc/classes/Array.xml msgid "" @@ -9173,6 +9595,14 @@ msgid "" "modifying a sub-array or dictionary in the copy will also impact those " "referenced in the source array." msgstr "" +"Gibt eine Kopie des Arrays zurück.\n" +"Wenn [code]deep[/code] [code]true[/code] ist, wird eine tiefe Kopie " +"erstellt: alle verschachtelten Arrays und Dictionaries werden dupliziert und " +"nicht mit dem ursprünglichen Array geteilt. Wenn es [code]false[/code] ist, " +"wird eine flache Kopie erstellt und Verweise auf die ursprünglichen " +"verschachtelten Arrays und Dictionaries werden beibehalten, so dass die " +"Änderung eines Sub-Arrays oder Dictionaries in der Kopie auch Auswirkungen " +"auf die im Quell-Array referenzierten hat." #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml @@ -9191,6 +9621,15 @@ msgid "" "element is close to the beginning of the array (index 0). This is because " "all elements placed after the removed element have to be reindexed." msgstr "" +"Entfernt das erste Vorkommen eines Wertes aus dem Array. Wenn der Wert nicht " +"im Array vorhanden ist, passiert nichts. Um ein Element nach Index zu " +"entfernen, verwenden Sie stattdessen [method remove].\n" +"[b]Hinweis:[/b] Diese Methode arbeitet in-place und gibt keinen Wert " +"zurück.\n" +"[b]Hinweis:[/b] Bei großen Arrays ist diese Methode langsamer, wenn das " +"entfernte Element nahe am Anfang des Arrays liegt (Index 0). Das liegt " +"daran, dass alle Elemente, die nach dem entfernten Element platziert sind, " +"neu indiziert werden müssen." #: doc/classes/Array.xml msgid "" @@ -9203,6 +9642,14 @@ msgid "" "array.fill(0) # Initialize the 10 elements to 0.\n" "[/codeblock]" msgstr "" +"Weist allen Elementen des Arrays den angegebenen Wert zu. Dies kann " +"normalerweise zusammen mit [method resize] verwendet werden, um ein Array " +"mit einer bestimmten Größe und initialisierten Elementen zu erstellen:\n" +"[codeblock]\n" +"var array = []\n" +"array.resize(10)\n" +"array.fill(0) # Initialisieren Sie die 10 Elemente auf 0.\n" +"[/codeblock]" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml @@ -9213,12 +9660,18 @@ msgid "" "not found. Optionally, the initial search index can be passed. Returns " "[code]-1[/code] if [code]from[/code] is out of bounds." msgstr "" +"Durchsucht das Array nach einem Wert und gibt dessen Index oder [code]-1[/" +"code] zurück, wenn er nicht gefunden wurde. Optional kann auch der " +"anfängliche Suchindex übergeben werden. Gibt [code]-1[/code] zurück, wenn " +"[code]from[/code] außerhalb der Grenzen liegt." #: doc/classes/Array.xml msgid "" "Searches the array in reverse order for a value and returns its index or " "[code]-1[/code] if not found." msgstr "" +"Durchsucht das Array in umgekehrter Reihenfolge nach einem Wert und gibt " +"dessen Index oder [code]-1[/code] zurück, wenn er nicht gefunden wird." #: doc/classes/Array.xml msgid "" @@ -9228,6 +9681,12 @@ msgid "" "[/code]. If the array is empty, accessing by index will pause project " "execution when running from the editor." msgstr "" +"Gibt das erste Element des Arrays zurück. Gibt einen Fehler aus und liefert " +"[code]null[/code], wenn das Array leer ist.\n" +"[b]Hinweis:[/b] Der Aufruf dieser Funktion ist nicht dasselbe wie das " +"Schreiben von [code]array[0][/code]. Wenn das Array leer ist, führt der " +"Zugriff über den Index zu einer Unterbrechung der Projektausführung, wenn es " +"vom Editor aus ausgeführt wird." #: doc/classes/Array.xml msgid "" @@ -9246,6 +9705,20 @@ msgid "" " pass\n" "[/codeblock]" msgstr "" +"Gibt [code]true[/code] zurück, wenn das Array den angegebenen Wert enthält.\n" +"[codeblock]\n" +"[\"innerhalb\", 7].has(\"innerhalb\") # True\n" +"[\"innerhalb\", 7].has(\"außerhalb\") # False\n" +"[\"innerhalb\", 7].has(7) # True\n" +"[\"innerhalb\", 7].has(\"7\") # False\n" +"[/codeblock]\n" +"[b]Hinweis:[/b] Dies entspricht der Verwendung des Operators [code]in[/code] " +"wie folgt:\n" +"[codeblock]\n" +"# Wird als `true` ausgewertet.\n" +"if 2 in [2, 4, 6, 8]:\n" +" pass\n" +"[/codeblock]" #: doc/classes/Array.xml msgid "" @@ -9256,6 +9729,13 @@ msgid "" "does [i]not[/i] imply the arrays are equal, because different arrays can " "have identical hash values due to hash collisions." msgstr "" +"Gibt einen gehashten 32-Bit-Ganzzahlwert zurück, der das Array und seinen " +"Inhalt darstellt.\n" +"[b]Hinweis:[/b] [Array]s mit gleichem Inhalt erzeugen immer identische " +"Hashwerte. Das Gegenteil ist jedoch nicht der Fall. Die Rückgabe von " +"identischen Hash-Werten bedeutet [i]nicht[/i], dass die Arrays gleich sind, " +"da verschiedene Arrays aufgrund von Hash-Kollisionen identische Hash-Werte " +"haben können." #: doc/classes/Array.xml msgid "" @@ -9266,6 +9746,15 @@ msgid "" "element is close to the beginning of the array (index 0). This is because " "all elements placed after the newly inserted element have to be reindexed." msgstr "" +"Fügt ein neues Element an einer bestimmten Position in das Array ein. Die " +"Position muss gültig sein oder am Ende des Arrays liegen ([code]pos == size()" +"[/code]).\n" +"[b]Hinweis:[/b] Diese Methode arbeitet in-place und gibt keinen Wert " +"zurück.\n" +"[b]Hinweis:[/b] Bei großen Arrays wird diese Methode langsamer sein, wenn " +"das eingefügte Element nahe am Anfang des Arrays (Index 0) liegt. Dies liegt " +"daran, dass alle Elemente, die nach dem neu eingefügten Element platziert " +"sind, neu indiziert werden müssen." #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml @@ -9280,6 +9769,9 @@ msgid "" "comparable types. If the elements can't be compared, [code]null[/code] is " "returned." msgstr "" +"Gibt den größten im Array enthaltenen Wert zurück, wenn alle Elemente von " +"vergleichbarem Typ sind. Wenn die Elemente nicht verglichen werden können, " +"wird [code]null[/code] zurückgegeben." #: doc/classes/Array.xml msgid "" @@ -9287,6 +9779,9 @@ msgid "" "comparable types. If the elements can't be compared, [code]null[/code] is " "returned." msgstr "" +"Gibt den kleinsten im Array enthaltenen Wert zurück, wenn alle Elemente von " +"vergleichbarem Typ sind. Wenn die Elemente nicht verglichen werden können, " +"wird [code]null[/code] zurückgegeben." #: doc/classes/Array.xml msgid "" @@ -9300,6 +9795,17 @@ msgid "" "removed element. The larger the array and the lower the index of the removed " "element, the slower [method pop_at] will be." msgstr "" +"Entfernt das Element des Arrays am Index [code]position[/code] und gibt es " +"zurück. Falls negativ, wird [code]position[/code] relativ zum Ende des " +"Arrays betrachtet. Lässt das Array unangetastet und gibt [code]null[/code] " +"zurück, wenn das Array leer ist oder wenn der Zugriff außerhalb der Grenzen " +"erfolgt. Es wird eine Fehlermeldung ausgegeben, wenn der Zugriff auf das " +"Array außerhalb der Grenzen erfolgt, aber nicht, wenn das Array leer ist.\n" +"[b]Hinweis:[/b] Bei großen Arrays kann diese Methode langsamer sein als " +"[method pop_back], da sie die Elemente des Arrays, die sich nach dem " +"entfernten Element befinden, neu indiziert werden müssen. Je größer das " +"Array und je niedriger der Index des entfernten Elements ist, desto " +"langsamer wird die [method pop_at] sein." #: doc/classes/Array.xml msgid "" @@ -9307,6 +9813,9 @@ msgid "" "if the array is empty, without printing an error message. See also [method " "pop_front]." msgstr "" +"Entfernt und gibt das letzte Element des Arrays zurück. Gibt [code]null[/" +"code] zurück, wenn das Array leer ist, ohne eine Fehlermeldung auszugeben. " +"Siehe auch [Methode pop_front]." #: doc/classes/Array.xml msgid "" @@ -9317,6 +9826,12 @@ msgid "" "pop_back] as it will reindex all the array's elements every time it's " "called. The larger the array, the slower [method pop_front] will be." msgstr "" +"Entfernt und gibt das erste Element des Arrays zurück. Gibt [code]null[/" +"code] zurück, wenn das Array leer ist, ohne eine Fehlermeldung auszugeben. " +"Siehe auch [Methode pop_back].\n" +"[b]Hinweis:[/b] Bei großen Arrays ist diese Methode viel langsamer als " +"[method pop_back], da sie bei jedem Aufruf alle Elemente des Arrays neu " +"indiziert. Je größer das Array, desto langsamer ist [method pop_front]." #: doc/classes/Array.xml #, fuzzy @@ -9332,6 +9847,11 @@ msgid "" "push_back] as it will reindex all the array's elements every time it's " "called. The larger the array, the slower [method push_front] will be." msgstr "" +"Fügt ein Element am Anfang des Arrays hinzu. Siehe auch [Methode " +"push_back].\n" +"[b]Hinweis:[/b] Bei großen Arrays ist diese Methode viel langsamer als " +"[method push_back], da sie bei jedem Aufruf alle Elemente des Arrays neu " +"indiziert. Je größer das Array, desto langsamer ist [method push_front]." #: doc/classes/Array.xml msgid "" @@ -9343,6 +9863,15 @@ msgid "" "element is close to the beginning of the array (index 0). This is because " "all elements placed after the removed element have to be reindexed." msgstr "" +"Entfernt ein Element aus dem Array nach Index. Wenn der Index im Array nicht " +"vorhanden ist, passiert nichts. Um ein Element durch die Suche nach seinem " +"Wert zu entfernen, verwenden Sie stattdessen [method erase].\n" +"[b]Hinweis:[/b] Diese Methode arbeitet in-place und gibt keinen Wert " +"zurück.\n" +"[b]Hinweis:[/b] Bei großen Arrays ist diese Methode langsamer, wenn das " +"entfernte Element nahe am Anfang des Arrays liegt (Index 0). Dies liegt " +"daran, dass alle Elemente, die nach dem entfernten Element platziert sind, " +"neu indiziert werden müssen." #: doc/classes/Array.xml msgid "" @@ -9350,6 +9879,9 @@ msgid "" "size is smaller, elements are cleared, if bigger, new elements are " "[code]null[/code]." msgstr "" +"Ändert die Größe des Arrays, damit es eine andere Anzahl von Elementen " +"enthält. Ist die Größe des Arrays kleiner, werden die Elemente gelöscht, ist " +"sie größer, sind die neuen Elemente [code]null[/code]." #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml @@ -9361,6 +9893,10 @@ msgid "" "the array. If the adjusted start index is out of bounds, this method " "searches from the end of the array." msgstr "" +"Durchsucht das Array in umgekehrter Reihenfolge. Optional kann ein Start-" +"Suchindex übergeben werden. Ist dieser negativ, wird der Startindex relativ " +"zum Ende des Arrays betrachtet. Liegt der eingestellte Startindex außerhalb " +"der Grenzen, sucht diese Methode ab dem Ende des Arrays." #: doc/classes/Array.xml msgid "" @@ -9369,6 +9905,11 @@ msgid "" "@GDScript.randi]. Call [method @GDScript.randomize] to ensure that a new " "seed will be used each time if you want non-reproducible shuffling." msgstr "" +"Mischt das Array so, dass die Elemente eine zufällige Reihenfolge haben. " +"Diese Methode verwendet den globalen Zufallszahlengenerator, der auch für " +"Methoden wie [method @GDScript.randi] verwendet wird. Rufen Sie [method " +"@GDScript.randomize] auf, um sicherzustellen, dass jedes Mal ein neuer Seed " +"verwendet wird, wenn Sie ein nicht reproduzierbares Mischen wünschen." #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml @@ -9384,6 +9925,11 @@ msgid "" "and upper index are inclusive, with the [code]step[/code] describing the " "change between indices while slicing." msgstr "" +"Dupliziert die in der Funktion beschriebene Teilmenge und gibt sie in einem " +"Array zurück, wobei das Array tief kopiert wird, wenn [code]deep[/code] " +"[code]true[/code] ist. Unterer und oberer Index sind inklusive, wobei " +"[code]step[/code] den Wechsel zwischen den Indizes während des Slicings " +"beschreibt." #: doc/classes/Array.xml msgid "" @@ -9397,6 +9943,16 @@ msgid "" "print(strings) # Prints [string1, string10, string11, string2]\n" "[/codeblock]" msgstr "" +"Sortiert das Array.\n" +"[b]Hinweis:[/b] Strings werden in alphabetischer Reihenfolge sortiert (im " +"Gegensatz zur natürlichen Reihenfolge). Dies kann zu unerwartetem Verhalten " +"führen, wenn ein Array mit Strings sortiert wird, die mit einer Zahlenfolge " +"enden. Betrachten Sie das folgende Beispiel:\n" +"[codeblock]\n" +"var strings = [\"string1\", \"string2\", \"string10\", \"string11\"]\n" +"strings.sort()\n" +"print(strings) # Prints [string1, string10, string11, string2]\n" +"[/codeblock]" #: doc/classes/Array.xml msgid "" @@ -9422,11 +9978,33 @@ msgid "" "print(my_items) # Prints [[4, Tomato], [5, Potato], [9, Rice]].\n" "[/codeblock]" msgstr "" +"Sortiert das Array mit einer eigenen Methode. Die Argumente sind ein Objekt, " +"das die Methode enthält, und der Name dieser Methode. Die benutzerdefinierte " +"Methode erhält zwei Argumente (ein Paar von Elementen aus dem Array) und " +"muss entweder [code]true[/code] oder [code]false[/code] zurückgeben.\n" +"Für zwei Elemente [code]a[/code] und [code]b[/code], wenn die angegebene " +"Methode [code]true[/code] zurückgibt, wird Element [code]b[/code] nach " +"Element [code]a[/code] im Array stehen.\n" +"[b]Hinweis:[/b] Sie können den Rückgabewert nicht zufällig bestimmen, da der " +"Heapsort-Algorithmus ein deterministisches Ergebnis erwartet. Dies würde zu " +"einem unerwarteten Verhalten führen.\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, \"Kartoffel\"], [9, \"Reis\"], [4, \"Tomate\"]]\n" +"my_items.sort_custom(MyCustomSorter, \"sort_ascending\")\n" +"print(my_items) # Prints [[4, Tomate], [5, Kartoffel], [9, Reis]].\n" +"[/codeblock]" #: doc/classes/ArrayMesh.xml msgid "" "[Mesh] type that provides utility for constructing a surface from arrays." msgstr "" +"[Mesh]-Typ, der das Konstruieren einer Oberfläche aus Arrays ermöglicht." #: doc/classes/ArrayMesh.xml msgid "" @@ -9455,12 +10033,40 @@ msgid "" "OpenGL/Face-culling]winding order[/url] for front faces of triangle " "primitive modes." msgstr "" +"Das [ArrayMesh] wird verwendet, um ein [Mesh] zu konstruieren, indem die " +"Attribute als Arrays angegeben werden.\n" +"Das einfachste Beispiel ist die Erstellung eines einzelnen Dreiecks:\n" +"[codeblock]\n" +"var vertices = PoolVector3Array()\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" +"# Initialisiere das ArrayMesh.\n" +"var arr_mesh = ArrayMesh.new()\n" +"var arrays = []\n" +"arrays.resize(ArrayMesh.ARRAY_MAX)\n" +"arrays[ArrayMesh.ARRAY_VERTEX] = vertices\n" +"# Erstelle das Mesh.\n" +"arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)\n" +"var m = MeshInstance.new()\n" +"m.mesh = arr_mesh\n" +"[/codeblock]\n" +"Die [MeshInstance] ist bereit, dem darzustellenden [SceneTree] hinzugefügt " +"zu werden.\n" +"Siehe auch [ImmediateGeometry], [MeshDataTool] und [SurfaceTool] für " +"prozedurale Geometrieerzeugung.\n" +"[b]Hinweis:[/b] Godot verwendet die [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]Wickelreihenfolge[/url] im Uhrzeigersinn für " +"Vorderseiten von Dreiecks-Primitivmodi." #: doc/classes/ArrayMesh.xml 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 "" +"Fügt einen Namen für eine Mischform hinzu, die mit der [method " +"add_surface_from_arrays] hinzugefügt wird. Muss aufgerufen werden, bevor die " +"Oberfläche hinzugefügt wird." #: doc/classes/ArrayMesh.xml msgid "" @@ -9479,76 +10085,105 @@ msgid "" "length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " "it is used." msgstr "" +"Erzeugt eine neue Oberfläche.\n" +"Flächen werden erstellt, um mit einem [code]primitive[/code] gerendert zu " +"werden, das einer der in [enum Mesh.PrimitiveType] definierten Typen sein " +"kann. (Es wird empfohlen, bei der Verwendung von Indizes nur Punkte, Linien " +"oder Dreiecke zu verwenden). Die [method Mesh.get_surface_count] wird zur " +"[code]surf_idx[/code] für diese neue Oberfläche.\n" +"Das Argument [code]arrays[/code] ist ein Array von Arrays. Siehe [enum " +"ArrayType] für die in diesem Array verwendeten Werte. Zum Beispiel ist " +"[code]arrays[0][/code] das Array der Vertices. Das erste Vertex-Sub-Array " +"ist immer erforderlich; die anderen sind optional. Das Hinzufügen eines " +"Index-Arrays versetzt diese Funktion in den \"Index-Modus\", in dem die " +"Vertex- und anderen Arrays zu Datenquellen werden und das Index-Array die " +"Reihenfolge der Vertexe definiert. Alle Sub-Arrays müssen die gleiche Länge " +"wie das Vertex-Array haben oder leer sein, mit Ausnahme der [constant " +"ARRAY_INDEX], falls sie verwendet wird." #: doc/classes/ArrayMesh.xml msgid "Removes all blend shapes from this [ArrayMesh]." -msgstr "" +msgstr "Entfernt alle Mischformen aus diesem [ArrayMesh]." #: doc/classes/ArrayMesh.xml msgid "Removes all surfaces from this [ArrayMesh]." -msgstr "" +msgstr "Entfernt alle Flächen aus diesem [ArrayMesh]." #: doc/classes/ArrayMesh.xml msgid "Returns the number of blend shapes that the [ArrayMesh] holds." -msgstr "" +msgstr "Gibt die Anzahl der Blendformen zurück, die das [ArrayMesh] enthält." #: doc/classes/ArrayMesh.xml msgid "Returns the name of the blend shape at this index." -msgstr "" +msgstr "Gibt den Namen der Blendform an diesem Index zurück." #: doc/classes/ArrayMesh.xml msgid "" "Will perform a UV unwrap on the [ArrayMesh] to prepare the mesh for " "lightmapping." msgstr "" +"Führt ein UV Unwrap auf dem [ArrayMesh] durch, um das Mesh für das " +"Lightmapping vorzubereiten." #: doc/classes/ArrayMesh.xml msgid "Will regenerate normal maps for the [ArrayMesh]." -msgstr "" +msgstr "Regeneriert Normal Maps für das [ArrayMesh]." #: doc/classes/ArrayMesh.xml msgid "" "Returns the index of the first surface with this name held within this " "[ArrayMesh]. If none are found, -1 is returned." msgstr "" +"Gibt den Index der ersten Fläche mit diesem Namen in diesem [ArrayMesh] " +"zurück. Wenn keine gefunden wird, wird -1 zurückgegeben." #: doc/classes/ArrayMesh.xml msgid "" "Returns the length in indices of the index array in the requested surface " "(see [method add_surface_from_arrays])." msgstr "" +"Gibt die Länge des Index-Arrays in der angeforderten Oberfläche in Indizes " +"zurück (siehe [method add_surface_from_arrays])." #: doc/classes/ArrayMesh.xml msgid "" "Returns the length in vertices of the vertex array in the requested surface " "(see [method add_surface_from_arrays])." msgstr "" +"Gibt die Länge des Vertex-Arrays in der angeforderten Oberfläche in Vertices " +"zurück (siehe [method add_surface_from_arrays])." #: doc/classes/ArrayMesh.xml msgid "" "Returns the format mask of the requested surface (see [method " "add_surface_from_arrays])." msgstr "" +"Gibt die Formatmaske der angeforderten Oberfläche zurück (siehe [method " +"add_surface_from_arrays])." #: doc/classes/ArrayMesh.xml msgid "Gets the name assigned to this surface." -msgstr "" +msgstr "Ruft den dieser Fläche zugewiesenen Namen ab." #: doc/classes/ArrayMesh.xml msgid "" "Returns the primitive type of the requested surface (see [method " "add_surface_from_arrays])." msgstr "" +"Gibt den primitiven Typ der angeforderten Fläche zurück (siehe [method " +"add_surface_from_arrays])." #: doc/classes/ArrayMesh.xml msgid "" "Removes a surface at position [code]surf_idx[/code], shifting greater " "surfaces one [code]surf_idx[/code] slot down." msgstr "" +"Entfernt eine Fläche an der Position [code]surf_idx[/code] und verschiebt " +"größere Flächen um einen [code]surf_idx[/code] Slot nach unten." #: doc/classes/ArrayMesh.xml msgid "Sets a name for a given surface." -msgstr "" +msgstr "Legt einen Namen für eine bestimmte Oberfläche fest." #: doc/classes/ArrayMesh.xml msgid "" @@ -9556,10 +10191,14 @@ msgid "" "[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 "" +"Aktualisiert einen bestimmten Bereich von Mesh-Arrays auf der GPU.\n" +"[b]Warnung:[/b] Nur verwenden, wenn Sie wissen, was Sie tun. Sie können " +"leicht Abstürze verursachen, wenn Sie diese Funktion mit falschen Argumenten " +"aufrufen." #: doc/classes/ArrayMesh.xml msgid "Sets the blend shape mode to one of [enum Mesh.BlendShapeMode]." -msgstr "" +msgstr "Setzt den Blendform-Modus auf einen der [enum Mesh.BlendShapeMode]." #: doc/classes/ArrayMesh.xml doc/classes/PrimitiveMesh.xml msgid "" @@ -9567,22 +10206,26 @@ msgid "" "Especially useful to avoid unexpected culling when using a shader to offset " "vertices." msgstr "" +"Überschreibt den [AABB] mit einem vom Benutzer definierten Wert für die " +"Verwendung mit Frustum Culling. Besonders nützlich, um unerwartetes Culling " +"zu vermeiden, wenn ein Shader zum Versetzen von Vertices verwendet wird." #: doc/classes/ArrayMesh.xml msgid "Value used internally when no indices are present." -msgstr "" +msgstr "Wert wird intern benutzt, wenn keine Indizes vorhanden sind." #: doc/classes/ArrayMesh.xml msgid "Amount of weights/bone indices per vertex (always 4)." -msgstr "" +msgstr "Anzahl der Gewichte/Knochenindizes pro Vertex (immer 4)." #: doc/classes/ArrayMesh.xml msgid "[PoolVector3Array], [PoolVector2Array], or [Array] of vertex positions." msgstr "" +"[PoolVector3Array], [PoolVector2Array] oder [Array] von Vertex-Positionen." #: doc/classes/ArrayMesh.xml msgid "[PoolVector3Array] of vertex normals." -msgstr "" +msgstr "[PoolVector3Array] von Vertex-Normalen." #: doc/classes/ArrayMesh.xml msgid "" @@ -9590,28 +10233,34 @@ msgid "" "first 3 floats determine the tangent, and the last the binormal direction as " "-1 or 1." msgstr "" +"[PoolRealArray] von Vertex-Tangenten. Jedes Element in Gruppen von 4 Floats, " +"die ersten 3 Floats bestimmen die Tangente, und das letzte die binormale " +"Richtung als -1 oder 1." #: doc/classes/ArrayMesh.xml msgid "[PoolColorArray] of vertex colors." -msgstr "" +msgstr "[PoolColorArray] von Vertex-Farben." #: doc/classes/ArrayMesh.xml msgid "[PoolVector2Array] for UV coordinates." -msgstr "" +msgstr "[PoolVector2Array] für UV-Koordinaten." #: doc/classes/ArrayMesh.xml msgid "[PoolVector2Array] for second UV coordinates." -msgstr "" +msgstr "[PoolVector2Array] für zweite UV-Koordinaten." #: doc/classes/ArrayMesh.xml msgid "" "[PoolRealArray] or [PoolIntArray] of bone indices. Each element in groups of " "4 floats." msgstr "" +"[PoolRealArray] oder [PoolIntArray] von Knochenindizes. Jedes Element in " +"Gruppen von 4 Floats." #: doc/classes/ArrayMesh.xml msgid "[PoolRealArray] of bone weights. Each element in groups of 4 floats." msgstr "" +"[PoolRealArray] von Knochengewichten. Jedes Element in Gruppen von 4 Floats." #: doc/classes/ArrayMesh.xml msgid "" @@ -9626,50 +10275,61 @@ msgid "" "vertices of each triangle. For lines, the index array is in pairs indicating " "the start and end of each line." msgstr "" +"[PoolIntArray] von Ganzzahlen, die als Indizes verwendet werden und auf " +"Vertices, Farben, Normalen, Tangenten und Texturen verweisen. Alle diese " +"Arrays müssen die gleiche Anzahl von Elementen haben wie das Vertex-Array. " +"Kein Index kann über die Größe des Vertex-Arrays hinausgehen. Wenn dieses " +"Index-Array vorhanden ist, versetzt es die Funktion in den \"Index-Modus\", " +"in dem der Index den *i*-ten Vertex, die Normale, die Tangente, die Farbe, " +"die UV, usw. auswählt. Das bedeutet, wenn man verschiedene Normalen oder " +"Farben entlang einer Kante haben will, muss man die Vertices duplizieren.\n" +"Bei Dreiecken wird das Index-Array als Tripel interpretiert, das sich auf " +"die Vertices der einzelnen Dreiecke bezieht. Bei Linien besteht das Index-" +"Array aus Paaren, die den Anfang und das Ende jeder Linie angeben." #: doc/classes/ArrayMesh.xml doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Represents the size of the [enum ArrayType] enum." -msgstr "" +msgstr "Stellt die Größe der Aufzählung [enum ArrayType] dar." #: doc/classes/ArrayMesh.xml msgid "Array format will include vertices (mandatory)." -msgstr "" +msgstr "Das Array-Format enthält Vertices (obligatorisch)." #: doc/classes/ArrayMesh.xml msgid "Array format will include normals." -msgstr "" +msgstr "Das Array-Format enthält Normalen." #: doc/classes/ArrayMesh.xml msgid "Array format will include tangents." -msgstr "" +msgstr "Das Array-Format enthält Tangenten." #: doc/classes/ArrayMesh.xml msgid "Array format will include a color array." -msgstr "" +msgstr "Das Array-Format enthält ein Farbarray." #: doc/classes/ArrayMesh.xml msgid "Array format will include UVs." -msgstr "" +msgstr "Das Array-Format enthält UVs." #: doc/classes/ArrayMesh.xml msgid "Array format will include another set of UVs." -msgstr "" +msgstr "Das Array-Format enthält einen weiteren Satz von UVs." #: doc/classes/ArrayMesh.xml msgid "Array format will include bone indices." -msgstr "" +msgstr "Das Array-Format enthält Knochenindizes." #: doc/classes/ArrayMesh.xml msgid "Array format will include bone weights." -msgstr "" +msgstr "Das Array-Format enthält Knochengewichte." #: doc/classes/ArrayMesh.xml msgid "Index array will be used." -msgstr "" +msgstr "Das Index-Array wird verwendet." #: doc/classes/ARVRAnchor.xml msgid "An anchor point in AR space." -msgstr "" +msgstr "Ein Ankerpunkt im AR-Raum." #: doc/classes/ARVRAnchor.xml msgid "" @@ -9687,16 +10347,32 @@ msgid "" "more about the real world out there especially if only part of the surface " "is in view." msgstr "" +"Der [ARVRAnchor]-Punkt ist ein räumlicher Knoten, der einen von der AR-" +"Plattform identifizierten Standort in der realen Welt auf eine Position " +"innerhalb der Spielwelt abbildet. Solange z. B. die Ebenenerkennung in ARKit " +"aktiviert ist, identifiziert und aktualisiert ARKit die Position von Ebenen " +"(Tische, Böden usw.) und erstellt Anker für sie.\n" +"Dieser Knoten wird durch seine eindeutige ID auf einen der Anker abgebildet. " +"Wenn Sie ein Signal erhalten, dass ein neuer Anker verfügbar ist, sollten " +"Sie diesen Knoten zu Ihrer Szene für diesen Anker hinzufügen. Sie können " +"Knoten vordefinieren und die ID festlegen; die Knoten bleiben dann einfach " +"auf 0,0,0, bis eine Ebene erkannt wird.\n" +"Denken Sie daran, dass, solange die Ebenenerkennung aktiviert ist, die " +"Größe, Platzierung und Ausrichtung eines Ankers aktualisiert wird, da die " +"Erkennungslogik mehr über die reale Welt da draußen erfährt, insbesondere " +"wenn nur ein Teil der Oberfläche im Blickfeld ist." #: doc/classes/ARVRAnchor.xml msgid "Returns the name given to this anchor." -msgstr "" +msgstr "Gibt den Namen zurück, der diesem Anker gegeben wurde." #: doc/classes/ARVRAnchor.xml 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 "" +"Gibt [code]true[/code] zurück, wenn der Anker verfolgt wird, und " +"[code]false[/code], wenn derzeit kein Anker mit dieser ID bekannt ist." #: doc/classes/ARVRAnchor.xml msgid "" @@ -9706,11 +10382,18 @@ msgid "" "can be used to create shadows/reflections on surfaces or for generating " "collision shapes." msgstr "" +"Falls vom [ARVRInterface] bereitgestellt, wird ein Mesh-Objekt für den Anker " +"zurückgegeben. Bei einem Anker kann es sich um eine Form handeln, die sich " +"auf das verfolgte Objekt bezieht, oder um ein Mesh, das eine Topologie in " +"Bezug auf den Anker bietet und zur Erstellung von Schatten/Reflexionen auf " +"Oberflächen oder zur Erzeugung von Kollisionsformen verwendet werden kann." #: doc/classes/ARVRAnchor.xml msgid "" "Returns a plane aligned with our anchor; handy for intersection testing." msgstr "" +"Gibt eine Ebene zurück, die an unserem Anker ausgerichtet ist; praktisch für " +"Schnittpunkttests." #: doc/classes/ARVRAnchor.xml msgid "" @@ -9718,6 +10401,9 @@ msgid "" "anchor relates to a table in the real world, this is the estimated size of " "the surface of that table." msgstr "" +"Gibt die geschätzte Größe der erkannten Fläche zurück. Wenn sich der Anker " +"beispielsweise auf einen Tisch in der realen Welt bezieht, ist dies die " +"geschätzte Größe der Oberfläche dieses Tisches." #: doc/classes/ARVRAnchor.xml msgid "" @@ -9728,6 +10414,12 @@ msgid "" "when the AR server identifies that two anchors represent different parts of " "the same plane and merges them." msgstr "" +"Die ID des Ankers. Sie können diese festlegen, bevor der Anker selbst " +"existiert. Der erste Anker erhält eine ID von [code]1[/code], der zweite " +"eine ID von [code]2[/code] usw. Wenn Anker entfernt werden, kann die Engine " +"dann die entsprechende ID neuen Ankern zuweisen. Die häufigste Situation, in " +"der Anker \"verschwinden\", ist, wenn der AR-Server feststellt, dass zwei " +"Anker verschiedene Teile derselben Ebene darstellen, und sie zusammenführt." #: doc/classes/ARVRAnchor.xml msgid "" @@ -9735,12 +10427,17 @@ msgid "" "available. This is especially important for topology that is constantly " "being [code]mesh_updated[/code]." msgstr "" +"Wird ausgesendet, wenn sich das mit dem Anker verbundene Netz ändert oder " +"eines verfügbar wird. Dies ist besonders wichtig für eine Topologie, die " +"ständig [code]mesh_updated[/code] wird." #: doc/classes/ARVRCamera.xml msgid "" "A camera node with a few overrules for AR/VR applied, such as location " "tracking." msgstr "" +"Ein Kameraknoten, der einige Grundregeln für AR/VR anwendet, z. B. die " +"Standortverfolgung." #: doc/classes/ARVRCamera.xml msgid "" @@ -9755,10 +10452,23 @@ msgid "" "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 "" +"Dies ist ein räumlicher Hilfsknoten für unsere Kamera; beachten Sie, dass " +"bei stereoskopischem Rendering (VR-HMD) die meisten Kameraeigenschaften " +"ignoriert werden, da die HMD-Informationen sie außer Kraft setzen. Die " +"einzigen Eigenschaften, auf die man sich verlassen kann, sind die Nah- und " +"Fern-Ebene.\n" +"Die Position und Ausrichtung dieses Knotens wird vom ARVR-Server automatisch " +"aktualisiert, um die Position des HMD darzustellen, wenn eine solche " +"Verfolgung verfügbar ist, und kann somit von der Spiellogik verwendet " +"werden. Beachten Sie, dass der Render-Thread im Gegensatz zum ARVR " +"Controller Zugriff auf die aktuellsten Tracking-Daten des HMD hat und die " +"Position der ARVRCamera daher einige Millisekunden hinter dem zurückbleiben " +"kann, was für das Rendering verwendet wird." #: doc/classes/ARVRController.xml msgid "A spatial node representing a spatially-tracked controller." msgstr "" +"Ein räumlicher Knoten, der einen räumlich verfolgten Controller darstellt." #: doc/classes/ARVRController.xml msgid "" @@ -9775,18 +10485,35 @@ msgid "" "[ARVRServer]. This makes this node ideal to add child nodes to visualize the " "controller." msgstr "" +"Dies ist ein räumlicher Hilfsknoten, der mit der Verfolgung von Controllern " +"verbunden ist. Er bietet auch mehrere praktische Durchreichungen für den " +"Zustand von Schaltflächen und dergleichen auf den Controllern.\n" +"Controller sind durch ihre ID verknüpft. Sie können Controller-Knoten " +"erstellen, bevor die Controller verfügbar sind. Wenn Ihr Spiel immer zwei " +"Controller verwendet (einen für jede Hand), können Sie die Controller mit " +"der ID 1 und 2 vordefinieren; sie werden aktiv, sobald die Controller " +"erkannt werden. Wenn Sie erwarten, dass zusätzliche Controller verwendet " +"werden, sollten Sie auf die Signale reagieren und ARVRController-Knoten zu " +"Ihrer Szene hinzufügen.\n" +"Die Position des Controllerknotens wird automatisch durch den [ARVRServer] " +"aktualisiert. Dies macht diesen Knoten ideal, um Kindknoten zur " +"Visualisierung des Controllers hinzuzufügen." #: doc/classes/ARVRController.xml msgid "" "If active, returns the name of the associated controller if provided by the " "AR/VR SDK used." msgstr "" +"Wenn aktiv, wird der Name des zugehörigen Controllers zurückgegeben, sofern " +"er vom verwendeten AR/VR-SDK bereitgestellt wird." #: doc/classes/ARVRController.xml msgid "" "Returns the hand holding this controller, if known. See [enum " "ARVRPositionalTracker.TrackerHand]." msgstr "" +"Gibt die Hand zurück, die diesen Controller hält, falls bekannt. Siehe [enum " +"ARVRPositionalTracker.TrackerHand]." #: doc/classes/ARVRController.xml #, fuzzy @@ -9802,6 +10529,8 @@ msgid "" "Returns the value of the given axis for things like triggers, touchpads, " "etc. that are embedded into the controller." msgstr "" +"Gibt den Wert der angegebenen Achse für Dinge wie Trigger, Touchpads usw. " +"zurück, die in den Controller eingebettet sind." #: doc/classes/ARVRController.xml msgid "" @@ -9812,12 +10541,22 @@ msgid "" "the AR/VR controllers. This ID is purely offered as information so you can " "link up the controller with its joystick entry." msgstr "" +"Gibt die ID des Joystick-Objekts zurück, das mit diesem verbunden ist. Jeder " +"vom [ARVRServer] verfolgte Controller, der Tasten und Achsen hat, wird auch " +"als Joystick in Godot registriert. Das bedeutet, dass alle normalen Joystick-" +"Verfolgungen und Eingabe-Zuordnungen für Tasten und Achsen auf den AR/VR-" +"Controllern funktionieren werden. Diese ID wird lediglich als Information " +"angeboten, damit Sie den Controller mit seinem Joystick-Eintrag verknüpfen " +"können." #: doc/classes/ARVRController.xml msgid "" "If provided by the [ARVRInterface], this returns a mesh associated with the " "controller. This can be used to visualize the controller." msgstr "" +"Falls von der [ARVRInterface] bereitgestellt, wird ein mit dem Controller " +"verbundenes Netz zurückgegeben. Dieses kann zur Visualisierung des " +"Controllers verwendet werden." #: doc/classes/ARVRController.xml msgid "" @@ -9825,6 +10564,9 @@ msgid "" "pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] " "constants." msgstr "" +"Gibt [code]true[/code] zurück, wenn die Taste bei Index [code]button[/code] " +"gedrückt ist. Siehe [enum JoystickList], insbesondere die [code]JOY_VR_*[/" +"code] Konstanten." #: doc/classes/ARVRController.xml msgid "" @@ -9838,6 +10580,16 @@ msgid "" "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 "" +"Die ID des Controllers.\n" +"Eine Controller-ID von 0 ist ungebunden und führt immer zu einem inaktiven " +"Knoten. Die Controller-ID 1 ist für den ersten Controller reserviert, der " +"sich als linker Controller identifiziert, und die ID 2 ist für den ersten " +"Controller reserviert, der sich als rechter Controller identifiziert.\n" +"Für jeden weiteren Controller, den der [ARVRServer] erkennt, wird mit der " +"Controller-ID 3 fortgefahren.\n" +"Wenn ein Controller ausgeschaltet wird, wird sein Steckplatz freigegeben. " +"Dadurch wird sichergestellt, dass die Controller dieselbe ID behalten, auch " +"wenn Controller mit niedrigeren IDs ausgeschaltet werden." #: doc/classes/ARVRController.xml msgid "" @@ -9847,14 +10599,21 @@ msgid "" "This is a useful property to animate if you want the controller to vibrate " "for a limited duration." msgstr "" +"Der Grad, in dem die Steuerung vibriert. Der Bereich reicht von [code]0.0[/" +"code] bis [code]1.0[/code]. Wenn er geändert wird, wird [member " +"ARVRPositionalTracker.rumble] entsprechend aktualisiert.\n" +"Dies ist eine nützliche Eigenschaft zum Animieren, wenn der Controller für " +"eine begrenzte Dauer vibrieren soll." #: doc/classes/ARVRController.xml msgid "Emitted when a button on this controller is pressed." msgstr "" +"Wird ausgesendet, wenn eine Taste auf diesem Steuergerät gedrückt wird." #: doc/classes/ARVRController.xml msgid "Emitted when a button on this controller is released." msgstr "" +"Wird ausgesendet, wenn eine Taste an diesem Controller losgelassen wird." #: doc/classes/ARVRController.xml msgid "" @@ -9862,10 +10621,13 @@ msgid "" "becomes available. Generally speaking this will be a static mesh after " "becoming available." msgstr "" +"Wird ausgesendet, wenn sich das mit dem Controller verknüpfte Netz ändert " +"oder wenn eines verfügbar wird. Im Allgemeinen wird dies ein statisches Mesh " +"sein, nachdem es verfügbar geworden ist." #: doc/classes/ARVRInterface.xml msgid "Base class for an AR/VR interface implementation." -msgstr "" +msgstr "Basisklasse für die Implementierung einer AR/VR-Schnittstelle." #: doc/classes/ARVRInterface.xml msgid "" @@ -9878,6 +10640,15 @@ msgid "" "give us a working setup. You can query the available interfaces through " "[ARVRServer]." msgstr "" +"Diese Klasse muss implementiert werden, um eine AR- oder VR-Plattform für " +"Godot verfügbar zu machen. Diese sollten als C++-Module oder GDNative-Module " +"implementiert werden (beachten Sie, dass für GDNative die Unterklasse " +"ARVRScriptInterface verwendet werden sollte). Ein Teil der Schnittstelle ist " +"für GDScript offengelegt, so dass Sie eine AR- oder VR-Plattform erkennen, " +"aktivieren und konfigurieren können.\n" +"Die Schnittstellen sollten so geschrieben sein, dass man durch einfaches " +"Aktivieren ein funktionierendes Setup erhält. Sie können die verfügbaren " +"Schnittstellen über [ARVRServer] abfragen." #: doc/classes/ARVRInterface.xml msgid "" @@ -9885,22 +10656,31 @@ msgid "" "background, this method returns the feed ID in the [CameraServer] for this " "interface." msgstr "" +"Wenn es sich um eine AR-Schnittstelle handelt, die die Anzeige eines " +"Kamerafeeds als Hintergrund erfordert, gibt diese Methode die Feed-ID im " +"[CameraServer] für diese Schnittstelle zurück." #: doc/classes/ARVRInterface.xml msgid "" "Returns a combination of [enum Capabilities] flags providing information " "about the capabilities of this interface." msgstr "" +"Gibt eine Kombination von [enum Capabilities]-Flags zurück, die " +"Informationen über die Fähigkeiten dieser Schnittstelle liefern." #: doc/classes/ARVRInterface.xml msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)." msgstr "" +"Gibt den Namen dieser Schnittstelle zurück (OpenVR, OpenHMD, ARKit, etc.)." #: doc/classes/ARVRInterface.xml msgid "" "Returns the resolution at which we should render our intermediate results " "before things like lens distortion are applied by the VR platform." msgstr "" +"Gibt die Auflösung zurück, mit der wir unsere Zwischenergebnisse rendern " +"sollten, bevor Dinge wie Linsenverzerrungen von der VR-Plattform angewendet " +"werden." #: doc/classes/ARVRInterface.xml msgid "" @@ -9908,6 +10688,9 @@ msgid "" "provide feedback to the user whether there are issues with positional " "tracking." msgstr "" +"Gibt, falls unterstützt, den Status unserer Positionsbestimmung zurück. So " +"können Sie dem Benutzer eine Rückmeldung geben, ob es Probleme mit der " +"Positionsbestimmung gibt." #: doc/classes/ARVRInterface.xml msgid "" @@ -9928,45 +10711,72 @@ msgid "" "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 "" +"Rufen Sie dies auf, um diese Schnittstelle zu initialisieren. Die erste " +"Schnittstelle, die initialisiert wird, wird als primäre Schnittstelle " +"identifiziert und wird für die Rendering-Ausgabe verwendet.\n" +"Nach der Initialisierung der Schnittstelle, die Sie verwenden möchten, " +"müssen Sie den AR/VR-Modus eines Ansichtsfensters aktivieren und das " +"Rendering sollte beginnen.\n" +"[b]Hinweis:[/b] Sie müssen den AR/VR-Modus im Haupt-Viewport für jedes Gerät " +"aktivieren, das die Hauptausgabe von Godot verwendet, z. B. für mobile VR.\n" +"Wenn Sie dies für eine Plattform tun, die ihre eigene Ausgabe verarbeitet " +"(wie OpenVR), zeigt Godot nur ein Auge ohne Verzerrung auf dem Bildschirm " +"an. Alternativ können Sie einen separaten Viewport-Knoten zu Ihrer Szene " +"hinzufügen und AR/VR in diesem Viewport aktivieren. Es wird für die Ausgabe " +"an das HMD verwendet, so dass Sie im Hauptfenster alles tun können, was Sie " +"möchten, z. B. eine separate Kamera als Zuschauerkamera verwenden oder etwas " +"völlig anderes rendern.\n" +"Sie können zusätzliche Schnittstellen aktivieren, die derzeit nicht " +"verwendet werden. Dies kann sinnvoll sein, wenn Sie Controller von anderen " +"Plattformen verfolgen wollen. Zum jetzigen Zeitpunkt kann jedoch nur eine " +"Schnittstelle auf ein HMD gerendert werden." #: doc/classes/ARVRInterface.xml msgid "" "Returns [code]true[/code] if the current output of this interface is in " "stereo." msgstr "" +"Gibt [code]true[/code] zurück, wenn die aktuelle Ausgabe dieser " +"Schnittstelle in Stereo ist." #: doc/classes/ARVRInterface.xml msgid "Turns the interface off." -msgstr "" +msgstr "Schaltet die Schnittstelle aus." #: doc/classes/ARVRInterface.xml msgid "On an AR interface, [code]true[/code] if anchor detection is enabled." msgstr "" +"Auf einer AR-Schnittstelle: [code]true[/code], wenn die Ankererkennung " +"aktiviert ist." #: doc/classes/ARVRInterface.xml msgid "[code]true[/code] if this interface been initialized." -msgstr "" +msgstr "[code]true[/code] wenn diese Schnittstelle initialisiert wurde." #: doc/classes/ARVRInterface.xml msgid "[code]true[/code] if this is the primary interface." -msgstr "" +msgstr "[code]true[/code], wenn dies die primäre Schnittstelle ist." #: doc/classes/ARVRInterface.xml msgid "No ARVR capabilities." -msgstr "" +msgstr "Keine ARVR-Fähigkeiten." #: doc/classes/ARVRInterface.xml msgid "" "This interface can work with normal rendering output (non-HMD based AR)." msgstr "" +"Diese Schnittstelle kann mit normaler Rendering-Ausgabe arbeiten (nicht-HMD-" +"basierte AR)." #: doc/classes/ARVRInterface.xml msgid "This interface supports stereoscopic rendering." -msgstr "" +msgstr "Diese Schnittstelle unterstützt das stereoskopische Rendering." #: doc/classes/ARVRInterface.xml msgid "This interface supports AR (video background and real world tracking)." msgstr "" +"Diese Schnittstelle unterstützt AR (Video-Hintergrund und Real-World-" +"Tracking)." #: doc/classes/ARVRInterface.xml msgid "" @@ -9976,6 +10786,12 @@ msgid "" "[method get_render_targetsize]). Using a separate viewport node frees up the " "main viewport for other purposes." msgstr "" +"Diese Schnittstelle gibt die Daten an ein externes Gerät aus. Wird das " +"Hauptansichtsfenster verwendet, ist die Bildschirmausgabe ein unveränderter " +"Puffer entweder des linken oder des rechten Auges (gestreckt, wenn die Größe " +"des Ansichtsfensters nicht auf das gleiche Seitenverhältnis von [method " +"get_render_targetsize] geändert wird). Die Verwendung eines separaten " +"Ansichtsfenster-Knotens macht das Hauptansichtfenster für andere Zwecke frei." #: doc/classes/ARVRInterface.xml msgid "" @@ -9983,50 +10799,67 @@ msgid "" "information for our camera node or when stereo scopic rendering is not " "supported." msgstr "" +"Mono-Ausgabe, diese wird meist intern verwendet, wenn " +"Positionierungsinformationen für unseren Kameraknoten abgerufen werden oder " +"wenn das stereoskopische Rendering nicht unterstützt wird." #: doc/classes/ARVRInterface.xml msgid "" "Left eye output, this is mostly used internally when rendering the image for " "the left eye and obtaining positioning and projection information." msgstr "" +"Die Ausgabe für das linke Auge wird hauptsächlich intern verwendet, um das " +"Bild für das linke Auge zu rendern und Informationen zur Positionierung und " +"Projektion zu erhalten." #: doc/classes/ARVRInterface.xml msgid "" "Right eye output, this is mostly used internally when rendering the image " "for the right eye and obtaining positioning and projection information." msgstr "" +"Die Ausgabe für das rechte Auge wird hauptsächlich intern verwendet, um das " +"Bild für das rechte Auge zu rendern und Informationen zur Positionierung und " +"Projektion zu erhalten." #: doc/classes/ARVRInterface.xml msgid "Tracking is behaving as expected." -msgstr "" +msgstr "Das Tracking verhält sich wie erwartet." #: doc/classes/ARVRInterface.xml msgid "" "Tracking is hindered by excessive motion (the player is moving faster than " "tracking can keep up)." msgstr "" +"Das Tracking wird durch übermäßige Bewegung behindert (der Spieler bewegt " +"sich schneller, als die Verfolgung mithalten kann)." #: doc/classes/ARVRInterface.xml msgid "" "Tracking is hindered by insufficient features, it's too dark (for camera-" "based tracking), player is blocked, etc." msgstr "" +"Das Tracking wird durch unzureichende Fähigkeiten behindert, es ist zu " +"dunkel (für kamerabasiertes Tracking), der Spieler ist blockiert, usw." #: doc/classes/ARVRInterface.xml msgid "" "We don't know the status of the tracking or this interface does not provide " "feedback." msgstr "" +"Wir kennen den Status der Nachverfolgung nicht, oder diese Schnittstelle " +"gibt keine Rückmeldung." #: doc/classes/ARVRInterface.xml msgid "" "Tracking is not functional (camera not plugged in or obscured, lighthouses " "turned off, etc.)." msgstr "" +"Das Tracking funktioniert nicht (Kamera nicht eingesteckt oder verdeckt, " +"Lighthouses ausgeschaltet usw.)." #: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml msgid "GDNative wrapper for an ARVR interface." -msgstr "" +msgstr "GDNative-Wrapper für eine ARVR-Schnittstelle." #: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml msgid "" @@ -10034,10 +10867,14 @@ msgid "" "To use a GDNative ARVR interface, simply instantiate this object and set " "your GDNative library containing the ARVR interface implementation." msgstr "" +"Dies ist eine Wrapper-Klasse für GDNative-Implementierungen der ARVR-" +"Schnittstelle. Um eine GDNative-ARVR-Schnittstelle zu verwenden, " +"instanziieren Sie einfach dieses Objekt und definieren Sie Ihre GDNative-" +"Bibliothek, die die ARVR-Schnittstellenimplementierung enthält." #: doc/classes/ARVROrigin.xml msgid "The origin point in AR/VR." -msgstr "" +msgstr "Der Ursprungspunkt in AR/VR." #: doc/classes/ARVROrigin.xml msgid "" @@ -10054,6 +10891,21 @@ msgid "" "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 "" +"Dies ist ein spezieller Knoten innerhalb des AR/VR-Systems, der die " +"physische Position des Zentrums unseres Tracking-Raums der virtuellen " +"Position innerhalb unserer Spielwelt zuordnet.\n" +"Es sollte nur einen dieser Knoten in Ihrer Szene geben und Sie müssen einen " +"haben. Alle ARVRCamera-, ARVRController- und ARVRAnchor-Knoten sollten " +"direkte Kinder dieses Knotens sein, damit das räumliche Tracking korrekt " +"funktioniert.\n" +"Es ist die Position dieses Knotens, die du aktualisierst, wenn dein " +"Charakter sich durch deine Spielwelt bewegen muss, während wir uns in der " +"realen Welt nicht bewegen. Die Bewegung in der realen Welt erfolgt immer in " +"Bezug auf diesen Ursprungspunkt.\n" +"Wenn deine Figur zum Beispiel ein Auto fährt, sollte der ARVROrigin-Knoten " +"ein untergeordneter Knoten dieses Autos sein. Oder wenn du ein Teleport-" +"System implementierst, um deinen Charakter zu bewegen, solltest du die " +"Position dieses Knotens ändern." #: doc/classes/ARVROrigin.xml msgid "" @@ -10061,10 +10913,14 @@ msgid "" "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 "" +"Ermöglicht es Ihnen, den Maßstab an die Einheiten Ihres Spiels anzupassen. " +"Die meisten AR/VR-Plattformen gehen von einem Maßstab von 1 Einheit der " +"Spielwelt = 1 Meter der realen Welt aus.\n" +"[b]Hinweis:[/b] Diese Methode ist ein Passthrough zum [ARVRServer] selbst." #: doc/classes/ARVRPositionalTracker.xml msgid "A tracked object." -msgstr "" +msgstr "Ein getracktes Objekt." #: doc/classes/ARVRPositionalTracker.xml msgid "" @@ -10079,35 +10935,53 @@ msgid "" "hood objects that make this all work. These are mostly exposed so that " "GDNative-based interfaces can interact with them." msgstr "" +"Eine Instanz dieses Objekts stellt ein Gerät dar, das verfolgt wird, z. B. " +"einen Controller oder Ankerpunkt. HMDs werden hier nicht dargestellt, da sie " +"intern gehandhabt werden.\n" +"Wenn Controller eingeschaltet werden und die AR/VR-Schnittstelle sie " +"erkennt, werden Instanzen dieses Objekts automatisch zur Liste der aktiven " +"Tracking-Objekte hinzugefügt, die über den [ARVRServer] zugänglich sind.\n" +"Der [ARVRController] und der [ARVRAnchor] verbrauchen beide Objekte dieses " +"Typs und sollten in Ihrem Projekt verwendet werden. Die Positions-Tracker " +"sind nur Objekte, die unter der Haube liegen und dafür sorgen, dass das " +"alles funktioniert. Sie sind meist offengelegt, damit GDNative-basierte " +"Schnittstellen mit ihnen interagieren können." #: doc/classes/ARVRPositionalTracker.xml msgid "" "Returns the hand holding this tracker, if known. See [enum TrackerHand] " "constants." msgstr "" +"Gibt die Hand zurück, die diesen Tracker hält, falls bekannt. Siehe [enum " +"TrackerHand] Konstanten." #: doc/classes/ARVRPositionalTracker.xml msgid "" "If this is a controller that is being tracked, the controller will also be " "represented by a joystick entry with this ID." msgstr "" +"Wenn es sich um einen Controller handelt, der verfolgt wird, wird der " +"Controller auch durch einen Joystick-Eintrag mit dieser ID dargestellt." #: doc/classes/ARVRPositionalTracker.xml msgid "" "Returns the mesh related to a controller or anchor point if one is available." msgstr "" +"Gibt das Netz zurück, das mit einem Controller oder Ankerpunkt verbunden " +"ist, falls ein solcher vorhanden ist." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns the controller or anchor point's name if available." msgstr "" +"Gibt den Namen des Controllers oder des Ankerpunkts zurück, falls vorhanden." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns the controller's orientation matrix." -msgstr "" +msgstr "Gibt die Orientierungsmatrix des Controllers zurück." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns the world-space controller position." -msgstr "" +msgstr "Gibt die Position des Controllers im Raum zurück." #: doc/classes/ARVRPositionalTracker.xml msgid "" @@ -10115,60 +10989,75 @@ msgid "" "tracker type and matches the ID you need to specify for nodes such as the " "[ARVRController] and [ARVRAnchor] nodes." msgstr "" +"Gibt die interne Tracker-ID zurück. Diese identifiziert den Tracker " +"eindeutig pro Tracker-Typ und entspricht der ID, die Sie für Knoten wie die " +"[ARVRController]- und [ARVRAnchor]-Knoten angeben müssen." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns [code]true[/code] if this device tracks orientation." msgstr "" +"Gibt [code]true[/code] zurück, wenn dieses Gerät die Ausrichtung verfolgt." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns [code]true[/code] if this device tracks position." msgstr "" +"Gibt [code]true[/code] zurück, wenn dieses Gerät die Position verfolgt." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns the transform combining this device's orientation and position." msgstr "" +"Gibt die Transformation zurück, die die Ausrichtung und Position dieses " +"Geräts kombiniert." #: doc/classes/ARVRPositionalTracker.xml msgid "Returns the tracker's type." -msgstr "" +msgstr "Gibt den Typ des Tracker zurück." #: doc/classes/ARVRPositionalTracker.xml 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 "" +"Der Grad, wie stark der Tracker wackelt. Der Bereich reicht von [code]0.0[/" +"code] bis [code]1.0[/code] mit einer Genauigkeit von [code].01[/code]." #: doc/classes/ARVRPositionalTracker.xml msgid "The hand this tracker is held in is unknown or not applicable." msgstr "" +"Die Hand, in der dieser Tracker gehalten wird, ist unbekannt oder nicht " +"anwendbar." #: doc/classes/ARVRPositionalTracker.xml msgid "This tracker is the left hand controller." -msgstr "" +msgstr "Dieser Tracker ist der Controller für die linke Hand." #: doc/classes/ARVRPositionalTracker.xml msgid "This tracker is the right hand controller." -msgstr "" +msgstr "Dieser Tracker ist der Controller für die rechte Hand." #: doc/classes/ARVRServer.xml msgid "Server for AR and VR features." -msgstr "" +msgstr "Server für AR- und VR-Funktionen." #: doc/classes/ARVRServer.xml msgid "" "The AR/VR server is the heart of our Advanced and Virtual Reality solution " "and handles all the processing." msgstr "" +"Der AR/VR-Server ist das Herzstück unserer Advanced and Virtual Reality-" +"Lösung und übernimmt die gesamte Verarbeitung." #: doc/classes/ARVRServer.xml msgid "Registers an [ARVRInterface] object." -msgstr "" +msgstr "Registriert ein [ARVRInterface]-Objekt." #: doc/classes/ARVRServer.xml msgid "" "Registers a new [ARVRPositionalTracker] that tracks a spatial location in " "real space." msgstr "" +"Registriert einen neuen [ARVRPositionalTracker], der eine räumliche Position " +"im realen Raum verfolgt." #: doc/classes/ARVRServer.xml msgid "" @@ -10192,11 +11081,34 @@ msgid "" "button on a controller for a short period of time, or when implementing a " "teleport mechanism." msgstr "" +"Das ist eine wichtige Funktion, die man richtig verstehen muss. AR- und VR-" +"Plattformen gehen alle etwas anders mit der Positionierung um.\n" +"Bei Plattformen, die kein räumliches Tracking bieten, ist unser " +"Ursprungspunkt (0,0,0) die Position unseres HMD, aber Sie haben wenig " +"Kontrolle über die Richtung, in die der Spieler in der realen Welt blickt.\n" +"Bei Plattformen, die räumliches Tracking bieten, hängt unser Ausgangspunkt " +"sehr stark vom System ab. Bei OpenVR ist unser Ausgangspunkt in der Regel " +"das Zentrum des Tracking-Raums, also auf dem Boden. Bei anderen Plattformen " +"ist es oft die Position der Tracking-Kamera.\n" +"Mit dieser Methode können Sie Ihren Tracker auf die Position des HMD " +"zentrieren. Dabei wird die aktuelle Position des HMD verwendet, um alle " +"Tracking-Daten anzupassen; im Wesentlichen wird die reale Welt an die " +"aktuelle Position des Spielers in der Spielwelt angepasst.\n" +"Damit diese Methode brauchbare Ergebnisse liefert, müssen Tracking-" +"Informationen verfügbar sein. Dies dauert oft ein paar Frames nach dem Start " +"des Spiels.\n" +"Sie sollten diese Methode aufrufen, nachdem ein paar Sekunden vergangen " +"sind. Zum Beispiel, wenn der Benutzer eine Neuausrichtung der Anzeige " +"anfordert, indem er eine bestimmte Taste auf einem Controller für eine kurze " +"Zeitspanne gedrückt hält, oder wenn er einen Teleportmechanismus " +"implementiert." #: doc/classes/ARVRServer.xml msgid "" "Clears our current primary interface if it is set to the provided interface." msgstr "" +"Löscht unsere aktuelle primäre Schnittstelle, wenn sie auf die angegebene " +"Schnittstelle eingestellt ist." #: doc/classes/ARVRServer.xml msgid "" @@ -10204,15 +11116,20 @@ msgid "" "capabilities of an AR/VR platform, you can find the interface for that " "platform by name and initialize it." msgstr "" +"Findet eine Schnittstelle anhand ihres Namens. Wenn Ihr Projekt z. B. die " +"Funktionen einer AR/VR-Plattform nutzt, können Sie die Schnittstelle für " +"diese Plattform anhand ihres Namens finden und sie initialisieren." #: doc/classes/ARVRServer.xml msgid "Returns the primary interface's transformation." -msgstr "" +msgstr "Gibt die Transformation der primären Schnittstelle zurück." #: doc/classes/ARVRServer.xml msgid "" "Returns the interface registered at a given index in our list of interfaces." msgstr "" +"Gibt die Schnittstelle zurück, die unter einem bestimmten Index in unserer " +"Liste der Schnittstellen registriert ist." #: doc/classes/ARVRServer.xml msgid "" @@ -10222,11 +11139,18 @@ msgid "" "try to initialize each interface and use the first one that returns " "[code]true[/code]." msgstr "" +"Gibt die Anzahl der derzeit beim AR/VR-Server registrierten Schnittstellen " +"zurück. Wenn Ihr Projekt mehrere AR/VR-Plattformen unterstützt, können Sie " +"die verfügbaren Schnittstellen durchsehen und dem Benutzer entweder eine " +"Auswahl präsentieren oder einfach versuchen, jede Schnittstelle zu " +"initialisieren und die erste zu verwenden, die [code]true[/code] zurückgibt." #: doc/classes/ARVRServer.xml msgid "" "Returns a list of available interfaces the ID and name of each interface." msgstr "" +"Liefert eine Liste der verfügbaren Schnittstellen, die ID und den Namen " +"jeder Schnittstelle." #: doc/classes/ARVRServer.xml msgid "" @@ -10234,6 +11158,9 @@ msgid "" "the AR/VR eyes to [VisualServer]. The value comes from an internal call to " "[method OS.get_ticks_usec]." msgstr "" +"Gibt den absoluten Zeitstempel (in μs) der letzten [ARVRServer]-Übertragung " +"der AR/VR-Augen an [VisualServer] zurück. Der Wert stammt aus einem internen " +"Aufruf der [Methode OS.get_ticks_usec]." #: doc/classes/ARVRServer.xml msgid "" @@ -10241,6 +11168,9 @@ msgid "" "difference between [method get_last_commit_usec] and [method " "get_last_process_usec] when committing." msgstr "" +"Gibt die Dauer (in μs) des letzten Frames zurück. Dies wird als Differenz " +"zwischen [method get_last_commit_usec] und [method get_last_process_usec] " +"beim Commit berechnet." #: doc/classes/ARVRServer.xml msgid "" @@ -10248,46 +11178,55 @@ msgid "" "callback. The value comes from an internal call to [method OS." "get_ticks_usec]." msgstr "" +"Gibt den absoluten Zeitstempel (in μs) des letzten [ARVRServer]-Prozess-" +"Callbacks zurück. Der Wert stammt aus einem internen Aufruf der [Methode OS." +"get_ticks_usec]." #: doc/classes/ARVRServer.xml msgid "" "Returns the reference frame transform. Mostly used internally and exposed " "for GDNative build interfaces." msgstr "" +"Gibt die Transformation des Referenzrahmens zurück. Wird meist intern " +"verwendet und für GDNative-Build-Schnittstellen bereitgestellt." #: doc/classes/ARVRServer.xml msgid "Returns the positional tracker at the given ID." -msgstr "" +msgstr "Gibt den Positionstracker an der angegebenen ID zurück." #: doc/classes/ARVRServer.xml msgid "Returns the number of trackers currently registered." -msgstr "" +msgstr "Gibt die Anzahl der derzeit registrierten Tracker zurück." #: doc/classes/ARVRServer.xml msgid "Removes this interface." -msgstr "" +msgstr "Entfernt diese Schnittstelle." #: doc/classes/ARVRServer.xml msgid "Removes this positional tracker." -msgstr "" +msgstr "Entfernt diesen Positionstracker." #: doc/classes/ARVRServer.xml msgid "The primary [ARVRInterface] currently bound to the [ARVRServer]." msgstr "" +"Das primäre [ARVRInterface], das derzeit an den [ARVRServer] gebunden ist." #: doc/classes/ARVRServer.xml 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 "" +"Ermöglicht es Ihnen, den Maßstab an die Einheiten Ihres Spiels anzupassen. " +"Die meisten AR/VR-Plattformen gehen von einem Maßstab von 1 Einheit der " +"Spielwelt = 1 Meter der realen Welt aus." #: doc/classes/ARVRServer.xml msgid "Emitted when a new interface has been added." -msgstr "" +msgstr "Wird ausgesendet, wenn eine neue Schnittstelle hinzugefügt wurde." #: doc/classes/ARVRServer.xml msgid "Emitted when an interface is removed." -msgstr "" +msgstr "Wird ausgesendet, wenn eine Schnittstelle entfernt wird." #: doc/classes/ARVRServer.xml msgid "" @@ -10296,6 +11235,11 @@ msgid "" "important to react to this signal to add the appropriate [ARVRController] or " "[ARVRAnchor] nodes related to this new tracker." msgstr "" +"Wird ausgesendet, wenn ein neuer Tracker hinzugefügt wurde. Wenn Sie keine " +"feste Anzahl von Controllern verwenden oder wenn Sie [ARVRAnchor]s für eine " +"AR-Lösung verwenden, ist es wichtig, auf dieses Signal zu reagieren, um die " +"entsprechenden [ARVRController]- oder [ARVRAnchor]-Knoten für diesen neuen " +"Tracker hinzuzufügen." #: doc/classes/ARVRServer.xml msgid "" @@ -10305,30 +11249,36 @@ msgid "" "available (i.e. a new controller is switched on that takes the place of the " "previous one)." msgstr "" +"Wird ausgesendet, wenn ein Tracker entfernt wird. Sie sollten alle " +"[ARVRController]- oder [ARVRAnchor]-Punkte entfernen, falls zutreffend. Dies " +"ist nicht zwingend erforderlich, die Knoten werden einfach inaktiv und " +"werden wieder aktiv, wenn ein neuer Tracker verfügbar wird (d. h. ein neuer " +"Controller wird eingeschaltet, der den vorherigen ersetzt)." #: doc/classes/ARVRServer.xml msgid "The tracker tracks the location of a controller." -msgstr "" +msgstr "Der Tracker tracktden Standort eines Controllers." #: doc/classes/ARVRServer.xml msgid "The tracker tracks the location of a base station." -msgstr "" +msgstr "Der Tracker trackt den Standort einer Basisstation." #: doc/classes/ARVRServer.xml msgid "The tracker tracks the location and size of an AR anchor." -msgstr "" +msgstr "Der Tracker trackt die Position und Größe eines AR-Ankers." #: doc/classes/ARVRServer.xml msgid "Used internally to filter trackers of any known type." -msgstr "" +msgstr "Wird intern verwendet, um Tracker jedes bekannten Typs zu filtern." #: doc/classes/ARVRServer.xml msgid "Used internally if we haven't set the tracker type yet." msgstr "" +"Wird intern verwendet, wenn wir den Tracker-Typ noch nicht festgelegt haben." #: doc/classes/ARVRServer.xml msgid "Used internally to select all trackers." -msgstr "" +msgstr "Wird intern verwendet, um alle Tracker auszuwählen." #: doc/classes/ARVRServer.xml msgid "" @@ -10336,22 +11286,32 @@ msgid "" "user is looking to in the real world. The user will look dead ahead in the " "virtual world." msgstr "" +"Vollständige Rückstellung der Ausrichtung des HMD. Es spielt keine Rolle, in " +"welche Richtung der Benutzer in der realen Welt schaut. Der Benutzer blickt " +"in der virtuellen Welt genau nach vorne." #: doc/classes/ARVRServer.xml 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 "" +"Setzt die Ausrichtung zurück, behält aber die Neigung des Geräts bei. Wenn " +"wir also nach unten schauen, schauen wir weiterhin nach unten, aber die " +"Ausrichtung wird zurückgesetzt." #: doc/classes/ARVRServer.xml msgid "" "Does not reset the orientation of the HMD, only the position of the player " "gets centered." msgstr "" +"Die Ausrichtung des HMD wird nicht zurückgesetzt, nur die Position des " +"Spielers wird zentriert." #: doc/classes/AspectRatioContainer.xml msgid "Container that preserves its child controls' aspect ratio." msgstr "" +"Container, der das Seitenverhältnis seiner untergeordneten Steuerelemente " +"beibehält." #: doc/classes/AspectRatioContainer.xml msgid "" @@ -10360,6 +11320,11 @@ msgid "" "the container size is dynamic and the contents' size needs to adjust " "accordingly without losing proportions." msgstr "" +"Ordnet untergeordnete Steuerelemente so an, dass ihr Seitenverhältnis " +"automatisch erhalten bleibt, wenn die Größe des Containers geändert wird. " +"Löst das Problem, dass die Größe des Containers dynamisch ist und die Größe " +"des Inhalts entsprechend angepasst werden muss, ohne dass die Proportionen " +"verloren gehen." #: doc/classes/AspectRatioContainer.xml doc/classes/BoxContainer.xml #: doc/classes/CenterContainer.xml doc/classes/Container.xml @@ -10375,16 +11340,21 @@ msgstr "Tabulierter Container." #: doc/classes/AspectRatioContainer.xml msgid "Specifies the horizontal relative position of child controls." msgstr "" +"Gibt die horizontale relative Position der untergeordneten Steuerelemente an." #: doc/classes/AspectRatioContainer.xml msgid "Specifies the vertical relative position of child controls." msgstr "" +"Gibt die vertikale relative Position der untergeordneten Steuerelemente an." #: doc/classes/AspectRatioContainer.xml msgid "" "The aspect ratio to enforce on child controls. This is the width divided by " "the height. The ratio depends on the [member stretch_mode]." msgstr "" +"Das Seitenverhältnis, das für untergeordnete Steuerelemente erzwungen werden " +"soll. Dies ist die Breite geteilt durch die Höhe. Das Verhältnis hängt von " +"dem [member stretch_mode] ab." #: doc/classes/AspectRatioContainer.xml #, fuzzy @@ -10396,18 +11366,25 @@ msgid "" "The height of child controls is automatically adjusted based on the width of " "the container." msgstr "" +"Die Höhe der untergeordneten Steuerelemente wird automatisch an die Breite " +"des Containers angepasst." #: doc/classes/AspectRatioContainer.xml msgid "" "The width of child controls is automatically adjusted based on the height of " "the container." msgstr "" +"Die Breite der untergeordneten Steuerelemente wird automatisch an die Höhe " +"des Containers angepasst." #: doc/classes/AspectRatioContainer.xml msgid "" "The bounding rectangle of child controls is automatically adjusted to fit " "inside the container while keeping the aspect ratio." msgstr "" +"Das Begrenzungsrechteck der untergeordneten Steuerelemente wird automatisch " +"so angepasst, dass es in den Container passt, wobei das Seitenverhältnis " +"beibehalten wird." #: doc/classes/AspectRatioContainer.xml msgid "" @@ -10418,25 +11395,38 @@ msgid "" "and [member Control.rect_clip_content] is enabled, this allows to show only " "the container's area restricted by its own bounding rectangle." msgstr "" +"Die Breite und Höhe der untergeordneten Steuerelemente wird automatisch so " +"angepasst, dass ihr Begrenzungsrechteck den gesamten Bereich des Containers " +"abdeckt und das Seitenverhältnis beibehalten wird.\n" +"Wenn das Begrenzungsrechteck der untergeordneten Steuerelemente die Größe " +"des Containers überschreitet und [member Control.rect_clip_content] " +"aktiviert ist, ermöglicht dies die Anzeige nur des Bereichs des Containers, " +"der durch sein eigenes Begrenzungsrechteck begrenzt ist." #: doc/classes/AspectRatioContainer.xml msgid "" "Aligns child controls with the beginning (left or top) of the container." msgstr "" +"Richtet untergeordnete Steuerelemente am Anfang (links oder oben) des " +"Containers aus." #: doc/classes/AspectRatioContainer.xml msgid "Aligns child controls with the center of the container." -msgstr "" +msgstr "Richtet untergeordnete Steuerelemente an der Mitte des Containers aus." #: doc/classes/AspectRatioContainer.xml msgid "Aligns child controls with the end (right or bottom) of the container." msgstr "" +"Richtet untergeordnete Steuerelemente am Ende (rechts oder unten) des " +"Containers aus." #: doc/classes/AStar.xml msgid "" "An implementation of A* to find the shortest paths among connected points in " "space." msgstr "" +"Eine Implementierung von A*, um die kürzesten Wege zwischen verbundenen " +"Punkten im Raum zu finden." #: doc/classes/AStar.xml msgid "" @@ -10481,12 +11471,59 @@ msgid "" "[code]1.0[/code], then this equals the sum of Euclidean distances of all " "segments in the path." msgstr "" +"A* ( A Star) ist ein Computeralgorithmus, der häufig bei der Pfadfindung und " +"der Durchquerung von Graphen eingesetzt wird. Dabei werden kurze Pfade " +"zwischen Vertices (Punkten) über eine bestimmte Menge von Kanten (Segmenten) " +"gezeichnet. Aufgrund seiner Leistungsfähigkeit und Genauigkeit ist er weit " +"verbreitet. Die A*-Implementierung von Godot verwendet standardmäßig Punkte " +"im dreidimensionalen Raum und euklidische Abstände.\n" +"Sie müssen Punkte manuell mit [method add_point] hinzufügen und Segmente " +"manuell mit [method connect_points] erstellen. Anschließend können Sie mit " +"der Funktion [method are_points_connected] prüfen, ob es einen Pfad zwischen " +"zwei Punkten gibt, mit [method get_id_path] einen Pfad mit Indizes oder mit " +"[method get_point_path] einen Pfad mit tatsächlichen Koordinaten erhalten.\n" +"Es ist auch möglich, nicht-euklidische Distanzen zu verwenden. Erstellen Sie " +"dazu eine Klasse, die [code]AStar[/code] erweitert und überschreiben Sie die " +"Methoden [method _compute_cost] und [method _estimate_cost]. Beide nehmen " +"zwei Indizes und geben eine Länge zurück, wie im folgenden Beispiel gezeigt " +"wird.\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" +"Die [method_estimate_cost] sollte eine Untergrenze des Abstands zurückgeben, " +"d.h. [code]_estimate_cost(u, v) <= _compute_cost(u, v)[/code]. Dies dient " +"als Hinweis für den Algorithmus, da die benutzerdefinierten " +"[code]_compute_cost[/code] möglicherweise sehr rechenintensiv sind. Wenn " +"dies nicht der Fall ist, sollte [method _estimate_cost] denselben Wert wie " +"[method _compute_cost] zurückgeben, um dem Algorithmus die genauesten " +"Informationen zu liefern.\n" +"Wenn die Standardmethoden [method _estimate_cost] und [method _compute_cost] " +"verwendet werden oder wenn die mitgelieferte Methode [method _estimate_cost] " +"eine untere Grenze der Kosten zurückgibt, dann sind die von A* " +"zurückgegebenen Pfade die Pfade mit den niedrigsten Kosten. Dabei sind die " +"Kosten eines Pfades gleich der Summe der [method _compute_cost]-Ergebnisse " +"aller Segmente des Pfades multipliziert mit den [code]weight_scale[/code]s " +"der Endpunkte der jeweiligen Segmente. Wenn die Standardmethoden verwendet " +"werden und die [code]weight_scale[/code]s aller Punkte auf [code]1.0[/code] " +"gesetzt werden, dann entspricht dies der Summe der euklidischen Abstände " +"aller Segmente im Pfad." #: doc/classes/AStar.xml 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 "" +"Wird aufgerufen, wenn die Kosten zwischen zwei verbundenen Punkten berechnet " +"werden.\n" +"Beachten Sie, dass diese Funktion in der Standardklasse [code]AStar[/code] " +"verborgen ist." #: doc/classes/AStar.xml msgid "" @@ -10494,6 +11531,10 @@ msgid "" "point.\n" "Note that this function is hidden in the default [code]AStar[/code] class." msgstr "" +"Wird aufgerufen, wenn die Kosten zwischen einem Punkt und dem Endpunkt des " +"Pfades geschätzt werden.\n" +"Beachten Sie, dass diese Funktion in der Standardklasse [code]AStar[/code] " +"verborgen ist." #: doc/classes/AStar.xml msgid "" @@ -10513,6 +11554,21 @@ msgid "" "If there already exists a point for the given [code]id[/code], its position " "and weight scale are updated to the given values." msgstr "" +"Fügt einen neuen Punkt an der angegebenen Position mit dem angegebenen " +"Bezeichner hinzu. Die [code]id[/code] muss 0 oder größer sein, und die " +"[code]weight_scale[/code] muss 0,0 oder größer sein.\n" +"Der [code]weight_scale[/code] wird mit dem Ergebnis von [method " +"_compute_cost] multipliziert, um die Gesamtkosten der Reise über ein Segment " +"von einem benachbarten Punkt zu diesem Punkt zu ermitteln. Unter sonst " +"gleichen Bedingungen bevorzugt der Algorithmus also Punkte mit niedrigeren " +"[code]weight_scale[/code]s, um einen Pfad zu bilden.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(1, 0, 0), 4) # Fügt den Punkt (1, 0, 0) mit " +"weight_scale 4 und id 1 hinzu\n" +"[/codeblock]\n" +"Wenn es bereits einen Punkt für die angegebene [code]id[/code] gibt, werden " +"seine Position und Gewichtung auf die angegebenen Werte aktualisiert" #: doc/classes/AStar.xml msgid "" @@ -10520,10 +11576,14 @@ msgid "" "[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 "" +"Gibt zurück, ob die beiden angegebenen Punkte direkt durch ein Segment " +"verbunden sind. Wenn [code]bidirectional[/code] [code]false[/code] ist, wird " +"zurückgegeben, ob eine Bewegung von [code]id[/code] nach [code]to_id[/code] " +"durch dieses Segment möglich ist." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "Clears all the points and segments." -msgstr "" +msgstr "Löscht alle Punkte und Segmente." #: doc/classes/AStar.xml msgid "" @@ -10537,6 +11597,16 @@ msgid "" "astar.connect_points(1, 2, false)\n" "[/codeblock]" msgstr "" +"Erzeugt ein Segment zwischen den angegebenen Punkten. Wenn " +"[code]bidirectional[/code] [code]false[/code] ist, ist nur die Bewegung von " +"[code]id[/code] nach [code]to_id[/code] erlaubt, nicht die umgekehrte " +"Richtung.\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]" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10544,10 +11614,15 @@ msgid "" "is [code]false[/code], only movement from [code]id[/code] to [code]to_id[/" "code] is prevented, and a unidirectional segment possibly remains." msgstr "" +"Löscht das Segment zwischen den angegebenen Punkten. Wenn " +"[code]bidirectional[/code] [code]false[/code] ist, wird nur die Bewegung von " +"[code]id[/code] nach [code]to_id[/code] verhindert, und es bleibt " +"möglicherweise ein unidirektionales Segment übrig." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "Returns the next available point ID with no point associated to it." msgstr "" +"Gibt die nächste verfügbare Punkte-ID zurück, der kein Punkt zugeordnet ist." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10558,6 +11633,12 @@ msgid "" "the one with the smallest ID will be returned, ensuring a deterministic " "result." msgstr "" +"Gibt die ID des Punktes zurück, der [code]to_position[/code] am nächsten " +"liegt, optional unter Berücksichtigung deaktivierter Punkte. Gibt [code]-1[/" +"code] zurück, wenn es keine Punkte im Punktepool gibt.\n" +"[b]Hinweis:[/b] Wenn mehrere Punkte der [code]to_position[/code] am nächsten " +"liegen, wird der Punkt mit der kleinsten ID zurückgegeben, um ein " +"deterministisches Ergebnis zu gewährleisten." #: doc/classes/AStar.xml msgid "" @@ -10574,6 +11655,19 @@ msgid "" "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 "" +"Gibt die nächstgelegene Position zu [code]to_position[/code] zurück, die " +"sich innerhalb eines Segments zwischen zwei verbundenen Punkten befindet.\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)) # Gibt (0, " +"3, 0) zurück\n" +"[/codeblock]\n" +"Das Ergebnis liegt in dem Segment, das von [code]y = 0[/code] bis [code]y = " +"5[/code] reicht. Es ist die Position im Segment, die dem angegebenen Punkt " +"am nächsten liegt." #: doc/classes/AStar.xml msgid "" @@ -10598,12 +11692,34 @@ msgid "" "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 "" +"Gibt ein Array mit den IDs der Punkte zurück, die den von AStar gefundenen " +"Pfad zwischen den angegebenen Punkten bilden. Das Array ist vom Startpunkt " +"bis zum Endpunkt des Pfades geordnet.\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) # Standartgewichtung ist 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) # Gibt [1, 2, 3] zurück\n" +"[/codeblock]\n" +"Wenn du die Gewichtung des 2. Punktes auf 3 änderst, wird das Ergebnis " +"stattdessen [code][1, 4, 3][/code] sein, weil es jetzt, obwohl die Strecke " +"länger ist, \"einfacher\" ist, durch Punkt 4 zu kommen als durch Punkt 2." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns the capacity of the structure backing the points, useful in " "conjunction with [code]reserve_space[/code]." msgstr "" +"Gibt die Kapazität der Struktur zurück, in der die Punkte gespeichert sind, " +"nützlich in Verbindung mit [code]reserve_space[/code]." #: doc/classes/AStar.xml msgid "" @@ -10622,10 +11738,25 @@ msgid "" "var neighbors = astar.get_point_connections(1) # Returns [2, 3]\n" "[/codeblock]" msgstr "" +"Gibt ein Array mit den IDs der Punkte zurück, die die Verbindung mit dem " +"angegebenen Punkt bilden.\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) # Gibt [2, 3] zurück\n" +"[/codeblock]" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "Returns the number of points currently in the points pool." msgstr "" +"Gibt die Anzahl der Punkte zurück, die sich derzeit im Punktepool befinden." #: doc/classes/AStar.xml msgid "" @@ -10635,38 +11766,53 @@ msgid "" "[b]Note:[/b] This method is not thread-safe. If called from a [Thread], it " "will return an empty [PoolVector3Array] and will print an error message." msgstr "" +"Gibt ein Array mit den Punkten zurück, die sich auf dem von AStar gefundenen " +"Pfad zwischen den angegebenen Punkten befinden. Das Array ist vom Startpunkt " +"bis zum Endpunkt des Pfades geordnet.\n" +"[b]Hinweis:[/b] Diese Methode ist nicht thread-sicher. Wenn sie von einem " +"[Thread] aufgerufen wird, gibt sie ein leeres [PoolVector3Array] zurück und " +"gibt eine Fehlermeldung aus." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns the position of the point associated with the given [code]id[/code]." msgstr "" +"Gibt die Position des Punktes zurück, der mit der angegebenen [code]id[/" +"code] verbunden ist." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns the weight scale of the point associated with the given [code]id[/" "code]." msgstr "" +"Gibt die Gewichtungsskala des Punktes zurück, der mit der angegebenen " +"[code]id[/code] verbunden ist." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "Returns an array of all points." -msgstr "" +msgstr "Gibt ein Array mit allen Punkten zurück." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns whether a point associated with the given [code]id[/code] exists." msgstr "" +"Gibt zurück, ob ein Punkt mit der angegebenen [code]id[/code] existiert." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns whether a point is disabled or not for pathfinding. By default, all " "points are enabled." msgstr "" +"Gibt zurück, ob ein Punkt für die Pfadfindung deaktiviert ist oder nicht. " +"Standardmäßig sind alle Punkte aktiviert." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Removes the point associated with the given [code]id[/code] from the points " "pool." msgstr "" +"Entfernt den mit der angegebenen [code]id[/code] verbundenen Punkt aus dem " +"Punktepool." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10674,17 +11820,25 @@ msgid "" "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 "" +"Reserviert intern Platz für [code]num_nodes[/code] Punkte, was nützlich ist, " +"wenn Sie eine bekannt große Anzahl von Punkten auf einmal hinzufügen, z. B. " +"für ein Gitter. Die neue Kapazität muss größer oder gleich der alten " +"Kapazität sein." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Disables or enables the specified point for pathfinding. Useful for making a " "temporary obstacle." msgstr "" +"Deaktiviert oder aktiviert den angegebenen Punkt für die Pfadfindung. " +"Nützlich für die Erstellung eines temporären Hindernisses." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Sets the [code]position[/code] for the point with the given [code]id[/code]." msgstr "" +"Setzt die [code]Position[/code] für den Punkt mit der angegebenen [code]id[/" +"code]." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10693,22 +11847,33 @@ msgid "" "_compute_cost] when determining the overall cost of traveling across a " "segment from a neighboring point to this point." msgstr "" +"Setzt den [code]weight_scale[/code] für den Punkt mit der angegebenen " +"[code]id[/code]. Der [code]weight_scale[/code] wird mit dem Ergebnis von " +"[method _compute_cost] multipliziert, wenn die Gesamtkosten für die Reise " +"über ein Segment von einem benachbarten Punkt zu diesem Punkt bestimmt " +"werden." #: doc/classes/AStar2D.xml msgid "AStar class representation that uses 2D vectors as edges." -msgstr "" +msgstr "AStar-Klassendarstellung, die 2D-Vektoren als Kanten verwendet." #: doc/classes/AStar2D.xml msgid "" "This is a wrapper for the [AStar] class which uses 2D vectors instead of 3D " "vectors." msgstr "" +"Dies ist ein Wrapper für die Klasse [AStar], die 2D-Vektoren anstelle von 3D-" +"Vektoren verwendet." #: doc/classes/AStar2D.xml 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 "" +"Wird aufgerufen, wenn die Kosten zwischen zwei verbundenen Punkten berechnet " +"werden.\n" +"Beachten Sie, dass diese Funktion in der Standardklasse [code]AStar2D[/code] " +"verborgen ist." #: doc/classes/AStar2D.xml msgid "" @@ -10716,6 +11881,10 @@ msgid "" "point.\n" "Note that this function is hidden in the default [code]AStar2D[/code] class." msgstr "" +"Wird aufgerufen, wenn die Kosten zwischen einem Punkt und dem Endpunkt des " +"Pfades geschätzt werden.\n" +"Beachten Sie, dass diese Funktion in der Standardklasse [code]AStar2D[/code] " +"verborgen ist." #: doc/classes/AStar2D.xml msgid "" @@ -10735,6 +11904,21 @@ msgid "" "If there already exists a point for the given [code]id[/code], its position " "and weight scale are updated to the given values." msgstr "" +"Fügt einen neuen Punkt an der angegebenen Position mit dem angegebenen " +"Bezeichner hinzu. Die [code]id[/code] muss 0 oder größer sein, und die " +"[code]weight_scale[/code] muss 0,0 oder größer sein.\n" +"Der [code]weight_scale[/code] wird mit dem Ergebnis von [method " +"_compute_cost] multipliziert, um die Gesamtkosten der Reise über ein Segment " +"von einem benachbarten Punkt zu diesem Punkt zu ermitteln. Unter sonst " +"gleichen Bedingungen bevorzugt der Algorithmus also Punkte mit niedrigeren " +"[code]weight_scale[/code]s, um einen Pfad zu bilden.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(1, 0), 4) # Fügt den Punkt (1, 0) mit " +"weight_scale 4 und id 1 hinzu\n" +"[/codeblock]\n" +"Wenn für die angegebene [code]id[/code] bereits ein Punkt existiert, werden " +"dessen Position und Gewichtungsskala auf die angegebenen Werte aktualisiert." #: doc/classes/AStar2D.xml msgid "" @@ -10742,6 +11926,10 @@ msgid "" "[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 "" +"Gibt zurück, ob es eine Verbindung/ein Segment zwischen den angegebenen " +"Punkten gibt. Wenn [code]bidirectional[/code] [code]false[/code] ist, wird " +"zurückgegeben, ob eine Bewegung von [code]id[/code] nach [code]to_id[/code] " +"durch dieses Segment möglich ist." #: doc/classes/AStar2D.xml msgid "" @@ -10755,6 +11943,16 @@ msgid "" "astar.connect_points(1, 2, false)\n" "[/codeblock]" msgstr "" +"Erzeugt ein Segment zwischen den angegebenen Punkten. Wenn " +"[code]bidirectional[/code] [code]false[/code] ist, ist nur die Bewegung von " +"[code]id[/code] nach [code]to_id[/code] erlaubt, nicht die umgekehrte " +"Richtung.\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]" #: doc/classes/AStar2D.xml msgid "" @@ -10771,6 +11969,19 @@ msgid "" "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 "" +"Gibt die nächstgelegene Position zu [code]to_position[/code] zurück, die " +"sich innerhalb eines Segments zwischen zwei verbundenen Punkten befindet.\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)) # Gibt (0, 3) " +"zurück\n" +"[/codeblock]\n" +"Das Ergebnis liegt in dem Segment, das von [code]y = 0[/code] bis [code]y = " +"5[/code] reicht. Es ist die Position im Segment, die dem angegebenen Punkt " +"am nächsten liegt." #: doc/classes/AStar2D.xml msgid "" @@ -10795,6 +12006,26 @@ msgid "" "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 "" +"Gibt ein Array mit den IDs der Punkte zurück, die den von AStar2D gefundenen " +"Pfad zwischen den angegebenen Punkten bilden. Das Array ist vom Startpunkt " +"bis zum Endpunkt des Pfades geordnet.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(0, 0))\n" +"astar.add_point(2, Vector2(0, 1), 1) # Standartgewichtung ist 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) # Gibt [1, 2, 3] zurück\n" +"[/codeblock]\n" +"Wenn du die Gewichtung des 2. Punktes auf 3 änderst, wird das Ergebnis " +"stattdessen [code][1, 4, 3][/code] sein, weil es jetzt, obwohl die Strecke " +"länger ist, \"einfacher\" ist, durch Punkt 4 zu kommen als durch Punkt 2." #: doc/classes/AStar2D.xml msgid "" @@ -10813,6 +12044,20 @@ msgid "" "var neighbors = astar.get_point_connections(1) # Returns [2, 3]\n" "[/codeblock]" msgstr "" +"Gibt ein Array mit den IDs der Punkte zurück, die die Verbindung mit dem " +"angegebenen Punkt bilden.\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) # Gibt [2, 3] zurück\n" +"[/codeblock]" #: doc/classes/AStar2D.xml msgid "" @@ -10822,11 +12067,19 @@ msgid "" "[b]Note:[/b] This method is not thread-safe. If called from a [Thread], it " "will return an empty [PoolVector2Array] and will print an error message." msgstr "" +"Gibt ein Array mit den Punkten zurück, die sich auf dem von AStar2D " +"gefundenen Pfad zwischen den angegebenen Punkten befinden. Das Array ist vom " +"Startpunkt bis zum Endpunkt des Pfades geordnet.\n" +"[b]Hinweis:[/b] Diese Methode ist nicht thread-sicher. Wenn sie von einem " +"[Thread] aufgerufen wird, gibt sie ein leeres [PoolVector2Array] zurück und " +"gibt eine Fehlermeldung aus." #: doc/classes/AtlasTexture.xml msgid "" "Crops out one part of a texture, such as a texture from a texture atlas." msgstr "" +"Schneidet einen Teil einer Textur aus, z. B. eine Textur aus einem " +"Texturatlas." #: doc/classes/AtlasTexture.xml msgid "" @@ -10846,16 +12099,36 @@ msgid "" "FLAG_REPEAT] and [constant Texture.FLAG_MIRRORED_REPEAT] flags are ignored " "when using an AtlasTexture." msgstr "" +"Ressource [Texture], die einen Teil der Textur [member atlas], definiert " +"durch [member region], ausschneidet. Der Hauptanwendungsfall ist das " +"Ausschneiden von Texturen aus einem Textur-Atlas, der eine große Texturdatei " +"ist, die mehrere kleinere Texturen enthält. Besteht aus einer [Texture] für " +"den [member atlas], einer [member region], die den zu verwendenden Bereich " +"des [member atlas] definiert, und einem [member margin], der die Randbreite " +"definiert.\n" +"[AtlasTexture] kann nicht in einer [AnimatedTexture] verwendet werden, kann " +"nicht in Knoten wie [TextureRect] gekachelt werden und funktioniert nicht " +"ordnungsgemäß, wenn sie innerhalb von anderen [AtlasTexture]-Ressourcen " +"verwendet wird. Mehrere [AtlasTexture]-Ressourcen können verwendet werden, " +"um mehrere Texturen aus dem Atlas zu schneiden. Die Verwendung eines " +"Texturatlasses hilft, die Videospeicherkosten und Renderaufrufe im Vergleich " +"zur Verwendung mehrerer kleiner Dateien zu optimieren.\n" +"[b]Hinweis:[/b] AtlasTexturen unterstützen keine Wiederholungen. Die Flags " +"[constant Texture.FLAG_REPEAT] und [constant Texture.FLAG_MIRRORED_REPEAT] " +"werden bei der Verwendung einer AtlasTextur ignoriert." #: doc/classes/AtlasTexture.xml msgid "The texture that contains the atlas. Can be any [Texture] subtype." msgstr "" +"Die Textur, die den Atlas enthält. Kann ein beliebiger [Texture]-Subtyp sein." #: doc/classes/AtlasTexture.xml msgid "" "If [code]true[/code], clips the area outside of the region to avoid bleeding " "of the surrounding texture pixels." msgstr "" +"Wenn [code]true[/code], wird der Bereich außerhalb der Region abgeschnitten, " +"um ein Ausbluten der umliegenden Texturpixel zu vermeiden." #: doc/classes/AtlasTexture.xml msgid "" @@ -10863,87 +12136,124 @@ msgid "" "(\"w\" and \"h\" in the editor) resizes the texture so it fits within the " "margin." msgstr "" +"Der Rand um die Region. Der Parameter [member Rect2.size] von [Rect2] (\"w\" " +"und \"h\" im Editor) ändert die Größe der Textur so, dass sie in den Rand " +"passt." #: doc/classes/AtlasTexture.xml msgid "The AtlasTexture's used region." -msgstr "" +msgstr "Die verwendete Region der AtlasTextur." #: doc/classes/AudioBusLayout.xml msgid "Stores information about the audio buses." -msgstr "" +msgstr "Speichert Informationen über die Audiobusse." #: doc/classes/AudioBusLayout.xml msgid "" "Stores position, muting, solo, bypass, effects, effect position, volume, and " "the connections between buses. See [AudioServer] for usage." msgstr "" +"Speichert Position, Stummschaltung, Solo, Bypass, Effekte, Effektposition, " +"Lautstärke und die Verbindungen zwischen Bussen. Siehe [AudioServer] für die " +"Verwendung." #: doc/classes/AudioEffect.xml msgid "Audio effect for audio." -msgstr "" +msgstr "Audioeffekt für Audio." #: doc/classes/AudioEffect.xml msgid "" "Base resource for audio bus. Applies an audio effect on the bus that the " "resource is applied on." msgstr "" +"Basisressource für Audiobus. Wendet einen Audioeffekt auf den Bus an, auf " +"den die Ressource angewendet wird." -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" -msgstr "" +msgstr "Audio Mic Record Demo" #: doc/classes/AudioEffectAmplify.xml msgid "" "Adds an amplifying audio effect to an audio bus.\n" "Increases or decreases the volume of the selected audio bus." msgstr "" +"Fügt einen verstärkenden Audioeffekt zu einem Audiobus hinzu.\n" +"Erhöht oder verringert die Lautstärke des ausgewählten Audiobusses." #: doc/classes/AudioEffectAmplify.xml msgid "Increases or decreases the volume being routed through the audio bus." -msgstr "" +msgstr "Erhöht oder verringert die über den Audiobus geleitete Lautstärke." #: doc/classes/AudioEffectAmplify.xml 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 "" +"Betrag der Verstärkung in Dezibel. Positive Werte machen den Ton lauter, " +"negative Werte machen ihn leiser. Der Wert kann von -80 bis 24 reichen." #: doc/classes/AudioEffectBandLimitFilter.xml msgid "Adds a band limit filter to the audio bus." -msgstr "" +msgstr "Fügt dem Audiobus einen Bandbegrenzungsfilter hinzu." #: doc/classes/AudioEffectBandLimitFilter.xml msgid "" "Limits the frequencies in a range around the [member AudioEffectFilter." "cutoff_hz] and allows frequencies outside of this range to pass." msgstr "" +"Begrenzt die Frequenzen in einem Bereich um den [member AudioEffectFilter." +"cutoff_hz] und lässt Frequenzen außerhalb dieses Bereichs passieren." #: doc/classes/AudioEffectBandPassFilter.xml msgid "Adds a band pass filter to the audio bus." -msgstr "" +msgstr "Fügt dem Audiobus einen Bandpassfilter hinzu." #: doc/classes/AudioEffectBandPassFilter.xml msgid "" "Attenuates the frequencies inside of a range around the [member " "AudioEffectFilter.cutoff_hz] and cuts frequencies outside of this band." msgstr "" +"Dämpft die Frequenzen innerhalb eines Bereichs um den [member " +"AudioEffectFilter.cutoff_hz] und schneidet Frequenzen außerhalb dieses " +"Bereichs ab." #: doc/classes/AudioEffectCapture.xml msgid "Captures audio from an audio bus in real-time." -msgstr "" +msgstr "Nimmt Audio von einem Audiobus in Echtzeit auf." #: doc/classes/AudioEffectCapture.xml +#, fuzzy msgid "" "AudioEffectCapture is an AudioEffect which copies all audio frames from the " "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" +"AudioEffectCapture ist ein AudioEffect, der alle Audio-Frames vom " +"angeschlossenen Audio-Effekt-Bus in seinen internen Ringpuffer kopiert.\n" +"Der Anwendungscode sollte diese Audioframes aus diesem Ringpuffer mit der " +"[method get_buffer] abrufen und nach Bedarf verarbeiten, z.B. um Daten von " +"einem Mikrofon zu erfassen, anwendungsdefinierte Effekte zu implementieren " +"oder um Audio über das Netzwerk zu übertragen. Wenn Audiodaten von einem " +"Mikrofon aufgenommen werden, ist das Format der Samples Stereo 32-Bit " +"Floating Point PCM." + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -10957,7 +12267,7 @@ msgstr "" #: doc/classes/AudioEffectCapture.xml msgid "Clears the internal ring buffer." -msgstr "" +msgstr "Löscht den internen Ringspeicher." #: doc/classes/AudioEffectCapture.xml msgid "" @@ -10967,6 +12277,11 @@ msgid "" "samples if available, or an empty [PoolVector2Array] if insufficient data " "was available." msgstr "" +"Ruft die nächsten [code]frames[/code] Audio-Samples aus dem internen " +"Ringpuffer ab.\n" +"Gibt ein [PoolVector2Array] zurück, das genau [code]frames[/code] Audio-" +"Samples enthält, falls verfügbar, oder ein leeres [PoolVector2Array], falls " +"nicht genügend Daten verfügbar waren." #: doc/classes/AudioEffectCapture.xml #, fuzzy @@ -10978,11 +12293,15 @@ msgid "" "Returns the number of audio frames discarded from the audio bus due to full " "buffer." msgstr "" +"Gibt die Anzahl der Audioframes zurück, die aufgrund eines vollen Puffers " +"vom Audiobus verworfen wurden." #: doc/classes/AudioEffectCapture.xml msgid "" "Returns the number of frames available to read using [method get_buffer]." msgstr "" +"Gibt die Anzahl der Bilder zurück, die mit der [methodget_buffer] gelesen " +"werden können." #: doc/classes/AudioEffectCapture.xml #, fuzzy @@ -10994,6 +12313,8 @@ msgid "" "Length of the internal ring buffer, in seconds. Setting the buffer length " "will have no effect if already initialized." msgstr "" +"Länge des internen Ringpuffers, in Sekunden. Die Einstellung der Pufferlänge " +"hat keine Auswirkungen, wenn sie bereits initialisiert ist." #: doc/classes/AudioEffectChorus.xml msgid "Adds a chorus audio effect." @@ -11073,7 +12394,7 @@ msgstr "" #: doc/classes/AudioEffectCompressor.xml msgid "Gain applied to the output signal." -msgstr "" +msgstr "Auf das Ausgangssignal angewendete Verstärkung." #: doc/classes/AudioEffectCompressor.xml msgid "" @@ -11190,12 +12511,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -11741,7 +13056,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -11902,12 +13222,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -12059,6 +13383,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml #, fuzzy msgid "MP3 audio stream driver." @@ -12203,7 +13542,10 @@ msgstr "Spielt Audio in 2D." #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -13899,7 +15241,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -13992,7 +15334,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -14020,9 +15364,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -14529,13 +15873,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -14561,8 +15906,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -14875,12 +16222,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -14925,8 +16272,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -14976,8 +16325,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -15039,7 +16391,8 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +#, fuzzy +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "[CanvasItem] wird aufgefordert zu zeichnen." #: doc/classes/CanvasItem.xml @@ -15174,7 +16527,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -18297,7 +19653,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -21065,7 +22423,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -21214,16 +22574,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -21369,18 +22730,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Liefert die Fläche des [Rect2i]." @@ -26323,8 +27672,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -26949,7 +28302,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -28549,10 +29904,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -29994,8 +31352,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -32325,11 +33683,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -33178,7 +34539,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -33190,6 +34555,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -35609,14 +36984,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -35624,22 +36999,29 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Gibt die Anzahl der Spuren in der Animation zurück." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Liefert die Position des Punktes bei Index [code]Punkt[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" +"Entfernt den Punkt bei Index [code]Punkt[/code] aus dem Überblendungsbereich." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" +"Liefert die Position des Punktes bei Index [code]Punkt[/code] im Dreieck von " +"Index [code]Dreieck[/code]." #: doc/classes/Line2D.xml msgid "" @@ -37219,9 +38601,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -37682,7 +39064,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -38846,7 +40230,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -39688,13 +41072,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41461,11 +42857,11 @@ msgstr "Gobale Position." #: doc/classes/Node2D.xml msgid "Global rotation in radians." -msgstr "" +msgstr "Globale Rotation im Bogenmaß." #: doc/classes/Node2D.xml msgid "Global rotation in degrees." -msgstr "" +msgstr "Globale Rotation in Grad." #: doc/classes/Node2D.xml msgid "Global scale." @@ -41515,6 +42911,10 @@ msgid "" "VisualServer.CANVAS_ITEM_Z_MIN] and [constant VisualServer." "CANVAS_ITEM_Z_MAX] (inclusive)." msgstr "" +"Z-Index. Legt fest, in welcher Reihenfolge die Nodes gerendert werde . Eine " +"Node mit höherem Z-Index wird über anderen angezeigt. Wert muss zwischen " +"[constant VisualServer.CANVAS_ITEM_Z_MIN] und [constant VisualServer." +"CANVAS_ITEM_Z_MAX] liegen (einschließlich)." #: doc/classes/NodePath.xml msgid "Pre-parsed scene tree path." @@ -43378,7 +44778,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -47933,7 +49335,7 @@ msgstr "" #: doc/classes/Polygon2D.xml msgid "The texture's rotation in degrees." -msgstr "" +msgstr "Die Rotation (Drehung) der Textur in Grad." #: doc/classes/Polygon2D.xml msgid "" @@ -48857,7 +50259,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Liefert die Position des Punktes bei Index [code]Punkt[/code]." #: doc/classes/PopupMenu.xml @@ -49099,7 +50503,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -49832,7 +51238,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -52520,8 +53930,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -56598,7 +58019,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -56745,13 +58168,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -57943,7 +59372,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -58574,6 +60006,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -58910,7 +60350,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -60362,7 +61804,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -61656,6 +63098,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -61717,6 +63162,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -61739,7 +63187,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -62892,6 +64343,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Liefert die Position des Punktes bei Index [code]Punkt[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -62922,6 +64378,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Liefert die Position des Punktes bei Index [code]Punkt[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -62963,8 +64424,13 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" +"Wird ausgegeben, wenn eine benutzerdefinierte Taste gedrückt wird. Siehe " +"[method add_button]." #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -67975,21 +69441,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -68002,7 +69472,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -68031,7 +69501,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -68041,22 +69543,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -68069,8 +69584,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -68268,16 +69785,16 @@ msgid "Unknown error." msgstr "unbekannter Fehler." #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." -msgstr "UPNP Gerät." +msgid "Universal Plug and Play (UPnP) device." +msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -77135,7 +78652,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/el.po b/doc/translations/el.po index 87eee32604..2a2608c38f 100644 --- a/doc/translations/el.po +++ b/doc/translations/el.po @@ -548,8 +548,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -559,7 +560,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -613,7 +615,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -625,7 +628,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1040,10 +1044,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4855,19 +4864,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4888,21 +4899,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4912,9 +4927,10 @@ msgstr "ΕπιστÏÎφει την εφαπτομÎνη της παÏαμÎÏ„Ï #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5566,9 +5582,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5742,8 +5758,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8745,8 +8761,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8797,10 +8814,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9043,12 +9070,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9594,7 +9615,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9755,12 +9781,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9908,6 +9938,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10048,7 +10093,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11728,7 +11776,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11821,7 +11869,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11849,9 +11899,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12352,13 +12402,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12384,8 +12435,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12698,12 +12751,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12748,8 +12801,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12797,8 +12852,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12860,7 +12918,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12985,7 +13043,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15981,7 +16042,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18712,7 +18775,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18861,16 +18926,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19016,18 +19082,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "ΕπιστÏÎφει το τόξο ημιτόνου της παÏαμÎÏ„Ïου." @@ -23942,8 +23996,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24564,7 +24622,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26152,10 +26212,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27564,8 +27627,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29867,11 +29930,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30717,7 +30783,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30729,6 +30799,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33089,14 +33169,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33104,22 +33184,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/Line2D.xml msgid "" @@ -34696,9 +34780,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35159,7 +35243,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36290,7 +36376,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37116,13 +37202,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40792,7 +40890,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46166,7 +46266,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/PopupMenu.xml @@ -46405,7 +46507,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47135,7 +47239,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49816,8 +49924,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53836,7 +53955,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53980,13 +54101,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55176,7 +55303,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55795,6 +55925,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56129,7 +56267,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57562,7 +57702,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58829,6 +58969,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58890,6 +59033,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58912,7 +59058,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60049,6 +60198,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60079,6 +60233,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60120,7 +60279,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65001,21 +65162,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65028,7 +65193,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65057,7 +65222,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65067,22 +65264,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65095,8 +65305,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65294,16 +65506,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73959,7 +74171,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/es.po b/doc/translations/es.po index f9d008c41a..f44ab6b4bf 100644 --- a/doc/translations/es.po +++ b/doc/translations/es.po @@ -35,12 +35,13 @@ # Jake-insane <jake0insane@gmail.com>, 2022. # Luis Alberto Flores Baca <betofloresbaca@gmail.com>, 2022. # emnrx <emanuelermancia@gmail.com>, 2022. +# BlackNoizE404 <blacknoize404@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-16 18:58+0000\n" -"Last-Translator: emnrx <emanuelermancia@gmail.com>\n" +"PO-Revision-Date: 2022-08-31 03:18+0000\n" +"Last-Translator: BlackNoizE404 <blacknoize404@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/es/>\n" "Language: es\n" @@ -48,7 +49,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -108,7 +109,7 @@ msgstr "(sobreescribe %s)" #: doc/tools/make_rst.py msgid "Default" -msgstr "Por defecto" +msgstr "Predeterminado" #: doc/tools/make_rst.py msgid "Setter" @@ -523,7 +524,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Compares two values by checking their actual contents, recursing into any " "[Array] or [Dictionary] up to its deepest level.\n" @@ -575,13 +575,12 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Converts a dictionary (previously created with [method inst2dict]) back to " "an instance. Useful for deserializing." msgstr "" -"Convierte un diccionario (que fue creado previamente con [method inst2dict]) " -"de nuevo en una instancia. Es útil para deserializar." +"Convierte un diccionario (previamente creado con [method inst2dict]) de " +"nuevo en una instancia. Es útil para deserializar." #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -624,7 +623,6 @@ msgstr "" "avanzadas, utilice [Tween] o [AnimationPlayer]." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "The natural exponential function. It raises the mathematical constant [b]e[/" "b] to the power of [code]s[/code] and returns it.\n" @@ -862,8 +860,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -873,7 +872,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Devuelve un factor de interpolación o extrapolación, considerando el rango " "especificado en [code]from[/code] y [code]to[/code], y el valor interpolado " @@ -967,7 +967,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -979,7 +980,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Interpola linealmente entre dos valores por un valor normalizado. Esto es la " "función inversa de [method inverse_lerp].\n" @@ -1653,16 +1655,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Transforma un [code]value[/code] entre los rangos [code](istart, istop][/" -"code] a los rangos [code][ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Devuelve 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -6348,25 +6350,22 @@ msgstr "" "[AnimationRootNode]. Si no, el editor no mostrará el nodo para añadir." #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" -"Obtiene la leyenda del texto de este nodo (usado por algunos editores)." #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" -"Obtiene un nodo hijo por Ãndice (utilizado por los editores que heredan de " -"[AnimationRootNode])." #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" -"Ordena todos los nodos infantiles como un diccionario de [code]name: node[/" -"code]. Sólo es útil cuando se hereda [AnimationRootNode]." #: doc/classes/AnimationNode.xml msgid "" @@ -6390,17 +6389,22 @@ msgstr "" "reutilizado en múltiples árboles." #: doc/classes/AnimationNode.xml +#, fuzzy 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" "Obtiene el valor por defecto de un parametro. Los parametros son " "personalizados en memoria local utilizados para tus nodos, dado que un " "recurso puede ser reutilizado en multiples arboles." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 "" @@ -6410,9 +6414,11 @@ msgstr "" "del [method Object.get_property_list]." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" "Devuelve [code]true[/code] si quieres que el editor del árbol de mezcla " "muestre la edición del filtro en este nodo." @@ -6423,10 +6429,12 @@ msgid "Returns whether the given path is filtered." msgstr "Devuelve [code]true[/code] si un camino dado es filtrado." #: doc/classes/AnimationNode.xml +#, fuzzy 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -7259,9 +7267,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -7495,9 +7503,10 @@ msgstr "" "encuentra." #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" "Devuelve la [Animation] con clave [code]name[/code] or [code]null[/code] si " "no se encuentra." @@ -11614,8 +11623,9 @@ msgstr "" "Recurso base para el bus de audio. Aplica un efecto de audio en el bus en " "que el recurso es aplicado." -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -11675,10 +11685,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -11989,12 +12009,6 @@ msgstr "" "los juegos, puede simular el sonido proveniente de algún dispositivo " "saturado o altavoz muy eficientemente." -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "Poder de distorsión. El valor puede variar entre 0 y 1." @@ -12709,10 +12723,13 @@ msgstr "" "[code]at_position[/code]." #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" -"Devuelve los nombres de todos los dispositivos de entrada de audio " -"detectados en el sistema." #: doc/classes/AudioServer.xml msgid "Generates an [AudioBusLayout] using the available buses and effects." @@ -12906,12 +12923,16 @@ msgstr "Número de buses de audio disponibles." #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -13070,6 +13091,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml #, fuzzy msgid "MP3 audio stream driver." @@ -13228,7 +13264,10 @@ msgstr "Reproduce el sonido 3D en el espacio 3D." #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -15326,7 +15365,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" "Establece la proyección de la cámara en modo frustum (ver [constant " "PROJECTION_FRUSTUM]), especificando un [code]size[/code], un [code]offset[/" @@ -15445,10 +15484,13 @@ msgstr "" "- ~121,63 grados en una vista de 21:9" #: doc/classes/Camera.xml +#, fuzzy 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" "El desplazamiento de la cámara de frustum. Se puede cambiar desde el valor " "predeterminado para crear efectos de \"frustum inclinado\" como [url=https://" @@ -15485,15 +15527,11 @@ msgstr "" "la cámara escala su tamaño percibido." #: doc/classes/Camera.xml -#, fuzzy msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" -"El tamaño de la cámara se mide como la mitad de la anchura o la altura. Sólo " -"aplicable en modo ortogonal. Dado que [member keep_aspect] se bloquea en el " -"eje, [code]size[/code] establece la longitud del tamaño del otro eje." #: doc/classes/Camera.xml msgid "The vertical (Y) offset of the camera viewport." @@ -16157,18 +16195,20 @@ msgid "Base class of anything 2D." msgstr "Clase base de cualquier cosa 2D." #: doc/classes/CanvasItem.xml +#, fuzzy 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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -16220,12 +16260,19 @@ msgid "Custom drawing in 2D" msgstr "" #: doc/classes/CanvasItem.xml +#, fuzzy msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" -"Función sobreescribible llamada por el motor (si está definida) para dibujar " -"el objeto canvas." +"Llamado cuando el nodo entra en el [SceneTree] (por ejemplo, al instalarse, " +"al cambiar de escena o después de llamar a [method add_child] en un script). " +"Si el nodo tiene hijos, su llamada a [method _enter_tree] se llamará " +"primero, y luego la de los hijos.\n" +"Corresponde a la notificación [constant NOTIFICATION_ENTER_TREE] en [method " +"Object._notification]." #: doc/classes/CanvasItem.xml msgid "" @@ -16614,12 +16661,13 @@ msgstr "" "Devuelve [code]true[/code] si las notificaciones de transformación global se " "comunican a los hijos." -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml +#, fuzzy msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" "Devuelve [code]true[/code] si el nodo está presente en el [SceneTree], su " "propiedad [member visible] es [code]true[/code] y todos sus antecedentes " @@ -16682,12 +16730,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" -"Pone en la cola el [CanvasItem] para la actualización. La [constant " -"NOTIFICATION_DRAW] será llamada en tiempo de inactividad para solicitar el " -"redibujado." #: doc/classes/CanvasItem.xml msgid "" @@ -16746,11 +16793,12 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" -"Emitido cuando el [CanvasItem] debe ser dibujado de nuevo. Esto sólo puede " -"ser conectado en tiempo real, ya que en diferido no se podrá dibujar." #: doc/classes/CanvasItem.xml msgid "Emitted when becoming hidden." @@ -16823,7 +16871,8 @@ msgstr "" "set_notify_local_transform]." #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +#, fuzzy +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "Se solicita al [CanvasItem] que dibuje." #: doc/classes/CanvasItem.xml @@ -16993,10 +17042,12 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" -"Establece la capa que sigue a la vista para simular un pseudo efecto 3D." #: doc/classes/CanvasLayer.xml msgid "" @@ -20889,10 +20940,10 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" -"Roba el foco de otro control y pasa a ser el control enfocado (ver [member " -"focus_mode])." #: doc/classes/Control.xml #, fuzzy @@ -24472,10 +24523,13 @@ msgid "A mathematic curve." msgstr "Una curva matemática." #: doc/classes/Curve.xml +#, fuzzy 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" "Una curva que puede ser guardada y reutilizada para otros objetos. Por " "defecto, oscila entre [code]0[/code] y [code]1[/code] en el eje Y y " @@ -24664,17 +24718,18 @@ msgstr "" "Mantiene un cacheo de puntos precalculados a lo largo de la curva, para " "acelerar los cálculos." -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml #, fuzzy msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" "Añade un punto a una curva en la posición [code]position[/code], con puntos " "de control [code]in[/code] y [code]out[/code].\n" @@ -24907,27 +24962,6 @@ msgstr "" #: doc/classes/Curve3D.xml #, fuzzy -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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 "" -"Añade un punto a una curva en la posición [code]position[/code], con puntos " -"de control [code]in[/code] y [code]out[/code].\n" -"Si se da [code]at_position[/code], el punto se inserta antes del número de " -"punto [code]at_position[/code], desplazando ese punto (y todos los puntos " -"posteriores) después del punto insertado. Si no se da [code]at_position[/" -"code], o es un valor ilegal ([code]at_position <0[/code] o [code]at_position " -">= [method get_point_count][/code]), el punto se añadirá al final de la " -"lista de puntos." - -#: doc/classes/Curve3D.xml -#, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Devuelve el caché de puntos como un [PackedVector3Array]." @@ -31644,11 +31678,13 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" -"Devuelve todo el archivo como una [String].\n" -"El texto se interpreta como codificado en UTF-8." #: doc/classes/File.xml #, fuzzy @@ -32413,13 +32449,16 @@ msgstr "" "Véase también [method CanvasItem.draw_string]." #: doc/classes/Font.xml +#, fuzzy 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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" "Dibuja el carácter [code]char[/code] en un elemento del canvas utilizando la " "fuente en una posición determinada, con [code]modular[/code] color, y " @@ -34545,12 +34584,16 @@ msgstr "" "entre puntos de color definidos por el usuario." #: doc/classes/Gradient.xml +#, fuzzy 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" "Dado un conjunto de colores, este recurso los interpolará en orden. Esto " "significa que si tiene el color 1, el color 2 y el color 3, la rampa " @@ -36333,8 +36376,8 @@ msgstr "Cliente HTTP(Hyper-text transfer protocol)." 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -39548,11 +39591,14 @@ msgstr "Detiene la vibración del joypad." #: doc/classes/Input.xml #, fuzzy msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" "Vibración de los dispositivos Android e iOS.\n" "[b]Nota:[/b] Necesita permiso de VIBRATE para Android en la configuración de " @@ -40668,7 +40714,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -40683,6 +40733,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -43795,44 +43855,40 @@ msgstr "" #: doc/classes/Line2D.xml 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 "" -"Añade un punto en la [code]position[/code]. Añade el punto al final de la " -"lÃnea.\n" -"Si se da [code]at_position[/code], el punto se inserta antes del número de " -"punto [code]at_position[/code], desplazando ese punto (y todos los puntos " -"posteriores) después del punto insertado. Si no se da [code]at_position[/" -"code], o es un valor ilegal ([code]at_position < 0[/code] o " -"[code]at_position >= [method get_point_count][/code]), el punto se añadirá " -"al final de la lista de puntos." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." +msgstr "" #: doc/classes/Line2D.xml msgid "Removes all points from the line." msgstr "Elimina todos los puntos de la lÃnea." #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "Devuelve la cantidad de puntos de Line2D." +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Devuelve la cantidad de huesos del esqueleto." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "Devuelve la posición del punto [code]i[/code]." +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Devuelve la posición del punto en el Ãndice [code]point[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." msgstr "Elimina el punto en el Ãndice [code]i[/code] de la lÃnea." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" "Sobrescribe la posición en el punto [code]i[/code] con la [code]position[/" "code] suministrada." @@ -45879,9 +45935,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" "MeshInstance es un nodo que toma un recurso [Mesh] y lo añade al escenario " "actual creando una instancia del mismo. Esta es la clase más usada para " @@ -46463,7 +46519,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" "Establece el color de una instancia especÃfica.\n" "Para que el color tenga efecto, asegúrate de que [member use_colors] es " @@ -47819,7 +47877,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -48746,15 +48804,26 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml -#, fuzzy msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." -msgstr "Devuelve el estado actual de la conexión. Ver [enum ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." +msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml #, fuzzy @@ -53930,7 +53999,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -61141,7 +61212,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Establece el icono del artÃculo en el Ãndice [code]idx[/code]." #: doc/classes/PopupMenu.xml @@ -61458,7 +61531,9 @@ msgstr "Clase para mostrar popups con un fondo de panel." 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" "Clase para mostrar popups con un fondo de panel. En algunos casos puede ser " "más simple de usar que el [Popup], ya que proporciona un fondo configurable. " @@ -62393,10 +62468,12 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" -"Si [code]true[/code], se permitirá la entrada del micrófono. Esto requiere " -"que se establezcan los permisos apropiados al exportar a Android o iOS." #: doc/classes/ProjectSettings.xml #, fuzzy @@ -65582,8 +65659,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -70849,7 +70937,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" "Cambia la escena en curso a una nueva instancia de la [PackedScene] dada.\n" "Devuelve [constant OK] en el éxito o [constant ERR_CANT_CREATE] si la escena " @@ -71044,18 +71134,20 @@ msgstr "La escena actual." #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" -"Si [code]true[/code], las formas de colisión serán visibles cuando se " -"ejecute el juego desde el editor con fines de depuración." #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" -"Si [code]true[/code], los polÃgonos de navegación serán visibles cuando se " -"ejecute el juego desde el editor para su depuración." #: doc/classes/SceneTree.xml msgid "The root of the edited scene." @@ -72462,8 +72554,11 @@ msgstr "" "es especÃfico para cada forma y no puede ser configurado." #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." -msgstr "La forma personalizada es un solucionador personalizado." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." +msgstr "" #: doc/classes/ShortCut.xml msgid "A shortcut for binding input." @@ -73228,6 +73323,18 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" +"Devuelve [code]true[/code] si el nodo está presente en el [SceneTree], su " +"propiedad [member visible] es [code]true[/code] y todos sus antecedentes " +"también son visibles. Si algún antecedente está oculto, este nodo no será " +"visible en el árbol de la escena." + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -73673,7 +73780,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -75516,7 +75625,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -77083,6 +77192,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -77161,6 +77273,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -77195,11 +77310,15 @@ msgstr "" "en su lugar." #: doc/classes/String.xml +#, fuzzy 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" "Divide la string en reales usando una string delimitadora y devuelve un " "array de las substrings..\n" @@ -78701,6 +78820,11 @@ msgstr "" "está activada." #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Devuelve el texto del artÃculo en el Ãndice [code]idx[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "Devuelve el número de pestañas ocultas desplazadas a la izquierda." @@ -78733,6 +78857,11 @@ msgstr "" "del ratón." #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Establece un icono para la pestaña en el Ãndice [code]tab_idx[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" "Establece un icono [code]icon[/code] para la pestaña en el Ãndice " @@ -78790,9 +78919,12 @@ msgstr "" "ratón. Ver [member drag_to_rearrange_enabled]." #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" -"Se emite cuando se hace clic con el botón derecho del ratón en una pestaña." +"Se emite cuando se presiona un botón personalizado. Ver [method add_button]." #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -85082,21 +85214,25 @@ msgstr "" "sola." #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." -msgstr "Funciones de red de UPNP." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." +msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -85109,7 +85245,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -85138,7 +85274,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -85146,24 +85314,38 @@ msgid "Adds the given [UPNPDevice] to the list of discovered devices." msgstr "Añade el [UPNPDevice] dado a la lista de dispositivos descubiertos." #: modules/upnp/doc_classes/UPNP.xml +#, fuzzy 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" "Añade un mapeo para reenviar el [code]port[/code] externo (entre 1 y 65535) " @@ -85192,12 +85374,15 @@ msgid "Clears the list of discovered devices." msgstr "Borra la lista de dispositivos descubiertos." #: modules/upnp/doc_classes/UPNP.xml +#, fuzzy 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" "Elimina la asignación de puertos para la combinación de puertos y protocolos " "dada en la pasarela por defecto (ver [method get_gateway]) si existe. " @@ -85443,16 +85628,17 @@ msgid "Unknown error." msgstr "Error desconocido." #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." -msgstr "Dispositivo UPNP." +msgid "Universal Plug and Play (UPnP) device." +msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml +#, fuzzy 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." +"Universal Plug and Play (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 "" "Dispositivo UPNP. Véase [UPNP] para las funciones de descubrimiento y " "utilidad del UPNP. Proporciona un acceso de bajo nivel a los comandos de " @@ -96678,8 +96864,13 @@ msgstr "" "dependencia cÃclica, y permite que las referencias sean liberadas." #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." -msgstr "Devuelve el [Object] al que se refiere este weakref." +#, fuzzy +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." +msgstr "" +"Devuelve el valor inicial de la propiedad especificada. Devuelve [code]null[/" +"code] si la propiedad no existe." #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "Closes this data channel, notifying the other peer." diff --git a/doc/translations/fa.po b/doc/translations/fa.po index 7416d80072..4be9e9a8e1 100644 --- a/doc/translations/fa.po +++ b/doc/translations/fa.po @@ -16,12 +16,13 @@ # Seyed Fazel Alavi <fazel8195@gmail.com>, 2022. # Giga hertz <gigahertzyt@gmail.com>, 2022. # ilia khormali <iliakhormaly1384@gmail.com>, 2022. +# John Smith <pkafsharix@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-21 15:55+0000\n" -"Last-Translator: ilia khormali <iliakhormaly1384@gmail.com>\n" +"PO-Revision-Date: 2022-09-08 12:47+0000\n" +"Last-Translator: John Smith <pkafsharix@gmail.com>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/fa/>\n" "Language: fa\n" @@ -29,7 +30,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -77,11 +78,11 @@ msgstr "ØªÙˆØ¶ÛŒØØ§Øª ویژگی تم" #: doc/tools/make_rst.py msgid "Inherits:" -msgstr "" +msgstr "ارث می‌برد از:" #: doc/tools/make_rst.py msgid "Inherited By:" -msgstr "" +msgstr "ارث برده شده توسط:" #: doc/tools/make_rst.py msgid "(overrides %s)" @@ -101,7 +102,7 @@ msgstr "مقدار" #: doc/tools/make_rst.py msgid "Getter" -msgstr "" +msgstr "گیرنده" #: doc/tools/make_rst.py msgid "" @@ -119,16 +120,20 @@ msgstr "" msgid "" "This method accepts any number of arguments after the ones described here." msgstr "" +"این متد هر تعداد آرگومان را پس از آنهایی Ú©Ù‡ اینجا ØªÙˆØ¶ÛŒØ Ø¯Ø§Ø¯Ù‡ شده اند قبول " +"می‌کند." #: doc/tools/make_rst.py msgid "This method is used to construct a type." -msgstr "" +msgstr "این متد برای ساختن یک تایپ Ø§Ø³ØªÙØ§Ø¯Ù‡ میشود." #: doc/tools/make_rst.py msgid "" "This method doesn't need an instance to be called, so it can be called " "directly using the class name." msgstr "" +"این متد برای صدا زده شدن نیازی به یک مورد ندارد، پس می‌تواند مستقیماً با " +"Ø§Ø³ØªÙØ§Ø¯Ù‡ از نام کلاس صدا زده شود." #: doc/tools/make_rst.py msgid "" @@ -786,8 +791,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -797,7 +803,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -875,7 +882,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -887,7 +895,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "با یک مقدار نرمال شده بین دو مقدار درون یابی Ù…ÛŒ کند. این مخال٠[روش " "inverse_lerp] است.\n" @@ -1460,10 +1469,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -5280,19 +5294,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5313,21 +5329,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5336,9 +5356,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5990,9 +6011,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -6166,8 +6187,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -9169,8 +9190,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9221,10 +9243,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9466,12 +9498,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10017,7 +10043,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10178,12 +10209,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10331,6 +10366,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10471,7 +10521,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12149,7 +12202,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12242,7 +12295,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12270,9 +12325,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12769,13 +12824,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12801,8 +12857,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13115,12 +13173,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13165,8 +13223,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13214,8 +13274,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13277,7 +13340,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13402,7 +13465,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16398,7 +16464,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19123,7 +19191,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19272,16 +19342,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19426,18 +19497,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -24344,8 +24403,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24965,7 +25028,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26549,10 +26614,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27959,8 +28027,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -30260,11 +30328,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31109,7 +31180,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31121,6 +31196,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33478,14 +33563,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33493,21 +33578,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -35084,9 +35169,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35545,7 +35630,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36663,7 +36750,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37478,13 +37565,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41148,7 +41247,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46524,7 +46625,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46763,7 +46866,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47492,7 +47597,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50173,8 +50282,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51981,7 +52101,7 @@ msgstr "" #: doc/classes/Resource.xml msgid "Resources" -msgstr "" +msgstr "منابع" #: doc/classes/Resource.xml msgid "" @@ -54195,7 +54315,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54339,13 +54461,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55535,7 +55663,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56154,6 +56285,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56488,7 +56627,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57921,7 +58062,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59186,6 +59327,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -59247,6 +59391,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -59269,7 +59416,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60406,6 +60556,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60435,6 +60589,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60476,7 +60634,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65341,21 +65501,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65368,7 +65532,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65397,7 +65561,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65407,22 +65603,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65435,8 +65644,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65634,16 +65845,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74273,7 +74484,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/fi.po b/doc/translations/fi.po index b1d940aa14..558873eb70 100644 --- a/doc/translations/fi.po +++ b/doc/translations/fi.po @@ -615,8 +615,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -626,7 +627,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -680,7 +682,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -692,7 +695,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1107,10 +1111,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4922,19 +4931,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4955,21 +4966,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4979,9 +4994,10 @@ msgstr "Palauttaa parametrin tangentin." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5633,9 +5649,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5809,8 +5825,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8818,8 +8834,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8870,10 +8887,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9116,12 +9143,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9667,7 +9688,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9828,12 +9854,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9981,6 +10011,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10121,7 +10166,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11802,7 +11850,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11895,7 +11943,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11923,9 +11973,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12427,13 +12477,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12459,8 +12510,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12773,12 +12826,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12823,8 +12876,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12872,8 +12927,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12935,7 +12993,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13060,7 +13118,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16057,7 +16118,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18788,7 +18851,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18937,16 +19002,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19092,18 +19158,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Palauttaa parametrin arkussinin." @@ -24018,8 +24072,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24640,7 +24698,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26228,10 +26288,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27647,8 +27710,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29950,11 +30013,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30800,7 +30866,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30812,6 +30882,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33173,14 +33253,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33188,22 +33268,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Palauttaa kahden vektorin jäännöksen." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Line2D.xml msgid "" @@ -34780,9 +34864,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35243,7 +35327,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36375,7 +36461,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37201,13 +37287,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40877,7 +40975,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46251,7 +46351,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/PopupMenu.xml @@ -46490,7 +46592,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47220,7 +47324,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49901,8 +50009,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53921,7 +54040,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54065,13 +54186,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55261,7 +55388,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55881,6 +56011,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56215,7 +56353,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57649,7 +57789,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58916,6 +59056,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58977,6 +59120,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58999,7 +59145,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60136,6 +60285,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Laskee kahden vektorin ristitulon." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60166,6 +60320,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Laskee kahden vektorin ristitulon." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60207,7 +60366,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65091,21 +65252,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65118,7 +65283,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65147,7 +65312,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65157,22 +65354,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65185,8 +65395,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65384,16 +65596,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74056,7 +74268,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/fil.po b/doc/translations/fil.po index 42ab5537f4..0f6a2d6ec6 100644 --- a/doc/translations/fil.po +++ b/doc/translations/fil.po @@ -549,8 +549,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -560,7 +561,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -614,7 +616,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -626,7 +629,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1041,10 +1045,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4855,19 +4864,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4888,21 +4899,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4911,9 +4926,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5565,9 +5581,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5741,8 +5757,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8744,8 +8760,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8796,10 +8813,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9041,12 +9068,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9592,7 +9613,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9753,12 +9779,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9906,6 +9936,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10046,7 +10091,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11724,7 +11772,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11817,7 +11865,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11845,9 +11895,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12344,13 +12394,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12376,8 +12427,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12690,12 +12743,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12740,8 +12793,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12789,8 +12844,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12852,7 +12910,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12977,7 +13035,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15973,7 +16034,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18698,7 +18761,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18847,16 +18912,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19001,18 +19067,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23919,8 +23973,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24540,7 +24598,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26124,10 +26184,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27534,8 +27597,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29835,11 +29898,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30684,7 +30750,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30696,6 +30766,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33053,14 +33133,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33068,21 +33148,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34659,9 +34739,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35120,7 +35200,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36232,7 +36314,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37047,13 +37129,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40717,7 +40811,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46081,7 +46177,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46320,7 +46418,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47049,7 +47149,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49730,8 +49834,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53748,7 +53863,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53892,13 +54009,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55088,7 +55211,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55707,6 +55833,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56041,7 +56175,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57474,7 +57610,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58739,6 +58875,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58800,6 +58939,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58822,7 +58964,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59959,6 +60104,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59988,6 +60137,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60029,7 +60182,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64894,21 +65049,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64921,7 +65080,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64950,7 +65109,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64960,22 +65151,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64988,8 +65192,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65187,16 +65393,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73826,7 +74032,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/fr.po b/doc/translations/fr.po index 44d40e1bd5..22533d6b9a 100644 --- a/doc/translations/fr.po +++ b/doc/translations/fr.po @@ -61,7 +61,7 @@ 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: 2022-08-04 05:23+0000\n" +"PO-Revision-Date: 2022-08-19 12:56+0000\n" "Last-Translator: Maxime Leroy <lisacintosh@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/fr/>\n" @@ -632,8 +632,8 @@ msgstr "" "nombre à virgule flottante, avec des valeurs spécifiques conduisant aux " "comportements suivants:\n" "[codeblock]\n" -"- Inférieur à -1.0 (exclus) : Plus lent au début et à la fin (\"ease in-out\"" -")\n" +"- Inférieur à -1.0 (exclus) : Plus lent au début et à la fin (\"ease in-" +"out\")\n" "- 1.0 : Linéaire\n" "- Entre -1.0 et 0.0 (exclus) : Plus rapide au début et à la fin (\"ease out-" "in\")\n" @@ -876,6 +876,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -883,8 +884,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -894,7 +896,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Retourne le facteur d'interpolation ou d'extrapolation suivant l'intervalle " "spécifié dans [code]from[/code] et [code]to[/code], et la valeur interpolée " @@ -985,12 +988,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -1002,7 +1007,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "L'interpolation linéaire entre deux valeurs avec un facteur défini par " "[code]weight[/code]. Pour faire une interpolation, [code]weight[/code] doit " @@ -1733,17 +1739,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Permet de trouver la valeur correspondante dans l'intervalle [code][ostart, " -"ostop][/code] de la valeur [code]value[/code] appartenant à l'intervalle " -"[code][istart, istop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Renvoie la valeur 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1849,26 +1854,27 @@ msgid "" "-1.6521) return values[/url]" msgstr "" "Retourne le résultat de l'interpolation douce de la valeur [code]s[/code] " -"entre [code]0[/code] et [code]1[/code], basée sur la position de " -"[code]s[/code] entre [code]from[/code] et [code]to[/code].\n" +"entre [code]0[/code] et [code]1[/code], basée sur la position de [code]s[/" +"code] entre [code]from[/code] et [code]to[/code].\n" "La valeur retournée est [code]0[/code] si [code]s <= from[/code], et " "[code]1[/code] si [code]s >= to[/code]. Si [code]s[/code] se trouve entre " "[code]from[/code] et [code]to[/code], la valeur retournée suit une courbe en " "S qui représente les positions de [code]s[/code] entre[code]0[/code] et " "[code]1[/code].\n" "Cette courbe en S est l'interpolation cubique d'Hermite, obtenu par la " -"fonction mathématique [code]f(y) = 3*y^2 - 2*y^3[/code] où [code]y = (x-from)" -" / (to-from)[/code].\n" +"fonction mathématique [code]f(y) = 3*y^2 - 2*y^3[/code] où [code]y = (x-" +"from) / (to-from)[/code].\n" "[codeblock]\n" "smoothstep(0, 2, -5.0) # Retourne 0.0\n" "smoothstep(0, 2, 0.5) # Retourne 0.15625\n" "smoothstep(0, 2, 1.0) # Retourne 0.5\n" "smoothstep(0, 2, 2.0) # Retourne 1.0\n" "[/codeblock]\n" -"Comparé à l'utilisateur [method ease] avec une valeur de courbe de [code]-1." -"6521[/code], [method smoothstep] retourne la courbe la plus douce possible, " -"sans changement brusque de dérivée. Si vous avez besoin d'effectuer des " -"transitions plus avancées, utilisez [Tween] ou [AnimationPlayer].\n" +"Comparé à l'utilisateur [method ease] avec une valeur de courbe de " +"[code]-1.6521[/code], [method smoothstep] retourne la courbe la plus douce " +"possible, sans changement brusque de dérivée. Si vous avez besoin " +"d'effectuer des transitions plus avancées, utilisez [Tween] ou " +"[AnimationPlayer].\n" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" "smoothstep_ease_comparison.png]Comparaison entre les valeurs retournées par " "smoothstep() et ease(x, -1.6521)[/url]" @@ -4008,7 +4014,6 @@ msgid "VR Controller analog trigger." msgstr "Gâchette analogique de la manette VR." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "VR Controller analog grip (side buttons)." msgstr "Bouton guide du contrôleur de jeu SDL." @@ -6418,25 +6423,22 @@ msgstr "" "[AnimationRootNode], sinon les éditeurs n'afficheront pas le nÅ“ud pour ajout." #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." -msgstr "Obtient la légende pour ce nÅ“ud (utilisé par certains éditeurs)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." +msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" -"Obtient un nÅ“ud enfant par son index (utilisé par les éditeurs héritant " -"d'[AnimationRootNode])." #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" -"Obtient tous les nÅ“uds enfants dans l'ordre en tant que dictionnaire " -"[code]name: node[/code]. Utile uniquement lorsque [AnimationRootNode] est " -"hérité." #: doc/classes/AnimationNode.xml msgid "" @@ -6460,17 +6462,22 @@ msgstr "" "réutilisé dans plusieurs arbres de nÅ“uds." #: doc/classes/AnimationNode.xml +#, fuzzy 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" "Obtient la valeur par défaut d'un paramètre. Les paramètres sont la mémoire " "locale personnalisé utilisé pour vos nÅ“uds, étant donné qu'une ressource " "peut être réutilisé dans plusieurs arbres de nÅ“uds." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 "" @@ -6480,9 +6487,11 @@ msgstr "" "format est similaire à [method Object.get_property_list]." #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" "Renvoie [code]true[/code] si vous souhaitez que l'éditeur de mélange d'arbre " "affiche l'édition de filtre sur ce nÅ“ud." @@ -6492,10 +6501,12 @@ msgid "Returns whether the given path is filtered." msgstr "Retourne quand un chemin donné est filtré." #: doc/classes/AnimationNode.xml +#, fuzzy 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -7317,13 +7328,14 @@ msgstr "" "court." #: doc/classes/AnimationNodeStateMachineTransition.xml +#, fuzzy 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -7568,9 +7580,10 @@ msgstr "" "Retourne le nom de [code]animation[/code] ou un chaine vide si n'existe pas." #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" "Retourne le [Animation] avec la clé [code]name[/code] ou [code]null[/code] " "s'il n'est pas trouvé." @@ -11868,8 +11881,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "Démo d'enregistrement du microphone" @@ -11928,12 +11942,22 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" +msgstr "Bus audio" + #: doc/classes/AudioEffectCapture.xml msgid "" "Returns [code]true[/code] if at least [code]frames[/code] audio frames are " @@ -12218,12 +12242,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "Bus audio" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "L'intensité de la distorsion. Cette valeur est comprise entre 0 et 1." @@ -12455,7 +12473,6 @@ msgid "Gain amount of the frequencies after the filter." msgstr "La valeur du gain de fréquences après le filtre." #: doc/classes/AudioEffectFilter.xml -#, fuzzy msgid "Amount of boost in the frequency range near the cutoff frequency." msgstr "" "Quantité de boost dans les harmoniques près de la fréquence de coupure." @@ -12906,9 +12923,13 @@ msgstr "" "[code]at_position[/code]." #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" -"Retourne le nom de tous les appareils d'entrée audio détectés par le système." #: doc/classes/AudioServer.xml msgid "Generates an [AudioBusLayout] using the available buses and effects." @@ -13095,13 +13116,18 @@ msgid "Number of available audio buses." msgstr "Nombre de bus audio disponibles." #: doc/classes/AudioServer.xml +#, fuzzy msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" "Le nom du périphérique actuel pour l'entrée audio (voir [method " "get_device_list)]. Sur les systèmes avec plusieurs entrées audio (comme " @@ -13309,6 +13335,21 @@ msgstr "" "langages compilés avec GDNative, mais [method push_frame] peut être " "[i]moins[/i] efficace avec GDScript." +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "Le pilote de flux audio MP3." @@ -13462,8 +13503,12 @@ msgid "Plays positional sound in 2D space." msgstr "Joue un son localisé dans un espace 2D." #: doc/classes/AudioStreamPlayer2D.xml +#, fuzzy msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -15631,7 +15676,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -15755,7 +15800,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -15788,14 +15835,10 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" -"La taille de la caméra mesurée comme la moitié de la largeur ou de la " -"hauteur. N'est applicable qu'en modes orthogonal et frustum. Comme [member " -"keep_aspect] verrouille l'axe, [code]size[/code] fixe la longueur de la " -"taille sur l'autre axe." #: doc/classes/Camera.xml msgid "The vertical (Y) offset of the camera viewport." @@ -16045,18 +16088,16 @@ 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 "" -"La marge gauche nécessaire pour glisser la caméra. Une valeur de " -"[code]1[/code] ne déplace la caméra que lorsqu'elle atteint le bord de " -"l'écran." +"La marge gauche nécessaire pour glisser la caméra. Une valeur de [code]1[/" +"code] ne déplace la caméra que lorsqu'elle atteint le bord de l'écran." #: doc/classes/Camera2D.xml 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 "" -"La marge droite nécessaire pour glisser la caméra. Une valeur de " -"[code]1[/code] ne déplace la caméra que lorsqu'elle atteint le bord de " -"l'écran." +"La marge droite nécessaire pour glisser la caméra. Une valeur de [code]1[/" +"code] ne déplace la caméra que lorsqu'elle atteint le bord de l'écran." #: doc/classes/Camera2D.xml msgid "" @@ -16425,18 +16466,20 @@ msgid "Base class of anything 2D." msgstr "Classe de base de tout ce qui est 2D." #: doc/classes/CanvasItem.xml +#, fuzzy 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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -16488,10 +16531,19 @@ msgid "Custom drawing in 2D" msgstr "" #: doc/classes/CanvasItem.xml +#, fuzzy msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" +"Appelé lorsque le nÅ“ud entre dans la [SceneTree] (par exemple en étant " +"instancié, au changement de scène, ou après avoir appelé [method add_child] " +"dans un script). Si le nÅ“ud a des enfants, sa méthode [méthod enter_tree] " +"sera appelée d'abord, puis ensuite celle de ses enfants.\n" +"Correspond à la notification [constant NOTIFICATION_ENTER_TREE] dans [method " +"Object._notification]." #: doc/classes/CanvasItem.xml msgid "" @@ -16637,7 +16689,6 @@ msgstr "" "avec anti-crénelage." #: doc/classes/CanvasItem.xml -#, fuzzy msgid "" "Draws multiple disconnected lines with a uniform [code]width[/code] and " "segment-by-segment coloring. Colors assigned to line segments match by index " @@ -16982,12 +17033,13 @@ msgstr "" "Retourne [code]true[/code] si les notification des transformations globales " "sont communiquées aux enfants." -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml +#, fuzzy msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" "Retourne [code]true[/code] si le nÅ“ud est présent dans le [SceneTree], que " "sa propriété [member visible] est [code]true[/code] et que tous ses parents " @@ -17055,11 +17107,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" -"Ajoute le [CanvasItem] pour être mis à jour. [constant NOTIFICATION_DRAW] " -"sera émise sur le temps inoccupé pour demander la mise à jour." #: doc/classes/CanvasItem.xml msgid "" @@ -17117,12 +17169,12 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" -"Émis lorsque le [CanvasItem] doit être redessiné. Ça ne peut être que " -"connecté qu'en temps réel, puisque le différer peut ne pas permettre le " -"dessin." #: doc/classes/CanvasItem.xml msgid "Emitted when becoming hidden." @@ -17194,7 +17246,8 @@ msgstr "" "reçue que si elle est activée par [method set_notify_local_transform]." #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +#, fuzzy +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "Le [CanvasItem] est demandé de dessiner." #: doc/classes/CanvasItem.xml @@ -17348,7 +17401,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -19277,12 +19333,10 @@ msgid "Antique white color." msgstr "Couleur blanc antique." #: doc/classes/Color.xml -#, fuzzy msgid "Aqua color." msgstr "Couleur aqua." #: doc/classes/Color.xml -#, fuzzy msgid "Aquamarine color." msgstr "Couleur aigue-marine." @@ -19363,7 +19417,6 @@ msgid "Dark cyan color." msgstr "Couleur cyan foncé." #: doc/classes/Color.xml -#, fuzzy msgid "Dark goldenrod color." msgstr "Couleur verge d'or foncé." @@ -19436,7 +19489,6 @@ msgid "Dim gray color." msgstr "Couleur gris pâle." #: doc/classes/Color.xml -#, fuzzy msgid "Dodger blue color." msgstr "Couleur bleue Dodger." @@ -19457,7 +19509,6 @@ msgid "Fuchsia color." msgstr "Couleur fuchsia." #: doc/classes/Color.xml -#, fuzzy msgid "Gainsboro color." msgstr "Couleur Gainsboro." @@ -19470,7 +19521,6 @@ msgid "Gold color." msgstr "Couleur or." #: doc/classes/Color.xml -#, fuzzy msgid "Goldenrod color." msgstr "Couleur verge d'or." @@ -19599,7 +19649,6 @@ msgid "Maroon color." msgstr "Couleur marron." #: doc/classes/Color.xml -#, fuzzy msgid "Medium aquamarine color." msgstr "Couleur bleu-marine moyenne." @@ -19684,7 +19733,6 @@ msgid "Orchid color." msgstr "Couleur d’orchidée." #: doc/classes/Color.xml -#, fuzzy msgid "Pale goldenrod color." msgstr "Couleur verge d'or pâle." @@ -19729,7 +19777,6 @@ msgid "Purple color." msgstr "Couleur violette." #: doc/classes/Color.xml -#, fuzzy msgid "Rebecca purple color." msgstr "Couleur violette Rebecca." @@ -19766,7 +19813,6 @@ msgid "Seashell color." msgstr "Couleur coquillage." #: doc/classes/Color.xml -#, fuzzy msgid "Sienna color." msgstr "Couleur Sienne." @@ -19807,7 +19853,6 @@ msgid "Teal color." msgstr "Couleur sarcelle." #: doc/classes/Color.xml -#, fuzzy msgid "Thistle color." msgstr "Couleur chardon." @@ -20259,7 +20304,6 @@ msgstr "" "Plus c'est haut, plus c'est rapide." #: doc/classes/ConeTwistJoint.xml doc/classes/PhysicsServer.xml -#, fuzzy msgid "" "Defines, how fast the swing- and twist-speed-difference on both sides gets " "synced." @@ -21405,10 +21449,10 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" -"Voler le focus d'un autre contrôle et devenir le contrôle focalisé (voir " -"[member focus_mode])." #: doc/classes/Control.xml msgid "" @@ -22990,10 +23034,10 @@ msgid "" "variables, like [member anchor_left]. To change all 4 anchors at once, use " "[method set_anchors_preset]." msgstr "" -"Magnétise l'un des 4 côtés d'ancrage à l'origine de l'ancrage " -"[code]Rect[/code], en haut à gauche. Utilisez-le avec l'une des variables " -"membres [code]anchor_*[/code], comme [member anchor_left]. Pour modifier les " -"4 ancres à la fois, utilisez [method set_anchors_preset]." +"Magnétise l'un des 4 côtés d'ancrage à l'origine de l'ancrage [code]Rect[/" +"code], en haut à gauche. Utilisez-le avec l'une des variables membres " +"[code]anchor_*[/code], comme [member anchor_left]. Pour modifier les 4 " +"ancres à la fois, utilisez [method set_anchors_preset]." #: doc/classes/Control.xml msgid "" @@ -25097,10 +25141,13 @@ msgid "A mathematic curve." msgstr "Une courbe mathématique." #: doc/classes/Curve.xml +#, fuzzy 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" "Une courbe qui peut être sauvegardée et réutilisée pour d'autres objets. Par " "défaut, elle va de [code]0[/code] à [code]1[/code] selon l'axe Y et les " @@ -25286,26 +25333,28 @@ msgstr "" "Ça garde un cache des points calculés le long de la courbe, pour accélérer " "les calculs ultérieurs." -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml +#, fuzzy msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" "Ajoute un point à une courbe à la [code]position[/code] par rapport à la " -"position de la [Curve2D], avec des points de contrôle d'entrée " -"[code]in[/code] et de sortie [code]out[/code].\n" +"position de la [Curve2D], avec des points de contrôle d'entrée [code]in[/" +"code] et de sortie [code]out[/code].\n" "Si [code]at_position[/code] est spécifié, le point est inséré juste avant ce " "numéro de point [code]at_position[/code], en déplaçant ce point (et tous les " -"autres points qui suivent) après le point inséré. Si [code]at_position[/code]" -" n'est pas donné, ou est une valeur invalide ([code]at_position < 0[/code] " -"ou [code]at_position >= [method get_point_count][/code]), le point sera " -"ajouté en dernier." +"autres points qui suivent) après le point inséré. Si [code]at_position[/" +"code] n'est pas donné, ou est une valeur invalide ([code]at_position < 0[/" +"code] ou [code]at_position >= [method get_point_count][/code]), le point " +"sera ajouté en dernier." #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" @@ -25520,27 +25569,6 @@ msgstr "" "accélérer de nouveaux calculs." #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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 "" -"Ajoute un point à la courbe à [code]position[/code] par rapport à la " -"position [Curve3D], avec des points de contrôle [code]in[/code] et " -"[code]out[/code].\n" -"Si [code]at_position[/code] est spécifiée, le point est inséré avant le " -"numéro de point [code]at_position[/code], deplaçant ce point (et tous les " -"suivants) après le point inséré. Si [code]at_position[/code] n'est pas " -"spécifiée, ou est une valeur invalide ([code]at_position <0[/code] ou " -"[code]at_position >= [method get_point_count][/code]), le point sera ajouté " -"à la fin de la liste des points." - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Retourne le cache de points sous forme de [PoolVector3Array]." @@ -26418,8 +26446,8 @@ msgstr "" "Change le dossier actuellement ouvert par celui donné en argument. " "L'argument peut être relatif au répertoire actuel (par exemple " "[code]nouveau_dossier[/code] ou [code]./dossier[/code]), ou être un chemin " -"absolu (par exemple [code]/tmp/dossier[/code] ou [code]res://parent/" -"dossier[/code]).\n" +"absolu (par exemple [code]/tmp/dossier[/code] ou [code]res://parent/dossier[/" +"code]).\n" "Retourne une des constantes de code [enum Error] (et [code]OK[/code] en cas " "de succès)." @@ -31794,7 +31822,6 @@ msgid "" msgstr "" #: doc/classes/Environment.xml -#, fuzzy msgid "The screen-space ambient occlusion color." msgstr "Le rayon d'occlusion ambiante de l'espace de l'écran primaire." @@ -31852,7 +31879,6 @@ msgid "" msgstr "" #: doc/classes/Environment.xml -#, fuzzy msgid "The default exposure used for tonemapping." msgstr "L’exposition par défaut utilisée pour tonifier." @@ -32292,11 +32318,13 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" -"Retourne le fichier complet en [String].\n" -"Le texte est interprété comme étant encodé en UTF-8." #: doc/classes/File.xml msgid "Returns next [code]len[/code] bytes of the file as a [PoolByteArray]." @@ -32959,7 +32987,6 @@ msgid "" msgstr "" #: doc/classes/FlowContainer.xml -#, fuzzy msgid "Base class for flow containers." msgstr "La classe de base pour les conteneurs de flux." @@ -33013,7 +33040,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -33984,20 +34013,19 @@ msgid "" msgstr "" "Gonfle ou dégonfle [code]polygon[/code] par la quantité [code]delta[/code] " "unités (pixels) dans toutes les directions. Si [code]delta[/code] est " -"positif, le polygone décale chaque sommet vers l'extérieur. Si " -"[code]delta[/code] est négatif, décale chaque sommet vers l'intérieur. " -"Retourne une liste des polygones parce que gonflage/dégonflage peut produire " -"plusieurs polygones distinctes. Retourne un tableau vide si " -"[code]delta[/code] est négatif et la valeur absolue de celui-ci dépasse " -"approximativement les dimensions du rectangle minimal englobant du polygone." -"\n" +"positif, le polygone décale chaque sommet vers l'extérieur. Si [code]delta[/" +"code] est négatif, décale chaque sommet vers l'intérieur. Retourne une liste " +"des polygones parce que gonflage/dégonflage peut produire plusieurs " +"polygones distinctes. Retourne un tableau vide si [code]delta[/code] est " +"négatif et la valeur absolue de celui-ci dépasse approximativement les " +"dimensions du rectangle minimal englobant du polygone.\n" "Les sommets de chaque polygone sont arrondis suivant [code]join_type[/code], " "voir [enum PolyJoinType].\n" "L'opération peut fournir un polygone extérieur (la limite extérieure) et " "plusieurs polygones à intérieur (représentant les trous) qui pourraient être " "distingués en appelant [method is_polygon_clockwise].\n" -"[b]Note :[/b] Pour transformer les sommets en polygone, utilisez la méthode [" -"method Transform2D.xform]:\n" +"[b]Note :[/b] Pour transformer les sommets en polygone, utilisez la méthode " +"[method Transform2D.xform]:\n" "[codeblock]\n" "var polygon = PoolVector2Array([Vector2(0, 0), Vector2(100, 0), Vector2(100, " "100), Vector2(0, 100)])\n" @@ -34030,8 +34058,8 @@ msgstr "" "vide.\n" "Les sommets de chaque polygone sont arrondis suivant [code]join_type[/code], " "voir [enum PolyJoinType].\n" -"Chaque point d'extrémité du polygone sera arrondi suivant " -"[code]end_type[/code], voir [enum PolyEndType].\n" +"Chaque point d'extrémité du polygone sera arrondi suivant [code]end_type[/" +"code], voir [enum PolyEndType].\n" "L'opération peut fournir un polygone extérieur (la limite extérieur) et " "plusieurs polygones à intérieur (représentant les trous) qui pourraient être " "distingués en appelant [method is_polygon_clockwise]." @@ -34861,12 +34889,16 @@ msgstr "" "des couleurs entre des points de couleur définis par l'utilisateur." #: doc/classes/Gradient.xml +#, fuzzy 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" "À partir d'un ensemble de couleurs, cette ressource les interpolera dans " "l'ordre. Cela signifie que si vous avez la couleur 1, la couleur 2 et la " @@ -35581,8 +35613,8 @@ msgstr "" "[code]custom_left[/code]/[code]right[/code] est une texture personnalisée " "pour le port de ce côté.\n" "[b]Note :[/b] Cette méthode ne définit que les propriétés de l'emplacement. " -"Pour créer l'emplacement, ajoutez un enfant dérivé de [Control] au GraphNode." -"\n" +"Pour créer l'emplacement, ajoutez un enfant dérivé de [Control] au " +"GraphNode.\n" "Les propriétés individuelles peuvent être définies en utilisant l'une des " "méthodes [code]set_slot_*[/code]. Vous devez activer au moins un côté de " "l'emplacement pour le faire." @@ -36245,7 +36277,6 @@ msgid "Horizontal version of [FlowContainer]." msgstr "La version horizontale du [FlowContainer]." #: doc/classes/HingeJoint.xml -#, fuzzy msgid "A hinge between two 3D PhysicsBodies." msgstr "Une articulation de torsion entre deux corps 3D." @@ -36503,7 +36534,6 @@ msgid "" msgstr "" #: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml -#, fuzzy msgid "Used when the mouse hovers over the grabber." msgstr "Utilisé lorsque la souris survole le glisseur." @@ -36615,11 +36645,12 @@ msgid "Low-level hyper-text transfer protocol client." msgstr "Client de protocole de transfert hypertexte de bas niveau." #: doc/classes/HTTPClient.xml +#, fuzzy 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -37675,12 +37706,12 @@ msgstr "" "des fichiers ou du contenu web via HTTP.\n" "[b]Avertissement :[/b] Voir les notes et avertissements du [HTTPClient] pour " "les limites, notamment concernant la sécurité SSL.\n" -"[b]Exemple pour contacter une API REST et afficher les champs retournés :[/b]" -"\n" +"[b]Exemple pour contacter une API REST et afficher les champs retournés :[/" +"b]\n" "[codeblock]\n" "func _ready():\n" -" # Créer un nÅ“ud de requête HTTP et le connecter au signal de complétion." -"\n" +" # Créer un nÅ“ud de requête HTTP et le connecter au signal de " +"complétion.\n" " var http_request = HTTPRequest.new()\n" " add_child(http_request)\n" " http_request.connect(\"request_completed\", self, " @@ -37716,8 +37747,8 @@ msgstr "" "HTTPRequest:[/b]\n" "[codeblock]\n" "func _ready():\n" -" # Créer un nÅ“ud de requête HTTP et le connecter au signal de complétion." -"\n" +" # Créer un nÅ“ud de requête HTTP et le connecter au signal de " +"complétion.\n" " var http_request = HTTPRequest.new()\n" " add_child(http_request)\n" " http_request.connect(\"request_completed\", self, " @@ -39364,11 +39395,14 @@ msgstr "Arrête la vibration du joypad." #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -40298,7 +40332,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -40310,6 +40348,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -42409,8 +42457,8 @@ msgid "" msgstr "" "Définit la priorité de rendu pour la bordure du texte. Les objets les plus " "prioritaires seront affichés par-dessus des objets les moins prioritaires.\n" -"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à [" -"constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" +"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à " +"[constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" "[b]Note :[/b] Cela ne s'applique qu'au tri des objets transparents. Cela " "n'affectera pas la façon dont les objets transparents sont triés par rapport " "aux objets opaques. C'est parce que les objets opaques ne sont pas triés, " @@ -42434,8 +42482,8 @@ msgid "" msgstr "" "Définit la priorité de rendu pour le texte. Les objets les plus prioritaires " "seront affichés par-dessus des objets les moins prioritaires.\n" -"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à [" -"constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" +"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à " +"[constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" "[b]Note :[/b] Cela ne s'applique qu'au tri des objets transparents. Cela " "n'affectera pas la façon dont les objets transparents sont triés par rapport " "aux objets opaques. C'est parce que les objets opaques ne sont pas triés, " @@ -43121,44 +43169,40 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" -"Ajoute un point au [code]position[/code]. Ajoute le point à la fin de la " -"ligne.\n" -"Si [code]at_position[/code] est donné, le point est inséré avant l'indice " -"[code]at_position[/code], en déplaçant ce point (et chaque point après) " -"après le point inséré. Si [code]at_position[/code] n'est pas donné, ou est " -"une valeur invalide ([code]at_position < 0[/code] ou [code]at_position >= " -"[method get_point_count][/code]), le point sera ajouté à la fin de la liste " -"des points." #: doc/classes/Line2D.xml msgid "Removes all points from the line." msgstr "Retire tous les points de la ligne." #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "Renvoie le nombre de points de la Ligne2D." +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Retourne le nombre d'os dans ce squelette." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "Renvoie la position du point [code]i[/code]." +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Retourne la position du point à l'index [code]point[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." msgstr "Supprime le point à l'index [code]i[/code] de la ligne." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" "Remplace la position du point [code]i[/code] par la [code]position[/code] " "spécifiée." @@ -43262,8 +43306,8 @@ msgid "" "The texture used for the line's texture. Uses [code]texture_mode[/code] for " "drawing style." msgstr "" -"La texture utilisée pour la texture de la ligne. Utilise " -"[code]texture_mode[/code] pour le style de dessin." +"La texture utilisée pour la texture de la ligne. Utilise [code]texture_mode[/" +"code] pour le style de dessin." #: doc/classes/Line2D.xml msgid "" @@ -43572,22 +43616,22 @@ msgid "" "# `text_change_rejected` is emitted with \"bye\" as parameter.\n" "[/codeblock]" msgstr "" -"La quantité maximale de caractères qui peuvent être entré dans ce " -"[LineEdit]. Si [code]0[/code], il n'y a aucune limite.\n" +"La quantité maximale de caractères qui peuvent être entré dans le " +"[LineEdit]. Aucune limite si [code]0[/code].\n" "Quand une limite est définie, le texte est tronqué aux [member max_length] " -"premiers caractères. Ça arrive pour le [member text] existant lorsque la " -"longueur maximale est définie, ou quand un nouveau texte est inséré dans le " +"premiers caractères. Cela s'applique au [member text] existant lorsque la " +"longueur maximale est définie ou quand un nouveau texte est inséré dans le " "[LineEdit], en étant par exemple collé. Si le texte est tronqué, le signal " "[signal text_change_rejected] est émis avec le reste du texte tronqué passé " "en paramètre.\n" -"[b]Example:[/b]\n" +"[b]Exemple:[/b]\n" "[codeblock]\n" "text = \"Salut le monde\"\n" "max_length = 5\n" "# `text` est tronqué à \"Salut\".\n" "max_length = 11\n" "text += \" l'univers\"\n" -"# `text` becomes \"Salut l'uni\".\n" +"# `text` devient \"Salut l'uni\".\n" "# `text_change_rejected` est émis avec \"vers\" passé en paramètre.\n" "[/codeblock]" @@ -44593,18 +44637,24 @@ msgid "" "Returns a [Material] in a given surface. Surface is rendered using this " "material." msgstr "" +"Retourne le [Material] pour une surface donnée. Le rendu de la surface est " +"fait en utilisant ce matériau." #: doc/classes/Mesh.xml msgid "" "Sets a [Material] for a given surface. Surface will be rendered using this " "material." msgstr "" +"Définit un [Material] pour une surface donnée. Le rendu de la surface sera " +"faite utilisant ce matériau." #: doc/classes/Mesh.xml msgid "" "Sets a hint to be used for lightmap resolution in [BakedLightmap]. Overrides " "[member BakedLightmap.default_texels_per_unit]." msgstr "" +"Définit un indice à utiliser pour la résolution de la lightmap dans " +"[BakedLightmap]. Surcharge [member BakedLightmap.default_texels_per_unit]." #: doc/classes/Mesh.xml msgid "Render array as points (one vertex equals one point)." @@ -44616,11 +44666,13 @@ msgstr "Rend le tableau en ligne (une ligne est créée tous les deux sommets)." #: doc/classes/Mesh.xml msgid "Render array as line strip." -msgstr "" +msgstr "Fait le rendu du tableau comme une suite de lignes." #: doc/classes/Mesh.xml msgid "Render array as line loop (like line strip, but closed)." msgstr "" +"Fait le rendu du tableau comme une boucle de ligne (une suite de lignes, " +"mais fermée)." #: doc/classes/Mesh.xml msgid "Render array as triangles (every three vertices a triangle is created)." @@ -44629,11 +44681,11 @@ msgstr "" #: doc/classes/Mesh.xml msgid "Render array as triangle strips." -msgstr "" +msgstr "Fait le rendu du tableau comme une suite de triangles." #: doc/classes/Mesh.xml msgid "Render array as triangle fans." -msgstr "" +msgstr "Fait le rendu du tableau comme un éventail de triangles." #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Blend shapes are normalized." @@ -44699,6 +44751,8 @@ msgstr "" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) normal array." msgstr "" +"Le drapeau utilisé pour marquer que le tableau de normales est compressé " +"(avec des demi-flottants)." #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) tangent array." @@ -44959,8 +45013,8 @@ msgid "" msgstr "" "Retourne le format du [Mesh]. Le format est un entier composé des drapeaux " "de format du [Mesh]. Par exemple, un maillage contenant à la fois des " -"sommets et des normales retournerait un format de [code]3[/code] parce que [" -"constant ArrayMesh.ARRAY_FORMAT_VERTEX] est [code]1[/code] et [constant " +"sommets et des normales retournerait un format de [code]3[/code] parce que " +"[constant ArrayMesh.ARRAY_FORMAT_VERTEX] est [code]1[/code] et [constant " "ArrayMesh.ARRAY_FORMAT_NORMAL] est [code]2[/code].\n" "Voir [enum ArrayMesh.ArrayFormat] pour une liste de drapeaux de format." @@ -45069,13 +45123,14 @@ msgid "Node that instances meshes into a scenario." msgstr "NÅ“ud qui instancie des meshes dans un scénario." #: doc/classes/MeshInstance.xml +#, fuzzy 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" "MeshInstance est un nÅ“ud qui prend une ressource [Mesh] et l'ajoute au " "scénario actuel en créant une instance. C'est la classe la plus souvent " @@ -45112,6 +45167,9 @@ msgid "" "This helper creates a [MeshInstance] child node with gizmos at every vertex " "calculated from the mesh geometry. It's mainly used for testing." msgstr "" +"Cett aide crée un nÅ“ud [MeshInstance] enfant avec des manipulateur à chaque " +"sommet calculé à partir de la géométrie de maillages. C'est principalement " +"utilisé pour les essais." #: doc/classes/MeshInstance.xml msgid "" @@ -45119,6 +45177,10 @@ msgid "" "[ConvexPolygonShape] collision shapes calculated from the mesh geometry via " "convex decomposition. It's mainly used for testing." msgstr "" +"Cett aide crée un nÅ“ud [StaticBody] enfant avec plusieurs formes de " +"collision [ConvexPolygonShape] calculées à partir de la géométrie de " +"maillage via la décomposition de convexes. C'est principalement utilisé pour " +"les essais." #: doc/classes/MeshInstance.xml msgid "" @@ -45126,6 +45188,9 @@ msgid "" "collision shape calculated from the mesh geometry. It's mainly used for " "testing." msgstr "" +"Cette aide crée un nÅ“ud [StaticBody] enfant avec une forme de collision " +"[ConcavePolygonShape] calculée à partir de la géométrie de maillages. C'est " +"principalement utilisé pour les essais." #: doc/classes/MeshInstance.xml msgid "" @@ -45135,6 +45200,12 @@ msgid "" "[Material] defined in the [Mesh]. For example, if [member GeometryInstance." "material_override] is used, all surfaces will return the override material." msgstr "" +"Retourne le [Material] qui sera utilisé par le [Mesh] lors de l'affichage. " +"Ceci peut renvoyer le [member GeometryInstance.material_override], la " +"surcharge de surface [Material] définie dans ce [MeshInstance], ou la " +"surface [Material] définie dans le [Mesh]. Par exemple, si [member " +"GeometryInstance.material_override] est utilisé, toutes les surfaces " +"retourneront le matériau de surcharge." #: doc/classes/MeshInstance.xml msgid "" @@ -45163,8 +45234,8 @@ msgid "" "each surface must match, in terms of material, attributes and vertex format." msgstr "" "Retourne [code]true[/code] si cette [MeshInstance] peut être fusionnée avec " -"l'autre instance [code]other_mesh_instance[/code], en utilisant la fonction [" -"method MeshInstance.merge_meshes].\n" +"l'autre instance [code]other_mesh_instance[/code], en utilisant la fonction " +"[method MeshInstance.merge_meshes].\n" "Pour pouvoir être fusionnées, les propriétés des [MeshInstance] doivent " "correspondre, et chaque surface doit correspondre, en termes de matériau, " "d'attributs et de format des sommets." @@ -45256,6 +45327,11 @@ msgid "" "toolbar. Select the [Sprite] node, then choose [b]Sprite > Convert to " "MeshInstance2D[/b] at the top of the 2D editor viewport." msgstr "" +"Le nÅ“ud utilisé pour afficher un [Mesh] en 2D. Un [MeshInstance2D] peut être " +"automatiquement créé à partir d'un [Sprite] existant via un outil dans la " +"barre d'outils d'éditeur. Sélectionnez le nÅ“ud [Sprite], puis choisissez " +"[b]Sprite > Convertir en MeshInstance2D[/b] en haut de la fenêtre " +"d'affichage 2D." #: doc/classes/MeshInstance2D.xml msgid "The [Mesh] that will be drawn by the [MeshInstance2D]." @@ -45269,12 +45345,22 @@ msgid "" "Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for " "a comparison of normal map coordinates expected by popular engines." msgstr "" +"La carte de normales qui sera utilisée si vous utilisez le " +"[CanvasItemMaterial] par défaut.\n" +"[b]Note :[/b] Godot s'attend à ce que la carte normale utilise les " +"coordonnées X+, Y+ et Z+. Voir [url=http://wiki.polycount.com/wiki/" +"Normal_Map_Technical_Details#Common_Swizzle_Coordinates]cette page[/url] " +"pour une comparaison des coordonnées des cartes de normales attendues par " +"certains moteurs populaires." #: doc/classes/MeshInstance2D.xml doc/classes/MultiMeshInstance2D.xml msgid "" "The [Texture] that will be used if using the default [CanvasItemMaterial]. " "Can be accessed as [code]TEXTURE[/code] in CanvasItem shader." msgstr "" +"La [Texture] qui sera utilisée si vous utilisez le [CanvasItemMaterial] par " +"défaut. Peut être accédée via [code]TEXTURE[/code] dans le shader du " +"CanvasItem." #: doc/classes/MeshInstance2D.xml doc/classes/MultiMeshInstance2D.xml msgid "Emitted when the [member texture] is changed." @@ -45290,6 +45376,10 @@ msgid "" "and ID. Each item can also include collision and navigation shapes. This " "resource is used in [GridMap]." msgstr "" +"Une bibliothèque de maillages. Contient une liste des ressources [Mesh], " +"chacune avec un nom et un identifiant. Chaque article peut également inclure " +"des formes de collision et de navigation. Cette ressource est utilisée dans " +"[GridMap]." #: doc/classes/MeshLibrary.xml msgid "Clears the library." @@ -45300,6 +45390,9 @@ 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 "" +"Crée un nouvel article dans la bibliothèque avec l'identifiant donné.\n" +"Vous pouvez obtenir un identifiant inutilisé via [method " +"get_last_unused_item_id]." #: doc/classes/MeshLibrary.xml msgid "Returns the first item with the given name." @@ -45315,7 +45408,7 @@ msgstr "Retourne le maillage de l'élément." #: doc/classes/MeshLibrary.xml msgid "Returns the transform applied to the item's mesh." -msgstr "" +msgstr "Retourne la transformation appliquée au maillage de l'objet." #: doc/classes/MeshLibrary.xml msgid "Returns the item's name." @@ -45338,12 +45431,20 @@ msgid "" "set_item_preview]. Returns an empty [Texture] if no preview was manually set " "in a running project." msgstr "" +"Lors de l'exécution dans l'éditeur, retourne l'aperçu généré d'un élément " +"(un rendu 3D dans la perspective isométrique). Lorsqu'il est utilisé dans un " +"projet en cours d'exécution, retourne l'aperçu personnalisé de l'élément qui " +"peut être défini en utilisant [method set_item_preview]. Retourne une " +"[Texture] vide si aucun aperçu n'a été défini manuellement dans un projet en " +"cours d'exécution." #: doc/classes/MeshLibrary.xml msgid "" "Returns an item's collision shapes.\n" "The array consists of each [Shape] followed by its [Transform]." msgstr "" +"Retourne les formes de collision.\n" +"Le tableau contient chaque [Shape] aussitôt suivie de sa [Transform]." #: doc/classes/MeshLibrary.xml msgid "Gets an unused ID for a new item." @@ -45359,7 +45460,7 @@ msgstr "Définit le maillage de l'élément." #: doc/classes/MeshLibrary.xml msgid "Sets the transform to apply to the item's mesh." -msgstr "" +msgstr "Régle la transformation à appliquer au maillage de l'objet." #: doc/classes/MeshLibrary.xml msgid "" @@ -45367,6 +45468,9 @@ msgid "" "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 "" +"Définit le nom de l'objet.\n" +"Ce nom est indiqué dans l'éditeur. Il peut également être utilisé pour " +"retrouver l'élément par la suite en utilisant [method find_item_by_name]." #: doc/classes/MeshLibrary.xml msgid "Sets the item's navigation mesh." @@ -45379,7 +45483,7 @@ msgstr "" #: doc/classes/MeshLibrary.xml msgid "Sets a texture to use as the item's preview icon in the editor." -msgstr "" +msgstr "Définit la texture pour l'icône d'aperçu de l'élément dans l'éditeur." #: doc/classes/MeshLibrary.xml msgid "" @@ -45388,6 +45492,10 @@ msgid "" "that will be applied to it. For shapes that should not have a transform, use " "[constant Transform.IDENTITY]." msgstr "" +"Définit les formes de collision d'un objet.\n" +"Le tableau doit être composé d'objets [Shape], chacun aussitôt suivi d'une " +"[Transform] qui lui sera appliqué. Pour les formes qui ne devraient pas " +"avoir une transformation, utilisez [constant Transform.IDENTITY]." #: doc/classes/MeshTexture.xml msgid "Simple texture that uses a mesh to draw itself." @@ -45398,6 +45506,9 @@ 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 "" +"Une texture simple qui utilise un maillage pour se dessiner elle-même. C'est " +"assez limité parce que les drapeaux ne peuvent pas être modifiés et que " +"l'affichage uniquement de cette région n'est pas supporté." #: doc/classes/MeshTexture.xml msgid "Sets the base texture that the Mesh will use to draw." @@ -45417,6 +45528,8 @@ msgstr "" msgid "" "Interpolates an abstract value and supplies it to a method called over time." msgstr "" +"Interpole une valeur abstraite et la fournit à une méthode appelée dans le " +"temps." #: doc/classes/MethodTweener.xml msgid "" @@ -45428,6 +45541,13 @@ msgid "" "create [MethodTweener]. Any [MethodTweener] created manually will not " "function correctly." msgstr "" +"[MethodTweener] est comme une combinaison de [CallbackTweener] et de " +"[PropertyTweener]. Il appelle une méthode en fournissant une valeur " +"interpolée comme paramètre. Voir [method SceneTreeTween.tween_method] pour " +"plus d'informations d'utilisation.\n" +"[b]Note :[/b] [method SceneTreeTween.tween_method] est le seul moyen correct " +"de créer un [MethodTweener]. Tout [MethodTweener] créé manuellement ne " +"fonctionnera pas correctement." #: doc/classes/MethodTweener.xml msgid "" @@ -45442,6 +45562,9 @@ msgid "" "Sets the type of used easing from [enum Tween.EaseType]. If not set, the " "default easing is used from the [SceneTreeTween] that contains this Tweener." msgstr "" +"Définit le type de comportement utilisé pour [enum Tween.EaseType]. Si n'est " +"pas défini, le comportement par défaut sera celui utilisé dans le " +"[SceneTreeTween] qui contient ce Tweener." #: doc/classes/MethodTweener.xml doc/classes/PropertyTweener.xml msgid "" @@ -45449,6 +45572,9 @@ msgid "" "set, the default transition is used from the [SceneTreeTween] that contains " "this Tweener." msgstr "" +"Définit le type de transition utilisée pour [enum Tween.TransitionType]. Si " +"n'est pas définie, la transition par défaut sera celle utilisée dans le " +"[SceneTreeTween] qui contient ce Tweener." #: modules/mobile_vr/doc_classes/MobileVRInterface.xml msgid "Generic mobile VR implementation." @@ -45470,6 +45596,20 @@ msgid "" " get_viewport().arvr = true\n" "[/codeblock]" msgstr "" +"Il s'agit d'une implémentation VR mobile générique où vous devez fournir des " +"détails sur le téléphone et le HMD utilisés. Il ne repose sur aucune " +"bibliothèque existante. C'est l'interface la plus basique que nous avons. " +"Pour un meilleur résultat, vous avez besoin d'un téléphone mobile avec un " +"gyroscope et un accéléromètre intégrés.\n" +"Notez que même s'il n'y a pas de suivi de la position, la caméra suppose que " +"le casque est à une hauteur de 1.85 mètres. Vous pouvez changer cela en " +"définissant [member eye_height].\n" +"Vous pouvez initialiser cette interface ainsi :\n" +"[codeblock]\n" +"var interface = ARVRServer.find_interface(\"Native mobile\")\n" +"if interface and interface.initialize():\n" +" get_viewport().arvr = true\n" +"[/codeblock]" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml msgid "" @@ -45537,12 +45677,25 @@ msgid "" "Since instances may have any behavior, the AABB used for visibility must be " "provided by the user." msgstr "" +"MultiMesh fournit un moyen d'instancier des maillages en bas niveau. " +"L'affichage des milliers de nÅ“uds [MeshInstance] peuvent être lent, puisque " +"chaque objet est envoyé au GPU puis dessiné individuellement.\n" +"MultiMesh est beaucoup plus rapide puisqu'il peut dessiner des milliers " +"d'instances avec un seul appel, ce qui réduit la charge sur l'API.\n" +"Un des inconvénients c'est que si les instances sont trop éloignées les unes " +"des autres, les performances peuvent être réduites car chaque instance sera " +"rendu individuellemen (elles sont indexés spatialement comme étant une " +"seule, mais pour l'objet entier).\n" +"Comme les instances peuvent avoir différents comportements, l'AABB utilisée " +"pour la visibilité doit être fournie par l'utilisateur." #: doc/classes/MultiMesh.xml msgid "" "Returns the visibility axis-aligned bounding box in local space. See also " "[method VisualInstance.get_transformed_aabb]." msgstr "" +"Retourne la boîte englobante, alignée sur les axes, de visibilité dans " +"l'espace local. Voir aussi [method VisualInstance.get_transformed_aabb]." #: doc/classes/MultiMesh.xml msgid "Gets a specific instance's color." @@ -45570,6 +45723,12 @@ msgid "" "used when initially placing an instance such as a bullet to prevent " "graphical glitches." msgstr "" +"En utilisant [i]l'interpolation physique[/i], cette fonction vous permet " +"d'empêcher l'interpolation sur une instance durant la trame physique " +"actuelle.\n" +"Cela vous permet de déplacer les instances instantanément, et devrait " +"généralement être utilisé lors du placement initial d'une instance telle " +"qu'une balle pour éviter les incohérences graphiques." #: doc/classes/MultiMesh.xml msgid "" @@ -45619,12 +45778,15 @@ msgstr "" "l'interpolation." #: doc/classes/MultiMesh.xml +#, fuzzy msgid "" "Sets the color of a specific instance by [i]multiplying[/i] the mesh's " "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" "Définit la couleur d'une instance spécifique en [i]multipliant[/i] les " "couleurs des sommets existants du maillage.\n" @@ -45747,12 +45909,19 @@ msgid "" "8 bits can only represent values between 0 and 1, numbers outside that range " "will be clamped." msgstr "" +"Compresse les données personnalisées en 8 bits pour les passer au shader. " +"Cela utilise moins de mémoire et peut être plus rapide, mais réduit la " +"précision et l'intervalle. Les flottans réduits à 8 bits ne peuvent " +"représenter que des valeurs entre 0 et 1, les nombres en dehors de cet " +"intervalle seront limités à ces valeurs." #: doc/classes/MultiMesh.xml msgid "" "The [Color] passed into [method set_instance_custom_data] will use 4 floats. " "Use this for highest precision." msgstr "" +"La [Color] passée dans [method set_instance_custom_data] utilisera 4 " +"flottants. Utilisez ce mode pour utiliser la plus haute précision possible." #: doc/classes/MultiMesh.xml msgid "" @@ -45765,6 +45934,8 @@ msgid "" "Attempt to interpolate using Basis slerping (spherical linear interpolation) " "where possible, otherwise fall back to lerping." msgstr "" +"Tente d'interpoler à l'aide de l'interpolation linéaire sphérique de Basis " +"si possible, sinon utilise l'interpolation basique." #: doc/classes/MultiMeshInstance.xml msgid "Node that instances a [MultiMesh]." @@ -45777,12 +45948,19 @@ msgid "" "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 "" +"[MultiMeshInstance] est un nÅ“ud spécialisé pour l'instance de " +"[GeometryInstance] basé sur une ressource [MultiMesh].\n" +"Ceci est utile pour optimiser le rendu d'une grande quantité d'instances " +"avec un maillage donné (par exemple des arbres dans une forêt ou des brins " +"d'herbe)." #: doc/classes/MultiMeshInstance.xml msgid "" "The [MultiMesh] resource that will be used and shared among all instances of " "the [MultiMeshInstance]." msgstr "" +"La ressource [MultiMesh] qui sera utilisée et partagée entre toutes les " +"instances de la [MultiMeshInstance]." #: doc/classes/MultiMeshInstance2D.xml msgid "Node that instances a [MultiMesh] in 2D." @@ -45825,12 +46003,16 @@ msgid "" "Clears the current MultiplayerAPI network state (you shouldn't call this " "unless you know what you are doing)." msgstr "" +"Efface l'état actuel du réseau MultiplayerAPI (vous ne devriez pas appeler " +"ceci à moins que vous ne sachiez ce que vous faites)." #: doc/classes/MultiplayerAPI.xml msgid "" "Returns the peer IDs of all connected peers of this MultiplayerAPI's [member " "network_peer]." msgstr "" +"Retourne les identifiants de tous les pairs connectés à [member " +"network_peer] de ce MultiplayerAPI." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -45844,6 +46026,9 @@ 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 "" +"Retourne l'identification par les pairs de l'expéditeur pour le RPC en cours " +"d'exécution.\n" +"[b]Note :[/b] Si n'est à l'intérieur d'un RPC, cette méthode retournera 0." #: doc/classes/MultiplayerAPI.xml doc/classes/SceneTree.xml msgid "Returns [code]true[/code] if there is a [member network_peer] set." @@ -45855,6 +46040,8 @@ msgid "" "Returns [code]true[/code] if this MultiplayerAPI's [member network_peer] is " "in server mode (listening for connections)." msgstr "" +"Retourne [code]true[/code] si le [member network_peer] de ce MultiplayerAPI " +"est en mode serveur (en attente de nouvelles connections)." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -45866,6 +46053,14 @@ msgid "" "will be executed in the same context of this function (e.g. [code]_process[/" "code], [code]physics[/code], [Thread])." msgstr "" +"La méthode utilisée pour vérifier régulièrement le MultijoueurAPI. Vous " +"n'avez qu'à vous soucier de cela si vous utilisez la surcharge [member Node." +"custom_multiplayer] ou que vous définissez [member SceneTree." +"multiplayer_poll] à [code]false[/code]. Par défaut, [SceneTree] polluera son " +"MultijoueurAPI pour vous.\n" +"[b]Note :[/b] Cette méthode permet d'appeler les RPC et RSET, de sorte " +"qu'ils seront exécutés dans le même contexte de cette fonction (par " +"exemple : [code]_process[/code], [code]physics[/code], [Thread])." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -45873,6 +46068,10 @@ msgid "" "[code]id[/code] (see [method NetworkedMultiplayerPeer.set_target_peer]). " "Default ID is [code]0[/code], i.e. broadcast to all peers." msgstr "" +"Envoie le code brut [code]bytes[/code] à un pair spécifique identifié par " +"[code]id[/code] (voir [method NetworkedMultiplayerPeer.set_target_peer]). " +"L'identifiant par défaut est [code]0[/code], c'est-à -dire envoyé à tous les " +"pairs." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -45983,6 +46182,9 @@ msgid "" "method or property for all RPC calls, making it unavailable. Default for all " "methods." msgstr "" +"Utilisé avec [method Node.rpc_config] ou [method Node.rset_config] pour " +"désactiver une méthode ou une propriété pour tous les appels RPC, la rendant " +"indisponible. C'est la valeur par défaut pour toutes les méthodes." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -46025,8 +46227,8 @@ msgid "" "change locally. Analogous to the [code]remotesync[/code] keyword." msgstr "" "Se comporte comme [constant RPC_MODE_REMOTE] mais fait aussi l'appel ou le " -"changement d'un propriété en local. Similaire au mot-clé " -"[code]remotesync[/code]." +"changement d'un propriété en local. Similaire au mot-clé [code]remotesync[/" +"code]." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -46042,8 +46244,8 @@ msgid "" "change locally. Analogous to the [code]mastersync[/code] keyword." msgstr "" "Se comporte comme [constant RPC_MODE_MASTER] mais fait aussi l'appel ou le " -"changement d'une propriété en local. Similaire au mot-clé " -"[code]mastersync[/code]." +"changement d'une propriété en local. Similaire au mot-clé [code]mastersync[/" +"code]." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -46051,8 +46253,8 @@ msgid "" "change locally. Analogous to the [code]puppetsync[/code] keyword." msgstr "" "Se comporte comme [constant RPC_MODE_PUPPET] mais fait aussi l'appel ou le " -"changement d'une propriété en local. Similaire au mot-clé " -"[code]puppetsync[/code]." +"changement d'une propriété en local. Similaire au mot-clé [code]puppetsync[/" +"code]." #: doc/classes/Mutex.xml msgid "A synchronization mutex (mutual exclusion)." @@ -46065,6 +46267,11 @@ msgid "" "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 "" +"Un mutex de synchronisation (une exclusion mutuelle). Ceci est utilisé pour " +"synchroniser plusieurs [Thread], et est équivalent à un [Semaphore] binaire. " +"Il garantit qu'un seul fil d'exécution peut imposer un blocage à la fois. Un " +"mutex peut être utilisé pour protéger une section critique ; cependant, " +"soyez prudent pour éviter le blocage total de l'exécution." #: doc/classes/Mutex.xml msgid "" @@ -46072,6 +46279,10 @@ msgid "" "[b]Note:[/b] This function returns without blocking if the thread already " "has ownership of the mutex." msgstr "" +"Verrouille ce [Mutex], le bloque jusqu'à ce qu'il soit déverrouillé par le " +"propriétaire actuel.\n" +"[b]Note :[/b] Cette fonction retourne sans bloquer si ce fil d'exécution est " +"déjà le propriétaire du mutex." #: doc/classes/Mutex.xml msgid "" @@ -46092,6 +46303,11 @@ msgid "" "times while already having ownership of the mutex, it must also call [method " "unlock] the same number of times in order to unlock it correctly." msgstr "" +"Débloque ce [Mutex], le laissant à d'autres fils d'exécution.\n" +"[b]Note :[/b] Si un fil d'exécution a appelé [method lock] ou [method " +"try_lock] plusieurs fois en étant déjà propriétaire du mutex, il doit " +"également appeler [method unlock] un nombre de fois identifique pour le " +"déverrouiller correctement." #: modules/gdnative/doc_classes/NativeScript.xml msgid "" @@ -46133,10 +46349,15 @@ msgid "" "passed to the native constructor function. This will change with in a future " "API extension." msgstr "" +"Construit un nouvel objet du type de base avec un script de ce type déjà " +"attaché.\n" +"[b]Note :[/b] Tout argument passé à cette fonction sera ignoré et ne sera " +"pas transmis à la fonction native du constructeur. Cela va changer avec dans " +"une future extension de l'API." #: doc/classes/Navigation.xml msgid "Mesh-based navigation and pathfinding node." -msgstr "" +msgstr "Noeuds de navigation à base de maillages et de cheminement." #: doc/classes/Navigation.xml msgid "" @@ -46149,6 +46370,14 @@ msgid "" "class also assists with aligning navigation agents with the meshes they are " "navigating on." msgstr "" +"[i]Obsolète.[/i] Le nÅ“ud [Navigation] et la méthode [method get_simple_path] " +"sont rendues obsolètes et seront retiré dans une prochaine version. Utilisez " +"plutôt [method NavigationServer.map_get_path].\n" +"Fournit la navigation et le cheminement dans une collection de " +"[NavigationMesh]. Par défaut, ceux-ci seront automatiquement récupérés " +"auprès des [NavigationMeshInstance] enfants. En plus du cheminement de base, " +"cette classe aide également à aligner les agents de navigation sur les " +"maillages sur lesquels ils naviguent." #: doc/classes/Navigation.xml doc/classes/NavigationMesh.xml #: doc/classes/NavigationServer.xml @@ -46160,6 +46389,8 @@ msgid "" "Returns the navigation point closest to the point given. Points are in local " "coordinate space." msgstr "" +"Retourne le point de navigation le plus proche du point donné. Les points " +"sont dans les coordonnées locales." #: doc/classes/Navigation.xml msgid "" @@ -46167,6 +46398,9 @@ msgid "" "given. Useful for rotating a navigation agent according to the navigation " "mesh it moves on." msgstr "" +"Retourne la normale de la surface au point de navigation le plus proche du " +"point donné. Utile pour la rotation d'un agent de navigation selon " +"l'inclinaison du maillage de navigation sur lequel il se déplace." #: doc/classes/Navigation.xml msgid "" @@ -46184,10 +46418,16 @@ msgid "" "between segment and navigation meshes. If multiple intersection points are " "found, the one closest to the segment start point is returned." msgstr "" +"Retourne le point de navigation le plus proche du segment de ligne donné. " +"Quand [code]use_collision[/code] est activé, ne considère que les points " +"d'intersection entre le segment et les maillages de navigation. Si plusieurs " +"points d'intersection sont trouvés, celui le plus proche du point de départ " +"du segment est retourné." #: doc/classes/Navigation.xml msgid "Returns the [RID] of the navigation map on the [NavigationServer]." msgstr "" +"Retourne le [RID] de la carte de navigation dans le [NavigationServer]." #: doc/classes/Navigation.xml msgid "" @@ -46200,8 +46440,8 @@ msgid "" "etc.) are considered in the path calculation, otherwise they are ignored." msgstr "" "[i]Obsolète.[/i] Le nÅ“ud [Navigation] la méthode [method get_simple_path] " -"sont obsolètes se seront retiré dans une prochaine version. Utilisez plutôt [" -"method NavigationServer.map_get_path].\n" +"sont obsolètes se seront retiré dans une prochaine version. Utilisez plutôt " +"[method NavigationServer.map_get_path].\n" "Retourne le chemin entre deux points donnés. Les points sont des coordonées " "locales. Si [code]optimize[/code] est [code]true[/code] (par défaut), les " "propriétés de l'agent associées à chaque [NavigationMesh] (rayon, hauteur, " @@ -46219,6 +46459,8 @@ msgstr "" msgid "" "This value is used to detect the near edges to connect compatible regions." msgstr "" +"Cette valeur est utilisée pour détecter les bords proches pour relier les " +"régions compatibles." #: doc/classes/Navigation.xml msgid "" @@ -46244,7 +46486,7 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "2D navigation and pathfinding node." -msgstr "" +msgstr "NÅ“uds de navigation et de cheminement en 2D." #: doc/classes/Navigation2D.xml msgid "" @@ -46255,6 +46497,13 @@ msgid "" "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." msgstr "" +"[i]Obsolète.[/i] Le nÅ“ud [Navigation2D] et la méthode [method " +"get_simple_path] sont rendues obsolètes et seront retiré dans une prochaine " +"version. Utilisez plutôt [method NavigationServer.map_get_path].\n" +"Navigation2D fournit la navigation et le cheminement dans une zone en 2D, " +"spécifiée comme une collection de ressources [NavigationPolygon]. Par " +"défaut, elles sont automatiquement récupérées à partir de nÅ“uds " +"[NavigationPolygonInstance] enfants." #: doc/classes/Navigation2D.xml doc/classes/Navigation2DServer.xml #: doc/classes/NavigationPolygon.xml @@ -46267,6 +46516,9 @@ msgid "" "point closest to the point given. This is usually a " "[NavigationPolygonInstance]." msgstr "" +"Retourne le propriétaire du [NavigationPolygon] qui contient le point de " +"navigation le plus proche du point donné. C'est généralement une " +"[NavigationPolygonInstance]." #: doc/classes/Navigation2D.xml msgid "" @@ -46277,10 +46529,17 @@ msgid "" "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." msgstr "" +"[i]Obsolète.[/i] Le nÅ“ud [Navigation2D] et la méthode [method " +"get_simple_path] sont rendues obsolètes et seront retiré dans une prochaine " +"version. Utilisez plutôt [method NavigationServer.map_get_path].\n" +"Retourne le chemin entre deux points donnés. Les points sont dans les " +"coordonnées locales. Si [code]optimize[/code] est [code]true[/code] (par " +"défaut), le chemin est lissé en fusionnant les segments du chemin quand " +"c'est possible." #: doc/classes/Navigation2D.xml msgid "The XY plane cell size to use for fields." -msgstr "" +msgstr "La taille des cellules sur le plan XY pour les champs." #: doc/classes/Navigation2D.xml msgid "" @@ -46290,10 +46549,9 @@ msgstr "" #: doc/classes/Navigation2DServer.xml msgid "Server interface for low-level 2D navigation access." -msgstr "" +msgstr "L'Interface serveur pour un accès bas niveau de la navigation 2D." #: doc/classes/Navigation2DServer.xml -#, fuzzy msgid "" "Navigation2DServer is the server responsible for all 2D navigation. It " "handles several objects, namely maps, regions and agents.\n" @@ -46322,26 +46580,36 @@ msgid "" "phase. This means that you can request any change to the map, using any " "thread, without worrying." msgstr "" -"Le NavigationServer2D est le serveur responsable pour toutes les navigation " -"en 2D. Il gère différents objets, nommés carte, régions et agents.\n" -"Les cartes (\"maps\") sont faites de régions, qui sont faites de maillages " -"de navigation. Ensemble, ces cartes définissent les aires navigables dans le " -"monde 2D. Pour que deux régions soient connectées entre elles, elles doivent " -"avoir une bordure en commun. Une bordure (\"edge\") est considérée connectée " -"à une autre si elles ont deux sommets rapprochés de moins de la distance [" -"member Navigation.edge_connection_margin].\n" -"Pour utiliser le système d'évitement, vous devez utiliser des agents. Vous " -"pouvez définir la vitesse cible d'un agent, puis le serveur émettra une " +"Le NavigationServer2D est le serveur responsable de la navigation 2D. Il " +"gère différents objets appelés cartes, régions et agents.\n" +"Les cartes (\"maps\") sont constituées de régions qui sont faites d'un " +"maillage de polygones de navigation. Ensemble, elles définissent les zones " +"navigables du monde 2D.\n" +"[b]Note :[/b] La plupart des changements effectués sur un NavigationServer " +"ne prennent pas effet immédiatement mais après la frame de physique " +"suivante. Cela inclut tous les changements faits aux cartes, régions ou " +"agents par des nÅ“uds liés à la navigation dans l'arborescence de la scène ou " +"par des scripts.\n" +"Pour que deux régions soient connectées entre elles, celles-ci doivent avoir " +"une bordure en commun. Une bordure (\"edge\") est considérée connectée à une " +"autre si ses deux sommets ont une distance inférieure à [member Navigation." +"edge_connection_margin] des sommets respectifs de l'autre bordure.\n" +"Vous pouvez assigner des couches de navigation aux régions avec [method " +"Navigation2DServer.region_set_navigation_layers], qui pourra ensuite être " +"utilisé en faisant une requête de chemin avec [method Navigation2DServer." +"map_get_path]. Cela permet d'autoriser ou d'interdire certaines zones aux " +"objets 2D.\n" +"Pour utiliser le système d'évitement, vous pouvez utiliser des agents. Vous " +"pouvez définir la vitesse cible d'un agent, le serveur émettra ensuite une " "méthode de rappel avec la vitesse modifiée.\n" "[b]Note :[/b] Le système d'évitement des collisions ignorent les régions. " -"Utiliser la vitesse modifiée telle quelle peut déplacer un agent hors de la " -"surface de navigable. C'est une limite du système d'évitement des " -"collisions, et certaines situations plus complexes peuvent nécessiter " -"l'utilisation du moteur physique.\n" -"Le serveur garde en mémoire tous les appels et les exécutent durant la phase " -"de synchronisation. Cela veut dire que vous pouvez demander n'importe quel " -"changement sur l'ensemble des cartes, via n'importe quel fil d'exécution, " -"sans soucis." +"Utiliser la vitesse modifiée telle quelle peut faire sortir un agent d'une " +"zone navigable. C'est une limite du système d'évitement des collisions et " +"certaines situations plus complexes peuvent nécessiter l'utilisation du " +"moteur physique.\n" +"Le serveur garde en mémoire tous les appels et les exécute durant la phase " +"de synchronisation. Ainsi, vous pouvez demander n'importe quel changement " +"sur la carte, depuis n'importe quel fil d'exécution sans problème." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Creates the agent." @@ -46358,6 +46626,7 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns [code]true[/code] if the map got changed the previous frame." msgstr "" +"Retourne [code]true[/code] si la carte a changé lors de la trame précédente." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46389,7 +46658,7 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the maximum speed of the agent. Must be positive." -msgstr "" +msgstr "Définit la vitesse maximale de l'agent. Ça doit être positif." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46404,7 +46673,7 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the position of the agent in world space." -msgstr "" +msgstr "Définit la position de l'agent dans l'espace global." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the radius of the agent." @@ -46429,7 +46698,7 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the current velocity of the agent." -msgstr "" +msgstr "Définit la vitesse actuelle de l'agent." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Destroys the given RID." @@ -46483,8 +46752,8 @@ msgstr "" "Cette fonction peut être utilisée pour calculer immédiatement tous les " "maillages de navigation et les connexions entre les régions de la carte de " "navigation. Cela permet d'interroger un chemin de navigation pour une carte " -"modifiée immédiatement et dans la même trame (plusieurs fois si nécessaire)." -"\n" +"modifiée immédiatement et dans la même trame (plusieurs fois si " +"nécessaire).\n" "En raison de restrictions techniques, la file de commandes actuelle de " "NavigationServer sera exécutée aussitôt. Cela signifie que toutes les " "commandes de mise à jour en attente pour cette trame de physique seront " @@ -46518,6 +46787,8 @@ msgstr "" #: doc/classes/Navigation2DServer.xml msgid "Returns the map cell height. [b]Note:[/b] Currently not implemented." msgstr "" +"Retourne la hauteur de la cellule. [b]Note :[/b] N'est pas implémenté pour " +"l'instant." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns the map cell size." @@ -46567,7 +46838,7 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns [code]true[/code] if the map is active." -msgstr "" +msgstr "Retourne [code]true[/code] si la carte est active." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the map active." @@ -46578,10 +46849,14 @@ msgid "" "Set the map cell height used to weld the navigation mesh polygons. [b]Note:[/" "b] Currently not implemented." msgstr "" +"Définit la hauteur de la cellule de carte utilisée pour souder les polygones " +"de maillage de navigation. [b]Note :[/b] N'est pas implémenté pour l'instant." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Set the map cell size used to weld the navigation mesh polygons." msgstr "" +"Définit la taille de la cellule de carte utilisée pour souder les polygones " +"de maillage de navigation." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46609,8 +46884,9 @@ msgid "" "an index between 0 and the return value of [method " "region_get_connections_count]." msgstr "" -"Retourne le point de départ d'une porte de connexion. [code]connection[/code]" -" est un indice entre 0 et la valeur de [method region_get_connections_count]." +"Retourne le point de départ d'une porte de connexion. [code]connection[/" +"code] est un indice entre 0 et la valeur de [method " +"region_get_connections_count]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46622,15 +46898,15 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns the [code]enter_cost[/code] of this [code]region[/code]." -msgstr "" +msgstr "Retourne le [code]enter_cost[/code] de cette [code]region[/code]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" "Returns the navigation map [RID] the requested [code]region[/code] is " "currently assigned to." msgstr "" -"Retourne le [RID] de la carte de navigation à laquelle la [code]region[/code]" -" spécifiée est actuellement assignée." +"Retourne le [RID] de la carte de navigation à laquelle la [code]region[/" +"code] spécifiée est actuellement assignée." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns the region's navigation layers." @@ -46638,7 +46914,7 @@ msgstr "Retourne les calques de navigation de la région." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." -msgstr "" +msgstr "Retourne le [code]travel_cost[/code] de cette [code]region[/code]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46673,7 +46949,7 @@ msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." -msgstr "" +msgstr "Définit le [code]enter_cost[/code] pour cette [code]region[/code]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the map for the region." @@ -46698,7 +46974,7 @@ msgstr "Retourne la transformation globale de cette région." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]travel_cost[/code] for this [code]region[/code]." -msgstr "" +msgstr "Définit le [code]travel_cost[/code] pour cette [code]region[/code]." #: doc/classes/NavigationAgent.xml msgid "3D agent used in navigation for collision avoidance." @@ -46834,12 +47110,16 @@ msgid "" "Returns the user-defined target location (set with [method " "set_target_location])." msgstr "" +"Retourne l'emplacement de la cible défini par l'utilisateur (défini avec " +"[method set_target_location])." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Returns [code]true[/code] if the navigation path's final location has been " "reached." msgstr "" +"Retourne [code]true[/code] si l'emplacement final du parcours de navigation " +"a été atteint." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -46856,6 +47136,11 @@ msgid "" "possible to reach the target location. It should always be possible to reach " "the final location though. See [method get_final_location]." msgstr "" +"Retourne [code]true[/code] si l'emplacement cible est atteint. L'emplacement " +"cible est défini en utilisant [method set_target_location]. Il peut parfois " +"ne pas être possible d'atteindre l'emplacement cible. Par contre, il devrait " +"toujours être possible d'atteindre l'emplacement final. Voir [method " +"get_final_location]." #: doc/classes/NavigationAgent.xml msgid "" @@ -46937,7 +47222,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "The maximum number of neighbors for the agent to consider." -msgstr "" +msgstr "Le nombre maximum de voisins à considérer par l'agent." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "The maximum speed that an agent can move." @@ -46956,7 +47241,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "The distance to search for other agents." -msgstr "" +msgstr "La distance pour chercher d'autres agents." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -47036,7 +47321,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "Notifies when the final location is reached." -msgstr "" +msgstr "Notifie quand l'emplacement final est atteint." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -47055,9 +47340,10 @@ msgstr "" "set_target_location], est atteinte." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +#, fuzzy msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" "Notifie quand la vitesse d'évitement de collision est calculée après un " "appel à [method set_velocity]." @@ -47167,6 +47453,8 @@ msgstr "" #: doc/classes/NavigationMesh.xml msgid "A mesh to approximate the walkable areas and obstacles." msgstr "" +"Un maillage pour l'approximation des zones où l'on peut marcher et des " +"obstacles." #: doc/classes/NavigationMesh.xml msgid "" @@ -47174,12 +47462,17 @@ msgid "" "environment are traversable to aid agents in pathfinding through complicated " "spaces." msgstr "" +"Un maillage de navigation est une collection de polygones qui définissent " +"les zones d'un environnement qui peuvent être traversés pour aider les " +"agents dans leur cheminement dans les espaces compliqués." #: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml msgid "" "Adds a polygon using the indices of the vertices you get when calling " "[method get_vertices]." msgstr "" +"Ajoute un polygone en utilisant les indices des sommets que obtenus avec " +"[method get_vertices]." #: doc/classes/NavigationMesh.xml msgid "" @@ -47192,12 +47485,16 @@ msgid "" "Initializes the navigation mesh by setting the vertices and indices " "according to a [Mesh]." msgstr "" +"Initialise le maillage de navigation en définissant les sommets et les " +"indices dans un [Mesh]." #: doc/classes/NavigationMesh.xml msgid "" "Returns whether the specified [code]bit[/code] of the [member " "geometry_collision_mask] is set." msgstr "" +"Retourne si le [code]bit[/code] spécifié de [member geometry_collision_mask] " +"est défini." #: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml msgid "" @@ -47209,7 +47506,7 @@ msgstr "" #: doc/classes/NavigationMesh.xml msgid "Returns the number of polygons in the navigation mesh." -msgstr "" +msgstr "Retourne le nombre de polygones dans le maillage de navigation." #: doc/classes/NavigationMesh.xml msgid "" @@ -47236,6 +47533,8 @@ msgid "" "Sets the vertices that can be then indexed to create polygons with the " "[method add_polygon] method." msgstr "" +"Définit les sommets qui peuvent ensuite être indexés pour créer des " +"polygones avec la méthode [method add_polygon]." #: doc/classes/NavigationMesh.xml msgid "" @@ -47244,6 +47543,10 @@ msgid "" "[b]Note:[/b] While baking, this value will be rounded up to the nearest " "multiple of [member cell_height]." msgstr "" +"La hauteur minimale entre le sol et le plafond qui permettra toujours que la " +"surface au sol soit considérée comme pouvant être traversée.\n" +"[b]Note :[/b] Pendant le pré-calcul, cette valeur sera arrondie au multiple " +"le plus proche de [member cell_height]." #: doc/classes/NavigationMesh.xml msgid "" @@ -47251,10 +47554,15 @@ msgid "" "[b]Note:[/b] While baking, this value will be rounded down to the nearest " "multiple of [member cell_height]." msgstr "" +"La hauteur minimale de haie qui est considérée comme toujours pouvant être " +"traversée.\n" +"[b]Note :[/b] Pendant le pré-calcul, cette valeur sera arrondie au multiple " +"le plus proche de [member cell_height]." #: doc/classes/NavigationMesh.xml msgid "The maximum slope that is considered walkable, in degrees." msgstr "" +"La pente maximale qui est considérée comme pouvant être traversée, en degrés." #: doc/classes/NavigationMesh.xml msgid "" @@ -47266,24 +47574,30 @@ msgstr "" #: doc/classes/NavigationMesh.xml msgid "The Y axis cell size to use for fields." -msgstr "" +msgstr "La taille de la cellule suivant l'axe Y pour les champs." #: doc/classes/NavigationMesh.xml msgid "" "The sampling distance to use when generating the detail mesh, in cell unit." msgstr "" +"La distance d'échantillonnage à utiliser pour générer le maillage de détail, " +"dans l'unité des cellules." #: doc/classes/NavigationMesh.xml msgid "" "The maximum distance the detail mesh surface should deviate from " "heightfield, in cell unit." msgstr "" +"La distance maximale de la surface de maillage de détail devrait s'écarter " +"du champ de hauteur, dans l'unité des cellules." #: doc/classes/NavigationMesh.xml msgid "" "The maximum distance a simplfied contour's border edges should deviate the " "original raw contour." msgstr "" +"La distance maximale qu'un contour simplifié peut dévier du contour brut " +"d'origine." #: doc/classes/NavigationMesh.xml msgid "" @@ -47291,6 +47605,10 @@ msgid "" "[b]Note:[/b] While baking, this value will be rounded up to the nearest " "multiple of [member cell_size]." msgstr "" +"La longueur maximale autorisée pour les bords de contour le long de la " +"bordure du maillage.\n" +"[b]Note :[/b] Pendant le pré-calcul, cette valeur sera arrondie au multiple " +"le plus proche de [member cell_height]." #: doc/classes/NavigationMesh.xml msgid "" @@ -47301,6 +47619,7 @@ msgstr "" #: doc/classes/NavigationMesh.xml msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." msgstr "" +"Le décalage de position appliqué au [AABB] de [member filter_baking_aabb]." #: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." @@ -47341,6 +47660,8 @@ msgid "" "The source of the geometry used when baking. See [enum SourceGeometryMode] " "for possible values." msgstr "" +"La source de la géométrie utilisée lors du pré-calcul. Voir [enum " +"SourceGeometryMode] pour les valeurs possibles." #: doc/classes/NavigationMesh.xml msgid "" @@ -47589,6 +47910,8 @@ msgid "" "Removes all polygons and vertices from the provided [code]nav_mesh[/code] " "resource." msgstr "" +"Enlève tous les polygones et les sommets de la ressource [code]nav_mesh[/" +"code] fournie." #: doc/classes/NavigationMeshInstance.xml msgid "An instance of a [NavigationMesh]." @@ -47664,10 +47987,10 @@ msgid "" "identify the [NavigationMeshInstance] closest to a point on the merged " "navigation map." msgstr "" -"Retourne le [RID] de cette région sur [NavigationServer]. Combiné avec [" -"method NavigationServer.map_get_closest_point_owner], peut être utilisé pour " -"identifier le [NavigationMeshInstance] le plus proche d'un point d'une carte " -"de navigation fusionnée." +"Retourne le [RID] de cette région sur [NavigationServer]. Combiné avec " +"[method NavigationServer.map_get_closest_point_owner], peut être utilisé " +"pour identifier le [NavigationMeshInstance] le plus proche d'un point d'une " +"carte de navigation fusionnée." #: doc/classes/NavigationMeshInstance.xml msgid "Determines if the [NavigationMeshInstance] is enabled or disabled." @@ -47707,6 +48030,8 @@ msgstr "" #: doc/classes/NavigationMeshInstance.xml msgid "Notifies when the navigation mesh bake operation is completed." msgstr "" +"Notifie quand l'opération de pré-calcul de maillage de navigation est " +"terminée." #: doc/classes/NavigationMeshInstance.xml msgid "Notifies when the [NavigationMesh] has changed." @@ -47844,8 +48169,8 @@ msgid "" "$NavigationPolygonInstance.navpoly = polygon\n" "[/codeblock]" msgstr "" -"Il y a deux façons de créer des polygones. Soit en utilisant la méthode [" -"method add_outline], soit en utilisant la méthode [method add_polygon].\n" +"Il y a deux façons de créer des polygones. Soit en utilisant la méthode " +"[method add_outline], soit en utilisant la méthode [method add_polygon].\n" "Avec [method add_outline] :\n" "[codeblock]\n" "var polygon = NavigationPolygon.new()\n" @@ -47955,20 +48280,20 @@ 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 "" -"Enlève un aperçu créé dans l'éditeur ou par un script. Vous devez appeler [" -"method make_polygons_from_outlines] pour mettre à jour les polygones." +"Enlève un aperçu créé dans l'éditeur ou par un script. Vous devez appeler " +"[method make_polygons_from_outlines] pour mettre à jour les polygones." #: doc/classes/NavigationPolygon.xml 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 "" -"Change un aperçu créé dans l'éditeur ou par un script. Vous devez appeler [" -"method make_polygons_from_outlines] pour mettre à jour les polygones." +"Change un aperçu créé dans l'éditeur ou par un script. Vous devez appeler " +"[method make_polygons_from_outlines] pour mettre à jour les polygones." #: doc/classes/NavigationPolygonInstance.xml msgid "A region of the 2D navigation map." -msgstr "" +msgstr "Une région de la carte de navigation 2D." #: doc/classes/NavigationPolygonInstance.xml msgid "" @@ -47997,8 +48322,8 @@ msgstr "" "la carte de navigation du nÅ“ud de navigation.\n" "Deux régions peuvent être reliées l'une à l'autre si elles partagent un bord " "similaire. Vous pouvez définir la distance minimale entre deux sommets " -"nécessaires pour connecter deux bords en utilisant [method Navigation2DServer" -".map_set_edge_connection_margin]\n" +"nécessaires pour connecter deux bords en utilisant [method " +"Navigation2DServer.map_set_edge_connection_margin]\n" "[b]Note :[/b] Embiquer deux régions ne suffit pas pour relier ces deux " "régions. Elles doivent partager un bord similaire.\n" "Le coût de cheminement de cette région vers une autre peut être contrôlé " @@ -48015,10 +48340,10 @@ msgid "" "identify the [NavigationPolygonInstance] closest to a point on the merged " "navigation map." msgstr "" -"Retourne le [RID] de cette région sur le [Navigation2DServer]. Combiné avec [" -"method Navigation2DServer.map_get_closest_point_propriétaire] peut permettre " -"d'identifier le [NavigationPolygonInstance] le plus proche d'un point sur la " -"carte de navigation fusionnée." +"Retourne le [RID] de cette région sur le [Navigation2DServer]. Combiné avec " +"[method Navigation2DServer.map_get_closest_point_propriétaire] peut " +"permettre d'identifier le [NavigationPolygonInstance] le plus proche d'un " +"point sur la carte de navigation fusionnée." #: doc/classes/NavigationPolygonInstance.xml msgid "Determines if the [NavigationPolygonInstance] is enabled or disabled." @@ -48038,10 +48363,9 @@ msgstr "La ressource [NavigationPolygon] à utiliser." #: doc/classes/NavigationServer.xml msgid "Server interface for low-level 3D navigation access." -msgstr "" +msgstr "Interface serveur pour un accès de navigation 3D de bas niveau." #: doc/classes/NavigationServer.xml -#, fuzzy msgid "" "NavigationServer is the server responsible for all 3D navigation. It handles " "several objects, namely maps, regions and agents.\n" @@ -48089,12 +48413,14 @@ msgstr "" #: doc/classes/NavigationServer.xml msgid "Returns the map cell height." -msgstr "" +msgstr "Retourne la hauteur de la cellule de la carte." #: doc/classes/NavigationServer.xml msgid "" "Returns the normal for the point returned by [method map_get_closest_point]." msgstr "" +"Retourne la normale pour le point retourné par [method " +"map_get_closest_point]." #: doc/classes/NavigationServer.xml msgid "" @@ -48118,6 +48444,8 @@ msgstr "Retourne la direction haut de la carte." #: doc/classes/NavigationServer.xml msgid "Set the map cell height used to weld the navigation mesh polygons." msgstr "" +"Définit la hauteur de la cellule de carte utilisée pour souder les polygones " +"de maillage de navigation." #: doc/classes/NavigationServer.xml msgid "Sets the map up direction." @@ -48157,6 +48485,8 @@ msgid "" "A [NetworkedMultiplayerPeer] implementation that can be controlled from a " "script." msgstr "" +"Une implémentation de [NetworkedMultiplayerPeer] qui peut être contrôlée à " +"partir d'un script." #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" @@ -48165,6 +48495,11 @@ msgid "" "Its purpose is to allow adding a new backend for the high-Level multiplayer " "API without needing to use GDNative." msgstr "" +"Une implémentation de [NetworkedMultiplayerPeer] qui peut être utilisée " +"comme un [member MultiplayerAPI.network_peer] et contrôlée à partir d'un " +"script.\n" +"Son but est de permettre d'ajouter un nouveau backend haut niveau pour l'API " +"multijoueur sans avoir besoin d'utiliser GDNative." #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" @@ -48173,24 +48508,38 @@ msgid "" "(originating from the [signal packet_generated] signal on the sending peer), " "passing it to this method will deliver it locally." msgstr "" +"Envoie un paquet au [MultiplayerAPI] local.\n" +"Lorsque votre script reçoit un paquet d'autres pairs sur le réseau (à partir " +"du signal [signal packet_generated] sur le pair que l'envoie), il le " +"transmet à cette méthode en local." #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" -"Retourne l'état actuel de la connexion. Voir [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." #: doc/classes/NetworkedMultiplayerCustom.xml msgid "Set the max packet size that this peer can handle." -msgstr "" +msgstr "Définit la taille maximale du paquet que ce pair peut traiter." #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" @@ -48199,6 +48548,10 @@ msgid "" "the network (which should call [method deliver_packet] with the data when " "it's received)." msgstr "" +"Émis lorsque le [MultiplayerAPI] local génère un paquet.\n" +"Votre script devrait prendre ce paquet et l'envoyer au pair spécifié sur le " +"réseau (qui devrait appeler [method deliver_packet] avec les données " +"lorsqu'il reçoit)." #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -48282,9 +48635,9 @@ msgstr "" "client a été créé, [constant ERR_ALREADY_IN_USE] si ce " "NetworkedMultiplayerENet a déjà une connexion ouverte (dans quel cas vous " "devez appeler [method close_connection] d'abord) ou [constant " -"ERR_CANT_CREATE] si le client ne peut pas être créé. Si " -"[code]client_port[/code] est spécifié, le client écoutera également le port " -"donné ; ceci est utile pour certaines techniques NAT transversale." +"ERR_CANT_CREATE] si le client ne peut pas être créé. Si [code]client_port[/" +"code] est spécifié, le client écoutera également le port donné ; ceci est " +"utile pour certaines techniques NAT transversale." #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -48340,8 +48693,8 @@ msgid "" "Returns the channel of the next packet that will be retrieved via [method " "PacketPeer.get_packet]." msgstr "" -"Retourne le canal du prochain paquet qui sera récupéré via [method PacketPeer" -".get_packet]." +"Retourne le canal du prochain paquet qui sera récupéré via [method " +"PacketPeer.get_packet]." #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml #: modules/websocket/doc_classes/WebSocketServer.xml @@ -49449,11 +49802,11 @@ msgid "" "[method get_node] instead. To avoid using [method find_parent] too often, " "consider caching the node reference into a variable." msgstr "" -"Trouve le premier parent de ce nÅ“ud dont le nom correspond à " -"[code]mask[/code] suivant le même fonctionnement que pour [method String." -"match] (c'est-à -dire sensible à la casse, que [code]\"*\"[/code] correspond " -"à un zéro au un seul caractère, et que [code]\"?\"[/code] correspond à " -"n'importe quel unique caractère sauf [code]\".\"[/code]).\n" +"Trouve le premier parent de ce nÅ“ud dont le nom correspond à [code]mask[/" +"code] suivant le même fonctionnement que pour [method String.match] (c'est-à -" +"dire sensible à la casse, que [code]\"*\"[/code] correspond à un zéro au un " +"seul caractère, et que [code]\"?\"[/code] correspond à n'importe quel unique " +"caractère sauf [code]\".\"[/code]).\n" "[b]Note :[/b] La correspondance ne se fait pas sur le chemin complet mais " "juste les noms des nÅ“uds.\n" "[b]Note :[/b] Comme cette méthode liste tous les parents d'un nÅ“ud, c'est le " @@ -49669,9 +50022,9 @@ msgid "" "processing unless the frames per second is changed via [member Engine." "iterations_per_second]." msgstr "" -"Retourne le temps écoulé (en secondes) depuis la dernière trame physique (" -"voir [method _physics_process]). C'est toujours une valeur constante dans le " -"traitement de la physique à moins que les trames par seconde ne soient " +"Retourne le temps écoulé (en secondes) depuis la dernière trame physique " +"(voir [method _physics_process]). C'est toujours une valeur constante dans " +"le traitement de la physique à moins que les trames par seconde ne soient " "changés via [member Engine.iterations_per_second]." #: doc/classes/Node.xml @@ -49746,6 +50099,8 @@ msgid "" "Returns [code]true[/code] if the given node occurs later in the scene " "hierarchy than the current node." msgstr "" +"Retourne [code]true[/code] si le nÅ“ud donné apparait plus tard dans la " +"hiérarchie de la scène que le nÅ“ud actuel." #: doc/classes/Node.xml msgid "" @@ -49790,8 +50145,8 @@ msgid "" "See [member SceneTree.physics_interpolation] and [member ProjectSettings." "physics/common/physics_interpolation]." msgstr "" -"Retourne [code]true[/code] si l'interpolation physique est activée (voir [" -"member physics_interpolation_mode]) [b]et[/b] activée dans [SceneTree].\n" +"Retourne [code]true[/code] si l'interpolation physique est activée (voir " +"[member physics_interpolation_mode]) [b]et[/b] activée dans [SceneTree].\n" "Il s'agit d'une version pratique de [method is_physics_interpolated] qui " "vérifie également si l'interpolation physique est activée globalement.\n" "Voir [member SceneTree.physics_interpolation] et [member ProjectSettings." @@ -50127,13 +50482,13 @@ msgid "" "By default, methods are not exposed to networking (and RPCs). See also " "[method rset] and [method rset_config] for properties." msgstr "" -"Change le mode RPC pour la [code]method[/code] donné pour le " -"[code]mode[/code] spécifié. Voir [enum MultiplayerAPI.RPCMode]. Une " -"alternative est d'annoter les méthodes et les propriétés avec les mots-clés " -"correspondants ([code]remote[/code], [code]master[/code], [code]puppet[/code]" -", [code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code])" -". Par défaut, les méthodes ne sont pas exposées au réseaut (et aux RPC). " -"Voir aussi [method rset] et [method rset_config] pour les propriétés." +"Change le mode RPC pour la [code]method[/code] donné pour le [code]mode[/" +"code] spécifié. Voir [enum MultiplayerAPI.RPCMode]. Une alternative est " +"d'annoter les méthodes et les propriétés avec les mots-clés correspondants " +"([code]remote[/code], [code]master[/code], [code]puppet[/code], " +"[code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code]). " +"Par défaut, les méthodes ne sont pas exposées au réseaut (et aux RPC). Voir " +"aussi [method rset] et [method rset_config] pour les propriétés." #: doc/classes/Node.xml msgid "" @@ -50187,22 +50542,26 @@ msgstr "" "Change le mode RPC pour la [code]property[/code] donnée au [code]mode[/code] " "spécifié. Voir [enum MultiplayerAPI.RPCMode]. Une alternative est " "l'annotation des méthodes et des propriétés avec les mots-clés " -"correspondants ([code]remote[/code], [code]master[/code], [code]puppet[/code]" -", [code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code])" -". Par défaut, les propriétés ne sont pas exposées au réseau (et au RPC). " -"Voir aussi [method rpc] et [method rpc_config] pour les méthodes." +"correspondants ([code]remote[/code], [code]master[/code], [code]puppet[/" +"code], [code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/" +"code]). Par défaut, les propriétés ne sont pas exposées au réseau (et au " +"RPC). Voir aussi [method rpc] et [method rpc_config] pour les méthodes." #: doc/classes/Node.xml msgid "" "Remotely changes the property's value on a specific peer identified by " "[code]peer_id[/code] (see [method NetworkedMultiplayerPeer.set_target_peer])." msgstr "" +"Modifie à distance de la valeur de la propriété indiquée par [code]peer_id[/" +"code] (voir [method NetworkedMultiplayerPeer.set_target_peer])." #: doc/classes/Node.xml msgid "" "Remotely changes the property's value on other peers (and locally) using an " "unreliable protocol." msgstr "" +"Modifie à distance la valeur de propriété enregistrée sur d'autres pairs (et " +"localement) en utilisant un protocole non fiable." #: doc/classes/Node.xml msgid "" @@ -50210,10 +50569,13 @@ msgid "" "[code]peer_id[/code] using an unreliable protocol (see [method " "NetworkedMultiplayerPeer.set_target_peer])." msgstr "" +"Modifie à distance de la valeur de la propriété suivante sur un pair " +"spécifique identifié par [code]peer_id[/code] en utilisant un protocole non " +"fiable (voir [method NetworkedMultiplayerPeer.set_target_peer])." #: doc/classes/Node.xml msgid "Sets the folded state of the node in the Scene dock." -msgstr "" +msgstr "Définit l'état réduit du nÅ“ud dans le dock de Scène." #: doc/classes/Node.xml msgid "" @@ -50224,6 +50586,12 @@ msgid "" "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 "" +"Définit le nÅ“ud maître du réseau au pair avec l'identifiant de pair donné. " +"Le maître du réseau est le pair qui a autorité sur le nÅ“ud sur le réseau. " +"Utile avec les mots-clés [code]master[/code] et [code]puppet[/code]. " +"Inhérité du nÅ“ud parent par défaut, qui a par défaut l'identifiant 1 (le " +"serveur). Si [code]recursive[/code], le pair donné est récursivement défini " +"comme le maître pour tous les enfants de ce nÅ“ud." #: doc/classes/Node.xml msgid "" @@ -50235,6 +50603,13 @@ msgid "" "if [method _physics_process] is overridden. Any calls to this before [method " "_ready] will be ignored." msgstr "" +"Active ou désactive le traitement physique (c'est-à -dire les trames fixes). " +"Lorsqu'un nÅ“ud est en cours de traitement, il recevra la notification " +"[constant NOTIFICATION_PHYSICS_PROCESS] à un intervalle fixe (généralement " +"60 FPS, voir [member Engine.iterations_per_second] pour le changer), et le " +"callback [method physique_process] sera appelé s'il existe. Est activé " +"automatiquement si [method physique_process] est surchargé. Tout appel à " +"cela avant [method _ready] sera ignoré." #: doc/classes/Node.xml msgid "" @@ -50293,11 +50668,16 @@ msgid "" "_unhandled_key_input] is overridden. Any calls to this before [method " "_ready] will be ignored." msgstr "" +"Permet un traitement des touches d'entrée non traitées. Activé " +"automatiquement si [method unhandled_key_input] est surchargé. Tout appel à " +"cela avant [method _ready] sera ignoré." #: doc/classes/Node.xml msgid "" "Sets whether this is an instance load placeholder. See [InstancePlaceholder]." msgstr "" +"Définit s'il s'agit d'un chargeur fictif d'instance. Voir " +"[InstancePlaceholder]." #: doc/classes/Node.xml msgid "" @@ -50305,12 +50685,17 @@ msgid "" "Use [method _get_configuration_warning] to setup the warning message to " "display." msgstr "" +"Met à jour l'avertissement affiché pour ce nÅ“ud dans le dock de Scène.\n" +"Utilisez [method get_configuration_warning] pour configurer le message " +"d'avertissement à afficher." #: doc/classes/Node.xml msgid "" "The override to the default [MultiplayerAPI]. Set to [code]null[/code] to " "use the default [SceneTree] one." msgstr "" +"La surcharge de la valeur par défaut du [MultiplayerAPI]. Définissez-le à " +"[code]null[/code] pour utiliser la valeur par défaut de [SceneTree]." #: doc/classes/Node.xml msgid "" @@ -50319,12 +50704,19 @@ msgid "" "[code]res://levels/1.tscn[/code]). Otherwise, [member filename] is set to an " "empty string." msgstr "" +"Si une scène est instanciée à partir d'un fichier, son nÅ“ud le plus haut " +"contient le chemin de fichier absolu à partir duquel elle a été chargée " +"depuis [member filename] (par exemple [code]res://levels/1.tscn[/code]). " +"Sinon, [member filename] sera une chaîne vide." #: doc/classes/Node.xml msgid "" "The [MultiplayerAPI] instance associated with this node. Either the [member " "custom_multiplayer], or the default SceneTree one (if inside tree)." msgstr "" +"L'instance [MultiplayerAPI] associée à ce nÅ“ud. Soit le [member " +"custom_multiplayer], ou la SceneTree par défaut (si l'intérieur de " +"l'arborescence)." #: doc/classes/Node.xml msgid "" @@ -50376,6 +50768,11 @@ msgid "" "process priority value is [i]lower[/i] will have their processing callbacks " "executed first." msgstr "" +"La priorité du nÅ“ud dans l'ordre d'exécution des appels de traitement " +"activés (c'est-à -dire [constant NOTIFICATION_PROCESS], [constant " +"NOTIFICATION_PHYSICS_PROCESS] et leurs homologues internes). Les nÅ“uds dont " +"la valeur de priorité d'exécution est [i]plus basse[/i] auront leurs appels " +"de traitement exécutés en premier." #: doc/classes/Node.xml msgid "" @@ -50393,6 +50790,10 @@ msgid "" "This signal is emitted [i]after[/i] the child node's own [constant " "NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" +"Émis lorsqu'un nÅ“ud enfant entre dans l'arborescence, soit parce qu'il est " +"entré seul ou parce que ce nÅ“ud est entré avec lui.\n" +"Ce signal est émis [i]après[/i] [constant NOTIFICATION_ENTER_TREE] et " +"[signal tree_entered] de cet enfant." #: doc/classes/Node.xml msgid "" @@ -50403,6 +50804,12 @@ msgid "" "tree and valid. This signal is emitted [i]after[/i] the child node's own " "[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" +"Émis lorsqu'un nÅ“ud d'enfant var quitter l'arborescence, soit parce qu'il " +"est enlevé ou libéré directement, soit parce que ce nÅ“ud sort de " +"l'arborescence.\n" +"Lorsque ce signal est reçu, le [code]node[/code] enfant est toujours dans " +"l'arborescence et valide. Ce signal est émis [i]après[/i] [signal " +"tree_exiting] et [constant NOTIFICATION_EXIT_TREE] de cet enfant." #: doc/classes/Node.xml msgid "Emitted when the node is ready." @@ -50418,6 +50825,9 @@ msgid "" "This signal is emitted [i]after[/i] the related [constant " "NOTIFICATION_ENTER_TREE] notification." msgstr "" +"Émis quand le nÅ“ud entre dans l'arborescence.\n" +"Ce signal est émis [i]après[/i] la notification correspondante [constant " +"NOTIFICATION_ENTER_TREE]." #: doc/classes/Node.xml msgid "Emitted after the node exits the tree and is no longer active." @@ -50430,12 +50840,19 @@ msgid "" "This signal is emitted [i]before[/i] the related [constant " "NOTIFICATION_EXIT_TREE] notification." msgstr "" +"Émis quand le nÅ“ud est encore actif mais sur le point de quitter " +"l'arborescence. C'est le bon endroit pour la de-initialisation (ou d'appel " +"au \"destructeur\").\n" +"Ce signal est émis [i]avant[/i] la notification correspondante [constant " +"NOTIFICATION_EXIT_TREE]." #: doc/classes/Node.xml msgid "" "Notification received when the node enters a [SceneTree].\n" "This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" +"La notification reçue lorsque le nÅ“ud entre dans un [SceneTree].\n" +"Cette notification est émise [i]avant[/i] la [signal tree_entered]." #: doc/classes/Node.xml msgid "" @@ -50467,24 +50884,34 @@ msgid "" "Notification received every frame when the physics process flag is set (see " "[method set_physics_process])." msgstr "" +"La notification reçue chaque trame lorsque le drapeau du processus de " +"physique est défini (voir [method set_physics_process])." #: doc/classes/Node.xml msgid "" "Notification received every frame when the process flag is set (see [method " "set_process])." msgstr "" +"La notification a reçu chaque trame lorsque le drapeau de processus est " +"défini (voir [method set_process])." #: doc/classes/Node.xml 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 "" +"La notification reçue lorsqu'un nÅ“ud est défini comme un enfant d'un autre " +"nÅ“ud.\n" +"[b]Note :[/b] Cela ne signifie pas que le nÅ“ud est nécessairement entré dans " +"le [SceneTree]." #: doc/classes/Node.xml msgid "" "Notification received when a node is unparented (parent removed it from the " "list of children)." msgstr "" +"La notification reçue lorsqu'un nÅ“ud n'a plus de parent (le parent l'a " +"retiré de sa liste d'enfants)." #: doc/classes/Node.xml msgid "Notification received when the node is instanced." @@ -50504,6 +50931,9 @@ msgid "" "Notification received when a drag operation ends.\n" "Use [method Viewport.gui_is_drag_successful] to check if the drag succeeded." msgstr "" +"La notification reçue à la fin d'une opération de déposé-glissé.\n" +"Utilisez [method Viewport.gui_is_drag_successful] pour vérifier si " +"l'opération a réussi." #: doc/classes/Node.xml msgid "Notification received when the node's [NodePath] changed." @@ -50514,12 +50944,16 @@ msgid "" "Notification received every frame when the internal process flag is set (see " "[method set_process_internal])." msgstr "" +"La notification a reçu chaque trame lorsque le drapeau interne du processus " +"est défini (voir [method set_process_internal])." #: doc/classes/Node.xml msgid "" "Notification received every frame when the internal physics process flag is " "set (see [method set_physics_process_internal])." msgstr "" +"La notification a reçu chaque trame lorsque le drapeau du processus physique " +"interne est défini (voir [method set_physics_process_internal])." #: doc/classes/Node.xml msgid "" @@ -50527,12 +50961,18 @@ msgid "" "NOTIFICATION_READY] is received. Unlike the latter, it's sent every time the " "node enters tree, instead of only once." msgstr "" +"La notification reçue lorsque le nÅ“ud est prêt, juste avant que [constant " +"NOTIFICATION_READY] soit reçue. Contrairement à cette dernière, cette " +"notification est envoyée chaque fois que le nÅ“ud entre dans l'arborescence, " +"et pas juste une seule fois." #: doc/classes/Node.xml msgid "" "Notification received when [method reset_physics_interpolation] is called on " "the node or parent nodes." msgstr "" +"La notification reçue lorsque [method reset_physics_interpolation] est " +"appelée sur le nÅ“ud ou les nÅ“uds parents." #: doc/classes/Node.xml msgid "" @@ -50546,25 +50986,32 @@ msgstr "Arrête la mise à jour quand le [SceneTree] est en pause." #: doc/classes/Node.xml msgid "Continue to process regardless of the [SceneTree] pause state." -msgstr "" +msgstr "Continuer le processus peu importe l'état de pause de la [SceneTree]." #: doc/classes/Node.xml msgid "" "Inherits physics interpolation mode from the node's parent. For the root " "node, it is equivalent to [constant PHYSICS_INTERPOLATION_MODE_ON]. Default." msgstr "" +"Inhérit le mode d'interpolation physique de la part du nÅ“ud parent. Pour le " +"nÅ“ud racine, c'est équivalent à [constant PHYSICS_INTERPOLATION_MODE_ON]. " +"C'est la valeur par défaut." #: doc/classes/Node.xml msgid "" "Turn off physics interpolation in this node and children set to [constant " "PHYSICS_INTERPOLATION_MODE_INHERIT]." msgstr "" +"Désactive l'interpolation physique de ce nÅ“ud et ses enfants qui sont " +"définis à [constant PHYSICS_INTERPOLATION_MODE_INHERIT]." #: doc/classes/Node.xml msgid "" "Turn on physics interpolation in this node and children set to [constant " "PHYSICS_INTERPOLATION_MODE_INHERIT]." msgstr "" +"Active l'interpolation physique de ce nÅ“ud et ses enfants qui sont définis à " +"[constant PHYSICS_INTERPOLATION_MODE_INHERIT]." #: doc/classes/Node.xml msgid "Duplicate the node's signals." @@ -50584,12 +51031,17 @@ msgid "" "An instance stays linked to the original so when the original changes, the " "instance changes too." msgstr "" +"Duplique via instanciation.\n" +"Une instance reste liée à l'original de sorte que lorsque l'original change, " +"l'instance change aussi." #: doc/classes/Node2D.xml msgid "" "A 2D game object, inherited by all 2D-related nodes. Has a position, " "rotation, scale, and Z index." msgstr "" +"Un objet de jeu 2D, hérité de tous les nÅ“uds 2D. A une position, une " +"rotation, une mise à l'échelle et un indice de profondeur Z." #: doc/classes/Node2D.xml msgid "" @@ -50598,6 +51050,11 @@ msgid "" "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 "" +"Un objet 2D de jeu, avec une transformation (position, rotation et mise à " +"l'échelle). Tous les nÅ“uds 2D, y compris les objets de physique et les " +"sprites, héritent de Node2D. Utilisez Node2D comme nÅ“ud parent pour " +"déplacer, mettre à l'échelle et pivoter des enfants dans un projet 2D. donne " +"également le contrôle sur l'ordre de rendu des nÅ“uds." #: doc/classes/Node2D.xml doc/classes/Vector2.xml msgid "All 2D Demos" @@ -50614,6 +51071,9 @@ msgid "" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" "node2d_get_angle_to.png]Illustration of the returned angle.[/url]" msgstr "" +"Retourne l'angle entre le nÅ“ud et le [code]point[/code] en radians.\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"nÅ“ud2d_get_angle_to.png]Illustration de l'angle retourné.[/url]" #: doc/classes/Node2D.xml msgid "Returns the [Transform2D] relative to this node's parent." @@ -50630,6 +51090,8 @@ msgid "" "Rotates the node so it points towards the [code]point[/code], which is " "expected to use global coordinates." msgstr "" +"Pivote le nÅ“ud pour qu'il pointe vers [code]point[/code], en supposant ça se " +"passe avec des coordonnées globales." #: doc/classes/Node2D.xml msgid "" @@ -50637,6 +51099,9 @@ msgid "" "_process]'s [code]delta[/code]. If [code]scaled[/code] is [code]false[/" "code], normalizes the movement." msgstr "" +"Applique un déplacement locale selon l'axe X du nÅ“ud suivant [code]delta[/" +"code] depuis [method Node._process]. Si [code]scaled[/code] est [code]false[/" +"code], le déplacement sera normalisé." #: doc/classes/Node2D.xml msgid "" @@ -50644,12 +51109,16 @@ msgid "" "_process]'s [code]delta[/code]. If [code]scaled[/code] is [code]false[/" "code], normalizes the movement." msgstr "" +"Applique un déplacement locale selon l'axe Y du nÅ“ud suivant [code]delta[/" +"code] depuis [method Node._process]. Si [code]scaled[/code] est [code]false[/" +"code], le déplacement sera normalisé." #: doc/classes/Node2D.xml msgid "" "Applies a rotation to the node, in radians, starting from its current " "rotation." msgstr "" +"Applique une rotation au nÅ“ud, en radians, à partir de son actuelle rotation." #: doc/classes/Node2D.xml msgid "" @@ -50698,7 +51167,7 @@ msgstr "[Transform2D] global." #: doc/classes/Node2D.xml msgid "Position, relative to the node's parent." -msgstr "" +msgstr "La position, relative au nÅ“ud parent." #: doc/classes/Node2D.xml msgid "Rotation in radians, relative to the node's parent." @@ -50728,6 +51197,9 @@ msgid "" "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 "" +"Si [code]true[/code], l'indice n'est pas défini comme étant relatif à " +"l'indice Z. Si l'indice Z du nÅ“ud est de 2 et que l'indice Z actuel du " +"parent est de 3, l'indice Z de ce nÅ“ud sera au final 2 + 3 = 5." #: doc/classes/Node2D.xml msgid "" @@ -50736,6 +51208,10 @@ msgid "" "VisualServer.CANVAS_ITEM_Z_MIN] and [constant VisualServer." "CANVAS_ITEM_Z_MAX] (inclusive)." msgstr "" +"Indice Z. Control l'ordre dans lequel les nÅ“uds sont affichés. Un nÅ“ud avec " +"un indice Z supérieur s'affichera devant les autres. Doit être définit entre " +"[constant VisualServer.CANVAS_ITEM_Z_MIN] et [constant VisualServer." +"CANVAS_ITEM_Z_MAX] (inclus)." #: doc/classes/NodePath.xml msgid "Pre-parsed scene tree path." @@ -50885,6 +51361,19 @@ msgid "" "print(property_path) # :position:x\n" "[/codeblock]" msgstr "" +"Retourne un chemin de nÅ“ud avec un caractère deux points ([code]:[/code]) " +"ajouté, le transformant en un chemin de propriété pur sans nom de nÅ“ud (par " +"défaut de résolution du nÅ“ud actuel).\n" +"[codeblock]\n" +"# Ce sera interprété comme un chemin de nÅ“ud vers la propriété \"x\" dans le " +"nÅ“ud \"position\".\n" +"d'appel au nÅ“ud_path = NodePath).\n" +"var node_path = NodePath(\"position:x\")\n" +"# Cela sera interprété comme un chemin de nÅ“ud vers le composant \"x\" de la " +"propriété \"position\" du nÅ“ud actuel.\n" +"var property_path = node_path.get_as_property_path()\n" +"print(property_path) # :position:x\n" +"[/codeblock]" #: doc/classes/NodePath.xml msgid "" @@ -50929,6 +51418,9 @@ msgid "" "get_subname_count]) are not included.\n" "For example, [code]\"Path2D/PathFollow2D/Sprite\"[/code] has 3 names." msgstr "" +"Retourne le nombre de noms de nÅ“uds qui composent le chemin. Les sous-noms " +"(voir [method get_subname_count]) ne sont pas inclus.\n" +"Par exemple, [code]\"Path2D/PathFollow2D/Sprite\"[/code] a 3 noms." #: doc/classes/NodePath.xml msgid "" @@ -50956,6 +51448,11 @@ msgid "" "For example, [code]\"Path2D/PathFollow2D/Sprite:texture:load_path\"[/code] " "has 2 subnames." msgstr "" +"Retourne le nombre de noms de ressources ou de propriétés (\"sous-noms\") " +"dans le chemin. Chaque sous-nom est répertorié après deux points ([code]:[/" +"code]) dans le chemin du nÅ“ud.\n" +"Par exemple, [code]\"Path2D/PathFollow2D/Sprite:texture:load_path\"[/code] a " +"2 sous-noms." #: doc/classes/NodePath.xml msgid "" @@ -50965,6 +51462,11 @@ msgid "" "root\"[/code]) or autoloads (e.g. [code]\"/global\"[/code] if a \"global\" " "autoload was registered)." msgstr "" +"Retourne [code]true[/code] si le chemin du nÅ“ud est absolu (et non relatif), " +"ce qui signifie qu'il commence par une barre oblique ([code]/[/code]). Les " +"chemins de nÅ“uds absolus peuvent être utilisés pour accéder au nÅ“ud racine " +"([code]\"/root\"[/code]) ou pour les chargements automatiques (par exemple " +"[code]\"/global\"[/code] si \"global\" est chargé automatiquement)." #: doc/classes/NodePath.xml msgid "Returns [code]true[/code] if the node path is empty." @@ -51010,12 +51512,17 @@ msgid "" "If [code]true[/code], the resulting texture contains a normal map created " "from the original noise interpreted as a bump map." msgstr "" +"Si [code]true[/code], la texture résultante contient une carte normale créée " +"à partir du bruit original interprété comme une carte de bosse." #: modules/opensimplex/doc_classes/NoiseTexture.xml 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 "" +"L'intensité des cartes de bosse utilisées dans cette texture. Une valeur " +"plus élevée rendra les cartes de bosse plus grandes alors qu'une valeur plus " +"basse les rendra plus douces." #: modules/opensimplex/doc_classes/NoiseTexture.xml msgid "Height of the generated texture." @@ -51031,6 +51538,9 @@ msgid "" "of the generated noise. This value is ignored if [member seamless] is " "enabled." msgstr "" +"Un décalage utilisé pour préciser la coordonnées de l'espace de bruit du " +"coin supérieur gauche du bruit généré. Cette valeur est ignorée si [member " +"seamless] est activé." #: modules/opensimplex/doc_classes/NoiseTexture.xml msgid "" @@ -51139,6 +51649,10 @@ msgid "" "Returns the given property. Returns [code]null[/code] if the [code]property[/" "code] does not exist." msgstr "" +"Une méthode virtuelle qui peut être surchargée pour personnaliser la valeur " +"de retour de [method get].\n" +"Retourne la propriété donnée. Retourne [code]null[/code] si [code]property[/" +"code] n'existe pas." #: doc/classes/Object.xml msgid "" @@ -51161,6 +51675,12 @@ msgid "" "class. If any other means (such as [method PackedScene.instance]) is used, " "then initialization will fail." msgstr "" +"Appelé lorsque l'objet est initialisé en mémoire. Peut prendre des " +"paramètres, qui sont passés dans lors de la construction.\n" +"[b]Note :[/b] Si [method _init] est défini avec les paramètres requis, alors " +"la construction explicite (via le code) est le seul moyen valable de créer " +"un objet de cette classe. Si d'autres moyens (comme [method PackedScene." +"instance]) sont utilisés, l'initialisation échouera." #: doc/classes/Object.xml msgid "" @@ -51170,6 +51690,11 @@ msgid "" "NOTIFICATION_PREDELETE], but subclasses such as [Node] define a lot more " "notifications which are also received by this method." msgstr "" +"Appelé chaque fois que l'objet reçoit une notification, qui est identifiée " +"par [code]what[/code] qui est une constante. Le [Object] de base a deux " +"constantes [constant NOTIFICATION_POSTINITIALIZE] et [constant " +"NOTIFICATION_PREDELETE], mais les sous-classes comme [Node] définissent " +"beaucoup plus de notifications qui sont également reçues par cette méthode." #: doc/classes/Object.xml msgid "" @@ -51178,6 +51703,10 @@ msgid "" "Sets a property. Returns [code]true[/code] if the [code]property[/code] " "exists." msgstr "" +"La méthode virtuelle qui peut être surchargée pour personnaliser la valeur " +"de retour de [method set].\n" +"Définit une propriété. Retourne [code]true[/code] si la [code]property[/" +"code] existe." #: doc/classes/Object.xml msgid "" @@ -51187,6 +51716,12 @@ msgid "" "Returns a [String] representing the object. If not overridden, defaults to " "[code]\"[ClassName:RID]\"[/code]." msgstr "" +"Une méthode virtuelle qui peut être remplacée pour personnaliser la valeur " +"de retour de [method to_string], et donc la représentation de l'objet s'il " +"est converti en chaîne de caractère, par exemple avec [code]print(obj)[/" +"code].\n" +"Retourne une [String] représentant l'objet. Si ce n'est pas le cas, le " +"format [code]\"[ClassName:RID]\"[/code] se retourné par défaut." #: doc/classes/Object.xml msgid "" @@ -51269,6 +51804,8 @@ msgid "" "Returns [code]true[/code] if the object can translate strings. See [method " "set_message_translation] and [method tr]." msgstr "" +"Retourne [code]true[/code] si l'objet peut traduire des chaînes de " +"caractères. Voir [method set_message_translation] et [method tr]." #: doc/classes/Object.xml msgid "" @@ -51345,6 +51882,11 @@ msgid "" "print an error. Use [method is_connected] to ensure that the connection " "exists." msgstr "" +"Déconnecte le [code]signal[/code] d'une [code]method[/code] pour la cible " +"[code]target[/code] donnée.\n" +"Si vous essayez de déconnecter une connexion qui n'existe pas, la méthode " +"affichera une erreur. Utiliser [method is_connected] pour s'assurer que la " +"connexion existe." #: doc/classes/Object.xml msgid "" @@ -51357,6 +51899,15 @@ msgid "" "emit_signal(\"game_over\")\n" "[/codeblock]" msgstr "" +"Émet le [code]signal[/code] donné. Le signal doit exister, de sorte qu'il " +"doit être un signal intégré de cette classe ou une de ses classes parentes, " +"ou un signal défini par l'utilisateur. Cette méthode prend en charge un " +"nombre variable d'arguments, de sorte que les paramètres sont passés comme " +"une liste séparée par des virgules. Exemple :\n" +"[codeblock]\n" +"emit_signal(\"hit\", weapon_type, damage)\n" +"emit_signal(\"game_over\")\n" +"[/codeblock]" #: doc/classes/Object.xml msgid "" @@ -51387,6 +51938,11 @@ msgid "" "declarations into account. If the object has a [code]class_name[/code] " "defined, the base class name will be returned instead." msgstr "" +"Retourne la classe de l'objet en tant que [String]. Voir aussi [method " +"is_class].\n" +"[b]Note :[/b] [method get_class] ignore les déclarations [code]class_name[/" +"code]. Si l'objet a un [code]class_name[/code] défini, le nom de classe de " +"base sera retourné à la place." #: doc/classes/Object.xml msgid "" @@ -51398,6 +51954,13 @@ msgid "" "- [code]method_name[/code] is the name of the method to which the signal is " "connected." msgstr "" +"Retourne un [Array] de dictionnaires avec des informations sur les signaux " +"qui sont connectés à l'objet.\n" +"Chaque [Dictionary] contient trois entrées en String :\n" +"- [code]source[/code] est une référence à l'émetteur de signal.\n" +"- [code]signal_name[/code] est le nom du signal connecté.\n" +"- [code]method_name[/code] est le nom de la méthode à laquelle le signal est " +"connecté." #: doc/classes/Object.xml msgid "" @@ -51417,6 +51980,10 @@ msgid "" "This ID can be saved in [EncodedObjectAsID], and can be used to retrieve the " "object instance with [method @GDScript.instance_from_id]." msgstr "" +"Retourne l'identifiant de l'instance unique de l'objet.\n" +"Cet identifiant peut être enregistré dans [EncodedObjectAsID] et peut être " +"utilisé pour récupérer l'objet de l'instance avec [method @GDScript." +"instance_from_id]." #: doc/classes/Object.xml msgid "" @@ -51424,6 +51991,10 @@ msgid "" "Throws error if the entry does not exist, unless [code]default[/code] is not " "[code]null[/code] (in which case the default value will be returned)." msgstr "" +"Retourne l'entrée de métadonnées de l'objet [code]name[/code] spécifié.\n" +"Affiche une erreur si l'entrée n'existe pas, sauf si [code]default[/code] " +"n'est pas [code]null[/code] (dans quel cas la valeur par défaut sera " +"retournée)." #: doc/classes/Object.xml msgid "Returns the object's metadata as a [PoolStringArray]." @@ -51442,6 +52013,13 @@ msgid "" "[code]hint_string: String[/code], and [code]usage: int[/code] (see [enum " "PropertyUsageFlags])." msgstr "" +"Retourne la liste de propriétés de l'objet dans un [Array] de " +"dictionnaires.\n" +"Chaque propriété [Dictionary] contient au moins [code]name: String[/code] et " +"[code]type: int[/code] (voir [enum Variant.Type]). En option, il peut " +"également inclure [code]hint: int[/code] (voir [enum PropertyHint]), " +"[code]hint_string: String[/code], et [code]usage: int[/code] (voir [enum " +"PropertyUsageFlags])." #: doc/classes/Object.xml msgid "" @@ -51485,6 +52063,9 @@ msgid "" "exists. Only signals added using [method add_user_signal] are taken into " "account." msgstr "" +"Retourne [code]true[/code] si le [code]signal[/code] défini par " +"l'utilisateur existe. Seuls les signaux ajoutés à [method add_user_signal] " +"sont pris en compte." #: doc/classes/Object.xml msgid "Returns [code]true[/code] if signal emission blocking is enabled." @@ -51498,6 +52079,11 @@ msgid "" "declarations into account. If the object has a [code]class_name[/code] " "defined, [method is_class] will return [code]false[/code] for that name." msgstr "" +"Retourne [code]true[/code] si l'objet hérite de la [code]class[/code] " +"donnée. Voir aussi [method get_class].\n" +"[b]Note :[/b] [method is_class] ne prend pas en compte les déclarations " +"[code]class_name[/code]. Si l'objet a un [code]class_name[/code] défini, " +"[method is_class] retournera [code]false[/code] pour ce nom." #: doc/classes/Object.xml msgid "" @@ -51579,12 +52165,23 @@ msgid "" "print(position) # (42, -10)\n" "[/codeblock]" msgstr "" +"Assigne une nouvelle valeur à la propriété identifiée par le [NodePath]. Le " +"chemin nÅ“ud devrait être relatif à l'objet courant et peut utiliser le " +"caractère des deux points ([code]:[/code]) pour accéder aux propriétés " +"imbriquées. Par exemple :\n" +"[codeblock]\n" +"set_indexed(\"position\", Vector2(42, 0))\n" +"set_indexed(\"position:y\", -10)\n" +"print(position) # (42, -10)\n" +"[/codeblock]" #: doc/classes/Object.xml msgid "" "Defines whether the object can translate strings (with calls to [method " "tr]). Enabled by default." msgstr "" +"Définit si l'objet peut traduire des chaînes (avec des appels à [method " +"tr]). Activé par défaut." #: doc/classes/Object.xml msgid "" @@ -51604,6 +52201,11 @@ msgid "" "freed and its variables and state will be lost. The new script's [method " "_init] method will be called." msgstr "" +"Attribue un script à l'objet. Chaque objet peut avoir un seul script qui lui " +"est assigné, qui sont utilisés pour étendre ses fonctionnalités.\n" +"Si l'objet avait déjà un script, l'instance de script précédente sera " +"libérée, ses variables et son état seront perdus. La méthode [method _init] " +"du nouveau script sera appelée." #: doc/classes/Object.xml msgid "" @@ -51612,6 +52214,10 @@ msgid "" "Override the method [method _to_string] to customize the [String] " "representation." msgstr "" +"Retourne une [String] représentant l'objet. Si ce n'est pas le cas, au " +"format par défaut [code]\"[ClassName:RID]\"[/code].\n" +"Surcharger la méthode [method to_string] pour personnaliser la " +"représentation en [String] affichée." #: doc/classes/Object.xml msgid "" @@ -51621,6 +52227,11 @@ msgid "" "otherwise it returns the [code]message[/code] unchanged. See [method " "set_message_translation]." msgstr "" +"Traduit un message en utilisant le catalogue de translations définit dans " +"les réglages du projet.\n" +"Ne fonctionne que si la traduction de message est activée (par défaut), " +"sinon elle retourne le [code]message[/code] inchangé. Voir [method " +"set_message_translation]." #: doc/classes/Object.xml msgid "Emitted whenever the object's script is changed." @@ -51662,6 +52273,9 @@ msgid "" "connected several times to the same target, and will only be fully " "disconnected once no references are left." msgstr "" +"Connectez un signal avec un compteur de référence. Cela signifie qu'un " +"signal donné peut être connecté plusieurs fois à la même cible, et ne sera " +"complètement déconnecté qu'une fois déconnecté de toutes les références." #: doc/classes/Occluder.xml msgid "Allows [OccluderShape]s to be used for occlusion culling." @@ -51700,6 +52314,8 @@ msgid "" "Editor facility that helps you draw a 2D polygon used as resource for " "[LightOccluder2D]." msgstr "" +"Aide de l'édition pour dessiner un polygone 2D utilisé comme ressource pour " +"un [LightOccluder2D]." #: doc/classes/OccluderPolygon2D.xml msgid "" @@ -51707,6 +52323,10 @@ msgid "" "occludes the light coming from any direction. An opened OccluderPolygon2D " "occludes the light only at its outline's direction." msgstr "" +"Si [code]true[/code], ferme (boucle) le polygone. Un OccluderPolygon2D fermé " +"bloque la lumière provenant de n'importe quelle direction. Un " +"OccluderPolygon2D ouvert ne bloque que la lumière qui vient en direction de " +"son alignement." #: doc/classes/OccluderPolygon2D.xml msgid "The culling mode to use." @@ -51718,6 +52338,9 @@ msgid "" "[b]Note:[/b] The returned value is a copy of the underlying array, rather " "than a reference." msgstr "" +"Un tableau de [Vector2] avec l'indice pour les positions des sommets.\n" +"[b]Note :[/b] La valeur retournée est une copie du tableau sous-jacent, et " +"non pas une référence." #: doc/classes/OccluderPolygon2D.xml msgid "Culling is disabled. See [member cull_mode]." @@ -51743,6 +52366,8 @@ msgstr "" #: doc/classes/OccluderShape.xml msgid "[Occluder]s can use any primitive shape derived from [OccluderShape]." msgstr "" +"Les [Occluder] peuvent utiliser toute forme primitive dérivée de " +"[OccluderShape]." #: doc/classes/OccluderShapePolygon.xml msgid "Polygon occlusion primitive for use with the [Occluder] node." @@ -51765,7 +52390,6 @@ msgid "" msgstr "" #: doc/classes/OccluderShapePolygon.xml -#, fuzzy msgid "Sets an individual hole point position." msgstr "Définit la position d'un trou simple." @@ -51775,17 +52399,19 @@ msgstr "Définit la position d'un seul point d'un polygone." #: doc/classes/OccluderShapePolygon.xml msgid "Allows changing the hole geometry from code." -msgstr "" +msgstr "Permet de changer la géométrie du trou depuis le code." #: doc/classes/OccluderShapePolygon.xml msgid "Allows changing the polygon geometry from code." -msgstr "" +msgstr "Permet de changer la géométrie de polygone depuis le code." #: doc/classes/OccluderShapePolygon.xml msgid "" "Specifies whether the occluder should operate from both sides. If " "[code]false[/code], the occluder will operate one way only." msgstr "" +"Précise si l'occulteur devrait fonctionner des deux côtés. Si [code]false[/" +"code], l'occulteur ne fonctionnera que dans un sens." #: doc/classes/OccluderShapeSphere.xml msgid "Spherical occlusion primitive for use with the [Occluder] node." @@ -51815,6 +52441,9 @@ msgid "" "each sphere is stored in the [code]normal[/code], and the radius is stored " "in the [code]d[/code] value of the plane." msgstr "" +"Les données de la sphère peuvent être obtenues dans un de tableau de " +"[Plane]. La position de chaque sphère est enregistrée dans [code]normal[/" +"code], et le rayon dans la valeur [code]d[/code] du plan." #: doc/classes/OmniLight.xml msgid "Omnidirectional light, such as a light bulb or a candle." @@ -51867,6 +52496,8 @@ msgid "" "Shadows are rendered to a dual-paraboloid texture. Faster than [constant " "SHADOW_CUBE], but lower-quality." msgstr "" +"Les ombres sont rendues dans une texture dual-paraboloïde. Plus rapide que " +"[constant SHADOW_CUBE], mais de qualité inférieure." #: doc/classes/OmniLight.xml msgid "" @@ -51874,6 +52505,9 @@ msgid "" "SHADOW_DUAL_PARABOLOID], but higher-quality. Only supported on GPUs that " "feature support for depth cubemaps." msgstr "" +"Les ombres sont rendues à un CubeMap. Plus lent que [constant " +"SHADOW_DUAL_PARABOLOID], mais de qualité supérieure. Seulement pris en " +"charge sur les GPU qui disposent du support pour les CubeMap de profondeur." #: doc/classes/OmniLight.xml msgid "Use more detail vertically when computing the shadow." @@ -51908,6 +52542,25 @@ msgid "" "print(noise.get_noise_4d(0.5, 1.9, 4.7, 0.0))\n" "[/codeblock]" msgstr "" +"Cette ressource vous permet de configurer et d'échantillonner un espace de " +"bruit fractal. Voici un court exemple d'utilisation qui configure un " +"OpenSimplexNoise et obtient des échantillons à différentes positions et " +"dimensions :\n" +"[codeblock]\n" +"var noise = OpenSimplexNoise.new()\n" +"\n" +"# Configuration\n" +"noise.seed = randi()\n" +"noise.octaves = 4\n" +"noise.period = 20.0\n" +"noise.persistence = 0.8\n" +"\n" +"# Échantionnage\n" +"print(\"Valeurs :\")\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]" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" @@ -51917,6 +52570,10 @@ msgid "" "value is used as the coordinates of the top-left corner of the generated " "noise." msgstr "" +"Générer une image de bruit au format [constant Image.FORMAT_L8] à la taille " +"[code]width[/code] sur [code]height[/code], basé sur les paramètres de bruit " +"actuels. Si [code]noise_offset[/code] est spécifié, le décalage sera utilisé " +"comme coordonnées du coin supérieur gauche du bruit généré." #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" @@ -51924,6 +52581,10 @@ msgid "" "[b]Note:[/b] This method actually returns the 2D noise value [code][-1,1][/" "code] with fixed y-coordinate value 0.0." msgstr "" +"Retourne le code de valeur de bruit 1D dans l'intervalle [code][-1,1][/code] " +"pour la coordonnée x donnée.\n" +"[b]Note :[/b] Cette méthode retourne en fait la valeur de bruit 2D dans " +"l'intervalle [code][-1,1][/code] mais avec la coordonnée y fixée à 0.0." #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "Returns the 2D noise value [code][-1,1][/code] at the given position." @@ -51967,6 +52628,8 @@ msgid "" "Period of the base octave. A lower period results in a higher-frequency " "noise (more value changes across the same distance)." msgstr "" +"La période de l'octave de base. Une période inférieure entraîne un bruit de " +"fréquence plus élevée (plus de valeur change sur la même distance)." #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" @@ -51974,12 +52637,18 @@ msgid "" "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 "" +"Le facteur de contribution des différentes octaves. Une valeur " +"[code]persistence[/code] de 1 signifie que toutes les octaves ont la même " +"contribution, une valeur de 0,5 signifie chaque octave contribue à la moitié " +"de la précédente." #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" "Seed used to generate random values, different seeds will generate different " "noise maps." msgstr "" +"La graine utilisée pour générer des valeurs aléatoires, différentes graines " +"généreront différentes cartes de bruit." #: doc/classes/OptionButton.xml msgid "Button control that provides selectable options when pressed." @@ -51993,6 +52662,11 @@ msgid "" "See also [BaseButton] which contains common properties and methods " "associated with this node." msgstr "" +"OptionButton est un type de bouton qui fournit une liste d'éléments " +"lorsqu'il est pressé. L'élément sélectionné devient l'élément \"actuel\" et " +"s'affiche comme le texte du bouton.\n" +"Voir aussi [BaseButton] qui contient des propriétés et des méthodes communes " +"associées à ce nÅ“ud." #: doc/classes/OptionButton.xml msgid "" @@ -52000,6 +52674,10 @@ msgid "" "(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 "" +"Ajoute un élément, avec une icône [code]texture[/code], un texte " +"[code]label[/code] et (en option) un [code]id[/code]. Si aucun [code]id[/" +"code] n'est spécifié, l'index de l'élément sera utilisé comme identifiant de " +"l'élément. Les nouveaux éléments sont placés à la fin de la liste." #: doc/classes/OptionButton.xml msgid "" @@ -52007,12 +52685,19 @@ msgid "" "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 "" +"Ajoute un élément, avec le texte [code]label[/code] et (en option) un " +"[code]id[/code]. Si aucun [code]id[/code] n'est spécifié, l'index de " +"l'élément sera utilisé comme identifiant de l'élément. Les nouveaux éléments " +"sont placés à la fin de la liste." #: doc/classes/OptionButton.xml 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 "" +"Ajoute un séparateur à la liste des articles. Les séparateurs aident à " +"regrouper les éléments. Le séparateur prend également un index et est ajouté " +"à la fin." #: doc/classes/OptionButton.xml msgid "Clears all the items in the [OptionButton]." @@ -52065,6 +52750,8 @@ msgid "" "Gets the metadata of the selected item. Metadata for items can be set using " "[method set_item_metadata]." msgstr "" +"Retourne les métadonnées de l'élément sélectionné. Les métadonnées peuvent " +"être définies en utilisant [method set_item_metadata]." #: doc/classes/OptionButton.xml msgid "" @@ -52083,6 +52770,10 @@ msgid "" "if the item is disabled.\n" "Passing [code]-1[/code] as the index deselects any currently selected item." msgstr "" +"Sélectionne un élément par son index et en fait l'élément actuel. Cela " +"fonctionnera même si l'élément est désactivé.\n" +"Passer [code]-1[/code] en index désélectionne tout élément actuellement " +"sélectionné." #: doc/classes/OptionButton.xml msgid "" @@ -52091,6 +52782,11 @@ msgid "" "by the user. If the current selected item is set as disabled, it will remain " "selected." msgstr "" +"Définit si l'élément à l'index [code]idx[/code] est désactivé.\n" +"Les éléments désactivés sont dessinés différemment dans la liste déroulante " +"et ne peuvent pas être sélectionnés par l'utilisateur. Si l'élément " +"sélectionné actuel est définit comme désactivé, il restera tout de même " +"sélectionné." #: doc/classes/OptionButton.xml msgid "Sets the icon of the item at index [code]idx[/code]." @@ -52105,6 +52801,9 @@ 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 "" +"Définit les métadonnées d'un élément. Les métadonnées peuvent être de " +"n'importe quel type et peuvent être utilisées pour stocker des informations " +"supplémentaires sur un élément, comme un identifiant de chaîne externe." #: doc/classes/OptionButton.xml doc/classes/PopupMenu.xml msgid "Sets the text of the item at index [code]idx[/code]." @@ -52119,6 +52818,8 @@ msgid "" "The index of the currently selected item, or [code]-1[/code] if no item is " "selected." msgstr "" +"L'index de l'élément actuellement sélectionné, ou [code]-1[/code] si aucun " +"élément n'est sélectionné." #: doc/classes/OptionButton.xml msgid "" @@ -52126,12 +52827,17 @@ msgid "" "[code]ui_down[/code] actions. The index of the item selected is passed as " "argument." msgstr "" +"Émis lorsque l'utilisateur navigue vers un élément utilisant les actions " +"[code]ui_up[/code] ou [code]ui_down[/code]. L'index de l'élément sélectionné " +"est passé comme argument." #: doc/classes/OptionButton.xml msgid "" "Emitted when the current item has been changed by the user. The index of the " "item selected is passed as argument." msgstr "" +"Émis lorsque l'élément actuel a été modifié par l'utilisateur. L'index de " +"l'élément sélectionné est passé en argument." #: doc/classes/OptionButton.xml msgid "Default text [Color] of the [OptionButton]." @@ -52147,6 +52853,9 @@ msgid "" "normal text color of the button. Disabled, hovered, and pressed states take " "precedence over this color." msgstr "" +"La [Color] du texte utilisée quand le [OptionButton] a le focus. Ne remplace " +"que la couleur normale du texte du bouton. Les états désactivés, survolés et " +"pressés sont prioritaires sur cette couleur." #: doc/classes/OptionButton.xml msgid "Text [Color] used when the [OptionButton] is being hovered." @@ -52184,6 +52893,9 @@ msgid "" "current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " "visual effect." msgstr "" +"Le [StyleBox] utilisé lorsque [OptionButton] a le focus. Elle est affichée " +"sur la [StyleBox] actuelle, dont utiliser [StyleBoxEmpty] va tout simplement " +"désactiver l'effet visuel de focus." #: doc/classes/OptionButton.xml msgid "[StyleBox] used when the [OptionButton] is being hovered." @@ -52219,6 +52931,8 @@ msgid "" "Displays a modal dialog box using the host OS' facilities. Execution is " "blocked until the dialog is closed." msgstr "" +"Affiche une boîte de dialogue modal en utilisant le système d'exploitation " +"hôte. L'exécution est bloquée jusqu'à ce que le dialogue soit fermé." #: doc/classes/OS.xml msgid "Returns [code]true[/code] if the host OS allows drawing." @@ -52236,13 +52950,15 @@ msgstr "" #: doc/classes/OS.xml msgid "Centers the window on the screen if in windowed mode." -msgstr "" +msgstr "Centre la fenêtre à l'écran si en mode fenêtre." #: doc/classes/OS.xml msgid "" "Shuts down system MIDI driver.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Ferme le système de pilote MIDI.\n" +"[b]Note :[/b] Cette méthode est implémenté sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -52252,6 +52968,12 @@ msgid "" "order of preference) [method @GDScript.assert], [method @GDScript." "push_error] or [method alert]. See also [method kill]." msgstr "" +"Fait planter le moteur (ou l'éditeur si appelé dans un script avec " +"[code]tool[/code]). Ceci ne devrait être [i]seulement[/i] utilisé pour " +"tester le gestionnaire de plantage du système, et non pour toute autre " +"raison. Pour la déclaration d'erreur générale, utilisez (dans l'ordre des " +"préférences) : [method @GDScript.assert], [method @GDScript.push_error] ou " +"[method alert]. Voir aussi [method kill]." #: doc/classes/OS.xml msgid "" @@ -52396,7 +53118,7 @@ msgstr "" #: doc/classes/OS.xml msgid "Returns the scancode of the given string (e.g. \"Escape\")." -msgstr "" +msgstr "Retourne le scancode de la chaîne donnée (par exemple \"Escape\")." #: doc/classes/OS.xml msgid "Returns the total number of available audio drivers." @@ -52404,7 +53126,7 @@ msgstr "Retourne le nombre total de périphériques audio." #: doc/classes/OS.xml msgid "Returns the audio driver name for the given index." -msgstr "" +msgstr "Retourne le nom du pilote audio à l'index donné." #: doc/classes/OS.xml msgid "" @@ -52463,12 +53185,18 @@ msgid "" "previously been initialised with [method open_midi_inputs].\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Retourne un tableau de noms de périphériques MIDI.\n" +"Le tableau retourné sera vide si le pilote MIDI n'a pas déjà été initialisé " +"avec [method open_midi_inputs].\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" "Returns the currently used video driver, using one of the values from [enum " "VideoDriver]." msgstr "" +"Retourne le pilote vidéo actuellement utilisé, en utilisant une des valeurs " +"de [enum VideoDriver]." #: doc/classes/OS.xml msgid "" @@ -52543,6 +53271,9 @@ msgid "" "been granted to the Android application.\n" "[b]Note:[/b] This method is implemented on Android." msgstr "" +"Avec cette fonction, vous pouvez obtenir la liste des autorisations " +"dangereuses qui ont été accordées à cette application Android.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Android." #: doc/classes/OS.xml msgid "" @@ -52552,6 +53283,11 @@ msgid "" "notify it of changes to the IME cursor position.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Retourne la position de curseur IME (la partie actuellement éditée de la " +"chaîne) par rapport aux caractères de la chaîne de composition.\n" +"[constant MainLoop.NOTIFICATION_OS_IME_UPDATE] est envoyé à l'application " +"pour l'informer des modifications apportées à la position du curseur IME.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "" @@ -52560,6 +53296,10 @@ msgid "" "notify it of changes to the IME composition string.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Retourne la chaîne de composition intermédiaire IME.\n" +"[constant MainLoop.NOTIFICATION_OS_IME_UPDATE] est envoyé à l'application " +"pour l'informer des modifications apportées à la chaîne de composition IME.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "" @@ -52607,6 +53347,10 @@ msgid "" "[b]Note:[/b] Thread IDs are not deterministic and may be reused across " "application restarts." msgstr "" +"Retourne l'identifiant du fil d'exécution principal. Voir [method " +"get_thread_caller_id].\n" +"[b]Note :[/b] Les identifiants des Thread ne sont pas déterministes mais " +"peuvent parfois être réutilisés même après des redémarrages de l'application." #: doc/classes/OS.xml msgid "" @@ -52614,6 +53358,9 @@ msgid "" "[b]Note:[/b] This method is implemented on Android and iOS. Returns " "[code]\"GenericDevice\"[/code] on unsupported platforms." msgstr "" +"Retourne le nom du modèle de l'appareil actuel.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Android et iOS. Retourne " +"[code]\"GénériqueDevice\"[/code] sur les plateformes non supportées." #: doc/classes/OS.xml msgid "" @@ -52633,6 +53380,10 @@ msgid "" "[b]Note:[/b] This method is implemented on Linux and Windows (other OSs will " "soon be supported)." msgstr "" +"Retourne les pointeurs de structure internes pour une utilisation dans les " +"greffons GDNative.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux et Windows (d'autres " +"OS seront bientôt pris en charge)." #: doc/classes/OS.xml msgid "" @@ -52640,6 +53391,9 @@ msgid "" "[code]-1[/code] if power state is unknown.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Retourne la quantité de batterie restante dans l'appareil en pourcentage. " +"Retourne [code]-1[/code] si l'état de la batterie est inconnu.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -52647,6 +53401,10 @@ msgid "" "of battery. Returns [code]-1[/code] if power state is unknown.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Retourne une estimation du temps restant en secondes avant que l'appareil " +"n'ait plus de batterie. Retourne [code]-1[/code] si l'état de la batterie " +"est inconnu.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -52664,6 +53422,9 @@ msgid "" "[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " "Windows." msgstr "" +"Retourne l'identifiant du processus du projet.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Android, iOS, Linux, macOS " +"et Windows." #: doc/classes/OS.xml msgid "" @@ -52671,6 +53432,9 @@ msgid "" "machine. On CPUs with HyperThreading enabled, this number will be greater " "than the number of [i]physical[/i] CPU cores." msgstr "" +"Retourne le nombre de cÅ“urs [i]logiques[/i] du CPU disponibles sur la " +"machine hôte. Sur les processeurs avec le mode HyperThreading activé, ce " +"nombre sera supérieur au nombre de cÅ“urs [i]physiques[/i] du CPU." #: doc/classes/OS.xml msgid "" @@ -52680,6 +53444,11 @@ msgid "" "iOS. On Android, HTML5 and UWP, [method get_processor_name] returns an empty " "string." msgstr "" +"Retourne le nom du modèle CPU sur la machine hôte (par exemple \"Intel(R) " +"Core(TM) i7-6700K CPU @ 4.00GHz\").\n" +"[b]Note :[/b] Cette méthode n'est implémentée que sur Windows, MacOS, Linux " +"et iOS. Sur Android, HTML5 et UWP, [method get_processor_name] renvoie une " +"chaîne vide." #: doc/classes/OS.xml msgid "Returns the window size including decorations like window borders." @@ -52694,6 +53463,10 @@ msgid "" "See also [member InputEventKey.scancode] and [method InputEventKey." "get_scancode_with_modifiers]." msgstr "" +"Retourne le scancode spécifié sous forme de chaîne (par exemple valeurs de " +"retour : [code]\"Escape\"[/code], [code]\"Shift+Escape\"[/code]).\n" +"Voir aussi [member InputEventKey.scancode] et [method InputEventKey." +"get_scancode_with_modifiers]." #: doc/classes/OS.xml msgid "Returns the number of displays attached to the host machine." @@ -52745,6 +53518,11 @@ msgid "" "other cases.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Retourner le plus grand facteur d'échelle de tous les écrans.\n" +"[b]Note :[/b] Sur macOS la valeur retournée est [code]2.0[/code] s'il y a au " +"moins un écran hiDPI (Retina) dans le système, et [code]1.0[/code] dans tous " +"les autres cas.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "" @@ -52772,6 +53550,20 @@ msgid "" " refresh_rate = 60.0\n" "[/codeblock]" msgstr "" +"Retourne le taux de rafraîchissement actuel de l'écran spécifié. Si " +"[code]screen[/code] est [code]-1[/code] (la valeur par défaut), l'écran " +"actuel sera utilisé.\n" +"[b]Note :[/b] Retourne [code]-1.0[/code] si Godot ne trouve pas le taux de " +"rafraîchissement pour l'écran spécifié. Sur HTML5, [method " +"get_screen_refresh_rate] retournera toujours [code]-1.0[/code] car il n'y a " +"aucun moyen de récupérer le taux de rafraîchissement sur cette plate-forme.\n" +"Pour utiliser un taux de rafraîchissement par défaut si la méthode échoue, " +"essayez :\n" +"[codeblock]\n" +"var refresh_rate = OS.get_screen_refresh_rate()\n" +"if refresh_rate < 0:\n" +" refresh_rate = 60.0\n" +"[/codeblock]" #: doc/classes/OS.xml msgid "" @@ -52782,6 +53574,12 @@ msgid "" "screen, and [code]1.0[/code] for all other cases.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Retourner le facteur d'échelle de l'écran spécifié à l'index. Si " +"[code]screen[/code] est [code]-1[/code] (la valeur par défaut), l'écran " +"actuel sera utilisé.\n" +"[b]Note :[/b] Sur macOS la valeur retournée est [code]2.0[/code] pour les " +"écrans hiDPI (Retina) et [code]1.0[/code] pour tous les autres écrans.\n" +"[b]Note :[/b] Cette méthode est implémentée sous macOS." #: doc/classes/OS.xml msgid "" @@ -52810,6 +53608,8 @@ msgid "" "Returns the amount of static memory being used by the program in bytes (only " "works in debug)." msgstr "" +"Retourne la quantité de mémoire statique utilisée par le programme en octets " +"(seulement pour les versions avec débogage)." #: doc/classes/OS.xml msgid "" @@ -52821,6 +53621,14 @@ msgid "" "differentiate between app specific and shared directories. Shared " "directories have additional restrictions on Android." msgstr "" +"Retourne le chemin réel aux dossiers couramment utilisés sur différentes " +"plateformes. Les emplacements disponibles sont spécifiés dans [enum " +"SystemDir].\n" +"[b]Note :[/b] Cette méthode est implémentée sur Android, Linux, macOS et " +"Windows.\n" +"[b]Note :[/b] Le stockage partagé est implémenté sur Android et permet de " +"différencier entre les applications spécifiques et les dossiers partagés. " +"Les dossiers partagés ont des restrictions supplémentaires sur Android." #: doc/classes/OS.xml msgid "Returns the epoch time of the operating system in milliseconds." @@ -52881,11 +53689,16 @@ msgid "" "Deprecated, use [method Time.get_time_dict_from_system] instead.\n" "Returns current time as a dictionary of keys: hour, minute, second." msgstr "" +"Obsolète, utilisez plutôt [method Time.get_time_dict_from_system].\n" +"Retourne l'heure actuelle dans un dictionnaire avec les clés : \"hour\", " +"\"minute\", \"second\"." #: doc/classes/OS.xml msgid "" "Returns the current time zone as a dictionary with the keys: bias and name." msgstr "" +"Retourne l'actuel fuseau horaire dans un dictionnaire avec les clés : biais " +"et nom." #: doc/classes/OS.xml msgid "" @@ -52899,6 +53712,17 @@ msgid "" "[b]Note:[/b] Returns an empty string on HTML5 and UWP, as this method isn't " "implemented on those platforms yet." msgstr "" +"Retourne une chaîne de caractères unique à l'appareil.\n" +"[b]Note :[/b] Cette chaîne peut changer sans préavis si l'utilisateur " +"réinstalle ou met à jour son système d'exploitation ou modifie son matériel. " +"Cela signifie qu'il ne devrait généralement pas être utilisé pour chiffrer " +"les données persistantes car des données enregistrées avant ce changement " +"d'identifiant deviendront inaccessibles. La chaîne retournée peut également " +"être modifiée manuellement en utilisant des programmes externes, donc ne pas " +"compter sur la chaîne retournée par [method get_unique_id] pour la " +"sécurisation.\n" +"[b]Note :[/b] Retourne une chaîne vide sur HTML5 et UWP, car cette méthode " +"n'est pas encore implémentée sur ces plateformes." #: doc/classes/OS.xml msgid "" @@ -52908,7 +53732,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -52948,6 +53774,8 @@ msgstr "" #: doc/classes/OS.xml msgid "Returns the number of video drivers supported on the current platform." msgstr "" +"Retourne le nombre de pilotes vidéo pris en charge sur la plateforme " +"actuelle." #: doc/classes/OS.xml msgid "" @@ -52955,18 +53783,25 @@ msgid "" "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 "" +"Retourne le nom du pilote vidéo correspondant à l'index [code]driver[/code] " +"donné. Cet index est une valeur de [enum VideoDriver], et vous pouvez " +"utiliser [method get_current_video_driver] pour obtenir l'index du backend." #: doc/classes/OS.xml msgid "" "Returns the on-screen keyboard's height in pixels. Returns 0 if there is no " "keyboard or if it is currently hidden." msgstr "" +"Retourne la hauteur du clavier virtuel à l'écran en pixels. Retourne 0 s'il " +"n'y a pas de clavier ou s'il est actuellement caché." #: doc/classes/OS.xml msgid "" "Returns unobscured area of the window where interactive controls should be " "rendered." msgstr "" +"Retourne la zone sûre de la fenêtre où les contrôles interactifs doivent " +"être placés." #: doc/classes/OS.xml msgid "" @@ -52974,18 +53809,26 @@ msgid "" "item to the macOS dock icon menu.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Ajoute un nouvel élément avec le texte \"label\" au menu global. Utilisez le " +"menu \"_dock\" pour ajouter l'élément au menu du dock sous macOS.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "" "Add a separator between items. Separators also occupy an index.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Ajoute un séparateur entre les éléments. Les séparateurs occupent également " +"un index.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "" "Clear the global menu, in effect removing all items.\n" "[b]Note:[/b] This method is implemented on macOS." msgstr "" +"Efface le menu global, en supprimant tous les éléments.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "" @@ -52993,6 +53836,9 @@ msgid "" "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 "" +"Retire l'élément à l'index \"idx\" du menu global. Notez que les index des " +"éléments après l'élément supprimé seront déplacés de un.\n" +"[b]Note :[/b] Cette méthode est implémentée sur macOS." #: doc/classes/OS.xml msgid "Returns [code]true[/code] if there is content on the clipboard." @@ -53005,6 +53851,11 @@ msgid "" "[b]Note:[/b] Double-check the casing of [code]variable[/code]. Environment " "variable names are case-sensitive on all platforms except Windows." msgstr "" +"Retourne [code]true[/code] si la variable d'environnement avec le nom " +"[code]variable[/code] existe.\n" +"[b]Note :[/b] Vérifiez à deux fois la casse de [code]variable[/code]. Les " +"noms variables d'environnement sont sensibles à la casse sur toutes les " +"plateformes sauf Windows." #: doc/classes/OS.xml msgid "" @@ -53069,6 +53920,8 @@ msgid "" "Returns [code]true[/code] if the input scancode corresponds to a Unicode " "character." msgstr "" +"Retourne [code]true[/code] si le code d'entrée correspond à un caractère " +"Unicode." #: doc/classes/OS.xml msgid "" @@ -53084,6 +53937,10 @@ msgid "" "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 "" +"Si [code]true[/code], le système de fichiers dans [code]user://[/code] est " +"persistant, que son état est le même après qu'un joueur quitte et relance le " +"jeu. Pertinent pour la plate-forme HTML5, où cette persistance peut être " +"indisponible." #: doc/classes/OS.xml msgid "" @@ -53099,12 +53956,17 @@ msgid "" "[b]Note:[/b] Only implemented on desktop platforms. On other platforms, it " "will always return [code]true[/code]." msgstr "" +"Retourne [code]true[/code] si la fenêtre a actuellement le focus.\n" +"[b]Note :[/b] Seulement implémenté sur les ordinateur de bureau. Sur " +"d'autres plateformes, il retournera toujours [code]true[/code]." #: doc/classes/OS.xml msgid "" "Returns active keyboard layout index.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Retourne l'index de la disposition du clavier actif.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -53120,6 +53982,9 @@ msgid "" "[code]index[/code].\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Retourne le code de langue ISO-639/BCP-47 de la disposition du clavier à la " +"position [code]index[/code].\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -53127,6 +53992,9 @@ msgid "" "code].\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Retourne le nom localisé de la disposition du clavier à la position " +"[code]index[/code].\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -53134,12 +54002,17 @@ msgid "" "keyboard layout.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Convertit un [code]scancode[/code] physique (US QWERTY) en un dans la " +"disposition du clavier actif.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" "Sets active keyboard layout.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Définit la disposition active du clavier.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -53151,6 +54024,13 @@ msgid "" "[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " "Windows." msgstr "" +"Tue (termine) le processus à partir de l'identifiant spécifié ([code]pid[/" +"code]), c'est-à -dire par celui retourné par [method execute] en mode non-" +"blocant. Voir aussi [method crash].\n" +"[b]Note :[/b] Cette méthode peut également être utilisée pour tuer des " +"processus qui n'ont pas été créés par le jeu.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Android, iOS, Linux, macOS " +"et Windows." #: doc/classes/OS.xml msgid "" @@ -53166,18 +54046,34 @@ msgid "" "OS.move_to_trash(ProjectSettings.globalize_path(file_to_remove))\n" "[/codeblock]" msgstr "" +"Déplace le fichier ou le dossier dans la corbeille du système. Voir aussi " +"[method Directory.remove].\n" +"La méthode ne prend que des chemins globaux, donc vous pouvez avoir besoin " +"d'utiliser [method ProjectSettings.globalize_path]. Ne l'utilisez pas pour " +"les fichiers dans [code]res://[/code] car ça ne fonctionnera pas dans le " +"projet exporté.\n" +"[b]Note :[/b] Si l'utilisateur a désactivé la corbeille sur son système, le " +"fichier sera définitivement supprimé.\n" +"[codeblock]\n" +"var file_to_remove = \"user://slot1.sav\"\n" +"OS.move_to_trash(ProjectSettings.globalize_path(file_to_remove))\n" +"[/codeblock]" #: doc/classes/OS.xml msgid "" "Moves the window to the front.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Déplace la fenêtre vers l'avant.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" "Returns [code]true[/code] if native video is playing.\n" "[b]Note:[/b] This method is only implemented on iOS." msgstr "" +"Retourne [code]true[/code] si la vidéo native joue.\n" +"[b]Note :[/b] Cette méthode n'est implémenté que sur iOS." #: doc/classes/OS.xml msgid "" @@ -53193,6 +54089,9 @@ msgid "" "audio and subtitle tracks.\n" "[b]Note:[/b] This method is only implemented on iOS." msgstr "" +"Joue la vidéo native depuis le chemin spécifié, au volume donné et avec des " +"pistes audio et sous-titres.\n" +"[b]Note :[/b] Cette méthode n'est implémenté que sur iOS." #: doc/classes/OS.xml msgid "" @@ -53215,12 +54114,17 @@ msgid "" "Initialises the singleton for the system MIDI driver.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Initialise le singleton pour le système de pilote MIDI.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml 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 "" +"Affiche toutes les ressources dans le jeu. En option, la liste peut être " +"écrite à un fichier en spécifiant un chemin de fichier dans [code]tofile[/" +"code]." #: doc/classes/OS.xml msgid "Shows the list of loaded textures sorted by size in memory." @@ -53241,12 +54145,19 @@ msgid "" "Windows or bounce the dock icon on OSX.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" +"Demandez l'attention de l'utilisateur sur cette fenêtre. Ça fait clignoter " +"le bouton de la barre de tâches sur Windows ou fait rebondir l'icône du dock " +"sur macOS.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" "At the moment this function is only used by [code]AudioDriverOpenSL[/code] " "to request permission for [code]RECORD_AUDIO[/code] on Android." msgstr "" +"Pour le moment cette fonction est uniquement utilisée par " +"[code]AudioDriverOpenSL[/code] pour demande la permission " +"[code]RECORD_AUDIO[/code] sur Android." #: doc/classes/OS.xml msgid "" @@ -53255,6 +54166,10 @@ msgid "" "applications.\n" "[b]Note:[/b] This method is implemented on Android." msgstr "" +"Avec cette fonction, vous pouvez demander des permissions dangereuses " +"puisque les autorisations normales sont automatiquement accordées à " +"l'installation dans les applications Android.\n" +"[b]Note :[/b] Cette méthode est implémentée sur Android." #: doc/classes/OS.xml msgid "" @@ -53274,6 +54189,12 @@ msgid "" "dialog. Image is scaled as needed.\n" "[b]Note:[/b] This method is implemented on HTML5, Linux, macOS and Windows." msgstr "" +"Définit l'icône du jeu en utilisant une ressource [Image].\n" +"La même image est utilisée pour l'icône de la fenêtre, la barre de tâches ou " +"du dock et le dialogue de sélection de la fenêtre. L'image est " +"redimensionnée au besoin.\n" +"[b]Note :[/b] Cette méthode est implémentée sur HTML5, Linux, macOS et " +"Windows." #: doc/classes/OS.xml msgid "" @@ -53291,6 +54212,9 @@ 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 "" +"Définit la position de la fenêtre surgissante avec la liste de suggestions " +"IME (dans les coordonnées de la fenêtre).\n" +"[b]Note :[/b] Cette méthode est implémentée sur Linux, macOS et Windows." #: doc/classes/OS.xml msgid "" @@ -53460,12 +54384,18 @@ 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 "" +"Si [code]true[/code], le moteur réduit la consommation du processeur en " +"rafraîchissant l'écran uniquement quand nécessaire. Peut améliorer la durée " +"de batterie sur mobile." #: doc/classes/OS.xml 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 "" +"La quantité d'inactivité entre les trames lorsque le mode de réduction du " +"processeur est activé (en microsecondes). Des valeurs plus élevées " +"limiteront l'utilisation du processeur." #: doc/classes/OS.xml msgid "" @@ -53473,6 +54403,9 @@ msgid "" "decorations). Does not affect fullscreen mode. Set to [code](0, 0)[/code] to " "reset to the system default value." msgstr "" +"La taille maximale de la fenêtre (sans compter les décorations du " +"gestionnaire de fenêtre). N'affecte pas le mode plein écran. Réglez à [code]" +"(0, 0)[/code] pour réinitialiser la valeur par défaut du système." #: doc/classes/OS.xml msgid "" @@ -53513,6 +54446,9 @@ msgid "" "[b]Note:[/b] Setting [code]window_borderless[/code] to [code]false[/code] " "disables per-pixel transparency." msgstr "" +"Si [code]true[/code], supprime le cadre autour de la fenêtre.\n" +"[b]Note :[/b] Le réglage [code]window_borderless[/code] à [code]false[/code] " +"désactivera la transparence par pixel." #: doc/classes/OS.xml msgid "If [code]true[/code], the window is fullscreen." @@ -53545,6 +54481,8 @@ 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 "" +"La position de la fenêtre par rapport à l'écran, l'origine étant le coin " +"supérieur gauche, l'axe +Y va vers le bas et l'axe +X va à droite." #: doc/classes/OS.xml msgid "If [code]true[/code], the window is resizable by the user." @@ -53560,12 +54498,16 @@ 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 "" +"Le backend de rendu GLES2. Cela utilise OpenGL ES 2.0 sur les appareils " +"mobiles, OpenGL 2.1 sur les plateformes de bureau et WebGL 1.0 sur le web." #: doc/classes/OS.xml msgid "" "The GLES3 rendering backend. It uses OpenGL ES 3.0 on mobile devices, OpenGL " "3.3 on desktop platforms and WebGL 2.0 on the web." msgstr "" +"Le backend de rendu GLES3. Cela utilise OpenGL ES 3.0 sur les appareils " +"mobiles, OpenGL 3.3 sur les plateformes de bureau et WebGL 2.0 sur le web." #: doc/classes/OS.xml msgid "Sunday." @@ -53651,6 +54593,11 @@ msgid "" "implemented)\n" "- Android: [code]JNIEnv*[/code] of the application (not yet implemented)" msgstr "" +"Les points de départ de l'application :\n" +"- Windows : [code]HINSTANCE[/code] de l'application\n" +"- MacOS : [code]NSApplication*[/code] de l'application (non encore " +"implémenté)\n" +"- Android : [code]JNIEnv*[/code] de l'application (pas encore implémenté)" #: doc/classes/OS.xml msgid "" @@ -53788,7 +54735,7 @@ msgstr "Version de référence de [PackedDataContainer]." #: doc/classes/PackedScene.xml msgid "An abstraction of a serialized scene." -msgstr "" +msgstr "Une abstraction d'une scène sérialisée." #: doc/classes/PackedScene.xml msgid "" @@ -53899,6 +54846,9 @@ msgid "" "instantiation(s). Triggers a [constant Node.NOTIFICATION_INSTANCED] " "notification on the root node." msgstr "" +"Instancie l'arborescence de la scène. Déclenche l'instanciation des enfants " +"de la scène. Déclenche une notification [constant Node." +"NOTIFICATION_INSTANCED] sur le nÅ“ud racine." #: doc/classes/PackedScene.xml msgid "" @@ -53918,6 +54868,8 @@ msgstr "" #: doc/classes/PackedScene.xml msgid "If passed to [method instance], blocks edits to the scene state." msgstr "" +"S'il est passé à [method instance], bloque les modifications de l'état de la " +"scène." #: doc/classes/PackedScene.xml msgid "" @@ -53925,6 +54877,9 @@ msgid "" "scene.\n" "[b]Note:[/b] Only available in editor builds." msgstr "" +"S'il est passé à [method instance], fournit des ressources de scène locale à " +"la scène locale.\n" +"[b]Note :[/b] Seulement disponible dans les éditeurs." #: doc/classes/PackedScene.xml msgid "" @@ -53932,6 +54887,10 @@ msgid "" "scene. Only the main scene should receive the main edit state.\n" "[b]Note:[/b] Only available in editor builds." msgstr "" +"S'il est passé à [method instance], fournit des ressources de scène locale à " +"la scène locale. Seule la scène principale devrait recevoir l'état principal " +"d'édition.\n" +"[b]Note :[/b] Seulement disponible dans les éditeurs." #: doc/classes/PackedScene.xml msgid "" @@ -53939,6 +54898,9 @@ msgid "" "scene is being instantiated to be the base of another one.\n" "[b]Note:[/b] Only available in editor builds." msgstr "" +"C'est similaire à [constant GEN_EDIT_STATE_MAIN], mais pour le cas où la " +"scène est instanciée pour être la base d'une autre.\n" +"[b]Note :[/b] Seulement disponible dans les éditeurs." #: modules/gltf/doc_classes/PackedSceneGLTF.xml msgid "" @@ -53947,6 +54909,10 @@ msgid "" "to [PackedSceneGLTF] within a script will cause an error in an exported " "project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que dans les éditeurs. Le " +"chargement et l'enregistrement de glTF n'est [i]pas[/i] disponible dans les " +"projets exportés. Les références à [PackedSceneGLTF] dans un script " +"causeront une erreur dans les projets exportés." #: doc/classes/PacketPeer.xml msgid "Abstraction and base class for packet-based protocols." @@ -54076,6 +55042,9 @@ msgid "" "Poll the connection to check for incoming packets. Call this frequently to " "update the status and keep the connection working." msgstr "" +"Sondez la connexion pour vérifier les paquets entrants. Appelez cela " +"fréquemment pour mettre à jour le statut et garder la connexion " +"fonctionnelle." #: doc/classes/PacketPeerDTLS.xml msgid "A status representing a [PacketPeerDTLS] that is disconnected." @@ -54086,6 +55055,8 @@ msgid "" "A status representing a [PacketPeerDTLS] that is currently performing the " "handshake with a remote peer." msgstr "" +"Un statut représentant un [PacketPeerDTLS] qui effectue actuellement la " +"poignée de main avec un pair distant." #: doc/classes/PacketPeerDTLS.xml msgid "" @@ -54104,6 +55075,8 @@ msgid "" "An error status that shows a mismatch in the DTLS certificate domain " "presented by the host and the domain requested for validation." msgstr "" +"Un statut d'erreur qui montre une erreur dans le domaine de certificat DTLS " +"présenté par l'hôte et le domaine demandé pour validation." #: doc/classes/PacketPeerStream.xml msgid "Wrapper to use a PacketPeer over a StreamPeer." @@ -54129,10 +55102,12 @@ msgstr "Homologue de paquet UDP." msgid "" "UDP packet peer. Can be used to send raw UDP packets as well as [Variant]s." msgstr "" +"Un pair de paquet UDP. Peut être utilisé pour envoyer des paquets UDP bruts " +"mais aussi des [Variant]." #: doc/classes/PacketPeerUDP.xml msgid "Closes the UDP socket the [PacketPeerUDP] is currently listening on." -msgstr "" +msgstr "Ferme la prise UDP [PacketPeerUDP] qui est actuellement à l'écoute." #: doc/classes/PacketPeerUDP.xml msgid "" @@ -54155,18 +55130,24 @@ 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 "" +"Retourne l'IP du pair distant qui a envoyé le dernier paquet (qui a été reçu " +"avec [method PacketPeer.get_packet] ou [method PacketPeer.get_var])." #: doc/classes/PacketPeerUDP.xml 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 "" +"Retourne le port du pair distant qui a envoyé le dernier paquet (qui a été " +"reçu avec [method PacketPeer.get_packet] ou [method PacketPeer.get_var])." #: doc/classes/PacketPeerUDP.xml 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 "" +"Retourne [code]true[/code] si le socket UDP est ouverte et a été connectée à " +"une adresse distante. Voir [method connect_to_host]." #: doc/classes/PacketPeerUDP.xml msgid "Returns whether this [PacketPeerUDP] is listening." @@ -54181,12 +55162,21 @@ msgid "" "[b]Note:[/b] Some Android devices might require the " "[code]CHANGE_WIFI_MULTICAST_STATE[/code] permission for multicast to work." msgstr "" +"Joins le groupe multicast spécifié par [code]multicast_address[/code] en " +"utilisant l'interface identifiée par [code]interface_name[/code].\n" +"Vous pouvez rejoindre le même groupe multicast avec plusieurs interfaces. " +"Utilisez [method IP.get_local_interfaces] pour savoir lesquelles sont " +"disponibles.\n" +"[b]Note :[/b] Certains appareils Android pourraient nécessiter la permission " +"[code]CHANGE_WIFI_MULTICAST_STATE[/code] pour faire fonctionner le multicast." #: doc/classes/PacketPeerUDP.xml msgid "" "Removes the interface identified by [code]interface_name[/code] from the " "multicast group specified by [code]multicast_address[/code]." msgstr "" +"Supprime l'interface identifiée par [code]interface_name[/code] du groupe " +"multicast spécifié par [code]multicast_address[/code]." #: doc/classes/PacketPeerUDP.xml msgid "" @@ -54202,6 +55192,18 @@ msgid "" "only listen on the interface with that addresses (or fail if no interface " "with the given address exists)." msgstr "" +"Fait que ce [PacketPeerUDP] écoute le [code]port[/code] connecté à " +"[code]bind_address[/code] avec une taille de mémoire tampon de " +"[code]recv_buf_size[/code].\n" +"Si [code]bind_address[/code] est défini à [code]\"*\"[/code] (par défaut), " +"le pair écoutera toutes les adresses disponibles (IPv4 et IPv6.)\n" +"Si [code]bind_address[/code] est défini à [code]\"0.0.0.0\"[/code] (pour " +"IPv4) ou [code]\"::\"[/code] (pour IPv6), le pair écoutera toutes les " +"adresses disponibles correspondant à ce type d'IP.\n" +"Si [code]bind_address[/code] est défini à toute adresse valide (par exemple " +"[code]\"192.168.1.101\"[/code], [code]\"::1\"[/code], etc), le pair " +"n'écoutera que l'interface avec ces adresses (ou échouera si aucune " +"interface avec l'adresse donnée n'existe)." #: doc/classes/PacketPeerUDP.xml msgid "" @@ -54212,6 +55214,12 @@ msgid "" "[code]CHANGE_WIFI_MULTICAST_STATE[/code] permission and this option to be " "enabled to receive broadcast packets too." msgstr "" +"Active ou désactive l'envoi de paquets de diffusion (par exemple " +"[code]set_dest_address(\"255.255.255.255\", 4343)[/code]. Cette option est " +"désactivée par défaut.\n" +"[b]Note :[/b] Certains appareils Android peuvent nécessiter la permission " +"[code]CHANGE_WIFI_MULTICAST_STATE[/code] et cette option pour être activée " +"pour recevoir aussi des paquets de diffusion." #: doc/classes/PacketPeerUDP.xml msgid "" @@ -54220,6 +55228,11 @@ msgid "" "[b]Note:[/b] [method set_broadcast_enabled] must be enabled before sending " "packets to a broadcast address (e.g. [code]255.255.255.255[/code])." msgstr "" +"Définit l'adresse de destination et le port pour envoyer des paquets et des " +"variables. Un nom d'hôte sera résolu en utilisant le DNS si nécessaire.\n" +"[b]Note :[/b] [method set_broadcast_enabled] doit être activé avant " +"d'envoyer des paquets à une adresse de diffusion (par exemple " +"[code]255.255.255[/code])." #: doc/classes/PacketPeerUDP.xml msgid "" @@ -54264,6 +55277,8 @@ 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 "" +"Le panneau est un [Control] qui affiche un fond opaque. Il est couramment " +"utilisé comme parent et conteneur pour d'autres types de nÅ“uds [Control]." #: doc/classes/Panel.xml msgid "2D Finite State Machine Demo" @@ -54286,6 +55301,9 @@ 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 "" +"Le type de conteneur. Ce conteneur s'adapte aux contrôles à l'intérieur de " +"la zone délimitée d'une boîte de style. C'est utile pour donner un contour " +"aux contrôles." #: doc/classes/PanelContainer.xml msgid "The style of [PanelContainer]'s background." @@ -56030,7 +57048,6 @@ msgid "Returns the value of a damped spring joint parameter." msgstr "" #: doc/classes/Physics2DServer.xml -#, fuzzy msgid "" "Sets a damped spring joint parameter. See [enum DampedStringParam] for a " "list of available parameters." @@ -56402,12 +57419,10 @@ msgid "Constant to set/get whether the body can sleep." msgstr "La constante pour définir/obtenir si le corps peut être au repos." #: doc/classes/Physics2DServer.xml -#, fuzzy msgid "Constant to create pin joints." msgstr "Constante pour créer des joints d’épingle." #: doc/classes/Physics2DServer.xml -#, fuzzy msgid "Constant to create groove joints." msgstr "Constante pour créer des joints de rainure." @@ -57373,7 +58388,6 @@ msgid "If [code]true[/code], the query will take [PhysicsBody]s into account." msgstr "Si [code]true[/code], le requête prendra les [PhysicsBody] en compte." #: doc/classes/PinJoint.xml -#, fuzzy msgid "Pin joint for 3D PhysicsBodies." msgstr "Joint d’épingle pour les formes 3D." @@ -57402,7 +58416,6 @@ msgid "" msgstr "" #: doc/classes/PinJoint2D.xml -#, fuzzy msgid "Pin Joint for 2D shapes." msgstr "Joint d’épingle pour les formes 2D." @@ -58810,8 +59823,13 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +#, fuzzy +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" +"Retourne la position de l’élément qui a actuellement le focus. Ou retourne " +"[code]-1[/code] si aucun n'a le focus." #: doc/classes/PopupMenu.xml msgid "Hides the [PopupMenu] when the window loses focus." @@ -59067,7 +60085,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -59605,8 +60625,8 @@ msgid "" "Returns the specified property's initial value. Returns [code]null[/code] if " "the property does not exist." msgstr "" -"Retourne la valeur initiale de la propriété spécifiée. Retourne " -"[code]null[/code] si la propriété n'existe pas." +"Retourne la valeur initiale de la propriété spécifiée. Retourne [code]null[/" +"code] si la propriété n'existe pas." #: doc/classes/ProjectSettings.xml msgid "" @@ -59731,9 +60751,9 @@ msgid "" "nearest-neighbor interpolation (recommended for pixel art)." msgstr "" "Si [code]true[/code], applique le filtrage linéaire pour l'étirement de " -"l'image (recommandé pour les images à haute résolution.) Si " -"[code]false[/code], utilise l'interpolation la plus proche (recommandée pour " -"le pixel-art)." +"l'image (recommandé pour les images à haute résolution.) Si [code]false[/" +"code], utilise l'interpolation la plus proche (recommandée pour le pixel-" +"art)." #: doc/classes/ProjectSettings.xml msgid "" @@ -59748,9 +60768,9 @@ msgid "" "for this to take effect." msgstr "" "Ce dossier utilisateur est utilisé pour stocker des données persistantes (le " -"système de fichiers [code]user://[/code]). Si laissé vide, " -"[code]user://[/code] va pointer vers un dossier spécifique au projet suivant " -"la configuration de Godot (voir [method OS.get_user_data_dir]). Si un nom de " +"système de fichiers [code]user://[/code]). Si laissé vide, [code]user://[/" +"code] va pointer vers un dossier spécifique au projet suivant la " +"configuration de Godot (voir [method OS.get_user_data_dir]). Si un nom de " "dossier personnalisé est défini, ce nom sera utilisé à la place, puis ajouté " "au dossier de données utilisateur spécifique au système (le même dossier " "parent que celui configuration Godot documenté dans [method OS." @@ -59830,9 +60850,9 @@ msgid "" "default can impact compatibility with some external tools or plugins which " "expect the default [code].import[/code] folder." msgstr "" -"Si [code]true[/code], le projet utilisera un dossier caché ([code]." -"import[/code]) pour stocker des données spécifiques au projet (métadonnées, " -"cache des shaders, etc.)\n" +"Si [code]true[/code], le projet utilisera un dossier caché ([code].import[/" +"code]) pour stocker des données spécifiques au projet (métadonnées, cache " +"des shaders, etc.)\n" "Si [code]false[/code], un dossier non caché ([code]import[/code]) sera " "utilisé à la place.\n" "[b]Note :[/b] Vous devez redémarrer l'application après avoir modifié ce " @@ -59961,7 +60981,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -61807,9 +62831,9 @@ msgid "" "Desktop override for [member logging/file_logging/enable_file_logging], as " "log files are not readily accessible on mobile/Web platforms." msgstr "" -"Le surcharge du bureau pour [member logging/file_logging/enable_file_logging]" -", car les fichiers de journaux ne sont pas facilement accessibles sur les " -"plateformes mobiles et web." +"Le surcharge du bureau pour [member logging/file_logging/" +"enable_file_logging], car les fichiers de journaux ne sont pas facilement " +"accessibles sur les plateformes mobiles et web." #: doc/classes/ProjectSettings.xml msgid "" @@ -61857,42 +62881,57 @@ msgid "" "map_set_cell_height].\n" "[b]Note:[/b] Currently not implemented." msgstr "" +"La hauteur de la cellule par défaut pour les cartes de navigation 2D. Voir " +"[method Navigation2DServer.map_set_cell_height]\n" +"[b]Note :[/b] N'est pas actuellement implémenté." #: doc/classes/ProjectSettings.xml msgid "" "Default cell size for 2D navigation maps. See [method Navigation2DServer." "map_set_cell_size]." msgstr "" +"La taille par défaut pour les cartes de navigation 2D. Voir [method " +"Navigation2DServer.map_set_cell_size]." #: doc/classes/ProjectSettings.xml msgid "" "Default edge connection margin for 2D navigation maps. See [method " "Navigation2DServer.map_set_edge_connection_margin]." msgstr "" +"La marge par défaut de connexion des bordures pour les cartes de navigation " +"2D. Voir [method Navigation2DServer.map_set_edge_connection_margin]." #: doc/classes/ProjectSettings.xml msgid "" "Default cell height for 3D navigation maps. See [method NavigationServer." "map_set_cell_height]." msgstr "" +"La hauteur par défaut pour les cartes de navigation 3D. Voir [method " +"NavigationServer.map_set_cell_height]." #: doc/classes/ProjectSettings.xml msgid "" "Default cell size for 3D navigation maps. See [method NavigationServer." "map_set_cell_size]." msgstr "" +"La taille par défaut pour les cartes de navigation 3D. Voir [method " +"NavigationServer.map_set_cell_size]." #: doc/classes/ProjectSettings.xml msgid "" "Default edge connection margin for 3D navigation maps. See [method " "NavigationServer.map_set_edge_connection_margin]." msgstr "" +"La marge par défaut de connexion des bodures pour les cartes de navigation " +"3D. Voir [method NavigationServer.map_set_edge_connection_margin]." #: doc/classes/ProjectSettings.xml msgid "" "Default map up vector for 3D navigation maps. See [method NavigationServer." "map_set_up]." msgstr "" +"La carte par défaut du vecteur vers haut pour cartes de navigation 3D. Voir " +"[method NavigationServer.map_set_up]." #: doc/classes/ProjectSettings.xml msgid "" @@ -61900,6 +62939,9 @@ msgid "" "Over this value, content is dropped. This helps not to stall the debugger " "connection." msgstr "" +"La quantité maximale de caractères autorisés à envoyer sur la sortie du " +"débogueur. Une fois cette valeur dépassée, le nouveau contenu est ignoré. " +"Cela aide à ne pas bloquer la connexion du déboguer." #: doc/classes/ProjectSettings.xml msgid "" @@ -61907,6 +62949,9 @@ msgid "" "Over this value, content is dropped. This helps not to stall the debugger " "connection." msgstr "" +"Le nombre maximum d'erreurs autorisées à être envoyées à la sortie du " +"débogueur. Une fois cette valeur dépassée, le nouveau contenu est ignoré. " +"Cela aide à ne pas bloquer la connexion du déboguer." #: doc/classes/ProjectSettings.xml msgid "" @@ -61914,6 +62959,9 @@ msgid "" "this value, content is dropped. This helps not to stall the debugger " "connection." msgstr "" +"La quantité maximale de messages autorisés à être envoyés à la sortie du " +"débogueur. Une fois cette valeur dépassée, le nouveau contenu est ignoré. " +"Cela aide à ne pas bloquer la connexion du déboguer." #: doc/classes/ProjectSettings.xml msgid "" @@ -61921,6 +62969,9 @@ msgid "" "Over this value, content is dropped. This helps not to stall the debugger " "connection." msgstr "" +"Le nombre maximal d'avertissements autorisés à être envoyés à la sortie du " +"débogueur. Une fois cette valeur dépassée, le nouveau contenu est ignoré. " +"Cela aide à ne pas bloquer la connexion du déboguer." #: doc/classes/ProjectSettings.xml msgid "" @@ -61928,6 +62979,10 @@ msgid "" "specified as a power of two). The default value [code]16[/code] is equal to " "65,536 bytes. Over this size, data is dropped." msgstr "" +"La taille par défaut du flux par paire de paquets pour décoder les données " +"Godot (en octets, spécifié par une puissance de deux). La valeur par défaut " +"[code]16[/code] est égale à 65 536 octets. Une fois cette valeur dépassée, " +"le nouveau contenu est ignoré." #: doc/classes/ProjectSettings.xml msgid "Timeout (in seconds) for connection attempts using TCP." @@ -61937,6 +62992,8 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "Maximum size (in kiB) for the [WebRTCDataChannel] input buffer." msgstr "" +"La taille maximale (en kiB) de la mémoire du tampon d'entrée du " +"[WebRTCDataChannel]." #: doc/classes/ProjectSettings.xml msgid "Maximum size (in kiB) for the [WebSocketClient] input buffer." @@ -61985,6 +63042,9 @@ msgid "" "Amount of read ahead used by remote filesystem. Higher values decrease the " "effects of latency at the cost of higher bandwidth usage." msgstr "" +"La quantité de lecture en avance utilisée par le système de fichiers " +"distants. Des valeurs plus élevées diminuent les effets de latence mais " +"augmentent la bande passante." #: doc/classes/ProjectSettings.xml msgid "Page size used by remote filesystem (in bytes)." @@ -61999,18 +63059,28 @@ msgid "" "bundle will be used.\n" "If in doubt, leave this setting empty." msgstr "" +"Le pack de certificats CA à utiliser pour les connexions SSL. Si cela est " +"défini à une valeur non vide, cela [i]écrasera[/i] les certificats par " +"défaut de Godot venant du [url=https://github.com/godotengine/godot/blob/" +"master/third/certs/ca-certificates.crt]Pack de certificats de Mozilla[/ur]. " +"Si laissé vide, ce paquet de certificat par défaut sera utilisé.\n" +"En cas de doute, laissez ce réglage vide." #: doc/classes/ProjectSettings.xml msgid "" "When creating node names automatically, set the type of casing in this " "project. This is mostly an editor setting." msgstr "" +"Lorsque vous créez des noms de nÅ“uds automatiquement, définissez le type de " +"casse dans ce projet. C'est surtout un réglage de l'éditeur." #: doc/classes/ProjectSettings.xml msgid "" "What to use to separate node name from number. This is mostly an editor " "setting." msgstr "" +"Que faire pour séparer le nom de nÅ“ud du numéro. C'est surtout un réglage de " +"l'éditeur." #: doc/classes/ProjectSettings.xml msgid "" @@ -62066,6 +63136,14 @@ msgid "" "Physics2DServer.AREA_PARAM_GRAVITY, 98)\n" "[/codeblock]" msgstr "" +"La force de gravité par défaut en 2D (en pixels par seconde au carré).\n" +"[b]Note :[/b] Cette propriété est seulement lue au lancement du projet. Pour " +"modifier la gravité par défaut à l'exécution, utilisez le code suivant :\n" +"[codeblock]\n" +"# Réglez la force de gravité par défaut à 98.\n" +"Physics2DServer.area_set_param(get_viewport().find_world_2d().get_space(), " +"Physics2DServer.AREA_PARAM_GRAVITY, 98)\n" +"/[codeblock]" #: doc/classes/ProjectSettings.xml msgid "" @@ -62078,6 +63156,14 @@ msgid "" "Physics2DServer.AREA_PARAM_GRAVITY_VECTOR, Vector2(0, 1))\n" "[/codeblock]" msgstr "" +"La direction de la gravité par défaut en 2D.\n" +"[b]Note :[/b] Cette propriété est seulement lue au lancement du projet. Pour " +"modifier la gravité par défaut à l'exécution, utilisez le code suivant :\n" +"[codeblock]\n" +"# Définir la direction de gravité par défaut à `Vector2(0, 1)`.\n" +"Physics2DServer.area_set_param(get_viewport().find_world_2d().get_space(), " +"Physics2DServer.AREA_PARAM_GRAVITY_VECTOR, Vector2(0, 1))\n" +"/[codeblock]" #: doc/classes/ProjectSettings.xml msgid "" @@ -62139,18 +63225,25 @@ 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]." msgstr "" +"Le temps (en secondes) d'inactivité avant lequel un corps de physique 2D " +"s'endormira. Voir [Constant Physics2DServer.SPACE_PARAM_BODY_TIME_TO_SLEEP]." #: doc/classes/ProjectSettings.xml msgid "" "Enables the use of bounding volume hierarchy instead of hash grid for 2D " "physics spatial partitioning. This may give better performance." msgstr "" +"Permet l'utilisation de la hiérarchie de volume englobant au lieu de la " +"grille de hachage pour le partitionnement spatial physique 2D. Cela peut " +"donner des meilleures performances." #: doc/classes/ProjectSettings.xml msgid "" "Sets whether the 3D physics world will be created with support for " "[SoftBody] physics. Only applies to the Bullet physics engine." msgstr "" +"Définit si le monde de physique 3D sera créé avec le support de la physique " +"[SoftBody]. Seulement s'applique au moteur de physique Bullet." #: doc/classes/ProjectSettings.xml msgid "" @@ -62393,6 +63486,8 @@ msgid "" "When batching is on, this regularly prints a frame diagnosis log. Note that " "this will degrade performance." msgstr "" +"Lors de l'affichage en lots, cela affichera régulièrement un diagnostic des " +"trames. À noter que cela dégrade les performances." #: doc/classes/ProjectSettings.xml msgid "" @@ -62440,10 +63535,12 @@ msgid "" "Turns 2D batching on and off. Batching increases performance by reducing the " "amount of graphics API drawcalls." msgstr "" +"Active ou désactive l'affichage 2D par lots. son activation augmente la " +"performance en réduisant la quantité d'appels de dessins sur API." #: doc/classes/ProjectSettings.xml msgid "Switches on 2D batching within the editor." -msgstr "" +msgstr "Active l'affichage 2D par lots dans l'éditeur." #: doc/classes/ProjectSettings.xml msgid "" @@ -62451,6 +63548,10 @@ msgid "" "batches, but there are diminishing returns for the memory used. This should " "only have a minor effect on performance." msgstr "" +"La taille de la mémoire tampon réservé aux sommets par lots. Une plus grande " +"taille permet des lots plus importants, mais le rapport avec la mémoire " +"utilisée est plus faible. Cela ne devrait avoir qu'une petite influence sur " +"les performances." #: doc/classes/ProjectSettings.xml msgid "" @@ -62460,6 +63561,12 @@ msgid "" "code] above which vertices will be translated to colored format. A value of " "0 will always use colored vertices, 1 will never use colored vertices." msgstr "" +"Inclure la couleur dans le format des sommets a un coût, cependant, ne pas " +"l'inclure empêche le gestion par lots à travers les changements de couleur. " +"Ce seuil détermine le rapport de [code]nombre de changements de couleur / " +"nombre total de sommets[/code] à partir duquel les sommets auront un format " +"avec la couleur. Une valeur de 0 utilisera toujours des sommets colorés, et " +"1 n'en utilisera jamais." #: doc/classes/ProjectSettings.xml msgid "" @@ -62713,6 +63820,11 @@ msgid "" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" +"Une surcharge pour [member rendering/gles3/shaders/shader_compilation_mode], " +"de sorte que la compilation asynchrone peut être désactivée sur les plates-" +"formes mobiles.\n" +"Vous voudrez peut-être le faire puisque les GPU des mobiles ne supportent en " +"général pas les ubershaders en raison de leur complexité." #: doc/classes/ProjectSettings.xml msgid "" @@ -62721,6 +63833,12 @@ msgid "" "You may want to do that since certain browsers (especially on mobile " "platforms) generally won't support ubershaders due to their complexity." msgstr "" +"Une surcharge pour [member rendering/gles3/shaders/shader_compilation_mode], " +"de sorte que la compilation asynchrone peut être désactivée sur les " +"plateformes web.\n" +"Vous pouvez vouloir le faire puisque certains navigateurs (surtout sur les " +"plates-formes mobiles) ne supportent en général pas les ubershaders en " +"raison de leur complexité." #: doc/classes/ProjectSettings.xml msgid "" @@ -62751,8 +63869,8 @@ msgid "" "Max buffer size for drawing immediate objects (ImmediateGeometry nodes). " "Nodes using more than this size will not work." msgstr "" -"La capacity maximale de la mémoire tampon pour le dessin d'objets immédiats (" -"les nÅ“uds ImmediateGeometry). Les nÅ“uds utilisant plus que cette taille ne " +"La capacity maximale de la mémoire tampon pour le dessin d'objets immédiats " +"(les nÅ“uds ImmediateGeometry). Les nÅ“uds utilisant plus que cette taille ne " "fonctionneront pas." #: doc/classes/ProjectSettings.xml @@ -63009,8 +64127,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -63092,6 +64221,9 @@ msgid "" "Lower-end override for [member rendering/quality/lightmapping/" "use_bicubic_sampling] on mobile devices, in order to reduce bandwidth usage." msgstr "" +"Une surcharge pour les appareils d'entrée de gamme, comme les appareils " +"mobiles, pour [member rendering/quality/lightmapping/use_bicubic_sampling], " +"afin de réduire l'utilisation de bande passante." #: doc/classes/ProjectSettings.xml msgid "" @@ -63099,12 +64231,18 @@ msgid "" "higher visual quality, while a smaller size will be faster and take up less " "memory." msgstr "" +"La taille des atlas utilisés par les sondes de réflexion. Une taille plus " +"grande peut entraîner une qualité visuelle plus élevée, tandis qu'une taille " +"plus petite sera plus rapide et prendre moins de mémoire." #: doc/classes/ProjectSettings.xml msgid "" "Number of subdivisions to use for the reflection atlas. A higher number " "lowers the quality of each atlas, but allows you to use more." msgstr "" +"Le nombre de sous-divisions à utiliser pour l'atlas de réflexion. Un nombre " +"plus élevé réduit la qualité de chaque atlas, mais vous permet d'en utiliser " +"plus." #: doc/classes/ProjectSettings.xml msgid "" @@ -63112,6 +64250,10 @@ msgid "" "variants of reflection probes and panorama backgrounds (sky). Those blurred " "variants are used by rough materials." msgstr "" +"Si [code]true[/code], utilise une grande quantité d'échantillons pour créer " +"des variantes floues de sondes de réflexion et d'arrière-plans panoramiques " +"(les ciels). Ces variantes floues sont utilisées par des matériaux avec " +"rugosité." #: doc/classes/ProjectSettings.xml msgid "" @@ -63119,6 +64261,9 @@ msgid "" "high_quality_ggx] on mobile devices, due to performance concerns or driver " "support." msgstr "" +"Une surcharge pour les appareils d'entrée de gamme, comme les appareils " +"mobiles, pour [member rendering/quality/reflections/high_quality_ggx], à " +"cause des potentiels soucis liés aux performances ou aux pilotes." #: doc/classes/ProjectSettings.xml msgid "" @@ -63137,6 +64282,10 @@ msgid "" "probes and panorama backgrounds (sky). This reduces jitter noise on " "reflections, but costs more performance and memory." msgstr "" +"Si [code]true[/code], utilise des tableaux de texture au lieu de mipmaps " +"pour les sondes de réflexion et les arrière-plans en panorama (ciel). Cela " +"réduit les effets de bruit \"jitter\" sur les réflexions, mais à réduit les " +"performances et augmente la mémoire utilisée." #: doc/classes/ProjectSettings.xml msgid "" @@ -63144,12 +64293,18 @@ msgid "" "texture_array_reflections] on mobile devices, due to performance concerns or " "driver support." msgstr "" +"Une surcharge pour les appareils d'entrée de gamme, comme les appareils " +"mobiles, pour [member rendering/quality/reflections/" +"texture_array_reflections], à cause des potentiels soucis liés aux " +"performances ou aux pilotes." #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses faster but lower-quality Blinn model to generate " "blurred reflections instead of the GGX model." msgstr "" +"Si [code]true[/code], utilise le modèle Blinn plus rapide mais de moins " +"bonne qualité pour générer des réflexions floues au lieu du modèle GGX." #: doc/classes/ProjectSettings.xml msgid "" @@ -63157,12 +64312,17 @@ msgid "" "force_blinn_over_ggx] on mobile devices, due to performance concerns or " "driver support." msgstr "" +"Une surcharge pour les appareils d'entrée de gamme, comme les appareils " +"mobiles, pour [member rendering/quality/shading/force_blinn_over_ggx], à " +"cause des potentiels soucis liés aux performances ou aux pilotes." #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses faster but lower-quality Lambert material " "lighting model instead of Burley." msgstr "" +"Si [code]true[/code], utilise le modèle d'éclairage de matériaux Lambert " +"plus rapide mais de qualité inférieure au modèle Burley." #: doc/classes/ProjectSettings.xml msgid "" @@ -63170,6 +64330,9 @@ msgid "" "force_lambert_over_burley] on mobile devices, due to performance concerns or " "driver support." msgstr "" +"Une surcharge pour les appareils d'entrée de gamme, comme les appareils " +"mobiles, pour [member rendering/quality/shading/force_lambert_over_burley], " +"à cause des potentiels soucis liés aux performances ou aux pilotes." #: doc/classes/ProjectSettings.xml msgid "" @@ -63337,6 +64500,11 @@ msgid "" "Try enabling this option if you see any visual anomalies in 3D (such as " "incorrect object visibility)." msgstr "" +"Si [code]true[/code], une version sûre du BVH (\"Bounding Volume " +"Hierarchy\") entre fils d'exécution sera utilisée dans le rendu et la " +"physique de Godot.\n" +"Essayez d'activer cette option si vous voyez des anomalies visuelles en 3D " +"(comme un visibilité incorrecte pour un objet)." #: doc/classes/ProjectSettings.xml msgid "" @@ -63463,9 +64631,9 @@ msgstr "" "exemple :\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" -"tween.tween_property(self, \"position\", Vector2(200, 100), 1).from(Vector2(" -"100, 100) # Ça déplacera le nÅ“ud de la position (100, 100) jusqu'à (200, 100)" -"\n" +"tween.tween_property(self, \"position\", Vector2(200, 100), 1)." +"from(Vector2(100, 100) # Ça déplacera le nÅ“ud de la position (100, 100) " +"jusqu'à (200, 100)\n" "/[codeblock]" #: doc/classes/PropertyTweener.xml @@ -63486,10 +64654,10 @@ msgstr "" "départ. Ceci est pareil que [method from] avec la valeur actuelle. Ces deux " "appels sont identiques :\n" "[codeblock]\n" -"tween.tween_property(self, \"position\", Vector2(200, 100), 1).from(position)" -"\n" -"tween.tween_property(self, \"position\", Vector2(200, 100), 1).from_current()" -"\n" +"tween.tween_property(self, \"position\", Vector2(200, 100), 1)." +"from(position)\n" +"tween.tween_property(self, \"position\", Vector2(200, 100), 1)." +"from_current()\n" "/[codeblock]" #: doc/classes/PropertyTweener.xml @@ -63621,6 +64789,13 @@ msgid "" "[b]Note:[/b] This signal is [i]not[/i] emitted by default, as the default " "[member dispatch_mode] is [constant MODE_PROXY]." msgstr "" +"Émis lorsque l'utilisateur appelle la méthode [method broadcast] et a défini " +"[member dispatch_mode] à [constant MODE_SIGNAL].\n" +"La méthode donnée et ses paramètres sont transmis aux objets qui sont " +"connectés au signal de cet objet, ainsi qu'à tout nÅ“ud [ProximityGroup] où " +"ce nÅ“ud est groupé avec.\n" +"[b]Note :[/b] Ce signal n'est [i]pas[/i] émis par défaut, car le [member " +"dispatch_mode] par défaut est [constant MODE_PROXY]." #: doc/classes/ProximityGroup.xml msgid "This [ProximityGroup]'s parent will be target of [method broadcast]." @@ -63685,6 +64860,10 @@ msgid "" "angles (in the YXZ convention: when decomposing, first Z, then X, and Y " "last), given in the vector format as (X angle, Y angle, Z angle)." msgstr "" +"Construit un quaternion qui effectuera une rotation spécifiée par les angles " +"d'Euler (suivant la convention YXZ : lors de la décomposition, d'abord Z, " +"puis X, et enfin Y), donnée dans le format vectoriel comme (angle X, angle " +"Y, angle Z)." #: doc/classes/Quat.xml msgid "" @@ -63778,8 +64957,8 @@ msgid "" "convention: when decomposing, first Z, then X, and Y last), given in the " "vector format as (X angle, Y angle, Z angle)." msgstr "" -"Définit le quaternion avec une rotation spécifiée par les angles d'Euler (" -"selon la convention YXZ : lors de la décomposition, d'abord Z, puis X, et " +"Définit le quaternion avec une rotation spécifiée par les angles d'Euler " +"(selon la convention YXZ : lors de la décomposition, d'abord Z, puis X, et " "enfin Y), donnée dans le format vectoriel comme (angle X, angle Y, angle Z)." #: doc/classes/Quat.xml @@ -63789,8 +64968,8 @@ msgid "" "[b]Note:[/b] Both quaternions must be normalized." msgstr "" "Retourne le résultat de l'interpolation linéaire sphérique entre ce " -"quaternion et [code]to[/code] par la quantité [code]weight[/code] spécifiée." -"\n" +"quaternion et [code]to[/code] par la quantité [code]weight[/code] " +"spécifiée.\n" "[b]Note :[/b] Les deux quaternions doivent être normalisés." #: doc/classes/Quat.xml @@ -64023,11 +65202,11 @@ msgid "" "configured [member step] and [member page] size. See e.g. [ScrollBar] and " "[Slider] for examples of higher level nodes using Range." msgstr "" -"Range est une classe de base des nÅ“uds [Control] qui change une " -"[code]value[/code] flottante entre le [code]minimum[/code] et le " -"[code]maximum[/code], par étape [code]step[/code] et par [code]page[/code], " -"par exemple un [ScrollBar]. Voir [ScrollBar] et [Slider] pour des exemples " -"de nÅ“uds de haut niveau utilisant des Range." +"Range est une classe de base des nÅ“uds [Control] qui change une [code]value[/" +"code] flottante entre le [code]minimum[/code] et le [code]maximum[/code], " +"par étape [code]step[/code] et par [code]page[/code], par exemple un " +"[ScrollBar]. Voir [ScrollBar] et [Slider] pour des exemples de nÅ“uds de haut " +"niveau utilisant des Range." #: doc/classes/Range.xml msgid "" @@ -64108,6 +65287,10 @@ msgid "" "[code]value[/code] will first be rounded to a multiple of [code]step[/code] " "then rounded to the nearest integer." msgstr "" +"Si supérieure à 0, [code]value[/code] sera toujours arrondie à un multiple " +"de [code]step[/code]. Si [code]rounded[/code] est également [code]true[/" +"code], [code]value[/code] sera d'abord arrondie à un multiple de [code]step[/" +"code] puis arrondie à l'entier le plus proche." #: doc/classes/Range.xml msgid "Range's current value." @@ -64131,6 +65314,14 @@ msgid "" "value_changed] is also emitted when [code]value[/code] is set directly via " "code." msgstr "" +"Émis quand [member value] change. Lorsqu'il est utilisé pour un [Slider], " +"cela s'appelle en continu lors du glissage (voire à chaque trame). Si vous " +"effectuez une opération coûteuse dans une fonction connectée à [signal " +"value_changed], essayez d'utiliser un [Timer] pour appeler la fonction moins " +"souvent.\n" +"[b]Note :[/b] Contrairement aux signaux tels que [signal LineEdit." +"text_changed], [signal value_changed] est également émis lorsque " +"[code]value[/code] est défini directement par code." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "Query the closest object intersecting a ray." @@ -64159,12 +65350,16 @@ msgid "" "Adds a collision exception so the ray does not report collisions with the " "specified node." msgstr "" +"Ajoute une exception de collision afin que le rayon ne signale pas les " +"collisions avec le nÅ“ud spécifié." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" "Adds a collision exception so the ray does not report collisions with the " "specified [RID]." msgstr "" +"Ajoute une exception de collision de sorte que le rayon ne signale pas les " +"collisions avec le [RID] spécifié." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "Removes all collision exceptions for this ray." @@ -64178,6 +65373,12 @@ msgid "" "changed state.\n" "[b]Note:[/b] [code]enabled[/code] is not required for this to work." msgstr "" +"Met à jour les informations de collision pour le rayon. Utilisez cette " +"méthode pour mettre à jour les informations de collision immédiatement au " +"lieu d'attendre le prochain appel à [code]_physics_process[/code], par " +"exemple si le rayon ou son parent a changé d'état.\n" +"[b]Note :[/b] [code]enabled[/code] n'est pas nécessaire pour que cela " +"fonctionne." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" @@ -64185,6 +65386,9 @@ msgid "" "object is intersecting the ray (i.e. [method is_colliding] returns " "[code]false[/code])." msgstr "" +"Retourne le premier objet que le rayon intersecte, ou [code]null[/code] si " +"aucun objet n'intersecte le rayon (c'est-à -dire [method is_colliding] " +"retourne [code]false[/code])." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" @@ -64214,10 +65418,10 @@ 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 "" -"Retourne le point de collision où le rayon intersecte l'objet le plus proche." -"\n" -"[b]Note :[/b] Ce point se trouve dans le système de coordonnées " -"[b]global[/b]." +"Retourne le point de collision où le rayon intersecte l'objet le plus " +"proche.\n" +"[b]Note :[/b] Ce point se trouve dans le système de coordonnées [b]global[/" +"b]." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" @@ -64422,8 +65626,8 @@ msgid "" "are positive." msgstr "" "Retourne un [Rect2] avec la même position et aire, modifié de sorte que le " -"coin supérieur gauche est l'origine et [code]width[/code] et " -"[code]height[/code] soient positifs." +"coin supérieur gauche est l'origine et [code]width[/code] et [code]height[/" +"code] soient positifs." #: doc/classes/Rect2.xml msgid "Returns the intersection of this [Rect2] and b." @@ -64450,8 +65654,8 @@ msgstr "" "[codeblock]\n" "# position (-3, 2), size (1, 1)\n" "var rect = Rect2(Vector2(-3, 2), Vector2(1, 1))\n" -"# position (-3, -1), size (3, 4), contient donc à la fois `rect` et Vector2(" -"0, -1)\n" +"# position (-3, -1), size (3, 4), contient donc à la fois `rect` et " +"Vector2(0, -1)\n" "var rect2 = rect.expand(Vector2(0, -1))\n" "/[codeblock]" @@ -64498,8 +65702,8 @@ msgid "" "[b]Note:[/b] If the [Rect2] has a negative size and is not flat or empty, " "[method has_no_area] will return [code]true[/code]." msgstr "" -"Retourne [code]true[/code] si le [Rect2] est plat ou vide, ou " -"[code]false[/code] sinon. Voir aussi [method get_area].\n" +"Retourne [code]true[/code] si le [Rect2] est plat ou vide, ou [code]false[/" +"code] sinon. Voir aussi [method get_area].\n" "[b]Note :[/b] Si le [Rect2] a une taille négative et n'est pas plat ou vide, " "[method has_no_area] retournera [code]true[/code]." @@ -66292,8 +67496,8 @@ msgid "" "See [member ProjectSettings.physics/3d/default_angular_damp] for more " "details about damping." msgstr "" -"Amortit les forces de rotation du corps. Si cette valeur est différente de -" -"1.0, elle sera ajoutée aux amortissements obtenues du monde et des aires.\n" +"Amortit les forces de rotation du corps. Si cette valeur est différente de " +"-1.0, elle sera ajoutée aux amortissements obtenues du monde et des aires.\n" "Voir [membre ProjectSettings.physics/3d/default_angular_damp] pour plus de " "détails sur l'amortissement." @@ -67448,7 +68652,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -67609,18 +68815,20 @@ msgstr "La scène actuelle." #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" -"Si [code]true[/code], les formes des collisions seront visibles lors du " -"lancement du jeu depuis l'éditeur pour aider au débogage." #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" -"Si [code]true[/code], les polygones de navigation seront visibles lors du " -"lancement du jeu depuis l'éditeur pour aider au débogage." #: doc/classes/SceneTree.xml msgid "The root of the edited scene." @@ -67912,7 +69120,6 @@ msgid "" msgstr "" #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "[SceneTreeTween] is a tween managed by the scene tree. As opposed to " "[Tween], it does not require the instantiation of a node.\n" @@ -68425,14 +69632,14 @@ msgstr "" "tween.tween_property($Sprite, \"position\", Vector2(200, 300), 1)\n" "[/codeblock]\n" "déplacera la sprite de sa position actuelle à la position (100, 200) puis " -"ensuite à (200, 300). Si vous utilisez [method PropertyTweener.from] ou [" -"method PropertyTweener.from_current], la position de départ sera celle " +"ensuite à (200, 300). Si vous utilisez [method PropertyTweener.from] ou " +"[method PropertyTweener.from_current], la position de départ sera celle " "spécifiée et non l'actuelle. Voir les autres méthodes de [PropertyTweener] " "pour connaitre les possibilités.\n" "[b]Note :[/b] Vous pouvez trouver les noms corrects des propriétés en " "survolant ces propriétés dans l'inspecteur de Godot. Vous pouvez aussi " -"fournir un seul composant de cette propriété directement en utilisant [code]" -"\"property:component\"[/code] (ex. [code]position:x[/code]), alors " +"fournir un seul composant de cette propriété directement en utilisant " +"[code]\"property:component\"[/code] (ex. [code]position:x[/code]), alors " "l'interpolation ne se fera que sur cet unique composant.\n" "Exemple : déplacer un objet deux fois depuis la même position vers " "différentes positions, avec différents types de transition.\n" @@ -69036,8 +70243,11 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." -msgstr "Le biais du solveur personnalisé de la forme." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." +msgstr "" #: doc/classes/ShortCut.xml msgid "A shortcut for binding input." @@ -69414,6 +70624,8 @@ msgid "" "If [code]true[/code], the slider can be interacted with. If [code]false[/" "code], the value can be changed only by code." msgstr "" +"Si [code]true[/code], l'utilisateur peut intéragir avec le curseur. Si " +"[code]false[/code], la valeur ne peut être modifiée que par code." #: doc/classes/Slider.xml msgid "If [code]true[/code], the value can be changed using the mouse wheel." @@ -69426,12 +70638,16 @@ msgid "" "Number of ticks displayed on the slider, including border ticks. Ticks are " "uniformly-distributed value markers." msgstr "" +"Le nombre de marqueurs affichées sur le curseur, y compris les marqueurs sur " +"les bords. Les marqueurs représentent des valeurs distribués uniformément." #: doc/classes/Slider.xml msgid "" "If [code]true[/code], the slider will display ticks for minimum and maximum " "values." msgstr "" +"Si [code]true[/code], le curseur affichera des marqueurs pour les valeurs " +"minimales et maximales." #: doc/classes/Slider.xml msgid "" @@ -69614,6 +70830,8 @@ msgid "" "Returns the parent [Spatial], or an empty [Object] if no parent exists or " "parent is not of type [Spatial]." msgstr "" +"Retourne le [Spatial] parent, ou un [Object] vide si aucun parent n'existe " +"ou si le parent n'est pas de type [Spatial]." #: doc/classes/Spatial.xml msgid "" @@ -69626,6 +70844,9 @@ 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 "" +"Pivote la transformation globale autour de l'axe, un [Vector3] unitaire, par " +"angle spécifié en radians. L'axe de rotation est dans le système de " +"coordonnées global." #: doc/classes/Spatial.xml msgid "" @@ -69640,6 +70861,8 @@ msgid "" "Moves the global (world) transformation by [Vector3] offset. The offset is " "in global coordinate system." msgstr "" +"Déplace la transformation globale par le décalage [Vector3 offset]. Le " +"décalage est dans le système de coordonnées global." #: doc/classes/Spatial.xml msgid "" @@ -69653,12 +70876,16 @@ msgid "" "Returns whether node notifies about its local transformation changes. " "[Spatial] will not propagate this by default." msgstr "" +"Retourne si le nÅ“ud notifie ses changements de transformation locale. " +"[Spatial] ne le propage pas par défaut." #: doc/classes/Spatial.xml msgid "" "Returns whether this node uses a scale of [code](1, 1, 1)[/code] or its " "local transformation scale." msgstr "" +"Retourne si ce nÅ“ud utilise une échelle de [code](1, 1, 1)[/code] ou son " +"échelle de transformation locale." #: doc/classes/Spatial.xml msgid "" @@ -69671,6 +70898,20 @@ msgid "" "Returns whether the node notifies about its global and local transformation " "changes. [Spatial] will not propagate this by default." msgstr "" +"Retourne si le nÅ“ud notifie ses changements de transformation globale et " +"locale. [Spatial] ne le propage pas par défaut." + +#: doc/classes/Spatial.xml +msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" +"Retourne [code]true[/code] si le nÅ“ud est présent dans le [SceneTree], que " +"sa propriété [member visible] est [code]true[/code] et que tous ses parents " +"sont également visibles. Si un parent est caché, ce nÅ“ud ne sera pas visible " +"dans l'arborescence de la scène." #: doc/classes/Spatial.xml msgid "" @@ -69693,6 +70934,9 @@ msgid "" "itself to point toward the [code]target[/code] as per [method look_at]. " "Operations take place in global space." msgstr "" +"Déplace le nÅ“ud vers la [code]position[/code] spécifiée, puis pivote vers la " +"cible [code]target[/code] comme avec [method look_at]. Les opérations se " +"déroulent dans l'espace global." #: doc/classes/Spatial.xml msgid "" @@ -69706,12 +70950,17 @@ msgid "" "Rotates the local transformation around axis, a unit [Vector3], by specified " "angle in radians." msgstr "" +"Pivote la transformation locale autour de l'axe, un [Vector3] unitaire, par " +"angle spécifié en radians." #: doc/classes/Spatial.xml 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 "" +"Pivote la transformation locale autour de l'axe, un [Vector3] unitaire, par " +"angle spécifié en radians. L'axe de rotation est dans le système de " +"coordonnées local à l'objet." #: doc/classes/Spatial.xml msgid "Rotates the local transformation around the X axis by angle in radians." @@ -69749,24 +70998,33 @@ msgid "" "transformation scale. Changes to the local transformation scale are " "preserved." msgstr "" +"Définit si le nÅ“ud utilise une échelle de [code](1, 1, 1)[/code] ou son " +"échelle de transformation locale. Les changements de l'échelle de " +"transformation locale sont préservés." #: doc/classes/Spatial.xml msgid "" "Reset all transformations for this node (sets its [Transform] to the " "identity matrix)." msgstr "" +"Réinitialise toutes les transformations pour ce nÅ“ud (définit sa [Transform] " +"avec une matrice d'identité)." #: doc/classes/Spatial.xml msgid "" "Sets whether the node ignores notification that its transformation (global " "or local) changed." msgstr "" +"Définit si le nÅ“ud ignore la notification que sa transformation (globale ou " +"locale) a changé." #: doc/classes/Spatial.xml msgid "" "Sets whether the node notifies about its local transformation changes. " "[Spatial] will not propagate this by default." msgstr "" +"Définit si le nÅ“ud notifie ses changements de transformation locale. " +"[Spatial] ne le propage pas par défaut." #: doc/classes/Spatial.xml msgid "" @@ -69774,6 +71032,9 @@ msgid "" "changes. [Spatial] will not propagate this by default, unless it is in the " "editor context and it has a valid gizmo." msgstr "" +"Définit si le nÅ“ud notifie ses changements de transformation globale et " +"locale. [Spatial] ne le propage pas par défaut, sauf dans le contexte de " +"l'éditeur et a un manipulateur valide." #: doc/classes/Spatial.xml msgid "" @@ -69844,6 +71105,8 @@ msgid "" "Global position of this node. This is equivalent to [code]global_transform." "origin[/code]." msgstr "" +"La position globale de ce nÅ“ud. Ceci est équivalent à [code]global_transform." +"origin[/code]." #: doc/classes/Spatial.xml msgid "" @@ -69863,6 +71126,8 @@ 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 "" +"La partie rotation de la transformation locale, en degrés, spécifiée en " +"termes d'angles YXZ d'Euler dans le format (angle X, angle Y puis angle Z)." #: doc/classes/Spatial.xml msgid "" @@ -69995,6 +71260,9 @@ msgid "" "Sets the [Texture] to be used by the specified [enum TextureParam]. This " "function is called when setting members ending in [code]*_texture[/code]." msgstr "" +"Définit la [Texture] à utiliser par le [enum TextureParam] spécifié. Cette " +"fonction est appelée lorsque les membres se terminent par [code]*_texture[/" +"code]." #: doc/classes/SpatialMaterial.xml msgid "The material's base color." @@ -70025,7 +71293,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -70048,6 +71318,8 @@ msgid "" "If [code]true[/code], ambient occlusion is enabled. Ambient occlusion " "darkens areas based on the [member ao_texture]." msgstr "" +"Si [code]true[/code], l'occlusion ambiante est activée. L'occlusion ambiante " +"assombrit les zones basées sur [member ao_texture]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70167,12 +71439,16 @@ msgstr "" msgid "" "Scales the depth offset effect. A higher number will create a larger depth." msgstr "" +"Met à l'échelle l'effet de décalage de profondeur. Un nombre plus élevé " +"créera une profondeur plus grande." #: doc/classes/SpatialMaterial.xml msgid "" "Texture used to determine depth at a given pixel. Depth is always stored in " "the red channel." msgstr "" +"La texture déterminant la profondeur à un pixel donné. La profondeur est " +"toujours enregistrée dans le canal pour la couleur rouge." #: doc/classes/SpatialMaterial.xml msgid "Texture that specifies the color of the detail overlay." @@ -70183,6 +71459,8 @@ msgid "" "Specifies how the [member detail_albedo] should blend with the current " "[code]ALBEDO[/code]. See [enum BlendMode] for options." msgstr "" +"Spécifie comment [member detail_albedo] devrait se mélanger avec l'actuel " +"[code]ALBEDO[/code]. Voir [enum BlendMode] pour les options." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70197,6 +71475,8 @@ msgid "" "Texture used to specify how the detail textures get blended with the base " "textures." msgstr "" +"La texture utilisée pour spécifier comment les textures de détail se " +"mélangent avec les textures de base." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70315,6 +71595,8 @@ msgid "" "If [code]true[/code], transparency is enabled on the body. See also [member " "params_blend_mode]." msgstr "" +"Si [code]true[/code], la transparence est activée sur le corps. Voir aussi " +"[member params_blend_mode]." #: doc/classes/SpatialMaterial.xml msgid "If [code]true[/code], the object is unaffected by lighting." @@ -70326,6 +71608,10 @@ msgid "" "[b]Note:[/b] This is only effective for objects whose geometry is point-" "based rather than triangle-based. See also [member params_point_size]." msgstr "" +"Si [code]true[/code], la taille de rendu des points peut être modifiée.\n" +"[b]Note :[/b] Ce n'est efficace que pour les objets dont la géométrie est " +"définie à partir de points plutôt que de triangles. Voir aussi [member " +"params_point_size]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70400,11 +71686,11 @@ msgstr "" #: doc/classes/SpatialMaterial.xml msgid "If [code]true[/code], normal mapping is enabled." -msgstr "" +msgstr "Si [code]true[/code], la carte normale est activée." #: doc/classes/SpatialMaterial.xml msgid "The strength of the normal map's effect." -msgstr "" +msgstr "L'intensité de l'effet de la carte normale." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70452,23 +71738,30 @@ msgid "" "Which side of the object is not drawn when backfaces are rendered. See [enum " "CullMode]." msgstr "" +"Quel côté de l'objet n'est pas dessiné lorsque les faces arrière sont " +"rendues. Voir [enum CullMode]." #: doc/classes/SpatialMaterial.xml msgid "" "Determines when depth rendering takes place. See [enum DepthDrawMode]. See " "also [member flags_transparent]." msgstr "" +"Détermine quand le rendu de profondeur a lieu. Voir [enum DepthDrawMode]. " +"Voir aussi [member flags_transparent]." #: doc/classes/SpatialMaterial.xml msgid "" "The algorithm used for diffuse light scattering. See [enum DiffuseMode]." msgstr "" +"L'algorithme utilisé pour diffuser la lumière. Voir [enum DiffuseMode]." #: doc/classes/SpatialMaterial.xml msgid "" "If [code]true[/code], enables the vertex grow setting. See [member " "params_grow_amount]." msgstr "" +"Si [code]true[/code], active l'inflation des sommets. Voir [member " +"params_grow_amount]." #: doc/classes/SpatialMaterial.xml msgid "Grows object vertices in the direction of their normals." @@ -70491,6 +71784,8 @@ msgid "" "If [code]true[/code], the shader will discard all pixels that have an alpha " "value less than [member params_alpha_scissor_threshold]." msgstr "" +"Si [code]true[/code], le shadow ignorera tous les pixels ayant une valeur " +"d'opacité inférieure à [member params_alpha_scisor_threshold]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70498,12 +71793,18 @@ msgid "" "when using [constant BILLBOARD_PARTICLES]. See [member " "params_billboard_mode]." msgstr "" +"Le nombre de trames horizontales dans la feuille de sprite de particules. " +"Seulement activé avec [constant BILLBOARD_PARTICLES]. Voir [member " +"params_billboard_mode]." #: doc/classes/SpatialMaterial.xml msgid "" "If [code]true[/code], particle animations are looped. Only enabled when " "using [constant BILLBOARD_PARTICLES]. See [member params_billboard_mode]." msgstr "" +"Si [code]true[/code], les animations de particules sont en boucle. Seulement " +"activé avec [constant BILLBOARD_PARTICLES]. Voir [member " +"params_billboard_mode]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70511,12 +71812,17 @@ msgid "" "when using [constant BILLBOARD_PARTICLES]. See [member " "params_billboard_mode]." msgstr "" +"Le nombre de trames verticales dans la feuille de sprite de particules. " +"Seulement activé avec [constant BILLBOARD_PARTICLES]. Voir [member " +"params_billboard_mode]." #: doc/classes/SpatialMaterial.xml msgid "" "Distance over which the fade effect takes place. The larger the distance the " "longer it takes for an object to fade." msgstr "" +"Distance sur laquelle l'effet de disparition se produit. Plus la distance " +"est grande, plus l'objet disparait progressivement." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70537,6 +71843,8 @@ msgid "" "The strength of the refraction effect. Higher values result in a more " "distorted appearance for the refraction." msgstr "" +"L'intensité de l'effet de réfraction. Des valeurs plus élevées entraînent " +"une apparence plus déformée pour la réfraction." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70586,6 +71894,9 @@ msgid "" "while a value of [code]1[/code] completely blurs the reflection. See also " "[member metallic]." msgstr "" +"La réflexion de surface. Une valeur de [code]0[/code] représente un miroir " +"parfait alors qu'une valeur de [code]1[/code] rend le reflet complètement " +"flou. Voir aussi [member metallic]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70616,6 +71927,8 @@ msgid "" "The color used by the transmission effect. Represents the light passing " "through an object." msgstr "" +"La couleur utilisée pour l'effet de transmission. Représente la lumière " +"passant à travers un objet." #: doc/classes/SpatialMaterial.xml msgid "If [code]true[/code], the transmission effect is enabled." @@ -70626,6 +71939,8 @@ msgid "" "Texture used to control the transmission effect per-pixel. Added to [member " "transmission]." msgstr "" +"La texture utilisée pour contrôler l'effet de transmission par pixel. Ajouté " +"à [member transmission]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70633,12 +71948,17 @@ msgid "" "added to [code]UV[/code] in the vertex function. This can be used to offset " "a texture." msgstr "" +"La quantité des coordonnées [code]UV[/code] à décaler. Cette quantité sera " +"ajoutée à [code]UV[/code] dans la fonction \"vertex\". Cela peut être " +"utilisé pour décaler une texture." #: doc/classes/SpatialMaterial.xml msgid "" "How much to scale the [code]UV[/code] coordinates. This is multiplied by " "[code]UV[/code] in the vertex function." msgstr "" +"La mise à l'échelle des coordonnées [code]UV[/code]. Ceci est multiplié par " +"[code]UV[/code] dans la fonction \"vertex\"." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70666,12 +71986,17 @@ msgid "" "added to [code]UV2[/code] in the vertex function. This can be used to offset " "a texture." msgstr "" +"La quantité des coordonnées [code]UV2[/code] à décaler. Cette quantité sera " +"ajoutée à [code]UV2[/code] dans la fonction \"vertex\". Cela peut être " +"utilisé pour décaler une texture." #: doc/classes/SpatialMaterial.xml msgid "" "How much to scale the [code]UV2[/code] coordinates. This is multiplied by " "[code]UV2[/code] in the vertex function." msgstr "" +"La mise à l'échelle des coordonnées [code]UV2[/code]. Ceci est multiplié par " +"[code]UV2[/code] dans la fonction \"vertex\"." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70844,6 +72169,8 @@ msgid "" "Default blend mode. The color of the object is blended over the background " "based on the object's alpha value." msgstr "" +"Le mode de mélange par défaut. La couleur de l'objet est mélangée sur " +"l'arrière-plan en fonction de l'opacité de l'objet." #: doc/classes/SpatialMaterial.xml msgid "The color of the object is added to the background." @@ -70866,6 +72193,8 @@ msgstr "" #: doc/classes/SpatialMaterial.xml msgid "Depth draw is calculated for both opaque and transparent objects." msgstr "" +"Le dessin de la profondeur est calculé pour des objets opaques et aussi " +"transparents." #: doc/classes/SpatialMaterial.xml msgid "No depth draw." @@ -70876,6 +72205,8 @@ msgid "" "For transparent objects, an opaque pass is made first with the opaque parts, " "then transparency is drawn." msgstr "" +"Pour les objets transparents, une passe opaque est faite d'abord avec les " +"parties opaques, puis la transparence est dessinée." #: doc/classes/SpatialMaterial.xml msgid "Default cull mode. The back of the object is culled when not visible." @@ -70904,6 +72235,8 @@ msgid "" "Lighting is calculated per-vertex rather than per-pixel. This can be used to " "increase the speed of the shader at the cost of quality." msgstr "" +"L'éclairage est calculé par sommet plutôt que par pixel. Cela peut être " +"utilisé pour améliorer la vitesse du shader mais réduit la qualité visuelle." #: doc/classes/SpatialMaterial.xml msgid "Set [code]ALBEDO[/code] to the per-vertex color specified in the mesh." @@ -70916,6 +72249,8 @@ msgid "" "Vertex color is in sRGB space and needs to be converted to linear. Only " "applies in the GLES3 renderer." msgstr "" +"La couleur des sommets est dans l'espace sRGB et doit être convertie en " +"linéaire. Seulement ne s'applique qu'au rendu GLES3." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70923,11 +72258,16 @@ msgid "" "albedo texture lookup to use [code]POINT_COORD[/code] instead of [code]UV[/" "code]." msgstr "" +"Utilise la taille d'affichage des points pour modifier pour les primitives " +"de points. Change également la projection des textures albedo en utilisant " +"[code]POINT_COORD[/code] au lieu de [code]UV[/code]." #: doc/classes/SpatialMaterial.xml msgid "" "Object is scaled by depth so that it always appears the same size on screen." msgstr "" +"L'objet est mise à l'échelle suivant sa profondeur pour qu'il apparaisse " +"toujours la même taille à l'écran." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70935,6 +72275,9 @@ msgid "" "when billboarding. Only applies when [member params_billboard_mode] is " "[constant BILLBOARD_ENABLED]." msgstr "" +"Le shader gardera l'échelle pour le maillage. Sinon, la mise à l'échelle " +"sera ignoré lors de l'affichage en mode panneau. Ne s'applique que quand " +"[member params_billboard_mode] est [constant BILLBOARD_ENABLED]." #: doc/classes/SpatialMaterial.xml msgid "" @@ -70978,6 +72321,8 @@ msgid "" "Use world coordinates in the triplanar texture lookup instead of local " "coordinates." msgstr "" +"Utilise les coordonnées globales pour la projection de la texture " +"triplanaire au lieu des coordonnées locales." #: doc/classes/SpatialMaterial.xml msgid "Forces the shader to convert albedo from sRGB space to linear space." @@ -71007,17 +72352,18 @@ msgid "Default diffuse scattering algorithm." msgstr "" #: doc/classes/SpatialMaterial.xml -#, fuzzy msgid "Diffuse scattering ignores roughness." msgstr "La diffusion diffuse ignore la rugosité." #: doc/classes/SpatialMaterial.xml msgid "Extends Lambert to cover more than 90 degrees when roughness increases." msgstr "" +"Étend le calcul Lambert pour couvrir plus de 90 degrés quand la rugosité " +"augmente." #: doc/classes/SpatialMaterial.xml msgid "Attempts to use roughness to emulate microsurfacing." -msgstr "" +msgstr "Tente d'utiliser la rugosité pour simuler le microsurfaçage." #: doc/classes/SpatialMaterial.xml msgid "Uses a hard cut for lighting, with smoothing affected by roughness." @@ -71042,7 +72388,6 @@ msgid "No specular blob." msgstr "Pas de blob spéculaire." #: doc/classes/SpatialMaterial.xml -#, fuzzy msgid "Billboard mode is disabled." msgstr "Le mode d'affichage est désactivé." @@ -71061,6 +72406,12 @@ msgid "" "The [member ParticlesMaterial.anim_speed] or [member CPUParticles." "anim_speed] should also be set to a positive value for the animation to play." msgstr "" +"Utilisé pour les systèmes de particules lorsqu'ils sont affectés aux nÅ“uds " +"[Particles] et [CPUParticles]. Active les propriétés [code]particles_anim_*[/" +"code].\n" +"[member ParticlesMaterial.anim_speed] ou [member CPUParticles.anim_speed] " +"devrait également être défini à une valeur positive pour que l'animation " +"soit jouée." #: doc/classes/SpatialMaterial.xml msgid "Used to read from the red channel of a texture." @@ -71095,6 +72446,8 @@ msgid "" "Smoothly fades the object out based on each pixel's distance from the camera " "using the alpha channel." msgstr "" +"Fait disparaitre doucement l'objet en fonction de la distance de chaque " +"pixel par rapport à la caméra en utilisant l'opacité." #: doc/classes/SpatialMaterial.xml msgid "" @@ -71145,6 +72498,10 @@ msgid "" "[b]Note:[/b] To get a regular hemisphere, the height and radius of the " "sphere must be equal." msgstr "" +"Si [code]true[/code], un hémisphère (une demi-sphère) est créé plutôt qu'une " +"sphère entière.\n" +"[b]Note :[/b] Pour obtenir un hémisphère uniforme, la hauteur et le rayon " +"doivent être identiques." #: doc/classes/SphereMesh.xml msgid "Number of radial segments on the sphere." @@ -71167,6 +72524,9 @@ 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." msgstr "" +"Une forme sphérique pour les collisions 3D, qui peut être placée dans un " +"[PhysicsBody] ou une [Area]. Cette forme est utile pour modéliser des objets " +"3D sphériques." #: doc/classes/SphereShape.xml msgid "The sphere's radius. The shape's diameter is double the radius." @@ -71279,18 +72639,25 @@ msgid "" "Container for splitting two [Control]s vertically or horizontally, with a " "grabber that allows adjusting the split offset or ratio." msgstr "" +"Un conteneur pour diviser deux [Control] verticalement ou horizontalement, " +"avec un séparateur pour régler le décalage ou le rapport entre ces deux " +"contrôles." #: doc/classes/SplitContainer.xml msgid "" "Clamps the [member split_offset] value to not go outside the currently " "possible minimal and maximum values." msgstr "" +"Limite la valeur [member split_offset] pour rester dans l'intervalle défini " +"entre les valeurs minimale et maximale actuellement possibles." #: doc/classes/SplitContainer.xml msgid "" "If [code]true[/code], the area of the first [Control] will be collapsed and " "the dragger will be disabled." msgstr "" +"Si [code]true[/code], le premier [Control] sera masqué et le glisseur " +"désactivé." #: doc/classes/SplitContainer.xml msgid "" @@ -71305,6 +72672,8 @@ 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 "" +"Le décalage initial de la séparation entre les deux [Control], avec [code]0[/" +"code] étant la fin du premier [Control]." #: doc/classes/SplitContainer.xml msgid "Emitted when the dragger is dragged by user." @@ -71315,7 +72684,6 @@ msgid "The split dragger is visible when the cursor hovers it." msgstr "Le dragueur fractionné est visible quand le curseur le survole." #: doc/classes/SplitContainer.xml -#, fuzzy msgid "The split dragger is never visible." msgstr "Le dragueur fractionné n’est jamais visible." @@ -71385,6 +72753,8 @@ msgid "" "Adds the [PhysicsBody] object with the given [RID] to the list of " "[PhysicsBody] objects excluded from the collision check." msgstr "" +"Ajoute l'objet [PhysicsBody] à la liste des objets [PhysicsBody] ignorés " +"lors de la vérification des collisions." #: doc/classes/SpringArm.xml msgid "" @@ -71402,6 +72772,8 @@ msgid "" "Removes the given [RID] from the list of [PhysicsBody] objects excluded from " "the collision check." msgstr "" +"Supprime le [RID] de la liste des objets [PhysicsBody] ignorés de la " +"vérification des collisions." #: doc/classes/SpringArm.xml msgid "" @@ -71410,6 +72782,10 @@ msgid "" "and-masks]Collision layers and masks[/url] in the documentation for more " "information." msgstr "" +"Les calques selon lesquels le contrôle des collisions doit être effectué. " +"Voir [url=$DOCS_URL/tutorials/physics/physics_introduction.html#collision-" +"layers-and-masks]Calques et masques de collision[/url] dans la documentation " +"pour plus d'informations." #: doc/classes/SpringArm.xml msgid "" @@ -71429,6 +72805,9 @@ msgid "" "When the shape is set, the SpringArm will cast the [Shape] on its z axis " "instead of performing a ray cast." msgstr "" +"La [Shape] à utiliser pour le SpringArm.\n" +"Lorsque la forme est définie, le SpringArm lancera le [Shape] sur son axe Z " +"au lieu d'exécuter un lancer de rayon." #: doc/classes/SpringArm.xml msgid "" @@ -71438,6 +72817,11 @@ msgid "" "To know more about how to perform a shape cast or a ray cast, please consult " "the [PhysicsDirectSpaceState] documentation." msgstr "" +"L'étendue maximale du SpringArm. Il s'agit d'une longueur tant pour le rayon " +"que pour la forme utilisée à l'intérieur pour calculer la position souhaitée " +"pour les nÅ“uds enfants du SpringArm.\n" +"Pour en savoir plus sur la façon d'effectuer un lancer de forme ou de rayon, " +"veuillez consulter la documentation de [PhysicsDirectSpaceState]." #: doc/classes/Sprite.xml msgid "General-purpose sprite node." @@ -71448,6 +72832,9 @@ 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 "" +"Un nÅ“ud qui affiche une texture 2D. La texture affichée peut être une région " +"à partir d'une texture plus grande de l'atlas, ou d'une trame d'une " +"animation de feuille de sprite." #: doc/classes/Sprite.xml msgid "" @@ -71461,6 +72848,16 @@ msgid "" " print(\"A click!\")\n" "[/codeblock]" msgstr "" +"Retourne un [Rect2] représentant la taille englobante du Sprite dans les " +"coordonnées locales. Peut être utilisé pour détecter si le Sprite a été " +"cliqué. Par exemple :\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(\"Un clic !\")\n" +"[/codeblock]" #: doc/classes/Sprite.xml msgid "" @@ -71469,6 +72866,10 @@ msgid "" "[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 "" +"Retourne [code]true[/code], si le pixel à la position donnée est opaque, ou " +"[code]false[/code] sinon.\n" +"[b]Note :[/b] Retourne également [code]false[/code] si la texture du sprite " +"est [code]null[/code] ou si la position donnée est invalide." #: doc/classes/Sprite.xml msgid "If [code]true[/code], texture is centered." @@ -71479,6 +72880,8 @@ msgid "" "Current frame to display from sprite sheet. [member hframes] or [member " "vframes] must be greater than 1." msgstr "" +"La trame actuelle à afficher dans la feuille de sprite. [membres hframes] ou " +"[membres vframes] doivent être supérieurs à 1." #: doc/classes/Sprite.xml doc/classes/Sprite3D.xml msgid "" @@ -71486,6 +72889,9 @@ msgid "" "for the [member frame] property. [member hframes] or [member vframes] must " "be greater than 1." msgstr "" +"Les coordonnées de la trame à afficher de la feuille de sprite. Il s'agit " +"d'un raccourci de la propriété [member frame]. [membres hframes] ou [membres " +"vframes] doivent être supérieurs à 1." #: doc/classes/Sprite.xml doc/classes/Sprite3D.xml msgid "The number of columns in the sprite sheet." @@ -71546,6 +72952,9 @@ msgid "" "can be a region from a larger atlas texture, or a frame from a sprite sheet " "animation." msgstr "" +"Un nÅ“ud qui affiche une texture 2D dans un environnement 3D. La texture " +"affichée peut être une région à partir d'une texture plus grande de l'atlas, " +"ou d'une trame d'une animation de feuille de sprite." #: doc/classes/Sprite3D.xml msgid "" @@ -71556,10 +72965,13 @@ msgstr "" "atlas. Voir [member region_rect]." #: doc/classes/Sprite3D.xml +#, fuzzy msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" +"La [Texture] à dessiner. Si [member GeometryInstance.material_override] est " +"utilisé, cette dernière sera utilisée." #: doc/classes/SpriteBase3D.xml msgid "2D sprite node in 3D environment." @@ -71587,6 +72999,8 @@ 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 "" +"Si [code]true[/code], la texture est aussi affichée de dos, si [code]false[/" +"code], elle est invisible de dos." #: doc/classes/SpriteBase3D.xml msgid "" @@ -71632,8 +73046,8 @@ msgid "" msgstr "" "Définit la priorité de rendu pour le texte. Les objets plus prioritaires " "seront affichés par-dessus les objets les moins prioritaites.\n" -"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à [" -"constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" +"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à " +"[constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" "[b]Note :[/b] Cela ne s'applique qu'au tri des objets transparents. Cela " "n'affectera pas la façon dont les objets transparents sont triés par rapport " "aux objets opaques. C'est parce que les objets opaques ne sont pas triés, " @@ -71645,33 +73059,43 @@ msgid "" "If [code]true[/code], the [Light] in the [Environment] has effects on the " "sprite." msgstr "" +"Si [code]true[/code], une [Light] dans le [Environment] a des effets sur le " +"sprite." #: doc/classes/SpriteBase3D.xml msgid "" "If [code]true[/code], the texture's transparency and the opacity are used to " "make those parts of the sprite invisible." msgstr "" +"Si [code]true[/code], la transparence et l'opacité des textures sont " +"utilisées pour rendre invisibles ces parties du sprite." #: doc/classes/SpriteBase3D.xml msgid "" "If set, the texture's transparency and the opacity are used to make those " "parts of the sprite invisible." msgstr "" +"Si elle est définie, la transparence de la texture et l'opacité sont " +"utilisées pour rendre invisibles ces parties du sprite." #: doc/classes/SpriteBase3D.xml msgid "If set, lights in the environment affect the sprite." -msgstr "" +msgstr "Si définies, les lumières dans l'environnement affecte le sprite." #: doc/classes/SpriteBase3D.xml msgid "" "If set, texture can be seen from the back as well, if not, it is invisible " "when looking at it from behind." msgstr "" +"Si défini, la texture est aussi visible de derrière, sinon, elle est " +"invisible quand on la regarde de derrière." #: doc/classes/SpriteBase3D.xml msgid "" "Sprite is scaled by depth so that it always appears the same size on screen." msgstr "" +"Sprite est mise à l'échelle suivant sa profondeur pour qu'elle apparaisse " +"toujours avec la même taille à l'écran." #: doc/classes/SpriteFrames.xml msgid "Sprite frame library for AnimatedSprite and AnimatedSprite3D." @@ -71708,6 +73132,8 @@ msgid "" "Returns [code]true[/code] if the given animation is configured to loop when " "it finishes playing. Otherwise, returns [code]false[/code]." msgstr "" +"Retourne [code]true[/code] si l'animation donnée est configurée pour boucler " +"lorsqu'elle termine de jouer. Sinon, retourne [code]false[/code]." #: doc/classes/SpriteFrames.xml msgid "" @@ -71785,12 +73211,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 "" +"La vitesse angulaire constante du corps. Cela ne tourne pas le corps, mais " +"affecte les autres corps qui le touchent, comme s'il pivotait." #: doc/classes/StaticBody.xml 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 "" +"La vitesse linéaire constante du corps. Cela ne déplace pas le corps, mais " +"affecte les autres corps qui le touchent, comme s'il se déplaçait." #: doc/classes/StaticBody.xml msgid "" @@ -71827,12 +73257,16 @@ msgid "" "The body's constant angular velocity. This does not rotate the body, but " "affects colliding bodies, as if it were rotating." msgstr "" +"La vitesse angulaire constante du corps. Cela ne tourne pas le corps, mais " +"affecte les autres corps qui le touchent, comme s'il pivotait." #: doc/classes/StaticBody2D.xml msgid "" "The body's constant linear velocity. This does not move the body, but " "affects colliding bodies, as if it were moving." msgstr "" +"La vitesse linéaire constante du corps. Cela ne déplace pas le corps, mais " +"affecte les autres corps qui le touchent, comme s'il se déplaçait." #: doc/classes/StaticBody2D.xml msgid "" @@ -71841,6 +73275,10 @@ msgid "" "Deprecated, use [member PhysicsMaterial.friction] instead via [member " "physics_material_override]." msgstr "" +"Le frottement du corps. Les valeurs vont de [code]0[/code] (pas de friction) " +"à [code]1[/code] (friction complète).\n" +"Obsolète, utilisez plutôt [member PhysicsMaterial.friction] avec [member " +"physics_material_override]." #: doc/classes/StreamPeer.xml msgid "Abstraction and base class for stream-based protocols." @@ -71852,6 +73290,9 @@ msgid "" "as TCP). It provides an API for sending and receiving data through streams " "as raw data or strings." msgstr "" +"StreamPeer est une classe abstraite de base pour les protocoles à base de " +"flux (comme TCP). Elle fournit une API pour l'envoi et la réception de " +"données par les flux sous forme de données brutes ou textuelles." #: doc/classes/StreamPeer.xml msgid "Gets a signed 16-bit value from the stream." @@ -71881,6 +73322,11 @@ msgid "" "received. This function returns two values, an [enum @GlobalScope.Error] " "code and a data array." msgstr "" +"Retourne les morceaux de données avec les octets reçus. Le nombre d'octets à " +"recevoir peut être spécifié dans l'argument [code]bytes[/code]. Si pas assez " +"d'octets sont disponibles, la fonction bloquera jusqu'à ce que la quantité " +"demandée soit reçu. Cette fonction retourne deux valeurs : un code [enum " +"@GlobalScope.Error] et un tableau de données." #: doc/classes/StreamPeer.xml msgid "Gets a double-precision float from the stream." @@ -71898,6 +73344,11 @@ msgid "" "function returns two values, an [enum @GlobalScope.Error] code, and a data " "array." msgstr "" +"Retourne les morceaux de données avec les octets. Le nombre d'octets à " +"recevoir peut être spécifié dans l'argument [code]byts[/code]. Si pas assez " +"d'octets sont disponibles, la fonction retournera combien ont effectivement " +"été reçus. Cette fonction retourne deux valeurs : un code [enum @GlobalScope." +"Error] et un tableau de données." #: doc/classes/StreamPeer.xml msgid "" @@ -71905,6 +73356,9 @@ msgid "" "[code]bytes[/code] is negative (default) the length will be read from the " "stream using the reverse process of [method put_string]." msgstr "" +"Retourne une chaîne ASCII de longeur [code]octets[/code] du flux. Si " +"[code]bytes[/code] est négatif (par défaut) la longueur sera lue depuis le " +"flux en utilisant le processus inverse de [method put_string]." #: doc/classes/StreamPeer.xml msgid "Gets an unsigned 16-bit value from the stream." @@ -71929,6 +73383,10 @@ msgid "" "(default) the length will be read from the stream using the reverse process " "of [method put_utf8_string]." msgstr "" +"Retourne une chaîne UTF-8 de longueur [code]bytes[/code] du flux (ceci " +"décode la chaîne envoyée en UTF-8). Si [code]bytes[/code] est négatif (par " +"défaut) la longueur sera lue depuis le flux en utilisant le processus " +"inverse de [method put_utf8_string]." #: doc/classes/StreamPeer.xml msgid "" @@ -71938,6 +73396,12 @@ msgid "" "Do not use this option if the serialized object comes from untrusted sources " "to avoid potential security threats such as remote code execution." msgstr "" +"Retourne un Variant du flux. Si [code]allow_objects[/code] est [code]true[/" +"code], le décodage des objets sera autorisé.\n" +"[b]Avertissement :[/b] Les objets désérialisés peuvent contenir du code qui " +"sera exécuté. N'utilisez pas cette option si l'objet sérialisé provient de " +"sources non sûres pour éviter des risques de sécurité telles que l'exécution " +"de code à distance." #: doc/classes/StreamPeer.xml msgid "Puts a signed 16-bit value into the stream." @@ -71961,6 +73425,9 @@ msgid "" "the data is done sending. This function returns an [enum @GlobalScope.Error] " "code." msgstr "" +"Envoie un morceau de données à travers la connexion, en blocant si " +"nécessaire jusqu'à ce que les données soient envoyées. Cette fonction " +"retourne un code [enum @GlobalScope.Error]." #: doc/classes/StreamPeer.xml msgid "Puts a double-precision float into the stream." @@ -71977,6 +73444,10 @@ msgid "" "[enum @GlobalScope.Error] code and an integer, describing how much data was " "actually sent." msgstr "" +"Envoie un morceau de données par la connexion. Si toutes les données ne " +"peuvent pas être envoyées à la fois, seule une partie de celle-ci le sera. " +"Cette fonction retourne deux valeurs : un code [enum @GlobalScope.Error], et " +"un entier décrivant la quantité de données effectivement envoyées." #: doc/classes/StreamPeer.xml msgid "" @@ -71988,6 +73459,13 @@ msgid "" "put_data(\"Hello world\".to_ascii())\n" "[/codeblock]" msgstr "" +"Ajoute une chaîne ASCII (se terminant par le caractère nul) dans le flux " +"précédée par un entier de 32 bits représentant sa taille.\n" +"[b]Note :[/b] Pour mettre une chaîne ASCII sans la faire précéder par sa " +"taille, vous pouvez utiliser [method put_data] :\n" +"[codeblock]\n" +"put_data(\"Salut le monde\".to_ascii())\n" +"[/codeblock]" #: doc/classes/StreamPeer.xml msgid "Puts an unsigned 16-bit value into the stream." @@ -72015,18 +73493,30 @@ msgid "" "put_data(\"Hello world\".to_utf8())\n" "[/codeblock]" msgstr "" +"Ajoute une chaîne UTF-8 (se terminant par le caractère nul) dans le flux " +"précédée par un entier non signé de 32 bits représentant sa taille.\n" +"[b]Note :[/b] Pour mettre une chaîne UTF-8 sans la faire précéder par sa " +"taille, vous pouvez utiliser [method put_data] :\n" +"[codeblock]\n" +"put_data(\"Salut le monde\".to_utf8())\n" +"[/codeblock]" #: doc/classes/StreamPeer.xml 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 "" +"Ajoute un Variant dans le flux. Si [code]full_objects[/code] est [code]true[/" +"code], le codage des objects est autorisé (ceux-ci peuvent potentiellement " +"contenir du code)." #: doc/classes/StreamPeer.xml msgid "" "If [code]true[/code], this [StreamPeer] will using big-endian format for " "encoding and decoding." msgstr "" +"Si [code]true[/code], ce [StreamPeer] utilisera le format big-endian pour " +"l'encodage et le décodage." #: doc/classes/StreamPeerBuffer.xml msgid "Data buffer stream peer." @@ -72050,6 +73540,8 @@ msgstr "Efface le [member data_array] et rétablit le curseur." msgid "" "Returns a new [StreamPeerBuffer] with the same [member data_array] content." msgstr "" +"Retourne un nouveau [StreamPeerBuffer] avec le même contenu de [member " +"data_array]." #: doc/classes/StreamPeerBuffer.xml msgid "Returns the current cursor position." @@ -72069,10 +73561,14 @@ msgid "" "Moves the cursor to the specified position. [code]position[/code] must be a " "valid index of [member data_array]." msgstr "" +"Déplace le curseur vers la position spécifiée. [code]position[/code] doit " +"être un index valide de [member data_array]." #: doc/classes/StreamPeerBuffer.xml msgid "The underlying data buffer. Setting this value resets the cursor." msgstr "" +"La mémoire tampon interne. Changer cette valeur réinitialise la position du " +"curseur." #: doc/classes/StreamPeerSSL.xml msgid "SSL stream peer." @@ -72083,6 +73579,8 @@ msgid "" "SSL stream peer. This object can be used to connect to an SSL server or " "accept a single SSL client connection." msgstr "" +"Un pair d'un flux SSL. Cet objet peut être utilisé pour se connecter à un " +"serveur SSL ou accepter une seule connexion avec un client SSL." #: doc/classes/StreamPeerSSL.xml msgid "" @@ -72091,6 +73589,10 @@ msgid "" "can pass the optional [code]chain[/code] parameter to provide additional CA " "chain information along with the certificate." msgstr "" +"Accepte une connexion par les pairs en tant que serveur en utilisant la " +"[code]private_key[/code] et en fournissant le [code]certificate[/code] donné " +"au client. Vous pouvez passer le paramètre optionnel [code]chain[/code] pour " +"fournir des informations supplémentaires sur la chaîne CA avec le certificat." #: doc/classes/StreamPeerSSL.xml msgid "" @@ -72101,6 +73603,13 @@ msgid "" "[b]Note:[/b] Specifying a custom [code]valid_certificate[/code] is not " "supported in HTML5 exports due to browsers restrictions." msgstr "" +"Se connecte à un pair en utilisant le [code]stream[/code] interne d'un " +"[StreamPeer]. Si [code]validate_certs[/code] est [code]true[/code], " +"[StreamPeerSSL] validera le certificat du pair pour s'assurer qu'il " +"correspond au [code]for_hostname[/code].\n" +"[b]Note :[/b] Spécifier un code personnalisé pour [code]valid_certificate[/" +"code] n'est pas pris en charge dans les exportations HTML5 en raison des " +"restrictions des navigateurs." #: doc/classes/StreamPeerSSL.xml doc/classes/StreamPeerTCP.xml msgid "Disconnects from host." @@ -72111,6 +73620,9 @@ msgid "" "Poll the connection to check for incoming bytes. Call this right before " "[method StreamPeer.get_available_bytes] for it to work properly." msgstr "" +"Sonde la connexion pour vérifier les octets entrants. Appelez ceci avant " +"[method StreamPeer.get_available_bytes] pour que ça puisse fonctionner " +"correctement." #: doc/classes/StreamPeerSSL.xml msgid "A status representing a [StreamPeerSSL] that is disconnected." @@ -72133,6 +73645,8 @@ msgid "" "An error status that shows a mismatch in the SSL certificate domain " "presented by the host and the domain requested for validation." msgstr "" +"Un statut d'erreur qui montre une erreur dans le domaine de certificat SSL " +"présenté par l'hôte et le domaine demandé pour validation." #: doc/classes/StreamPeerTCP.xml msgid "TCP stream peer." @@ -72143,6 +73657,8 @@ msgid "" "TCP stream peer. This object can be used to connect to TCP servers, or also " "is returned by a TCP server." msgstr "" +"Pair de flux TCP. Cet objet peut être utilisé pour se connecter aux serveurs " +"TCP, ou est également retourné par un serveur TCP." #: doc/classes/StreamPeerTCP.xml msgid "" @@ -72150,6 +73666,9 @@ msgid "" "resolved if valid. Returns [constant OK] on success or [constant FAILED] on " "failure." msgstr "" +"Se connecte au pair [code]host:port[/code] spécifié. Un nom d'hôte sera " +"résolu si valide. Retourne [constant OK] en cas de succès ou [constant " +"FAILED] en cas l'échec." #: doc/classes/StreamPeerTCP.xml msgid "Returns the IP of this peer." @@ -72229,6 +73748,11 @@ msgid "" "Strings are reference-counted and use a copy-on-write approach, so passing " "them around is cheap in resources." msgstr "" +"C'est la classe de chaîne intégrée (et celle utilisée par GDScript). Il " +"prend en charge l'Unicode et fournit tous les moyens nécessaires pour la " +"manipulation des chaînes. Les chaînes sont comptées par référence et " +"utilisent une approche de copie à l'écriture, donc les passer en argument ne " +"demande que très peu de ressources." #: doc/classes/String.xml msgid "Constructs a new String from the given [bool]." @@ -72387,6 +73911,13 @@ msgid "" "[b]Note:[/b] Unlike the GDScript parser, this method doesn't support the " "[code]\\uXXXX[/code] escape sequence." msgstr "" +"Retourne une copie de la chaîne avec des caractères échappés remplacés par " +"leurs significations. Les caracètres échappés supportés sont : [code]\\'[/" +"code], [code]\\\"[/code], [code]\\?[/code], [code]\\\\[/code], [code]\\a[/" +"code], [code]\\b[/code], [code]\\f[/code], [code]\\n[/code], [code]\\r[/" +"code], [code]\\t[/code] et [code]\\v[/code].\n" +"[b]Note :[/b] Contrairement au parseur GDScript, cette méthode ne supporte " +"pas la séquence d'échappement de caractères Unicode [code]\\uXXXX[/code]." #: doc/classes/String.xml msgid "" @@ -72397,6 +73928,12 @@ msgid "" "code], it will return [code]Capitalize Camel Case Mixed With Underscores[/" "code]." msgstr "" +"Change la casse de certaines lettres. Remplace les underscores avec des " +"espaces, ajoute des espaces avant les caractères majuscules en mots, " +"convertit toutes les lettres en minuscule, puis met en majuscule la première " +"lettre et chaque lettre suivant un caractère d'espace. Pour [code]unTexte en " +"majuscule avec_des_underscores[/code], cela retournera [code]Un Texte En " +"Majuscule Avec des Underscores[/code]." #: doc/classes/String.xml msgid "" @@ -72424,6 +73961,10 @@ msgid "" "[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 "" +"Retourne le nombre d'occurrences de la sous-chaîne [code]what[/code] entre " +"les positions [code]from[/code] et [code]to[/code]. Si [code]from[/code] et " +"[code]to[/code] sont égales à 0, la chaîne entière sera utilisée. Si " +"seulement [code]to[/code] est à 0, la sous-chaîne restante sera utilisée." #: doc/classes/String.xml msgid "" @@ -72432,6 +73973,11 @@ msgid "" "[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 "" +"Retourne le nombre d'occurrences de la sous-chaîne [code]what[/code] (en " +"ignorant la casse) entre les positions [code]from[/code] et [code]to[/code]. " +"Si [code]from[/code] et [code]to[/code] sont égales à 0, la chaîne entière " +"sera utilisée. Si seulement [code]to[/code] est à 0, la sous-chaîne restante " +"sera utilisée." #: doc/classes/String.xml msgid "" @@ -72537,6 +74083,33 @@ msgid "" "\"Godot\"]]))\n" "[/codeblock]" msgstr "" +"Formate la chaîne en remplaçant toutes les occurrences de [code]placeholder[/" +"code] par les éléments de [code]values[/code].\n" +"[code]values[/code] peut être un [Dictionary] ou un [Array]. Toute occurence " +"de [code]placeholder[/code] sera remplacée par les clés correspondantes à " +"l'avance. Les éléments Array utilisent leur index comme clés.\n" +"[codeblock]\n" +"# Affiche : 'En attendant Godot' est une pièce de Samuel Beckett, et le " +"moteur Godot est nommé d'après elle.\n" +"var use_array_values = \"'En attendant {0}' est une pièce de {1}, et le " +"moteur {0} est nommé d'après elle.\"\n" +"print(use_array_values.format([\"Godot\", \"Samuel Beckett\"]))\n" +"\n" +"# Affiche : L'utilisateur 42 est Godot.\n" +"print(\"L'utilisateur {id} est {name}.\".format({\"id\": 42, \"name\": " +"\"Godot\"}))\n" +"[/codeblock]\n" +"Une manipulation supplémentaire est effectuée quand [code]values[/code] est " +"un tableau. Si [code]placeholder[/code] ne contient pas de underscore " +"(\"_\"), les éléments du tableau seront utilisés pour remplacer " +"l'occurrence ; Si un élément de tableau est un autre tableau de 2 éléments, " +"il sera interprété comme une paire de clé et valeur.\n" +"[codeblock]\n" +"# Affiche : L'utilisateur 42 est Godot.\n" +"print(\"L'utilisateur {} est {}.\".format([42, \"Godot\"], \"{}\"))\n" +"print(\"L'utilisateur {id} est {name}.\".format([[\"id\", 42], [\"name\", " +"\"Godot\"]]))\n" +"[/codeblock]" #: doc/classes/String.xml msgid "If the string is a valid file path, returns the base directory name." @@ -72600,6 +74173,15 @@ msgid "" "print(\"i/am/example/string\".get_slice(\"/\", 2)) # Prints 'example'.\n" "[/codeblock]" msgstr "" +"Divise une chaîne en utilisant un [code]delimiter[/code] et retourne une " +"sous-chaîne à l'index [code]slice[/code]. Retourne une chaîne vide si " +"l'index n'existe pas.\n" +"Il s'agit d'une alternative plus performante à [method split] pour les cas " +"où vous avez besoin d'un seul élément du tableau à un index fixe.\n" +"Exemple :\n" +"[codeblock]\n" +"print(\"je/suis/un/exemple\".get_slice(\"/\", 3)) # Affiche 'exemple'.\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72609,6 +74191,13 @@ msgid "" "does [i]not[/i] imply the strings are equal, because different strings can " "have identical hash values due to hash collisions." msgstr "" +"Retourne la valeur de hachage de 32 bits représentant le contenu de la " +"chaîne.\n" +"[b]Note :[/b] Les [String] avec un contenu identique produiront toujours des " +"valeurs de hachage identiques. Cependant, l'inverse n'est pas vrai. Des " +"valeurs de hachage identiques n'implique [i]pas[/i] que les chaînes le " +"soient aussi, car différentes chaînes peuvent avoir des valeurs de hachage " +"identiques en raison de collisions de hachage." #: doc/classes/String.xml msgid "" @@ -72651,6 +74240,12 @@ msgid "" "http_unescape())\n" "[/codeblock]" msgstr "" +"Échappe (décode) une chaine dans le format encodé pour les URL. Également " +"dénommé \"URL decode\".\n" +"[codeblock]\n" +"print(\"https://example.org/?escaped=\" + \"Godot%20Engine%3A%27docs%27\"." +"http_unescape())\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72664,6 +74259,16 @@ msgid "" "print(size) # prints \"127.5 MiB\"\n" "[/codeblock]" msgstr "" +"Convertit [code]size[/code] qui représente un taille en octets dans un " +"format lisible en utilisant un ensemble internationalisé d'unités de taille " +"de données, comme : o, Kio, Mio, Gio, Tio, Pio, Eio. Notez que l'unité " +"proche la plus petite est choisie automatiquement pour s'adapter aux " +"multiples de 1024.\n" +"[codeblock]\n" +"var bytes = 133790307\n" +"var size = String.humanize_size(bytes)\n" +"print(size) # Affiche \"127.5 Mio\"\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72674,6 +74279,14 @@ msgid "" "e.g. [code]\"# \"[/code]. See also [method dedent] to remove indentation.\n" "[b]Note:[/b] Empty lines are kept empty." msgstr "" +"Retourne une copie de la chaîne avec des lignes identées avec [code]prefix[/" +"code].\n" +"Par exemple, la chaîne peut être identée avec deux tabulations en utilisant " +"[code]\"\\t\\t\"[/code], ou quatre espaces en utilisant [code]\" \"[/" +"code]. Le préfixe peut être n'importe quelle chaîne de sorte qu'il peut " +"également être utilisé pour commenter les chaînes avec par exemple [code]\"# " +"\"[/code]. Voir aussi [method dedent] pour supprimer l'indentation.\n" +"[b]Note :[/b] Les lignes vides sont gardées vides." #: doc/classes/String.xml msgid "" @@ -72688,18 +74301,24 @@ msgid "" "If the string is a path to a file or directory, returns [code]true[/code] if " "the path is absolute." msgstr "" +"Si la chaîne est un chemin vers un fichier ou un dossier, retourne " +"[code]true[/code] si le chemin est absolu." #: doc/classes/String.xml msgid "" "If the string is a path to a file or directory, returns [code]true[/code] if " "the path is relative." msgstr "" +"Si la chaîne est un chemin vers un fichier ou un dossier, retourne " +"[code]true[/code] si le chemin est relatif." #: doc/classes/String.xml msgid "" "Returns [code]true[/code] if this string is a subsequence of the given " "string." msgstr "" +"Retourne [code]true[/code] si cette chaîne est une sous-séquence de la " +"chaîne donnée." #: doc/classes/String.xml msgid "" @@ -72715,6 +74334,9 @@ msgid "" "allowed in file names, those being:\n" "[code]: / \\ ? * \" | % < >[/code]" msgstr "" +"Retourne [code]true[/code] si cette chaîne est libre des caractères qui ne " +"sont pas autorisés dans les noms de fichiers, ceux-ci étant :\n" +"[code]: / \\ ? * \" | % < >[/code]" #: doc/classes/String.xml msgid "" @@ -72727,6 +74349,14 @@ msgid "" "print(\"Hello\".is_valid_float()) # Prints \"False\"\n" "[/codeblock]" msgstr "" +"Retourne [code]true[/code] si cette chaîne contient un flottant valide. Ceci " +"inclut les entiers, et supporte aussi les exposants :\n" +"[codeblock]\n" +"print(\"1.7\".is_valid_float()) # Affiche \"True\"\n" +"print(\"24\".is_valid_float()) # Affiche \"True\"\n" +"print(\"7e3\".is_valid_float()) # Affiche \"True\"\n" +"print(\"Hello\".is_valid_float()) # Affiche \"False\"\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72735,6 +74365,10 @@ msgid "" "the hexadecimal number is determined by [code]0x[/code] prefix, for " "instance: [code]0xDEADC0DE[/code]." msgstr "" +"Retourne [code]true[/code] si cette chaîne contient un numéro hexadécimal " +"valide. Si [code]with_prefix[/code] est [code]true[/code], alors le nombre " +"hexadécimal doit commencer par [code]0x[/code] pour être valide, comme par " +"exemple : [code]0xDEADC0DE[/code]." #: doc/classes/String.xml msgid "" @@ -72743,6 +74377,11 @@ msgid "" "[code]hsl()[/code] colors aren't considered valid by this method and will " "return [code]false[/code]." msgstr "" +"Retourne [code]true[/code] si cette chaîne contient une couleur valide dans " +"la notation HTML hexadécimale. D'autres notations HTML telles que les " +"couleurs nommées ou l'utilisation de [code]hsl()[/code] ne sont pas " +"considérées comme valides par cette méthode et retourneront toujours " +"[code]false[/code]." #: doc/classes/String.xml msgid "" @@ -72755,6 +74394,15 @@ msgid "" "print(\"bad_ident_#2\".is_valid_identifier()) # Prints \"False\"\n" "[/codeblock]" msgstr "" +"Retourne [code]true[/code] si cette chaîne est un identifiant valide. Un " +"identifiant valide ne peut contenir que des lettres, des chiffres et des " +"underlines ([code]_[/code]) et le premier caractère ne peut pas être un " +"chiffre. Ça représente un nom valide d'une variable ou d'une méthode.\n" +"[codeblock]\n" +"print(\"good_ident_1\".is_valid_identifier()) # Affiche \"True\"\n" +"print(\"1st_bad_ident\".is_valid_identifier()) # Affiche \"False\"\n" +"print(\"bad_ident_#2\".is_valid_identifier()) # Affiche \"False\"\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72767,6 +74415,14 @@ msgid "" "print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" +"Retourne [code]true[/code] si cette chaîne contient un entier valide.\n" +"[codeblock]\n" +"print(\"7\".is_valid_integer()) # Affiche \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Affiche \"False\"\n" +"print(\"L\".is_valid_integer()) # Affiche \"False\"\n" +"print(\"+3\".is_valid_integer()) # Affiche \"True\"\n" +"print(\"-12\".is_valid_integer()) # Affiche \"True\"\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72775,6 +74431,10 @@ msgid "" "Reserved_IP_addresses]reserved IP addresses[/url] such as [code]0.0.0.0[/" "code] as valid." msgstr "" +"Retourne [code]true[/code] si cette chaîne contient seulement une adresse " +"IPv4 ou IPv6 correctement formée. Cette méthode considère [url=https://en." +"wikipedia.org/wiki/Reserved_IP_addresses]les adresses IP réservées[/url] " +"comme [code]0.0.0.0[/code] comme étant valides." #: doc/classes/String.xml msgid "" @@ -72785,6 +74445,14 @@ msgid "" "print(\", \".join([\"One\", \"Two\", \"Three\", \"Four\"]))\n" "[/codeblock]" msgstr "" +"Retourner une [String] qui est la concaténation des éléments [code]parts[/" +"code]. Le séparateur entre les éléments est la chaîne qui appelle cette " +"méthode.\n" +"Exemple :\n" +"[codeblock]\n" +"print(\", \".join([\"Un\", \"deux\", \"trois\", \"quatre.\"])) # Affiche " +"\"Un, deux, trois, quatre.\"\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -72819,6 +74487,11 @@ msgid "" "single character except a period ([code]\".\"[/code]). An empty string or " "empty expression always evaluates to [code]false[/code]." msgstr "" +"Fait une correspondance simple de l'expression sensible à la casse, où " +"[code]\"*\"[/code] correspond aucun, un seul ou plusieurs caractères " +"arbitraires, et [code]\"?\"[/code] correspond à un seule caracètre sauf un " +"point ([code]\".\"[/code]). Une chaîne ou expression vide est toujours " +"évaluée [code]false[/code]." #: doc/classes/String.xml msgid "" @@ -72827,10 +74500,15 @@ msgid "" "single character except a period ([code]\".\"[/code]). An empty string or " "empty expression always evaluates to [code]false[/code]." msgstr "" +"Fait une correspondance simple de l'expression insensible à la casse, où " +"[code]\"*\"[/code] correspond aucun, un seul ou plusieurs caractères " +"arbitraires, et [code]\"?\"[/code] correspond à un seule caracètre sauf un " +"point ([code]\".\"[/code]). Une chaîne ou expression vide est toujours " +"évaluée [code]false[/code]." #: doc/classes/String.xml msgid "Returns the MD5 hash of the string as an array of bytes." -msgstr "" +msgstr "Retourne le hachage MD5 de la chaîne dans un tableau d'octets." #: doc/classes/String.xml msgid "Returns the MD5 hash of the string as a string." @@ -72912,6 +74590,9 @@ msgid "" "Percent-encodes a string. Encodes parameters in a URL when sending a HTTP " "GET request (and bodies of form-urlencoded POST requests)." msgstr "" +"Encode avec des pourcentages une chaîne. Encode les paramètres dans une URL " +"lors de l'envoi d'une requête HTTP GET (et les corps de requêtes POST sous " +"forme codée)." #: doc/classes/String.xml msgid "" @@ -72919,6 +74600,9 @@ msgid "" "the string as a subpath. E.g. [code]\"this/is\".plus_file(\"path\") == " "\"this/is/path\"[/code]." msgstr "" +"Si la chaîne est un chemin, ajoute [code]file[/code] à la fin de la chaîne " +"comme sous-chemin. Par exemple : [code]\"vers/un\".plus_file(\"fichier\") == " +"\"vers/un/fichier\"[/code]." #: doc/classes/String.xml msgid "" @@ -72967,11 +74651,15 @@ msgstr "" "donnée." #: doc/classes/String.xml +#, fuzzy 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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -73010,6 +74698,12 @@ msgid "" "trim_suffix] method that will remove a single suffix string rather than a " "set of characters." msgstr "" +"Retourne une copie de la chaîne avec des caractères retirés de la droite. " +"L'argument [code]chars[/code] est une chaîne spécifiant l'ensemble des " +"caractères à supprimer.\n" +"[b]Note :[/b] [code]chars[/code] n'est pas un suffixe. Voir la méthode " +"[method trim_suffix] qui supprimera une seule chaîne de suffixe plutôt qu'un " +"ensemble de caractères." #: doc/classes/String.xml msgid "Returns the SHA-1 hash of the string as an array of bytes." @@ -73064,9 +74758,13 @@ msgid "Returns a simplified canonical path." msgstr "" #: doc/classes/String.xml +#, fuzzy msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -73104,12 +74802,20 @@ msgstr "" "utilisez plutôt la classe [RegEx]." #: doc/classes/String.xml +#, fuzzy 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" +"Divise la chaîne en flottants en utilisant une chaîne comme délimiteur et " +"retourne un tableau des sous-chaînes.\n" +"Par exemple, [code]\"12,5,3\"[/code] retournera [code][1, 2.5, 3][/code] si " +"délimité par [code]\",\"[/code]." #: doc/classes/String.xml msgid "" @@ -73118,6 +74824,10 @@ msgid "" "end. The optional arguments are used to toggle stripping on the left and " "right edges respectively." msgstr "" +"Retourne une copie de la chaîne avec tous les caractères non imprimable " +"(soient les tabulations, les espaces et les retours à la ligne) supprimés en " +"début et en fin de chaîne. Les arguments optionnels permettent d'activer ou " +"non la suppression des caractères en début ou en fin respectivement." #: doc/classes/String.xml msgid "" @@ -73126,6 +74836,11 @@ msgid "" "32), such as tabulation ([code]\\t[/code] in C) and newline ([code]\\n[/" "code] and [code]\\r[/code]) characters, but not spaces." msgstr "" +"Retourne une copie de la chaîne avec tous les caractères d'échappement " +"supprimés. Il s'agit de tous les caractères de commande non-imprimables de " +"la première page de la table ASCII (< 32), tels que la tabulation " +"([code]\\t[/code] in C) et le retour à la ligne ([code]\\n[/code] et " +"[code]\\r[/code]), mais pas les espaces." #: doc/classes/String.xml msgid "" @@ -73133,6 +74848,10 @@ msgid "" "[code]len[/code]. Argument [code]len[/code] is optional and using [code]-1[/" "code] will return remaining characters from given position." msgstr "" +"Retourne une partie de la chaîne de la position [code]from[/code] avec la " +"longueur [code]len[/code]. L'argument [code]len[/code] est optionnel et " +"l'utilisation [code]-1[/code] renvoie les caractères restants à partir de la " +"position donnée." #: doc/classes/String.xml msgid "" @@ -73158,6 +74877,16 @@ msgid "" "print(\"1e3\".to_float()) # 1000\n" "[/codeblock]" msgstr "" +"Convertit une chaîne contenant un nombre décimal en [code]float[/code]. La " +"méthode s'arrêtera sur le premier caractère qui n'est pas un chiffre sauf le " +"premier [code].[/code] (point décimal), et [code]e[/code] qui est utilisé " +"pour l'exposant.\n" +"[codeblock]\n" +"print(\"12.3\".to_float()) # 12.3\n" +"print(\"1.2.3\".to_float()) # 1.2\n" +"print(\"12ab3\".to_float()) # 12\n" +"print(\"1e3\".to_float()) # 1*10^3 = 1000\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -73170,6 +74899,14 @@ msgid "" "print(\"1.2.3\".to_int()) # 1\n" "[/codeblock]" msgstr "" +"Convertit une chaîne contenant un nombre entier en [code]int[/code]. La " +"méthode supprimera tout caractère qui n'est pas un chiffre et s'arrêtera si " +"elle rencontre un [code].[/code].\n" +"[codeblock]\n" +"print(\"123\".to_int()) # 123\n" +"print(\"a1b2c3\".to_int()) # 123\n" +"print(\"1.2.3\".to_int()) # 1\n" +"[/codeblock]" #: doc/classes/String.xml msgid "Returns the string converted to lowercase." @@ -73196,6 +74933,8 @@ msgid "" "Converts the String (which is an array of characters) to [PoolByteArray] " "(which is an array of bytes)." msgstr "" +"Convertit la String (qui est un tableau de caractères) en [PoolByteArray] " +"(un tableau d'octets)." #: doc/classes/String.xml msgid "" @@ -73219,6 +74958,9 @@ msgid "" "([code].[/code] [code]:[/code] [code]@[/code] [code]/[/code] [code]\"[/" "code])." msgstr "" +"Supprimer les caractères de la chaîne qui sont interdits dans les noms de " +"[Node] ([code].[/code] [code]:[/code] [code]@[/code] [code]/[/code] et " +"[code]\"[/code])." #: doc/classes/String.xml msgid "" @@ -73274,6 +75016,8 @@ msgid "" "Returns the [CanvasItem] that handles its [constant CanvasItem." "NOTIFICATION_DRAW] or [method CanvasItem._draw] callback at this moment." msgstr "" +"Retourne le [CanvasItem] qui gère sa [constant CanvasItem.NOTIFICATION_DRAW] " +"ou sa méthode [method CanvasItem._draw] actuellement." #: doc/classes/StyleBox.xml msgid "Returns the default value of the specified [enum Margin]." @@ -73284,6 +75028,9 @@ msgid "" "Returns the content margin offset for the specified [enum Margin].\n" "Positive values reduce size inwards, unlike [Control]'s margin values." msgstr "" +"Retourne le décalage de la marge de contenu pour la [enum Margin] spécifié.\n" +"Les valeurs positives réduisent la taille vers l'intérieur, contrairement " +"aux valeurs des marges de [Control]." #: doc/classes/StyleBox.xml msgid "Returns the minimum size that this stylebox can be shrunk to." @@ -73297,6 +75044,9 @@ msgid "" "equivalent to [code]Vector2(style.get_margin(MARGIN_LEFT), style." "get_margin(MARGIN_TOP))[/code]." msgstr "" +"Retourne le \"décalage\" d'une boîte de style. Cette fonction d'aide " +"retourne une valeur équivalente à [code]Vector2(style." +"get_margin(MARGIN_LEFT), style.get_margin(MARGIN_TOP))[/code]." #: doc/classes/StyleBox.xml msgid "" @@ -73333,6 +75083,9 @@ msgid "" "reduces the space available to the contents from the left.\n" "Refer to [member content_margin_bottom] for extra considerations." msgstr "" +"La marge gauche pour le contenu de cette boîte de style. L'augmentation de " +"cette valeur réduit l'espace disponible pour le contenu sur la gauche.\n" +"Voir [membrer content_margin_bottom] pour des considérations supplémentaires." #: doc/classes/StyleBox.xml msgid "" @@ -73340,6 +75093,9 @@ msgid "" "reduces the space available to the contents from the right.\n" "Refer to [member content_margin_bottom] for extra considerations." msgstr "" +"La marge droite pour le contenu de cette boîte de style. L'augmentation de " +"cette valeur réduit l'espace disponible pour le contenu sur la droite.\n" +"Voir [membrer content_margin_bottom] pour des considérations supplémentaires." #: doc/classes/StyleBox.xml msgid "" @@ -73347,6 +75103,9 @@ msgid "" "reduces the space available to the contents from the top.\n" "Refer to [member content_margin_bottom] for extra considerations." msgstr "" +"La marge supérieure pour le contenu de cette boîte de style. Augmenter cette " +"valeur réduit l'espace disponible pour le contenu en haut.\n" +"Voir [membrer content_margin_bottom] pour des considérations supplémentaires." #: doc/classes/StyleBoxEmpty.xml msgid "Empty stylebox (does not display anything)." @@ -73680,6 +75439,8 @@ msgid "" "The shadow offset in pixels. Adjusts the position of the shadow relatively " "to the stylebox." msgstr "" +"Le décalage de l'ombre en pixels. Ajuste la position de l'ombre relativement " +"à la boîte de style." #: doc/classes/StyleBoxFlat.xml msgid "The shadow size in pixels." @@ -73709,6 +75470,8 @@ msgid "" "[StyleBox] that displays a single line of a given color and thickness. It " "can be used to draw things like separators." msgstr "" +"Une [StyleBox] qui affiche simplement une ligne de couleur et d'épaisseur " +"données. Ça peut être utilisé pour dessiner des séparateurs par exemple." #: doc/classes/StyleBoxLine.xml msgid "The line's color." @@ -73773,12 +75536,18 @@ msgid "" "Controls how the stylebox's texture will be stretched or tiled horizontally. " "See [enum AxisStretchMode] for possible values." msgstr "" +"Contrôle la façon dont la texture de la boîte de style sera étirée ou " +"répétée horizontalement. Voir [enum AxisStretchMode] pour les valeurs " +"possibles." #: doc/classes/StyleBoxTexture.xml msgid "" "Controls how the stylebox's texture will be stretched or tiled vertically. " "See [enum AxisStretchMode] for possible values." msgstr "" +"Contrôle la façon dont la texture de la boîte de style sera étirée ou " +"répétée verticalement. Voir [enum AxisStretchMode] pour les valeurs " +"possibles." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -73790,18 +75559,24 @@ msgid "" "Expands the bottom margin of this style box when drawing, causing it to be " "drawn larger than requested." msgstr "" +"Augmente la marge du bas de cette boite de style lors de l'affichage, pour " +"qu'elle soit plus grande que demandé." #: doc/classes/StyleBoxTexture.xml msgid "" "Expands the left margin of this style box when drawing, causing it to be " "drawn larger than requested." msgstr "" +"Augmente la marge gauche de cette boite de style lors de l'affichage, pour " +"qu'elle soit plus grande que demandé." #: doc/classes/StyleBoxTexture.xml msgid "" "Expands the right margin of this style box when drawing, causing it to be " "drawn larger than requested." msgstr "" +"Augmente la marge droite de cette boite de style lors de l'affichage, pour " +"qu'elle soit plus grande que demandé." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -73819,6 +75594,12 @@ msgid "" "This is also the value used as fallback for [member StyleBox." "content_margin_bottom] if it is negative." msgstr "" +"Augmente la marge inférieure de la boîte de texture en 3×3.\n" +"Une valeur plus élevée signifie qu'une plus grande partie de la texture " +"source est considérée comme faisant partie de la bordure inférieure de la " +"boîte en 3×3.\n" +"C'est aussi la valeur de repli utilisée pour [member StyleBox." +"content_margin_bottom] si elle est négative." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -73828,6 +75609,12 @@ msgid "" "This is also the value used as fallback for [member StyleBox." "content_margin_left] if it is negative." msgstr "" +"Augmente la marge gauche de la boîte de texture en 3×3.\n" +"Une valeur plus élevée signifie qu'une plus grande partie de la texture " +"source est considérée comme faisant partie de la bordure gauche de la boîte " +"3×3.\n" +"C'est aussi la valeur de repli utilisée pour [member StyleBox." +"content_margin_left] si elle est négative." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -73837,6 +75624,12 @@ msgid "" "This is also the value used as fallback for [member StyleBox." "content_margin_right] if it is negative." msgstr "" +"Augmente la marge droite de la boîte de texture en 3×3.\n" +"Une valeur plus élevée signifie qu'une plus grande partie de la texture " +"source est considérée comme faisant partie de la droite frontière de la " +"boîte 3×3.\n" +"C'est aussi la valeur de repli utilisée pour [member StyleBox." +"content_margin_right] si elle est négative." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -73846,10 +75639,17 @@ msgid "" "This is also the value used as fallback for [member StyleBox." "content_margin_top] if it is negative." msgstr "" +"Augmente la marge supérieure de la boîte de texture en 3×3.\n" +"Une valeur plus élevée signifie qu'une plus grande partie de la texture " +"source est considérée comme faisant partie de la bordure supérieure de la " +"boîte 3×3.\n" +"C'est aussi la valeur de repli utilisée pour [member StyleBox." +"content_margin_top] si elle est négative." #: doc/classes/StyleBoxTexture.xml msgid "Modulates the color of the texture when this style box is drawn." msgstr "" +"Module la couleur de la texture lorsque cette boîte de style est dessinée." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -73866,6 +75666,9 @@ msgid "" "This is equivalent to first wrapping the texture in an [AtlasTexture] with " "the same region." msgstr "" +"Spécifié la sous-région de la texture à utiliser.\n" +"C'est l'équivalent à d'abord mettre la texture dans un [AtlasTexture] avec " +"la même région." #: doc/classes/StyleBoxTexture.xml msgid "The texture to use when drawing this style box." @@ -73880,6 +75683,9 @@ msgid "" "Stretch the stylebox's texture. This results in visible distortion unless " "the texture size matches the stylebox's size perfectly." msgstr "" +"Étire la texture de la boîte de style. Cela entraîne une distorsion visible " +"à moins que la taille de la texture ne corresponde parfaitement à la taille " +"de la boîte de style." #: doc/classes/StyleBoxTexture.xml msgid "" @@ -74004,6 +75810,10 @@ msgid "" "current index (if also using index arrays) should use smooth normals for " "normal calculation." msgstr "" +"Spécifie si les sommets actuels (uniquement si seulement des tableaux de " +"sommets sont utilisés) ou l'index courant (si des tableaux d'index sont " +"également utilisés) devraient utiliser des normales lisses dans le calcul " +"des normales." #: doc/classes/SurfaceTool.xml msgid "" @@ -74080,6 +75890,8 @@ msgid "" "Called before adding any vertices. Takes the primitive type as an argument " "(e.g. [constant Mesh.PRIMITIVE_TRIANGLES])." msgstr "" +"Appelé avant d'ajouter des sommets. Cela prend le type primitif comme " +"argument (par exemple [constant Mesh. PRIMITIVE_TRIANGES])." #: doc/classes/SurfaceTool.xml msgid "Clear all information passed into the surface tool so far." @@ -74214,6 +76026,9 @@ msgid "" "Returns [code]-1[/code] if the point is outside the control boundaries or if " "there's no tab at the queried position." msgstr "" +"Retourne l'index de l'onglet aux coordonnées [code]point[/code] locales. " +"Retourne [code]-1[/code] si le point est en dehors des limites du contrôle " +"ou s'il n'y a pas d'onglet à la position demandée." #: doc/classes/TabContainer.xml msgid "" @@ -74221,16 +76036,22 @@ msgid "" "default to the name of the indexed child node, but this can be overridden " "with [method set_tab_title]." msgstr "" +"Retourne le titre de l'onglet à l'index [code]tab_idx[/code]. Le titres des " +"onglets sont par défaut le nom des nÅ“uds enfants indexés, mais ça peut être " +"changé avec [method set_tab_title]." #: doc/classes/TabContainer.xml msgid "Returns the [TabContainer] rearrange group id." -msgstr "" +msgstr "Retourne l'identifiant du groupe de réarrangement du [TabContainer]." #: doc/classes/TabContainer.xml 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 "" +"Si défini sur une instance de nÅ“ud [Popup], une icône de menu apparaît dans " +"le coin supérieur droit du [TabContainer]. En cliquant dessus, le nÅ“ud " +"[Popup] sera développé." #: doc/classes/TabContainer.xml doc/classes/Tabs.xml msgid "" @@ -74257,6 +76078,8 @@ msgid "" "Sets a title for the tab at index [code]tab_idx[/code]. Tab titles default " "to the name of the indexed child node." msgstr "" +"Définit un titre pour l'onglet à l'index [code]tab_idx[/code]. Les titres " +"par défaut des onglets sont le nom des nÅ“ud indexés." #: doc/classes/TabContainer.xml msgid "" @@ -74264,12 +76087,18 @@ msgid "" "enable tab drag between [TabContainer]. Enable drag with [member " "drag_to_rearrange_enabled]." msgstr "" +"Définit l'identifiant de groupe de réarrangement, choisissez pour chaque " +"[TabContainer] la même valeur pour activer le déposé-glissé entre les " +"[TabContainer]. Activer le déposé-glissé avec [member " +"drag_to_rearrange_enabled]." #: doc/classes/TabContainer.xml msgid "" "If [code]true[/code], all tabs are drawn in front of the panel. If " "[code]false[/code], inactive tabs are drawn behind the panel." msgstr "" +"Si [code]true[/code], tous les onglets sont dessinés devant le panneau. Si " +"[code]false[/code], les onglets inactifs sont dessinés derrière le panneau." #: doc/classes/TabContainer.xml msgid "" @@ -74277,6 +76106,9 @@ msgid "" "[code]visible[/code] property is set to [code]true[/code] and all others are " "set to [code]false[/code]." msgstr "" +"L'index actuel de l'onglet. Quand définie, cette propriété [code]visible[/" +"code] du nÅ“ud [Control] pour cet index sera mis à [code]true[/code] et " +"toutes les autres seront à [code]false[/code]." #: doc/classes/TabContainer.xml doc/classes/Tabs.xml msgid "If [code]true[/code], tabs can be rearranged with mouse drag." @@ -74306,6 +76138,9 @@ msgid "" "minimum size take into account in the total, instead of only the currently " "visible one." msgstr "" +"Si [code]true[/code], les nÅ“uds [Control] enfants qui sont cachés auront " +"leur taille minimale qui sera prise en compte dans le total, au lieu de " +"seulement celle actuellement visible." #: doc/classes/TabContainer.xml msgid "" @@ -74365,6 +76200,10 @@ msgid "" "fit in the container width. When the button is disabled (i.e. the first tab " "is visible), it appears semi-transparent." msgstr "" +"L'icône pour le bouton flèche de gauche qui apparaît quand il y a trop " +"d'onglets à afficher dans le conteneur. Lorsque le bouton est désactivé " +"(c'est-à -dire le premier onglet est visible), il apparaît en semi-" +"transparent." #: doc/classes/TabContainer.xml doc/classes/Tabs.xml msgid "" @@ -74372,6 +76211,9 @@ msgid "" "fit in the container width. Used when the button is being hovered with the " "cursor." msgstr "" +"L'icône pour le bouton flèche de gauche qui apparaît quand il y a trop " +"d'onglets à afficher dans le conteneur. Utilisé quand le bouton est survolé " +"par le curseur." #: doc/classes/TabContainer.xml doc/classes/Tabs.xml msgid "" @@ -74379,6 +76221,10 @@ msgid "" "fit in the container width. When the button is disabled (i.e. the last tab " "is visible) it appears semi-transparent." msgstr "" +"L'icône pour le bouton flèche de droite qui apparaît quand il y a trop " +"d'onglets à afficher dans le conteneur. Lorsque le bouton est désactivé " +"(c'est-à -dire le dernier onglet est visible), il apparaît en semi-" +"transparent." #: doc/classes/TabContainer.xml doc/classes/Tabs.xml msgid "" @@ -74386,6 +76232,9 @@ msgid "" "fit in the container width. Used when the button is being hovered with the " "cursor." msgstr "" +"L'icône pour le bouton flèche de droite qui apparaît quand il y a trop " +"d'onglets à afficher dans le conteneur. Utilisé quand le bouton est survolé " +"par le curseur." #: doc/classes/TabContainer.xml msgid "The icon for the menu button (see [method set_popup])." @@ -74434,13 +76283,16 @@ msgstr "Ajoute un nouvel onglet." #: doc/classes/Tabs.xml msgid "Moves the scroll view to make the tab visible." -msgstr "" +msgstr "Déplace la vue de défilement pour rendre l'onglet visible." #: doc/classes/Tabs.xml 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 "" +"Retourne [code]true[/code] si les boutons de décalage (les boutons qui " +"apparaissent lorsqu'il n'y a pas assez d'espace pour tous les onglets) sont " +"visibles." #: doc/classes/Tabs.xml msgid "Returns [code]true[/code] if select with right mouse button is enabled." @@ -74448,8 +76300,13 @@ msgstr "" "Retourne [code]true[/code] si la sélection avec le clic-droit est actif." #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Retourne le titre de l'onglet à la position [code]idx[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." -msgstr "" +msgstr "Retourne le nombre d'onglets cachés décalés vers la gauche." #: doc/classes/Tabs.xml msgid "Returns tab [Rect2] with local position and size." @@ -74461,7 +76318,7 @@ msgstr "Retourne le titre de l'onglet à la position [code]idx[/code]." #: doc/classes/Tabs.xml msgid "Returns the [Tabs]' rearrange group ID." -msgstr "" +msgstr "Retourne l'identifiant de groupe du [Tab]." #: doc/classes/Tabs.xml msgid "Moves a tab from [code]from[/code] to [code]to[/code]." @@ -74479,6 +76336,11 @@ msgstr "" "le clic droit." #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Définit une icône pour l'onglet à la position [code]tab_idx[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" "Définit une [code]icon[/code] pour l'onglet à la position [code]tab_idx[/" @@ -74506,6 +76368,8 @@ msgid "" "if [code]true[/code], the mouse's scroll wheel can be used to navigate the " "scroll view." msgstr "" +"si [code]true[/code], la roue de défilement de la souris permet de naviguer " +"dans la vue de défilement." #: doc/classes/Tabs.xml msgid "The alignment of all tabs. See [enum TabAlign] for details." @@ -74517,6 +76381,8 @@ msgid "" "Sets when the close button will appear on the tabs. See [enum " "CloseButtonDisplayPolicy] for details." msgstr "" +"Définit lorsque le bouton de fermeture apparaîtra sur les onglets. Voir " +"[enum CloseButtonDisplayPolicy] pour plus de détails." #: doc/classes/Tabs.xml msgid "" @@ -74527,8 +76393,12 @@ msgstr "" "drag_to_rearrange_enabled]." #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." -msgstr "Émis quand un onglet a été cliqué-droit." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." +msgstr "" +"Émis lorsqu'un bouton personnalisé est pressé. Voir [method add_button]." #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -74597,6 +76467,8 @@ msgid "" "A TCP server. Listens to connections on a port and returns a [StreamPeerTCP] " "when it gets an incoming connection." msgstr "" +"Un serveur TCP. Ecoute les connexions sur un port et retourne un " +"[StreamPeerTCP] quand il obtient une connexion entrante." #: doc/classes/TCP_Server.xml msgid "Returns [code]true[/code] if a connection is available for taking." @@ -74654,6 +76526,7 @@ msgstr "" #: doc/classes/TextEdit.xml msgid "Adds color region (given the delimiters) and its colors." msgstr "" +"Ajoute une région de couleur (à partir des délimiteurs) et ses couleurs." #: doc/classes/TextEdit.xml msgid "Adds a [code]keyword[/code] and its [Color]." @@ -74664,18 +76537,25 @@ msgid "" "Returns if the given line is foldable, that is, it has indented lines right " "below it." msgstr "" +"Retourne si la ligne donnée peut être réduite, c'est-à -dire qu'elle indente " +"les lignes juste en dessous." #: doc/classes/TextEdit.xml msgid "" "Centers the viewport on the line the editing cursor is at. This also resets " "the [member scroll_horizontal] value to [code]0[/code]." msgstr "" +"Centre le fenêtre d'affichage sur la ligne où est le curseur d'édition. Cela " +"réinitialise également la valeur [member scroll_horizontal] à [code]0[/code]." #: doc/classes/TextEdit.xml msgid "" "Clears all custom syntax coloring information previously added with [method " "add_color_region] or [method add_keyword_color]." msgstr "" +"Efface toutes les informations de coloration de syntaxe personnalisées " +"précédemment ajoutées avec [method add_color_region] ou [method " +"add_keyword_color]." #: doc/classes/TextEdit.xml msgid "Clears the undo history." @@ -74699,6 +76579,9 @@ msgid "" "If [code]adjust_viewport[/code] is set to [code]true[/code], the viewport " "will center at the cursor position after the move occurs." msgstr "" +"Déplace le curseur à l'index [code]column[/code] spécifié.\n" +"Si [code]adjust_viewport[/code] est défini à [code]true[/code], le fenêtre " +"d'affichage se centrera à la position du curseur après le mouvement." #: doc/classes/TextEdit.xml msgid "" @@ -74720,10 +76603,11 @@ msgstr "Désélectionne la sélection actuelle." #: doc/classes/TextEdit.xml msgid "Folds all lines that are possible to be folded (see [method can_fold])." msgstr "" +"Réduit toutes les lignes qui peuvent être réduites (voir [method can_fold])." #: doc/classes/TextEdit.xml msgid "Folds the given line, if possible (see [method can_fold])." -msgstr "" +msgstr "Réduit la ligne donnée, si possible (voir [method can_fold])." #: doc/classes/TextEdit.xml msgid "Returns an array containing the line number of each breakpoint." @@ -74742,6 +76626,8 @@ msgid "" "Returns the line and column at the given position. In the returned vector, " "[code]x[/code] is the column, [code]y[/code] is the line." msgstr "" +"Retourne la ligne et la colonne à la position donnée. Dans le vecteur " +"retourné, [code]x[/code] est la colonne, [code]y[/code] est la ligne." #: doc/classes/TextEdit.xml msgid "Returns the amount of total lines in the text." @@ -74749,7 +76635,7 @@ msgstr "Retourne le nombre total de lignes dans le texte." #: doc/classes/TextEdit.xml msgid "Returns the height of a largest line." -msgstr "" +msgstr "Retourne la hauteur de la plus grande ligne." #: doc/classes/TextEdit.xml msgid "" @@ -74815,7 +76701,7 @@ msgstr "" #: doc/classes/TextEdit.xml msgid "Returns the total amount of lines that could be drawn." -msgstr "" +msgstr "Retourne le nombre total des lignes qui pourraient être affichées." #: doc/classes/TextEdit.xml msgid "Returns the number of visible lines, including wrapped text." @@ -74848,11 +76734,11 @@ msgstr "Insérer le texte spécifié à la position du curseur." #: doc/classes/TextEdit.xml msgid "Returns whether the line at the specified index is folded or not." -msgstr "" +msgstr "Retourne si la ligne à l'index spécifié est réduite ou non." #: doc/classes/TextEdit.xml msgid "Returns whether the line at the specified index is hidden or not." -msgstr "" +msgstr "Retourne si la ligne de l'index spécifié est cachée ou non." #: doc/classes/TextEdit.xml msgid "" @@ -74866,12 +76752,16 @@ msgid "" "Returns [code]true[/code] when the specified [code]line[/code] has a " "breakpoint." msgstr "" +"Retourne [code]true[/code] lorsque la ligne [code]line[/code] spécifié a un " +"point d'arrêt." #: doc/classes/TextEdit.xml msgid "" "Returns [code]true[/code] when the specified [code]line[/code] is marked as " "safe." msgstr "" +"Retourne [code]true[/code] lorsque la ligne [code]line[/code] spécifié est " +"marquée comme sûre." #: doc/classes/TextEdit.xml msgid "Returns if the given line is wrapped." @@ -74882,6 +76772,9 @@ msgid "" "Returns whether the mouse is over selection. If [code]edges[/code] is " "[code]true[/code], the edges are considered part of the selection." msgstr "" +"Retourne si la souris est sur la sélection. Si [code]edges[/code] est " +"[code]true[/code], les bords sont considérés comme faisant partie de la " +"sélection." #: doc/classes/TextEdit.xml msgid "Returns [code]true[/code] if the selection is active." @@ -74908,6 +76801,8 @@ msgid "" "Removes all the breakpoints. This will not fire the [signal " "breakpoint_toggled] signal." msgstr "" +"Retire tous les points d'arrêt. Cela n'émettra pas [signal " +"breakpoint_toggled]." #: doc/classes/TextEdit.xml msgid "" @@ -74942,6 +76837,9 @@ msgid "" "Perform selection, from line/column to line/column.\n" "If [member selecting_enabled] is [code]false[/code], no selection will occur." msgstr "" +"Effectue une sélection, de la ligne/colonne à la ligne/colonne.\n" +"Si [member selection_enabled] est [code]false[/code], aucune sélection ne " +"sera effectuée." #: doc/classes/TextEdit.xml msgid "" @@ -74962,9 +76860,9 @@ msgid "" "code]. Deletes the bookmark if [code]bookmark[/code] is [code]false[/code].\n" "Bookmarks are shown in the [member breakpoint_gutter]." msgstr "" -"Ajoute un marque-page pour la ligne [code]line[/code] si " -"[code]bookmark[/code] est [code]true[/code]. Supprime le marque-page si " -"[code]bookmark[/code] est [code]false[/code].\n" +"Ajoute un marque-page pour la ligne [code]line[/code] si [code]bookmark[/" +"code] est [code]true[/code]. Supprime le marque-page si [code]bookmark[/" +"code] est [code]false[/code].\n" "Les marque-pages sont affichés dans [member breakpoint_gutter]." #: doc/classes/TextEdit.xml @@ -74972,6 +76870,8 @@ msgid "" "Adds or removes the breakpoint in [code]line[/code]. Breakpoints are shown " "in the [member breakpoint_gutter]." msgstr "" +"Ajoute ou supprime le point d'arrêt à [code]line[/code]. Les points d'arrêt " +"sont indiqués dans le [member breakpoint_gutter]." #: doc/classes/TextEdit.xml msgid "If [code]true[/code], hides the line of the specified index." @@ -74983,10 +76883,13 @@ msgid "" "This will show the line number with the color provided in the " "[code]safe_line_number_color[/code] theme property." msgstr "" +"Si [code]true[/code], marque la [code]line[/code] comme sûre.\n" +"Cela montrera le numéro de ligne avec la couleur fournie dans la propriété " +"[code]safe_line_number_color[/code] du thème." #: doc/classes/TextEdit.xml msgid "Toggle the folding of the code block at the given line." -msgstr "" +msgstr "Réduit le bloc de code à la ligne donnée." #: doc/classes/TextEdit.xml msgid "Perform undo operation." @@ -75001,6 +76904,8 @@ msgid "" "Unhide all lines that were previously set to hidden by [method " "set_line_as_hidden]." msgstr "" +"Ré-affiche toutes les lignes qui étaient précédemment cachées par [method " +"set_line_as_hidden]." #: doc/classes/TextEdit.xml msgid "If [code]true[/code], the bookmark gutter is visible." @@ -75024,6 +76929,10 @@ msgid "" "before displaying the context menu.\n" "If [code]false[/code], the context menu disregards mouse location." msgstr "" +"Si [code]true[/code], un clic droit déplace le curseur à la position de la " +"souris avant d'afficher le menu contextuel.\n" +"Si [code]false[/code], la position du menu contextuel ignore l'emplacement " +"de la souris." #: doc/classes/TextEdit.xml msgid "If [code]true[/code], a right-click displays the context menu." @@ -75031,7 +76940,7 @@ msgstr "Si [code]true[/code], un clic droit affiche le menu contextuel." #: doc/classes/TextEdit.xml msgid "If [code]true[/code], allow drag and drop of selected text." -msgstr "" +msgstr "Si [code]true[/code], permet le déposé-glissé du texte sélectionné." #: doc/classes/TextEdit.xml msgid "" @@ -75056,6 +76965,8 @@ msgid "" "If [code]true[/code], all lines that have been set to hidden by [method " "set_line_as_hidden], will not be visible." msgstr "" +"Si [code]true[/code], toutes les lignes qui ont été cachées par [method " +"set_line_as_hidden] ne seront pas visibles." #: doc/classes/TextEdit.xml msgid "" @@ -75103,12 +77014,17 @@ msgid "" "If there is a horizontal scrollbar, this determines the current horizontal " "scroll value in pixels." msgstr "" +"S'il y a une barre de défilement horizontale, cela détermine le décalage de " +"défilement horizontal actuel en pixels." #: doc/classes/TextEdit.xml msgid "" "If there is a vertical scrollbar, this determines the current vertical " "scroll value in line numbers, starting at 0 for the top line." msgstr "" +"S'il y a une barre de défilement verticale, cela détermine le décalage de " +"défilement vertical actuel en nombres de lignes, en commençant par 0 pour la " +"ligne du haut." #: doc/classes/TextEdit.xml msgid "" @@ -75116,29 +77032,39 @@ msgid "" "If [code]false[/code], text can not be selected by the user or by the " "[method select] or [method select_all] methods." msgstr "" +"Si [code]true[/code], le texte peut être sélectionné.\n" +"Si [code]false[/code], le texte ne peut pas être sélectionné par " +"l'utilisateur ou par les méthodes [method select] ou [method select_all]." #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], shortcut keys for context menu items are enabled, even " "if the context menu is disabled." msgstr "" +"Si [code]true[/code], les touches de raccourcies pour les éléments de menu " +"contextuel sont activées, même si le menu contextuel est désactivé." #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], line numbers are displayed to the left of the text." msgstr "" +"Si [code]true[/code], les numéros de ligne sont affichés à gauche du texte." #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], sets the [code]step[/code] of the scrollbars to " "[code]0.25[/code] which results in smoother scrolling." msgstr "" +"Si [code]true[/code], définit le [code]step[/code] des barres de défilement " +"à [code]0.25[/code] qui permet de défiler plus facilement." #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], any custom color properties that have been set for " "this [TextEdit] will be visible." msgstr "" +"Si [code]true[/code], toutes les propriétés de couleur personnalisées qui " +"ont été définies pour ce [TextEdit] seront visibles." #: doc/classes/TextEdit.xml msgid "String value of the [TextEdit]." @@ -75153,6 +77079,8 @@ msgid "" "If [code]true[/code], enables text wrapping when it goes beyond the edge of " "what is visible." msgstr "" +"Si [code]true[/code], permet le retour à la ligne quand le texte dépasse ce " +"qui est visible." #: doc/classes/TextEdit.xml msgid "Emitted when a breakpoint is placed via the breakpoint gutter." @@ -75228,6 +77156,8 @@ msgid "" "Sets the [Color] of the breakpoints. [member breakpoint_gutter] has to be " "enabled." msgstr "" +"Définit la [Color] des points d'arrêt. [member breakpoint_gutter] doit être " +"activé." #: doc/classes/TextEdit.xml msgid "Sets the font [Color]." @@ -75353,18 +77283,28 @@ msgid "" "canvas_item_add_texture_rect] with a rect at [code]position[/code] and the " "size of this [Texture]." msgstr "" +"Dessine la texture en utilisant un [CanvasItem] avec l'API du [VisualServer] " +"à la [code]position[/code] spécifiée. Équivalent à [method VisualServer." +"canvas_item_add_texture_rect] avec un rectangle à [code]position[/code] et " +"la taille de cette [Texture]." #: doc/classes/Texture.xml msgid "" "Draws the texture using a [CanvasItem] with the [VisualServer] API. " "Equivalent to [method VisualServer.canvas_item_add_texture_rect]." msgstr "" +"Dessine la texture en utilisant un [CanvasItem] avec l'API du " +"[VisualServer]. Équivalent à [method VisualServer." +"canvas_item_add_texture_rect]." #: doc/classes/Texture.xml msgid "" "Draws a part of the texture using a [CanvasItem] with the [VisualServer] " "API. Equivalent to [method VisualServer.canvas_item_add_texture_rect_region]." msgstr "" +"Dessine une partie de la texture en utilisant un [CanvasItem] avec l'API du " +"[VisualServer]. Équivalent à [method VisualServer." +"canvas_item_add_texture_rect_region]." #: doc/classes/Texture.xml msgid "" @@ -75389,12 +77329,16 @@ msgstr "Renvoie la largeur de texture." #: doc/classes/Texture.xml msgid "Returns [code]true[/code] if this [Texture] has an alpha channel." msgstr "" +"Retourne [code]true[/code] si cette [Texture] a une transparence (canal " +"alpha)." #: doc/classes/Texture.xml msgid "" "The texture's [enum Flags]. [enum Flags] are used to set various properties " "of the [Texture]." msgstr "" +"Les [enum Flags] de la texture. [enum Flags] sont utilisés pour définir " +"différentes propriétés de la [Texture]." #: doc/classes/Texture.xml msgid "" @@ -75418,10 +77362,14 @@ msgid "" "[b]Note:[/b] Ignored when using an [AtlasTexture] as these don't support " "repetition." msgstr "" +"Répète la texture (au lieu de la limiter aux bords).\n" +"[b]Note :[/b] Ignoré avec les [AtlasTexture] puisqu'ils ne supportent pas la " +"répétition." #: doc/classes/Texture.xml doc/classes/VisualServer.xml msgid "Uses a magnifying filter, to enable smooth zooming in of the texture." msgstr "" +"Utilise un filtre grossissant, pour permettre un zoom lisse sur la texture." #: doc/classes/Texture.xml doc/classes/TextureLayered.xml #: doc/classes/VisualServer.xml @@ -75430,6 +77378,10 @@ msgid "" "texture with different aspect ratios.\n" "This results in better-looking textures when viewed from oblique angles." msgstr "" +"Utilise le filtrage de mipmap anisotrope. Génère des versions plus petites " +"de la même texture avec différents ratios d'aspect.\n" +"Cela donne des textures plus jolies lorsqu'elles sont vues à partir d'angles " +"obliques." #: doc/classes/Texture.xml doc/classes/VisualServer.xml msgid "Converts the texture to the sRGB color space." @@ -75441,6 +77393,9 @@ msgid "" "[b]Note:[/b] Ignored when using an [AtlasTexture] as these don't support " "repetition." msgstr "" +"Répète la texture avec en alternant des sections en miroir.\n" +"[b]Note :[/b] Ignoré avec les [AtlasTexture] puisqu'ils ne supportent pas la " +"répétition." #: doc/classes/Texture.xml doc/classes/VisualServer.xml msgid "Texture is a video surface." @@ -75448,7 +77403,7 @@ msgstr "La texture est une surface vidéo." #: doc/classes/Texture3D.xml msgid "Texture with 3 dimensions." -msgstr "" +msgstr "Une texture à 3 dimensions." #: doc/classes/Texture3D.xml msgid "" @@ -75641,6 +77596,8 @@ msgid "" "Texture to display by default, when the node is [b]not[/b] in the disabled, " "focused, hover or pressed state." msgstr "" +"La texture à afficher par défault, quand le nÅ“ud n'est [b]pas[/b] dans " +"l'état désactivé, avec focus, survolé or pressé." #: doc/classes/TextureButton.xml msgid "" @@ -75648,6 +77605,9 @@ msgid "" "focus and the player presses the Enter key or if the player presses the " "[member BaseButton.shortcut] key." msgstr "" +"La texture à afficher quand la souris appuie sur le nÅ“ud, si quand le nÅ“ud a " +"le focus du clavier et que l'utilisateur appuie sur la touche Entrée, ou " +"quand l'utilisateur appuie sur la touche [member BaseButton.shortcut]." #: doc/classes/TextureButton.xml doc/classes/TextureRect.xml msgid "Scale to fit the node's bounding rectangle." @@ -76699,7 +78659,6 @@ msgid "If [code]true[/code], this TileMap bakes a navigation region." msgstr "" #: doc/classes/TileMap.xml -#, fuzzy msgid "If [code]true[/code], the cell's UVs will be clipped." msgstr "Si [code]true[/code], les UV de la cellule seront limités." @@ -78183,7 +80142,6 @@ msgid "Control to show a tree of items." msgstr "Un contrôle pour afficher l'arborescence d'éléments." #: doc/classes/Tree.xml -#, fuzzy 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, " @@ -79099,6 +81057,9 @@ msgid "" "using [method get_metadata]. This can be used, for example, to store a " "reference to the original data." msgstr "" +"Définit la valeur des métadonnées pour la colonne donnée, qui peut être " +"récupérée ultérieurement en utilisant [method get_metadata]. Cela peut être " +"utilisé, par exemple, pour stocker une référence aux données d'origine." #: doc/classes/TreeItem.xml msgid "Sets the value of a [constant CELL_MODE_RANGE] column." @@ -79111,6 +81072,10 @@ msgid "" "If [code]expr[/code] is [code]true[/code], the edit mode slider will use an " "exponential scale as with [member Range.exp_edit]." msgstr "" +"Définit la gamme de valeurs acceptées pour une colonne. La colonne doit être " +"dans le mode [constant CELL_MODE_RANGE].\n" +"Si [code]expr[/code] est [code]true[/code], le glisseur d'édition utilisera " +"une échelle exponentielle comme avec [member Range.exp_edit]." #: doc/classes/TreeItem.xml msgid "If [code]true[/code], the given column is selectable." @@ -79121,6 +81086,8 @@ msgid "" "Sets a string to be shown after a column's value (for example, a unit " "abbreviation)." msgstr "" +"Définit un texte à afficher après la valeur d'une colonne (par exemple, une " +"abréviation d'unité)." #: doc/classes/TreeItem.xml msgid "Sets the given column's text value." @@ -79131,6 +81098,8 @@ msgid "" "Sets the given column's text alignment. See [enum TextAlign] for possible " "values." msgstr "" +"Définit l'alignement du texte de la colonne donnée. Voir [enum TextAlign] " +"pour les valeurs possibles." #: doc/classes/TreeItem.xml msgid "Sets the given column's tooltip text." @@ -79240,6 +81209,15 @@ msgid "" "direction of the interpolation. See the class description for more " "information." msgstr "" +"Suit la méthode [code]method[/code] de [code]object[/code] et applique la " +"valeur retournée sur la méthode [code]target_method[/code] de [code]target[/" +"code], en partant de [code]initial_val[/code] pendant [code]duration[/code] " +"secondes, après [code]delay[/code] secondes. Les méthodes sont appelées avec " +"des valeurs consécutives.\n" +"Utilisez [enum TransitionType] pour le paramètres [code]trans_type[/code] et " +"[enum EaseType] pour [code]ease_type[/code]. Ces valeurs contrôlent le " +"comportement et la direction de l'interpolation. Voir la description de la " +"classe pour plus d'informations." #: doc/classes/Tween.xml msgid "" @@ -79252,6 +81230,14 @@ msgid "" "direction of the interpolation. See the class description for more " "information." msgstr "" +"Suit la propriété [code]property[/code] de [code]object[/code] et applique " +"la valeur retournée sur la propriété [code]target_property[/code] de " +"[code]target[/code], en partant de [code]initial_val[/code] pendant " +"[code]duration[/code] secondes, après [code]delay[/code] secondes.\n" +"Utilisez [enum TransitionType] pour le paramètres [code]trans_type[/code] et " +"[enum EaseType] pour [code]ease_type[/code]. Ces valeurs contrôlent le " +"comportement et la direction de l'interpolation. Voir la description de la " +"classe pour plus d'informations." #: doc/classes/Tween.xml msgid "" @@ -79259,6 +81245,10 @@ msgid "" "one lasting 10 seconds and the other 20 seconds, it would return 20 seconds, " "as by that time all tweens would have finished." msgstr "" +"Retourne le temps total nécessaire pour que tous les tweens finissent. Si " +"vous avez deux tweens, un de 10 secondes et les 20 autres secondes, il sera " +"retourné 20 secondes, car c'est la durée nécessaire pour que tous les tweens " +"se terminent." #: doc/classes/Tween.xml msgid "" @@ -79277,6 +81267,10 @@ msgid "" "[code]arg1[/code]-[code]arg5[/code] are arguments to be passed to the " "callback." msgstr "" +"Appelle la méthode [code]callback[/code] de [code]object[/code] après " +"[code]duration[/code] sur le fil d'exécution principal (similaire à [method " +"Object.call_deferred]). [code]arg1[/code]-[code]arg5[/code] sont les " +"arguments à passer lors de l'appel." #: doc/classes/Tween.xml msgid "" @@ -79289,6 +81283,14 @@ msgid "" "direction of the interpolation. See the class description for more " "information." msgstr "" +"Anime la méthode [code]method[/code] de [code]object[/code] de " +"[code]initial_val[/code] jusqu'à [code]final_val[/code] pendant " +"[code]duration[/code] secondes, après [code]delay[/code] secondes. Les " +"méthodes sont appelées avec des valeurs consécutives.\n" +"Utilisez [enum TransitionType] pour le paramètres [code]trans_type[/code] et " +"[enum EaseType] pour [code]ease_type[/code]. Ces valeurs contrôlent le " +"comportement et la direction de l'interpolation. Voir la description de la " +"classe pour plus d'informations." #: doc/classes/Tween.xml msgid "" @@ -79301,12 +81303,23 @@ msgid "" "direction of the interpolation. See the class description for more " "information." msgstr "" +"Anime la propriété [code]property[/code] de [code]object[/code] de " +"[code]initial_val[/code] jusqu'à [code]final_val[/code] pendant " +"[code]duration[/code] secondes, après [code]delay[/code] secondes. Définir " +"la valeur initiale à [code]null[/code] utilise l'actuelle valeur de la " +"propriété.\n" +"Utilisez [enum TransitionType] pour le paramètres [code]trans_type[/code] et " +"[enum EaseType] pour [code]ease_type[/code]. Ces valeurs contrôlent le " +"comportement et la direction de l'interpolation. Voir la description de la " +"classe pour plus d'informations." #: doc/classes/Tween.xml 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 "" +"Retourne [code]true[/code] si des tweens sont en cours d'exécution.\n" +"[b]Note :[/b] Cette méthode ne tient pas compte des tweens qui sont terminés." #: doc/classes/Tween.xml msgid "" @@ -79314,6 +81327,9 @@ msgid "" "pair. By default, all tweens are removed, unless [code]key[/code] is " "specified." msgstr "" +"Arrête l'animation et supprime un tween, compte tenu de son objet et de ses " +"propriétés/méthodes. Par défaut, tous les tweens sont supprimés, sauf si " +"[code]key[/code] est spécifié." #: doc/classes/Tween.xml msgid "Stops animation and removes all tweens." @@ -79325,6 +81341,9 @@ msgid "" "tween), given its object and property/method pair. By default, all tweens " "are reset, unless [code]key[/code] is specified." msgstr "" +"Réinitialise un tween à sa valeur initiale (celle donnée, pas celle avant le " +"tween), en donnant son objet et ses propriétés/méthodes. Par défaut, tous " +"les tweens sont réinitialisés, sauf si [code]key[/code] est spécifié." #: doc/classes/Tween.xml msgid "" @@ -79340,6 +81359,9 @@ msgid "" "pair. By default, all tweens are resumed, unless [code]key[/code] is " "specified." msgstr "" +"Continue d'animer un tween arrêté, à partir de son objet et des propriétés/" +"méthodes. Par défaut, tous les tweens sont repris, sauf si [code]key[/code] " +"est spécifié." #: doc/classes/Tween.xml msgid "Continues animating all stopped tweens." @@ -79360,12 +81382,15 @@ msgstr "" #: doc/classes/Tween.xml msgid "Starts the tween. You can define animations both before and after this." msgstr "" +"Lance le tween. Vous pouvez définir des animations avant et après cela." #: doc/classes/Tween.xml msgid "" "Stops a tween, given its object and property/method pair. By default, all " "tweens are stopped, unless [code]key[/code] is specified." msgstr "" +"Arrête un tween, à partir de son objet et de ses propriétés/méthodes. Par " +"défaut, tous les tweens sont arrêtés, sauf si [code]key[/code] est spécifié." #: doc/classes/Tween.xml msgid "Stops animating all tweens." @@ -79382,6 +81407,15 @@ msgid "" "direction of the interpolation. See the class description for more " "information." msgstr "" +"Anime la méthode [code]method[/code] de [code]object[/code] et applique la " +"valeur retournée sur la méthode [code]initial_method[/code] jusqu'à " +"[code]final_val[/code] pendant [code]duration[/code] secondes, après " +"[code]delay[/code] secondes. Les méthodes sont animées en les appelant avec " +"des valeurs consécutives.\n" +"Utilisez [enum TransitionType] pour le paramètres [code]trans_type[/code] et " +"[enum EaseType] pour [code]ease_type[/code]. Ces valeurs contrôlent le " +"comportement et la direction de l'interpolation. Voir la description de la " +"classe pour plus d'informations." #: doc/classes/Tween.xml msgid "" @@ -79394,6 +81428,14 @@ msgid "" "direction of the interpolation. See the class description for more " "information." msgstr "" +"Anime la propriété [code]property[/code] de [code]object[/code] et applique " +"la valeur retournée par la propriété [code]initial_val[/code] de " +"[code]initial[/code] jusqu'à [code]final_val[/code] pendant [code]duration[/" +"code] secondes, après [code]delay[/code] secondes.\n" +"Utilisez [enum TransitionType] pour le paramètres [code]trans_type[/code] et " +"[enum EaseType] pour [code]ease_type[/code]. Ces valeurs contrôlent le " +"comportement et la direction de l'interpolation. Voir la description de la " +"classe pour plus d'informations." #: doc/classes/Tween.xml msgid "Returns the current time of the tween." @@ -79411,6 +81453,11 @@ msgid "" "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 "" +"Le multiplicateur de la vitesse du tween. Par exemple, [code]1.0[/code] " +"définit une vitesse normale, [code]2.0[/code] deux fois que la vitesse " +"normale, et [code]0.5[/code] la moitié de la vitesse normale. Une valeur de " +"[code]0[/code] met en pause l'animation, mais voir aussi [method set_active] " +"ou [method stop_all] pour cela." #: doc/classes/Tween.xml msgid "If [code]true[/code], the tween loops." @@ -79527,6 +81574,7 @@ msgstr "" #: doc/classes/Tweener.xml msgid "Abstract class for all Tweeners used by [SceneTreeTween]." msgstr "" +"Une classe abstraite pour tous les Tweener utilisés par [SceneTreeTween]." #: doc/classes/Tweener.xml msgid "" @@ -79535,6 +81583,10 @@ msgid "" "can't be created manually, you need to use a dedicated method from " "[SceneTreeTween]." msgstr "" +"Les tweeners sont des objets qui effectuent une tâche d'animation " +"spécifique, par exemple interpoler une propriété ou appeler une méthode à un " +"moment donné. Un [Tweener] ne peut pas être créé manuellement, vous devez " +"utiliser une méthode dédiée de [SceneTreeTween]." #: doc/classes/Tweener.xml msgid "Emitted when the [Tweener] has just finished its job." @@ -79675,6 +81727,10 @@ msgid "" "can optionally specify a [code]bind_address[/code] to only listen for " "packets sent to that address. See also [method PacketPeerUDP.listen]." msgstr "" +"Démarre le serveur en ouvrant un socket UDP écoutant du port donné. Vous " +"pouvez en option spécifier une [code]bind_address[/code] pour seulement " +"écouter les paquets envoyés à cette adresse. Voir aussi [method " +"PacketPeerUDP.listen]." #: doc/classes/UDPServer.xml msgid "" @@ -79795,6 +81851,7 @@ msgstr "" #: doc/classes/UndoRedo.xml msgid "Register a method that will be called when the action is committed." msgstr "" +"Enregistre une méthode qui sera appelée lorsque l'action sera exécutée." #: doc/classes/UndoRedo.xml msgid "Register a property value change for \"do\"." @@ -79806,6 +81863,9 @@ msgid "" "lost. This is useful mostly for new nodes created for the \"do\" call. Do " "not use for resources." msgstr "" +"Enregistre une référence pour \"faire\" qui sera effacée si l'historique de " +"\"faire\" est perdue. Ceci est utile surtout pour les nouveaux nÅ“uds créés " +"avec l'appel \"faire\". Ne pas l'utiliser pour les ressources." #: doc/classes/UndoRedo.xml msgid "Register a method that will be called when the action is undone." @@ -79821,6 +81881,9 @@ msgid "" "history is lost. This is useful mostly for nodes removed with the \"do\" " "call (not the \"undo\" call!)." msgstr "" +"Enregistre une référence pour \"annuler\" qui sera effacée si l'historique " +"\"annuler\" est perdue. Ceci est utile surtout pour les nÅ“uds retirés avec " +"l'appel \"faire\" (et non pas l'appel \"annuler\" !)." #: doc/classes/UndoRedo.xml msgid "" @@ -79828,12 +81891,17 @@ msgid "" "Passing [code]false[/code] to [code]increase_version[/code] will prevent the " "version number to be increased from this." msgstr "" +"Efface l'historique annuler/refaire et les références associées.\n" +"Passez [code]false[/code] pour [code]increase_version[/code] pour empêcher " +"le numéro de version d'être augmenté suite à ça." #: doc/classes/UndoRedo.xml msgid "" "Commit the action. All \"do\" methods/properties are called/set when this " "function is called." msgstr "" +"Exécute l'action. Toutes les méthodes et propriétés \"faire\" sont appelées/" +"définies lorsque cette fonction est appelée." #: doc/classes/UndoRedo.xml msgid "" @@ -79844,6 +81912,12 @@ msgid "" "The way actions are merged is dictated by the [code]merge_mode[/code] " "argument. See [enum MergeMode] for details." msgstr "" +"Crée une nouvelle action. Une fois appelé, faites tous vos appels avec " +"[method add_do_method], [method add_undo_method], [method add_do_property], " +"et [method add_undo_property], puis exécutez l'action avec [method " +"commit_action].\n" +"La façon dont les actions sont fusionnées est défini par l'argument " +"[code]merge_mode[/code]. Voir [enum MergeMode] pour plus de détails." #: doc/classes/UndoRedo.xml msgid "Gets the name of the current action." @@ -79855,6 +81929,10 @@ msgid "" "version number is increased automatically.\n" "This is useful mostly to check if something changed from a saved version." msgstr "" +"Retourne la version. Chaque fois qu'une nouvelle action est engagée, le " +"numéro de version du [UndoRedo] est augmenté automatiquement.\n" +"Ceci est surtout utile pour vérifier si quelque chose a changé par rapport à " +"une version sauvegardée." #: doc/classes/UndoRedo.xml msgid "" @@ -79862,6 +81940,9 @@ msgid "" "action, i.e. running its \"do\" method or property change (see [method " "commit_action])." msgstr "" +"Retourne [code]true[/code] si le [UndoRedo] engage actuellement l'action, " +"c'est-à -dire en exécutant sa méthode « faire » ou son changement de " +"propriété (voir [method commit_action])." #: doc/classes/UndoRedo.xml msgid "Redo the last action." @@ -79887,27 +81968,34 @@ msgid "" "and the \"undo\" operation is from the last subsequent action with the same " "name." msgstr "" +"Fait de sorte que l'opération action suivante \"faire\" est de la première " +"action créée, et que l'opération \"annuler\" est de l'action suivante avec " +"le même nom." #: doc/classes/UndoRedo.xml msgid "Makes subsequent actions with the same name be merged into one." msgstr "Fusionne les actions suivantes avec le même nom dans une seule." #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." -msgstr "Les fonctions de réseau UPNP." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." +msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -79920,7 +82008,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -79949,62 +82037,40 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" -msgstr "" -"Fournis un fonctionnalité UPNP pour découvrir des appareils [UPNPDevice] sur " -"le réseau local et lancer des commandes sur eux, comme la gestion des ports " -"(port forwarding) et requêter les adresses IP locales et distantes. À noter " -"que les méthodes de cette classe sont synchrones et bloquent le fil " -"d'exécution que les appelle.\n" -"Pour le forward d'un 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" -"Pour fermer le port spécifié (ex. après avoir fini de l'utiliser) :\n" -"[codeblock]\n" -"upnp.delete_port_mapping(port)\n" "[/codeblock]\n" -"[b]Note :[/b] la découverte UPnP bloque le fil d'exécution que l'appelle. " -"Pour ne pas bloquer le fil d'exécution principal, utilisez les [Thread] " -"comme ceci :\n" -"[codeblock]\n" -"# Émis quand la configuration d'un port UPnP est fini (peu importe si c'est " -"un succès ou un échec).\n" -"signal upnp_completed(error)\n" -"\n" -"# Remplacer ceci avec le port de votre serveur compris entre 1025 et 65535.\n" -"const SERVER_PORT = 3928\n" -"var thread = null\n" -"\n" -"func _upnp_setup(server_port):\n" -" # Les requêtes UPNP prennent un peu de temps\n" -" var upnp = UPNP.new()\n" -" var err = upnp.discover()\n" -"\n" -" if err != OK:\n" -" push_error(str(err))\n" -" emit_signal(\"upnp_completed\", err)\n" -" return\n" -"\n" -" if upnp.get_gateway() and upnp.get_gateway().is_valid_gateway():\n" -" upnp.add_port_mapping(server_port, server_port, ProjectSettings." -"get_setting(\"application/config/name\"), \"UDP\")\n" -" upnp.add_port_mapping(server_port, server_port, ProjectSettings." -"get_setting(\"application/config/name\"), \"TCP\")\n" -" emit_signal(\"upnp_completed\", OK)\n" -"\n" -"func _ready():\n" -" thread = Thread.new()\n" -" thread.start(self, \"_upnp_setup\", SERVER_PORT)\n" -"\n" -"func _exit_tree():\n" -" # Attendre ici que le fil d'exécution se termine avant que le jeu ne " -"quitte.\n" -" thread.wait_to_finish()\n" -"[/codeblock]" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." +msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "Adds the given [UPNPDevice] to the list of discovered devices." @@ -80013,22 +82079,35 @@ msgstr "Ajouter le [UPNPDevice] spécifié à la liste des appareils découverts #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -80041,8 +82120,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -80055,6 +82136,13 @@ msgid "" "this if you know what you're doing.\n" "See [enum UPNPResult] for possible return values." msgstr "" +"Découvre les [UPNPDevice] locaux. Efface la liste des appareils précédemment " +"découverts.\n" +"Filtres pour les appareils de type IGD (InternetGatewayDevice) par défaut, " +"comme ceux gèrent le suivi de port. [code]timeout[/code] est la durée " +"d'attente des réponses en millisecondes. [code]ttl[/code] est le temps " +"laissé à vivre; changez-le seulement si vous savez ce que vous faites.\n" +"Voir [enum UPNPResult] pour les valeurs retournées possibles." #: modules/upnp/doc_classes/UPNP.xml msgid "Returns the [UPNPDevice] at the given [code]index[/code]." @@ -80070,12 +82158,16 @@ msgid "" "Returns the default gateway. That is the first discovered [UPNPDevice] that " "is also a valid IGD (InternetGatewayDevice)." msgstr "" +"Retourne la passerelle par défaut. Il s'agit du premier [UPNPDevice] " +"découvert qui est également un IGD (InternetGatewayDevice) valide." #: modules/upnp/doc_classes/UPNP.xml msgid "" "Returns the external [IP] address of the default gateway (see [method " "get_gateway]) as string. Returns an empty string on error." msgstr "" +"Retourne l'adresse [IP] externe de la passerelle par défaut (voir [method " +"get_gateway]) en tant que chaîne. Retourne une chaîne vide en cas d'erreur." #: modules/upnp/doc_classes/UPNP.xml msgid "" @@ -80104,12 +82196,18 @@ msgid "" "the source port 1900 (same as destination port). Otherwise, the value will " "be used as the port." msgstr "" +"Si [code]0[/code], le port local à utiliser pour la découverte est choisi " +"automatiquement par le système. Si [code]1[/code], la découverte sera faite " +"à partir du port source 1900 (même comme port de destination.) Sinon, la " +"valeur sera utilisée comme port." #: modules/upnp/doc_classes/UPNP.xml msgid "" "Multicast interface to use for discovery. Uses the default multicast " "interface if empty." msgstr "" +"L'interface multicast à utiliser pour la découverte. Utilise l'interface " +"multicast par défaut si vide." #: modules/upnp/doc_classes/UPNP.xml msgid "UPNP command or discovery was successful." @@ -80120,12 +82218,16 @@ msgid "" "Not authorized to use the command on the [UPNPDevice]. May be returned when " "the user disabled UPNP on their router." msgstr "" +"Non autorisé à utiliser la commande sur le [UPNPDevice]. Peut être retourné " +"lorsque l'utilisateur a désactivé UPNP sur son routeur." #: modules/upnp/doc_classes/UPNP.xml msgid "" "No port mapping was found for the given port, protocol combination on the " "given [UPNPDevice]." msgstr "" +"Aucune carte des ports n'a été trouvée pour le port donné, la combinaison de " +"protocole sur le [UPNPDevice] donné." #: modules/upnp/doc_classes/UPNP.xml msgid "Inconsistent parameters." @@ -80136,6 +82238,8 @@ msgid "" "No such entry in array. May be returned if a given port, protocol " "combination is not found on an [UPNPDevice]." msgstr "" +"Pas d'entrée dans le tableau. Peut être retourné si pour un port donné, la " +"combinaison de protocole n'est pas trouvée sur un [UPNPDevice]." #: modules/upnp/doc_classes/UPNP.xml msgid "The action failed." @@ -80145,6 +82249,7 @@ msgstr "L’action a échoué." msgid "" "The [UPNPDevice] does not allow wildcard values for the source IP address." msgstr "" +"Le [UPNPDevice] ne permet pas les valeurs joker pour l'adresse IP source." #: modules/upnp/doc_classes/UPNP.xml msgid "The [UPNPDevice] does not allow wildcard values for the external port." @@ -80169,6 +82274,8 @@ msgid "" "No port maps are available. May also be returned if port mapping " "functionality is not available." msgstr "" +"Aucune carte de ports n'est disponible. Peut également être retourné si la " +"fonctionnalité de carte des ports n'est pas disponible." #: modules/upnp/doc_classes/UPNP.xml msgid "" @@ -80176,10 +82283,13 @@ msgid "" "UPNP_RESULT_CONFLICT_WITH_OTHER_MAPPING] if a port mapping conflicts with an " "existing one." msgstr "" +"Est en conflit avec un autre mécanisme. Peut être retourné au lieu de " +"[constant UPNP_RESULT_CONFLICT_WITH_OTHER_MAPPING] si une carte des ports " +"est en conflit avec une carte existante." #: modules/upnp/doc_classes/UPNP.xml msgid "Conflict with an existing port mapping." -msgstr "" +msgstr "Est en conflit avec une carte des ports existante." #: modules/upnp/doc_classes/UPNP.xml msgid "External and internal port values must be the same." @@ -80190,6 +82300,8 @@ msgid "" "Only permanent leases are supported. Do not use the [code]duration[/code] " "parameter when adding port mappings." msgstr "" +"Seuls les baux permanents sont pris en charge. N'utilisez pas le paramètre " +"[code]duration[/code] lors de l'ajout de carte des ports." #: modules/upnp/doc_classes/UPNP.xml msgid "Invalid gateway." @@ -80236,29 +82348,41 @@ msgid "" "No gateway available. You may need to call [method discover] first, or " "discovery didn't detect any valid IGDs (InternetGatewayDevices)." msgstr "" +"Aucune passerelle disponible. Vous pouvez avoir besoin d'appeler [method " +"discover] d'abord, ou la découverte n'a pas détecté de IGD " +"(InternetGatewayDevices) valide." #: modules/upnp/doc_classes/UPNP.xml msgid "" "No devices available. You may need to call [method discover] first, or " "discovery didn't detect any valid [UPNPDevice]s." msgstr "" +"Aucun appareil disponible. Vous pouvez avoir besoin d'appeler [method " +"discover] d'abord, ou la découverte n'a pas détecté des [UPNPDevice] valides." #: modules/upnp/doc_classes/UPNP.xml modules/upnp/doc_classes/UPNPDevice.xml msgid "Unknown error." msgstr "Erreur inconnue." #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." -msgstr "Périphérique UPNP." +msgid "Universal Plug and Play (UPnP) device." +msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml +#, fuzzy 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." +"Universal Plug and Play (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 "" +"Un appareil UPNP. Voir [UPNP] pour les fonctions UPNP de découverte et " +"utilitaires. Fournit un accès de bas niveau aux commandes UPNP. Permet de " +"gérer les cartes de ports (suivi de port) et de demander des informations " +"réseau sur l'appareil (comme l'adresse IP locale et externe, et le statut). " +"Notez que les méthodes de cette classe sont synchrones et bloquent le fil " +"d'exécution dans lequel ces méthodes sont appelées." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" @@ -80266,30 +82390,36 @@ msgid "" "for the given protocol to the local machine. See [method UPNP." "add_port_mapping]." msgstr "" +"Ajoute une carte des ports pour faire passer le port externe donné sur ce " +"[UPNPDevice] pour le protocole donné à la machine locale. Voir [method UPNP." +"add_port_mapping]." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" "Deletes the port mapping identified by the given port and protocol " "combination on this device. See [method UPNP.delete_port_mapping]." msgstr "" +"Supprime la carte des ports identifiée par la combinaison de ports et le " +"protocole donnée sur cet appareil. Voir [method UPNP.delete_port_mapping]." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" "Returns [code]true[/code] if this is a valid IGD (InternetGatewayDevice) " "which potentially supports port forwarding." msgstr "" +"Retourne [code]true[/code] si c'est un IGD (InternetGatewayDevice) valide " +"qui supporte potentiellement le suivi de port." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" "Returns the external IP address of this [UPNPDevice] or an empty string." -msgstr "" +msgstr "Retourne l'adresse IP externe de ce [UPNPDevice], ou une chaîne vide." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "URL to the device description." msgstr "URL de la description de l’appareil." #: modules/upnp/doc_classes/UPNPDevice.xml -#, fuzzy msgid "IDG control URL." msgstr "URL de contrôle IDG." @@ -80475,6 +82605,8 @@ msgstr "" msgid "" "Returns a new vector with all components in absolute values (i.e. positive)." msgstr "" +"Retourne un nouveau vecteur avec tous les composants en valeurs absolues " +"(c'est-à -dire toujours positif)." #: doc/classes/Vector2.xml msgid "" @@ -80496,6 +82628,9 @@ msgid "" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" "vector2_angle_to.png]Illustration of the returned angle.[/url]" msgstr "" +"Retourne l'angle au vecteur donné, en radians.\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"vector2_angle_to.png]Illustration de l'angle retourné.[/url]" #: doc/classes/Vector2.xml msgid "" @@ -80504,6 +82639,10 @@ msgid "" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/stable/img/" "vector2_angle_to_point.png]Illustration of the returned angle.[/url]" msgstr "" +"Retourne l'angle entre la ligne reliant les deux points et l'axe X, en " +"radians.\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/stable/img/" +"vector2_angle_to_point.png]Illustration de l'angle retourné.[/url]" #: doc/classes/Vector2.xml msgid "" @@ -80524,6 +82663,7 @@ msgid "" "Returns a new vector with all components rounded up (towards positive " "infinity)." msgstr "" +"Retourne un nouveau vecteur avec tous les composants arrondis (vers +infini)." #: doc/classes/Vector2.xml msgid "" @@ -80555,12 +82695,18 @@ msgid "" "result at position [code]weight[/code]. [code]weight[/code] is on the range " "of 0.0 to 1.0, representing the amount of interpolation." msgstr "" +"Fait une interpolation cubique entre ce vecteur et [code]b[/code] en " +"utilisant [code]pre_a[/code] et [code]post_b[/code] comme poignées, et " +"retourne le résultat suivant [code]weight[/code]. [code]weight[/code] est " +"dans l'intervalle de 0,0 à 1,0, représentant la quantité interpolée." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" "Returns the normalized vector pointing from this vector to [code]b[/code]. " "This is equivalent to using [code](b - a).normalized()[/code]." msgstr "" +"Retourne le vecteur normalisé de ce vecteur en direction de [code]b[/code]. " +"Ceci est équivalent à l'utilisation [code]b - a).normalized()[/code]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80568,6 +82714,10 @@ msgid "" "This method runs faster than [method distance_to], so prefer it if you need " "to compare vectors or need the squared distance for some formula." msgstr "" +"Retourne la distance entre ce vecteur et [code]b[/code].\n" +"Cette méthode est plus rapide que [method distance_to], alors préfèrez-le si " +"vous avez besoin de comparer des vecteurs ou besoin de la distance carrée " +"pour une formule." #: doc/classes/Vector2.xml msgid "Returns the distance between this vector and [code]to[/code]." @@ -80593,6 +82743,8 @@ msgid "" "Returns a new vector with all components rounded down (towards negative " "infinity)." msgstr "" +"Retourne un nouveau vecteur avec tous les composants arrondis à la valeur " +"inférieur (vers -infini)." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80622,6 +82774,10 @@ msgid "" "This method runs faster than [method length], so prefer it if you need to " "compare vectors or need the squared distance for some formula." msgstr "" +"Retourne la longeur (magnitude) au carré de ce vecteur.\n" +"Cette méthode est plus rapide que [method length] donc préférez-le si vous " +"devez comparer des vecteurs ou avoir besoin de la distance carrée pour " +"certaines formules." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80637,6 +82793,9 @@ msgid "" "[code]to[/code] by amount [code]weight[/code]. [code]weight[/code] is on the " "range of 0.0 to 1.0, representing the amount of interpolation." msgstr "" +"Retourne le résultat de l'interpolation linéaire entre ce vecteur et " +"[code]to[/code] par la quantité [code]weight[/code]. [code]weight[/code] est " +"compris entre 0,0 et 1,0, représentant la quantité d'interpolation." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80651,18 +82810,24 @@ msgid "" "Returns the vector scaled to unit length. Equivalent to [code]v / v.length()" "[/code]." msgstr "" +"Retourne le vecteur de longueur unitaire. Équivalent à [code]v / v.length()[/" +"code]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" "Returns a vector composed of the [method @GDScript.fposmod] of this vector's " "components and [code]mod[/code]." msgstr "" +"Retourne un vecteur composé de [method @GDScript.fposmod] de ces composants " +"vectoriels et [code]mod[/code]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" "Returns a vector composed of the [method @GDScript.fposmod] of this vector's " "components and [code]modv[/code]'s components." msgstr "" +"Retourne un vecteur composé de [method @GDScript.fposmod] de ces composants " +"vectoriels et [code]modv[/code])." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "Returns this vector projected onto the vector [code]b[/code]." @@ -80673,14 +82838,16 @@ msgid "" "Returns the vector reflected (i.e. mirrored, or symmetric) over a line " "defined by the given direction vector [code]n[/code]." msgstr "" +"Retourne le vecteur réfléchi (c'est-à -dire en miroir ou symétrique) sur une " +"ligne définie par le vecteur de direction [code]n[/code] spécifié." #: doc/classes/Vector2.xml msgid "" "Returns the vector rotated by [code]angle[/code] (in radians). See also " "[method @GDScript.deg2rad]." msgstr "" -"Retourne le vecteur pivoté par [code]angle[/code] (en radians). Voir aussi [" -"method @GDScript.deg2rad]." +"Retourne le vecteur pivoté par [code]angle[/code] (en radians). Voir aussi " +"[method @GDScript.deg2rad]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80696,6 +82863,9 @@ msgid "" "depending on the signs of the components. If a component is zero, it returns " "positive one." msgstr "" +"Retourne un nouveau vecteur avec chaque composant défini à 1 ou -1, selon " +"les signes des composants. Si un composant est zéro, la valeur retournée " +"sera positive." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80704,10 +82874,16 @@ msgid "" "the range of 0.0 to 1.0, representing the amount of interpolation.\n" "[b]Note:[/b] Both vectors must be normalized." msgstr "" +"Retourne le résultat de l'interpolation linéaire sphérique entre ce vecteur " +"et [code]to[/code], par la quantité [code]weight[/code]. [code]weight[/code] " +"est compris entre 0,0 et 1,0, représentant la quantité d'interpolation.\n" +"[b]Note :[/b] Les deux vecteurs doivent être normalisés." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "Returns this vector slid along a plane defined by the given normal." msgstr "" +"Retourne ce vecteur ayant glissé le long du plan défini par la normale " +"donnée." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80715,6 +82891,9 @@ msgid "" "[code]step[/code]. This can also be used to round to an arbitrary number of " "decimals." msgstr "" +"Retourne ce vecteur avec chaque composant arrondis au multiple le plus " +"proche de [code]step[/code]. Cela peut également être utilisé pour arrondir " +"à un nombre arbitraire de décimales." #: doc/classes/Vector2.xml msgid "" @@ -80729,12 +82908,16 @@ msgid "" "The vector's X component. Also accessible by using the index position [code]" "[0][/code]." msgstr "" +"La composante vectorielle X. Également accessible en utilisant le code de " +"position index [code][0][/code]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" "The vector's Y component. Also accessible by using the index position [code]" "[1][/code]." msgstr "" +"La composante vectorielle X. Également accessible en utilisant le code de " +"position index [code][1][/code]." #: doc/classes/Vector2.xml msgid "Enumerated value for the X axis." @@ -80747,10 +82930,13 @@ msgstr "Les valeurs énumérées pour l'axe Y." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "Zero vector, a vector with all components set to [code]0[/code]." msgstr "" +"Le vecteur zéro, un vecteur avec tous ses composants définis [code]0[/code]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "One vector, a vector with all components set to [code]1[/code]." msgstr "" +"Le vecteur unitaire, un vecteur avec tous ses composants définis à [code]1[/" +"code]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80792,6 +82978,11 @@ msgid "" "code] if it's equal to [code]Vector3(0, 0, 0)[/code]. Otherwise, a Vector3 " "will always evaluate to [code]true[/code]." msgstr "" +"Une structure de 3 éléments qui peut être utilisée pour représenter des " +"positions dans l'espace 3D ou tout autre trio de valeurs numériques.\n" +"[b]Note :[/b] Avec des booléens, un Vector3 sera évalué ) [code]false[/code] " +"s'il est égal à [code]Vector3(0, 0, 0)[/code]. Sinon, un Vector3 sera " +"toujours évalué à [code]true[/code]." #: doc/classes/Vector3.xml msgid "Returns a Vector3 with the given components." @@ -80812,6 +83003,10 @@ msgid "" "result at position [code]weight[/code]. [code]weight[/code] is on the range " "of 0.0 to 1.0, representing the amount of interpolation." msgstr "" +"Exécute une interpolation cubique entre ce vecteur et [code]b[/code] en " +"utilisant [code]pre_a[/code] et [code]post_b[/code] comme poignées, et " +"retourne le résultat à la position [code]weight[/code]. [code]weight[/code] " +"est dans l'intervalle de 0,0 à 1,0, représentant la quantité d'interpolation." #: doc/classes/Vector3.xml msgid "Returns the distance between this vector and [code]b[/code]." @@ -80846,6 +83041,9 @@ msgid "" "[code]to[/code] by amount [code]t[/code]. [code]weight[/code] is on the " "range of 0.0 to 1.0, representing the amount of interpolation." msgstr "" +"Retourne le résultat de l'interpolation linéaire entre ce vecteur et " +"[code]to[/code] par la quantité [code]t[/code]. [code]weight[/code] est dans " +"l'intervalle 0,0 à 1,0, représentant la quantité d'interpolée." #: doc/classes/Vector3.xml msgid "" @@ -80853,6 +83051,9 @@ msgid "" "constants. If all components are equal, this method returns [constant " "AXIS_X]." msgstr "" +"Retourne l'axe de la valeur la plus importante du vecteur. Voir les " +"constantes[code]AXIS_*[/code]. Si tous les composants sont égaux, cette " +"méthode retourne [constant AXIS_X]." #: doc/classes/Vector3.xml msgid "" @@ -80860,6 +83061,9 @@ msgid "" "constants. If all components are equal, this method returns [constant " "AXIS_Z]." msgstr "" +"Retourne l'axe de la valeur vectorielle la plus petite. Voir les constantes " +"[code]AXIS_*[/code]. Si tous les composants sont égaux, cette méthode " +"retourne [constant AXIS_Z]." #: doc/classes/Vector3.xml msgid "Returns the outer product with [code]b[/code]." @@ -80867,7 +83071,7 @@ msgstr "" #: doc/classes/Vector3.xml msgid "Returns this vector reflected from a plane defined by the given normal." -msgstr "" +msgstr "Retourne ce vecteur réfléchi par un plan défini par la normale donnée." #: doc/classes/Vector3.xml msgid "" @@ -80884,6 +83088,9 @@ msgid "" "clockwise direction when viewed from the side specified by the [code]axis[/" "code]." msgstr "" +"Retourne l'angle signé du vecteur donné, en radians. Le signe de l'angle est " +"positif dans une direction horaire inversée et négatif dans l'autre " +"direction lorsqu'il est vu du côté spécifié par le [code]axis[/code]." #: doc/classes/Vector3.xml msgid "" @@ -80891,12 +83098,17 @@ msgid "" "This is equivalent to a Basis with no rotation or shearing and this vector's " "components set as the scale." msgstr "" +"Retourne une matrice diagonale avec ce vecteur comme diagonale principale.\n" +"Il s'agit d'une Basis qui n'a ni rotation ni déformation, et les composants " +"de ce vecteur représentent l'échelle." #: doc/classes/Vector3.xml msgid "" "The vector's Z component. Also accessible by using the index position [code]" "[2][/code]." msgstr "" +"Le composant vectoriel Z. Également accessible en utilisant l'index [code][2]" +"[/code]." #: doc/classes/Vector3.xml msgid "" @@ -81097,6 +83309,8 @@ 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 "" +"L'angle de direction du volant pour la roue. Définit de cette valeur à une " +"valeur non nulle fera tourner le véhicule quand il se déplace." #: doc/classes/VehicleWheel.xml msgid "" @@ -81105,6 +83319,10 @@ msgid "" "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 "" +"La force maximale que le ressort peut résister. Cette valeur devrait être " +"supérieure à un quart du [member RigidBody.mass] du [VehicleBody] ou alors " +"le ressort ne portera pas le poids du véhicule. Les bons résultats sont " +"souvent obtenus par une valeur d'environ 3× à 4× ce nombre." #: doc/classes/VehicleWheel.xml msgid "" @@ -81112,6 +83330,10 @@ msgid "" "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 "" +"Cette valeur définit la rigidité de la suspension. Utilisez une valeur " +"inférieure à 50 pour une voiture tout terrain, une valeur entre 50 et 100 " +"pour une voiture de course et essayez quelque chose autour de 200 pour " +"quelque chose comme une voiture de Formule 1." #: doc/classes/VehicleWheel.xml msgid "" @@ -81119,6 +83341,9 @@ msgid "" "equivalent to meters, keep this setting relatively low. Try a value between " "0.1 and 0.3 depending on the type of car." msgstr "" +"C'est la distance que la suspension peut parcourir. Comme les unités Godot " +"sont équivalentes aux mètres, garder ce réglage relativement bas. Essayez " +"une valeur entre 0,1 et 0,3 selon le type de voiture." #: doc/classes/VehicleWheel.xml msgid "" @@ -81126,6 +83351,9 @@ msgid "" "value is used in conjunction with [member VehicleBody.steering] and ignored " "if you are using the per-wheel [member steering] value instead." msgstr "" +"Si [code]true[/code], cette roue sera tournée lorsque la voiture tourne. " +"Cette valeur est utilisée en conjonction avec [member VehicleBody.steering] " +"et ignorée si vous utilisez plutôt la valeur [member steering] par roue." #: doc/classes/VehicleWheel.xml msgid "" @@ -81134,6 +83362,10 @@ msgid "" "VehicleBody.engine_force] and ignored if you are using the per-wheel [member " "engine_force] value instead." msgstr "" +"Si [code]true[/code], cette roue transfère la force moteur au sol pour " +"propulser le véhicule vers l'avant. Cette valeur est utilisée en conjonction " +"avec [member VehicleBody.engine_force] et ignorée si vous utilisez plutôt la " +"valeur par roue [member engine_force]." #: doc/classes/VehicleWheel.xml msgid "" @@ -81164,6 +83396,9 @@ msgid "" "your vehicle will be prone to rolling over, while a value of 0.0 will resist " "body roll." msgstr "" +"Cette valeur affecte le roulade de votre véhicule. Si définit à 1.0 pour " +"toutes les roues, votre véhicule sera sujet aux roulades, tandis qu'une " +"valeur de 0.0 résistera au roulade du corps." #: doc/classes/VFlowContainer.xml msgid "Vertical flow container." @@ -81195,6 +83430,8 @@ msgid "" "Returns the video stream's name, or [code]\"<No Stream>\"[/code] if no video " "stream is assigned." msgstr "" +"Retourne le nom du flux vidéo, ou [code]\"<No Stream>\"[/code] si aucun flux " +"vidéo n'est assigné." #: doc/classes/VideoPlayer.xml msgid "Returns the current frame as a [Texture]." @@ -81205,12 +83442,17 @@ 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 "" +"Retourne [code]true[/code] si la vidéo joue.\n" +"[b]Note :[/b] La vidéo est toujours considérée comme en train de jouer si " +"elle est mise en pause pendant la lecture." #: doc/classes/VideoPlayer.xml msgid "" "Starts the video playback from the beginning. If the video is paused, this " "will not unpause the video." msgstr "" +"Commence la lecture vidéo dès le début. Si la vidéo est en pause, cela ne la " +"fera pas reprendre." #: doc/classes/VideoPlayer.xml msgid "" @@ -81218,6 +83460,9 @@ msgid "" "[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 "" +"Arrête la lecture vidéo et fixe la position du flux à 0.\n" +"[b]Note :[/b] Bien que la position du flux soit définie à 0, la première " +"trame du flux vidéo ne deviendra pas le trame actuel." #: doc/classes/VideoPlayer.xml msgid "The embedded audio track to play." @@ -81242,6 +83487,9 @@ msgid "" "control minimum size will be automatically adjusted to match the video " "stream's dimensions." msgstr "" +"Si [code]true[/code], la taille des contrôles dépendront de la vidéo. Sinon, " +"la taille minimale des contrôles sera automatiquement ajustée pour " +"correspondre aux dimensions du flux vidéo." #: doc/classes/VideoPlayer.xml msgid "If [code]true[/code], the video is paused." @@ -81257,6 +83505,10 @@ msgid "" "[b]Note:[/b] Changing this value won't have any effect as seeking is not " "implemented yet, except in video formats implemented by a GDNative add-on." msgstr "" +"La position actuelle du flux, en secondes.\n" +"[b]Note :[/b] La modification de cette valeur n'a pas d'effet puisque le " +"progression de lecture n'est pas encore implémentée, sauf dans les formats " +"vidéo implémentés par un greffon GDNative." #: doc/classes/VideoPlayer.xml msgid "Audio volume as a linear value." @@ -81280,6 +83532,9 @@ msgid "" "[VideoStream] can all be used as resource types to play back videos in " "[VideoPlayer]." msgstr "" +"Le type de ressources de base pour tous les flux vidéos. Les classes qui " +"dérivent de [VideoStream] peuvent tous être utilisées comme types de " +"ressources pour lire des vidéos dans [VideoPlayer]." #: modules/gdnative/doc_classes/VideoStreamGDNative.xml msgid "[VideoStream] resource for video formats implemented via GDNative." @@ -81293,6 +83548,10 @@ msgid "" "videodecoder]godot-videodecoder[/url] which uses the [url=https://ffmpeg." "org]FFmpeg[/url] library." msgstr "" +"La ressource [VideoStream] pour les formats vidéo implémenté avec GDNative.\n" +"Il peut être utilisé via [url=https://github.com/KidRigger/godot-" +"videodecoder]godot-videodecoder[/url] utilisé par la bibliothèque " +"[url=https://ffmpeg.org]FFmpeg[/url]." #: modules/gdnative/doc_classes/VideoStreamGDNative.xml msgid "Returns the video file handled by this [VideoStreamGDNative]." @@ -81305,6 +83564,9 @@ msgid "" "supported extensions depend on the GDNative plugins used to expose video " "formats." msgstr "" +"Définit le fichier vidéo que cette ressource [VideoStreamGDNative] gère. Les " +"extensions supportées dépendent des greffons GDNative utilisés pour exposer " +"les formats vidéo." #: modules/theora/doc_classes/VideoStreamTheora.xml msgid "[VideoStream] resource for Ogg Theora videos." @@ -81363,6 +83625,9 @@ msgid "" "Sets the WebM video file that this [VideoStreamWebm] resource handles. The " "[code]file[/code] name should have the [code].webm[/code] extension." msgstr "" +"Définit le fichier vidéo WebM que cette ressource [VideoStreamWebm] gère. Le " +"nom de fichier [code]file[/code] devrait avoir l'extension [code].webm[/" +"code]." #: doc/classes/Viewport.xml msgid "Creates a sub-view into the screen." @@ -81441,6 +83706,8 @@ msgid "" "Returns the mouse's position in this [Viewport] using the coordinate system " "of this [Viewport]." msgstr "" +"Retourne la position de la souris dans ce [Viewport] en utilisant le système " +"de coordonnées de ce [Viewport]." #: doc/classes/Viewport.xml msgid "Returns information about the viewport from the rendering pipeline." @@ -81453,6 +83720,7 @@ msgstr "" #: doc/classes/Viewport.xml msgid "Returns the size override set with [method set_size_override]." msgstr "" +"Retourne la surcharge de taille définit avec [method set_size_override]." #: doc/classes/Viewport.xml msgid "" @@ -81465,6 +83733,15 @@ msgid "" "img.flip_y()\n" "[/codeblock]" msgstr "" +"Retourne la texture de la fenêtre d'affichage.\n" +"[b]Note :[/b] En raison de la façon dont OpenGL fonctionne, la " +"[ViewportTexture] finale est à l'envers verticalement. Vous pouvez utiliser " +"[method Image.flip_y] sur l'image de [method Texture.get_data] pour la " +"retourner, par exemple :\n" +"[codeblock]\n" +"var img = get_viewport().get_texture().get_data()\n" +"img.flip_y()\n" +"/[codeblock]" #: doc/classes/Viewport.xml msgid "Returns the viewport's RID from the [VisualServer]." @@ -81480,10 +83757,12 @@ msgid "" "Returns the drag data from the GUI, that was previously returned by [method " "Control.get_drag_data]." msgstr "" +"Retourne les données de déposé-glissé de l'interface graphique, qui a été " +"précédemment retourné par [method Control.get_drag_data]." #: doc/classes/Viewport.xml msgid "Returns [code]true[/code] if there are visible modals on-screen." -msgstr "" +msgstr "Retourne [code]true[/code] s'il y a des modales visibles à l'écran." #: doc/classes/Viewport.xml msgid "Returns [code]true[/code] if the drag operation is successful." @@ -81496,6 +83775,11 @@ msgid "" "Alternative to [constant Node.NOTIFICATION_DRAG_BEGIN] and [constant Node." "NOTIFICATION_DRAG_END] when you prefer polling the value." msgstr "" +"Retourne [code]true[/code] si la fenêtre d'affichage effectue actuellement " +"une opération de déposé-glissé.\n" +"C'est une alternative à [constant Node. NOTIFICATION_DRAG_BEGIN] and " +"[constant Node. NOTIFICATION_DRAG_END] lorsque vous préférez récupérer " +"directement la valeur." #: doc/classes/Viewport.xml msgid "" @@ -81512,6 +83796,9 @@ msgid "" "[Viewport] but makes you responsible for updating the position of this " "[Viewport] manually." msgstr "" +"Attaque ce [Viewport] au [Viewport] racine avec le rectangle spécifié. Cela " +"contourne le besoin d'un autre nÅ“ud pour afficher ce [Viewport] mais vous " +"devez mettre à jour de la position de ce [Viewport] manuellement." #: doc/classes/Viewport.xml msgid "Stops the input from propagating further down the [SceneTree]." @@ -81534,6 +83821,10 @@ msgid "" "size. If the size parameter is [code](-1, -1)[/code], it won't update the " "size." msgstr "" +"Définit la surcharge de la taille de la fenêtre d'affichage. Si le paramètre " +"[code]enable[/code] est [code]true[/code], le paramètre de surcharge sera " +"utilisé, sinon ça utilisera la taille par défaut. Si le paramètre de taille " +"est [code](-1, -1)[/code], sa taille ne sera pas mise à jour." #: doc/classes/Viewport.xml msgid "Forces update of the 2D and 3D worlds." @@ -81544,10 +83835,14 @@ msgid "" "Moves the mouse pointer to the specified position in this [Viewport] using " "the coordinate system of this [Viewport]." msgstr "" +"Déplace le pointeur de la souris à la position spécifiée dans ce [Viewport] " +"en utilisant le système de coordonnées de ce [Viewport]." #: doc/classes/Viewport.xml msgid "If [code]true[/code], the viewport will be used in AR/VR process." msgstr "" +"Si [code]true[/code], la fenêtre d'affichage sera utilisée dans le processus " +"AR/VR." #: doc/classes/Viewport.xml msgid "If [code]true[/code], the viewport will process 2D audio streams." @@ -81563,6 +83858,9 @@ msgid "" "positions of all child [CanvasItem]s. This is relative to the global canvas " "transform of the viewport." msgstr "" +"La transformation du canevas de la fenpetre d'affichage, utile pour changer " +"les positions à l'écran de tous les [CanvasItem] enfants. C'est relatif à la " +"transformation globale du canevas de la fenêtre d'affichage." #: doc/classes/Viewport.xml msgid "" @@ -81578,12 +83876,16 @@ msgstr "" #: doc/classes/Viewport.xml msgid "The overlay mode for test rendered geometry in debug purposes." msgstr "" +"Le mode de surcouche (\"overlay\") pour tester la géométrie rendue lors du " +"débogage." #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], the viewport will disable 3D rendering. For actual " "disabling use [code]usage[/code]." msgstr "" +"Si [code]true[/code], le viewport désactivera le rendu 3D. Pour le " +"désactiver réellement, utilisez [code]usage[/code]." #: doc/classes/Viewport.xml msgid "" @@ -81600,6 +83902,8 @@ msgid "" "The global canvas transform of the viewport. The canvas transform is " "relative to this." msgstr "" +"La transformation globale de la toile de cette fenêtre d'affichage. La " +"transformation en toile est relative à cela." #: doc/classes/Viewport.xml msgid "If [code]true[/code], the viewport will not receive input events." @@ -81612,6 +83916,8 @@ msgid "" "If [code]true[/code], the GUI controls on the viewport will lay pixel " "perfectly." msgstr "" +"Si [code]true[/code], les contrôles de l'interface graphique dans la fenêtre " +"d'affichage s'alignent au pixel près." #: doc/classes/Viewport.xml msgid "" @@ -81658,6 +83964,8 @@ msgid "" "If [code]true[/code], the objects rendered by viewport become subjects of " "mouse picking process." msgstr "" +"Si [code]true[/code], les objets rendus dans la fenêtre d'affichage peuvent " +"être sélectionnés par la souris." #: doc/classes/Viewport.xml msgid "" @@ -81673,10 +83981,15 @@ msgid "" "The clear mode when viewport used as a render target.\n" "[b]Note:[/b] This property is intended for 2D usage." msgstr "" +"Le mode clair quand la fenêtre d'affichage est utilisé comme cible de " +"rendu.\n" +"[b]Note :[/b] Cette propriété est destinée à une utilisation 2D." #: doc/classes/Viewport.xml msgid "The update mode when viewport used as a render target." msgstr "" +"Le mode de mise à jour lorsque la fenêtre d'affichage est utilisé comme " +"cible de rendu." #: doc/classes/Viewport.xml msgid "" @@ -81692,18 +84005,22 @@ msgstr "" #: doc/classes/Viewport.xml msgid "The subdivision amount of the first quadrant on the shadow atlas." msgstr "" +"La quantité de sous-division du premier quadrant de l'atlas de l'ombre." #: doc/classes/Viewport.xml msgid "The subdivision amount of the second quadrant on the shadow atlas." msgstr "" +"La quantité de sous-division du deuxième quadrant de l'atlas de l'ombre." #: doc/classes/Viewport.xml msgid "The subdivision amount of the third quadrant on the shadow atlas." msgstr "" +"La quantité de sous-division du troisième quadrant de l'atlas de l'ombre." #: doc/classes/Viewport.xml msgid "The subdivision amount of the fourth quadrant on the shadow atlas." msgstr "" +"La quantité de sous-division du quatrième quadrant de l'atlas de l'ombre." #: doc/classes/Viewport.xml msgid "" @@ -81729,10 +84046,15 @@ msgid "" "The width and height of viewport. Must be set to a value greater than or " "equal to 2 pixels on both dimensions. Otherwise, nothing will be displayed." msgstr "" +"La largeur et la hauteur de la fenêtre d'affichage. Doit être défini à une " +"valeur supérieure ou égale à 2 pixels dans les deux dimensions. Sinon, rien " +"ne sera affiché." #: doc/classes/Viewport.xml msgid "If [code]true[/code], the size override affects stretch as well." msgstr "" +"Si [code]true[/code], la surcharge de la taille affecte également " +"l'étirement." #: doc/classes/Viewport.xml msgid "" @@ -81765,6 +84087,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "The custom [World] which can be used as 3D environment source." msgstr "" +"Le [World] personnalisé qui peut être utilisée comme source d'environnement " +"en 3D." #: doc/classes/Viewport.xml msgid "The custom [World2D] which can be used as 2D environment source." @@ -81781,6 +84105,9 @@ msgid "" "Emitted when the size of the viewport is changed, whether by [method " "set_size_override], resize of window, or some other means." msgstr "" +"Émis lorsque la taille de la fenpetre d'affichage a changé, que ce soit par " +"[method set_size_override], en redimensionnant la fenêtre, ou par d'autres " +"moyens." #: doc/classes/Viewport.xml msgid "Do not update the render target." @@ -81797,6 +84124,8 @@ msgstr "" msgid "" "Update the render target only when it is visible. This is the default value." msgstr "" +"Met à jour la cible de rendu seulement quand elle est visible. C'est la " +"valeur par défaut." #: doc/classes/Viewport.xml msgid "Always update the render target." @@ -81804,11 +84133,11 @@ msgstr "Met toujours à jour la cible de rendu." #: doc/classes/Viewport.xml msgid "This quadrant will not be used." -msgstr "" +msgstr "Ce quadrant ne sera pas utilisé." #: doc/classes/Viewport.xml msgid "This quadrant will only be used by one shadow map." -msgstr "" +msgstr "Ce quadrant ne sera utilisé que par une seule carte d'ombre." #: doc/classes/Viewport.xml msgid "This quadrant will be split in 4 and used by up to 4 shadow maps." @@ -82283,8 +84612,8 @@ msgid "" "Returns [code]true[/code] when the specified layer is enabled in [member " "layers] and [code]false[/code] otherwise." msgstr "" -"Retourne [code]true[/code] si le calque spécifié est actif, ou " -"[code]false[/code] sinon." +"Retourne [code]true[/code] si le calque spécifié est actif, ou [code]false[/" +"code] sinon." #: doc/classes/VisualInstance.xml msgid "" @@ -82502,8 +84831,8 @@ msgid "" "target node can have only one sequence port." msgstr "" "Connecte deux ports d'une séquence. L'exécution passera de " -"[code]from_output[/code] de [code]from_node[/code] vers [code]to_node[/code]." -"\n" +"[code]from_output[/code] de [code]from_node[/code] vers [code]to_node[/" +"code].\n" "Contrairement à [method data_connect], il n'y a pas ∂e [code]to_port[/code], " "puisque le nÅ“ud cible ne peut avoir qu'un seul port dans la séquence." @@ -82555,8 +84884,8 @@ msgid "" "A Visual Script node representing a constant from base types, such as " "[constant Vector3.AXIS_X]." msgstr "" -"Un nÅ“ud Visual Script représentant une constante des types de base, comme [" -"constant Vector3.AXIS_X]." +"Un nÅ“ud Visual Script représentant une constante des types de base, comme " +"[constant Vector3.AXIS_X]." #: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml msgid "The type to get the constant from." @@ -82739,8 +85068,8 @@ msgid "" "the third input. Uses the formula [code]a + (a - b) * t[/code]." msgstr "" "Retourner un nombre linéairement interpolé entre les deux premières entrées, " -"basé sur la troisième entrée. Utilise la formule [code]a + (a - b) * " -"t[/code]." +"basé sur la troisième entrée. Utilise la formule [code]a + (a - b) * t[/" +"code]." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Moves the number toward a value, based on the third input." @@ -83365,8 +85694,8 @@ msgid "" "The mode for RPC calls. See [method Node.rpc] for more details and [enum " "RPCCallMode] for available options." msgstr "" -"Le mode pour les appels RPC. Voir [method Node.rpc] pour plus de détails et [" -"enum RPCCallMode] pour les options disponibles." +"Le mode pour les appels RPC. Voir [method Node.rpc] pour plus de détails et " +"[enum RPCCallMode] pour les options disponibles." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "" @@ -83840,8 +86169,8 @@ msgid "" "The node path to use when [member set_mode] is set to [constant " "CALL_MODE_NODE_PATH]." msgstr "" -"Le chemin du nÅ“ud à utiliser lorsque [member set_mode] est défini à [" -"constant CALL_MODE_NODE_PATH]." +"Le chemin du nÅ“ud à utiliser lorsque [member set_mode] est défini à " +"[constant CALL_MODE_NODE_PATH]." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml msgid "" @@ -83913,7 +86242,8 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" "The name of the property to set. Changing this will clear [member index]." -msgstr "Le nom de la propriété à définir. Changer cela effecera [member index]." +msgstr "" +"Le nom de la propriété à définir. Changer cela effecera [member index]." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" @@ -84290,7 +86620,8 @@ msgstr "Un signal depuis cet [Object] sera utilisé." #: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml msgid "A signal from the given [Node] in the scene tree will be used." -msgstr "Un signal du [Node] donné dans l'arborescence de la scène sera utilisé." +msgstr "" +"Un signal du [Node] donné dans l'arborescence de la scène sera utilisé." #: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml msgid "A signal from an instanced node with the given type will be used." @@ -84340,8 +86671,8 @@ msgid "" "Sets margin size, where black bars (or images, if [method " "black_bars_set_images] was used) are rendered." msgstr "" -"Définit la taille de la marge, où des barres noires (ou des images, si [" -"method black_bars_set_images] est utilisé) sont rendues." +"Définit la taille de la marge, où des barres noires (ou des images, si " +"[method black_bars_set_images] est utilisé) sont rendues." #: doc/classes/VisualServer.xml msgid "" @@ -84699,7 +87030,7 @@ msgid "" "texture_scale]." msgstr "" "Définit le facteur d'échelle de la texture de lumière. Équivalent à [member " -"Light2D.texture_scale]" +"Light2D.texture_scale]." #: doc/classes/VisualServer.xml msgid "" @@ -84925,7 +87256,7 @@ msgid "" "Environment.background_sky_custom_fov]." msgstr "" "Définit un angle de vue personnalisé pour le ciel [Sky] en arrière-plan. " -"Équivalent à [member Environnement.background_sky_custom_fov]" +"Équivalent à [member Environnement.background_sky_custom_fov]." #: doc/classes/VisualServer.xml msgid "" @@ -84933,7 +87264,7 @@ msgid "" "to [member Environment.background_sky_orientation]." msgstr "" "Définit la rotation du ciel [Sky] en arrière-plan exprimé avec une [Basis]. " -"Équivalent à [member Environnement.background_sky_orientation]" +"Équivalent à [member Environnement.background_sky_orientation]." #: doc/classes/VisualServer.xml msgid "" @@ -85006,8 +87337,8 @@ msgid "" "[b]Note:[/b] When running a headless or server binary, this function returns " "an empty string." msgstr "" -"Retourne le vendeur de l'adaptateur vidéo (par exemple \"NVIDIA Corporation\"" -").\n" +"Retourne le vendeur de l'adaptateur vidéo (par exemple \"NVIDIA " +"Corporation\").\n" "[b]Note :[/b] Lors de l'exécution d'une version sans graphique ou de " "serveur, cette fonction retourne une chaîne vide." @@ -85060,16 +87391,16 @@ msgid "" "Returns the dynamic range set for this GI probe. Equivalent to [member " "GIProbe.dynamic_range]." msgstr "" -"Retourne la gamme dynamique pour cette sonde GI. Équivalent à [member GIProbe" -".dynamic_range]" +"Retourne la gamme dynamique pour cette sonde GI. Équivalent à [member " +"GIProbe.dynamic_range]." #: doc/classes/VisualServer.xml msgid "" "Returns the energy multiplier for this GI probe. Equivalent to [member " "GIProbe.energy]." msgstr "" -"Retourne le multiplicateur d'énergie pour cette sonde GI. Équivalent à [" -"member GIProbe.energy]" +"Retourne le multiplicateur d'énergie pour cette sonde GI. Équivalent à " +"[member GIProbe.energy]." #: doc/classes/VisualServer.xml msgid "" @@ -85083,7 +87414,7 @@ msgid "" "GIProbe.propagation]." msgstr "" "Retourne la valeur de propagation de cette sonde GI. Équivalent à [member " -"GIProbe.propagation]" +"GIProbe.propagation]." #: doc/classes/VisualServer.xml msgid "Returns the Transform set by [method gi_probe_set_to_cell_xform]." @@ -85095,7 +87426,7 @@ msgid "" "is compressed. Equivalent to [member GIProbe.compress]." msgstr "" "Retourne [code]true[/code] si les données de cette sonde GI sont " -"compressées. Équivalent à [member GIProbe.compress]" +"compressées. Équivalent à [member GIProbe.compress]." #: doc/classes/VisualServer.xml msgid "" @@ -85741,12 +88072,10 @@ msgstr "" "utilisant la [method instance_set_base] utilisant le RID retourné." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns a mesh's blend shape count." msgstr "Retourne le nombre de formes de mélange d’un maillage." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns a mesh's blend shape mode." msgstr "Retourne le mode de forme de mélange d’un maillage." @@ -85763,7 +88092,6 @@ msgid "Removes a mesh's surface." msgstr "Supprime la surface d'un maillage." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Sets a mesh's blend shape count." msgstr "Définit le nombre de formes de mélange d’un maillage." @@ -86907,11 +89235,13 @@ msgstr "Nombre de poids / os par sommet." #: doc/classes/VisualServer.xml msgid "The minimum Z-layer for canvas items." -msgstr "Le niveau minimal du calque de profondeur pour les éléments de canevas." +msgstr "" +"Le niveau minimal du calque de profondeur pour les éléments de canevas." #: doc/classes/VisualServer.xml msgid "The maximum Z-layer for canvas items." -msgstr "Le niveau maximal du calque de profondeur pour les éléments de canevas." +msgstr "" +"Le niveau maximal du calque de profondeur pour les éléments de canevas." #: doc/classes/VisualServer.xml msgid "" @@ -89273,7 +91603,6 @@ msgstr "" "ignorant la dernière ligne et colonne de la transformation." #: doc/classes/VisualShaderNodeUniform.xml -#, fuzzy msgid "A base type for the uniforms within the visual shader graph." msgstr "Le type de base pour les uniformes dans le graphe du Visual Shader." @@ -89822,10 +92151,13 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +#, fuzzy +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" -"Retourne le [Object] que cette référence faible ([code]weakref[/code]) " -"contient." +"Retourne la valeur initiale de la propriété spécifiée. Retourne [code]null[/" +"code] si la propriété n'existe pas." #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "Closes this data channel, notifying the other peer." diff --git a/doc/translations/gl.po b/doc/translations/gl.po index 207a818761..0f079f0003 100644 --- a/doc/translations/gl.po +++ b/doc/translations/gl.po @@ -541,8 +541,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -552,7 +553,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -606,7 +608,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -618,7 +621,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1033,10 +1037,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4847,19 +4856,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4880,21 +4891,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4903,9 +4918,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5557,9 +5573,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5733,8 +5749,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8736,8 +8752,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8788,10 +8805,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9033,12 +9060,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9584,7 +9605,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9745,12 +9771,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9898,6 +9928,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10038,7 +10083,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11716,7 +11764,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11809,7 +11857,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11837,9 +11887,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12336,13 +12386,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12368,8 +12419,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12682,12 +12735,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12732,8 +12785,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12781,8 +12836,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12844,7 +12902,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12969,7 +13027,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15965,7 +16026,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18690,7 +18753,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18839,16 +18904,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18993,18 +19059,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23908,8 +23962,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24529,7 +24587,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26113,10 +26173,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27523,8 +27586,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29824,11 +29887,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30673,7 +30739,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30685,6 +30755,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33042,14 +33122,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33057,21 +33137,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34648,9 +34728,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35109,7 +35189,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36221,7 +36303,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37036,13 +37118,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40706,7 +40800,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46070,7 +46166,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46309,7 +46407,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47038,7 +47138,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49719,8 +49823,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53737,7 +53852,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53881,13 +53998,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55077,7 +55200,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55696,6 +55822,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56030,7 +56164,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57463,7 +57599,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58728,6 +58864,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58789,6 +58928,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58811,7 +58953,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59948,6 +60093,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59977,6 +60126,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60018,7 +60171,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64883,21 +65038,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64910,7 +65069,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64939,7 +65098,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64949,22 +65140,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64977,8 +65181,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65176,16 +65382,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73815,7 +74021,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/hi.po b/doc/translations/hi.po index 2df4b9bbe4..68273c5a73 100644 --- a/doc/translations/hi.po +++ b/doc/translations/hi.po @@ -5,12 +5,13 @@ # # harvinder rathor <harvinderr09@gmail.com>, 2021. # Lalita mishra <yashkebacche1234@gmail.com>, 2022. +# Yan Chen <cyan97087@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-02-03 13:04+0000\n" -"Last-Translator: Lalita mishra <yashkebacche1234@gmail.com>\n" +"PO-Revision-Date: 2022-08-21 06:02+0000\n" +"Last-Translator: Yan Chen <cyan97087@gmail.com>\n" "Language-Team: Hindi <https://hosted.weblate.org/projects/godot-engine/godot-" "class-reference/hi/>\n" "Language: hi\n" @@ -18,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -61,7 +62,6 @@ msgid "Method Descriptions" msgstr "Method Descriptions" #: doc/tools/make_rst.py -#, fuzzy msgid "Theme Property Descriptions" msgstr "थीम विशेषता" @@ -540,8 +540,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -551,7 +552,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -605,7 +607,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -617,7 +620,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1032,10 +1036,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4846,19 +4855,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4879,21 +4890,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4902,9 +4917,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5556,9 +5572,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5732,8 +5748,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8735,8 +8751,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8787,10 +8804,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9032,12 +9059,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9583,7 +9604,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9744,12 +9770,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9897,6 +9927,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10037,7 +10082,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11715,7 +11763,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11808,7 +11856,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11836,9 +11886,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12335,13 +12385,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12367,8 +12418,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12681,12 +12734,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12731,8 +12784,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12780,8 +12835,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12843,7 +12901,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12968,7 +13026,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15964,7 +16025,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18689,7 +18752,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18838,16 +18903,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18992,18 +19058,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23907,8 +23961,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24528,7 +24586,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26112,10 +26172,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27522,8 +27585,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29823,11 +29886,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30672,7 +30738,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30684,6 +30754,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33041,14 +33121,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33056,21 +33136,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34647,9 +34727,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35108,7 +35188,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36220,7 +36302,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37035,13 +37117,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40705,7 +40799,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46069,7 +46165,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46308,7 +46406,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47037,7 +47137,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49718,8 +49822,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53736,7 +53851,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53880,13 +53997,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55076,7 +55199,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55695,6 +55821,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56029,7 +56163,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57462,7 +57598,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58727,6 +58863,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58788,6 +58927,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58810,7 +58952,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59947,6 +60092,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59976,6 +60125,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60017,7 +60170,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64882,21 +65037,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64909,7 +65068,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64938,7 +65097,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64948,22 +65139,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64976,8 +65180,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65175,16 +65381,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73814,7 +74020,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/hu.po b/doc/translations/hu.po index 221206451a..feaff9b12c 100644 --- a/doc/translations/hu.po +++ b/doc/translations/hu.po @@ -559,8 +559,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -570,7 +571,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -624,7 +626,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -636,7 +639,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1051,10 +1055,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4865,19 +4874,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4898,21 +4909,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4921,9 +4936,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5575,9 +5591,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5751,8 +5767,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8754,8 +8770,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8806,10 +8823,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9051,12 +9078,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9602,7 +9623,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9763,12 +9789,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9916,6 +9946,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10056,7 +10101,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11734,7 +11782,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11827,7 +11875,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11855,9 +11905,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12354,13 +12404,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12386,8 +12437,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12700,12 +12753,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12750,8 +12803,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12799,8 +12854,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12862,7 +12920,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12987,7 +13045,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15983,7 +16044,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18708,7 +18771,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18857,16 +18922,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19011,18 +19077,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23926,8 +23980,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24547,7 +24605,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26131,10 +26191,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27541,8 +27604,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29842,11 +29905,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30691,7 +30757,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30703,6 +30773,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33060,14 +33140,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33075,21 +33155,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34666,9 +34746,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35127,7 +35207,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36239,7 +36321,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37054,13 +37136,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40724,7 +40818,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46088,7 +46184,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46327,7 +46425,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47056,7 +47156,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49737,8 +49841,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53755,7 +53870,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53899,13 +54016,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55095,7 +55218,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55714,6 +55840,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56048,7 +56182,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57481,7 +57617,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58746,6 +58882,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58807,6 +58946,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58829,7 +58971,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59966,6 +60111,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59995,6 +60144,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60036,7 +60189,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64901,21 +65056,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64928,7 +65087,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64957,7 +65116,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64967,22 +65158,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64995,8 +65199,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65194,16 +65400,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73833,7 +74039,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/id.po b/doc/translations/id.po index 39310a6160..7d50703868 100644 --- a/doc/translations/id.po +++ b/doc/translations/id.po @@ -16,12 +16,13 @@ # Reza Almanda <rezaalmanda27@gmail.com>, 2022. # Tsaqib Fadhlurrahman Soka <sokatsaqib@gmail.com>, 2022. # yusuf afandi <afandi.yusuf.04@gmail.com>, 2022. +# Yan Chen <cyan97087@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-09 21:12+0000\n" -"Last-Translator: yusuf afandi <afandi.yusuf.04@gmail.com>\n" +"PO-Revision-Date: 2022-08-14 04:02+0000\n" +"Last-Translator: Yan Chen <cyan97087@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/id/>\n" "Language: id\n" @@ -29,7 +30,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -134,13 +135,12 @@ msgstr "" "dipanggil langsung menggunakan nama class." #: doc/tools/make_rst.py -#, fuzzy msgid "" "This method describes a valid operator to use with this type as left-hand " "operand." msgstr "" -"Metode ini menjelaskan operator yang valid untuk digunakan dengan jenis ini " -"sebagai nilai pembilang." +"Metode ini menjelaskan operator yang valid untuk digunakan dengan tipe ini " +"sebagai operan kiri." #: modules/gdscript/doc_classes/@GDScript.xml msgid "Built-in GDScript functions." @@ -317,7 +317,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy 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 " @@ -327,13 +326,13 @@ msgid "" "a = atan2(0, -1) # a is 3.141593\n" "[/codeblock]" msgstr "" -"Mengembalikan tangen busur [code]y/x[/code] dalam radian. Gunakan untuk " -"mendapatkan sudut tangen [kode]y/x[/kode]. Untuk menghitung nilai, metode " -"memperhitungkan tanda dari kedua argumen untuk menentukan kuadran.\n" +"Mengembalikan tangen busur dari [code]y/x[/code] dalam radian. Gunakan untuk " +"mendapatkan sudut tangen [code]y/x[/code]. Untuk menghitung nilai, metode " +"ini memperhitungkan tanda kedua argumen untuk menentukan kuadran.\n" "Catatan penting: Koordinat Y didahulukan, berdasarkan konvensi.\n" -"[blok kode]\n" +"[codeblock]\n" "a = atan2(0, -1) # a adalah 3.141593\n" -"[/blok kode]" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -789,8 +788,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -800,7 +800,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -880,7 +881,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -892,7 +894,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1434,19 +1437,18 @@ msgid "" msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Memetakan sebuah [code] nilai[/code] dari jangkauan [code][istart, istop][/" -"code] ke [code][ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Mengembalikan 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -5263,19 +5265,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5296,21 +5300,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5320,9 +5328,10 @@ msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5974,9 +5983,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -6150,8 +6159,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -9153,8 +9162,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9205,10 +9215,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9450,12 +9470,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10001,7 +10015,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10162,12 +10181,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10315,6 +10338,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10455,7 +10493,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12133,7 +12174,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12226,7 +12267,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12254,9 +12297,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12754,13 +12797,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12786,8 +12830,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13100,12 +13146,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13150,8 +13196,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13199,8 +13247,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13262,7 +13313,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13387,7 +13438,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16383,7 +16437,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19108,7 +19164,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19257,16 +19315,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19411,18 +19470,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -24332,8 +24379,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24954,7 +25005,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26542,10 +26595,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27953,8 +28009,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -30254,11 +30310,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31103,7 +31162,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31115,6 +31178,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33472,14 +33545,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33487,22 +33560,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Line2D.xml msgid "" @@ -35078,9 +35155,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35540,7 +35617,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36671,7 +36750,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37489,13 +37568,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41162,7 +41253,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46543,7 +46636,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/PopupMenu.xml @@ -46782,7 +46877,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47511,7 +47608,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50192,8 +50293,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54211,7 +54323,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54355,13 +54469,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55551,7 +55671,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56170,6 +56293,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56504,7 +56635,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57937,7 +58070,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59204,6 +59337,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -59265,6 +59401,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -59287,7 +59426,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60424,6 +60566,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60453,6 +60600,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60494,7 +60646,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65364,21 +65518,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65391,7 +65549,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65420,7 +65578,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65430,22 +65620,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65458,8 +65661,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65657,16 +65862,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74302,7 +74507,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/is.po b/doc/translations/is.po index e3080abf39..2b748209ad 100644 --- a/doc/translations/is.po +++ b/doc/translations/is.po @@ -540,8 +540,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -551,7 +552,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -605,7 +607,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -617,7 +620,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1032,10 +1036,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4846,19 +4855,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4879,21 +4890,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4902,9 +4917,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5556,9 +5572,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5732,8 +5748,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8735,8 +8751,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8787,10 +8804,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9032,12 +9059,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9583,7 +9604,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9744,12 +9770,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9897,6 +9927,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10037,7 +10082,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11715,7 +11763,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11808,7 +11856,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11836,9 +11886,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12335,13 +12385,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12367,8 +12418,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12681,12 +12734,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12731,8 +12784,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12780,8 +12835,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12843,7 +12901,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12968,7 +13026,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15964,7 +16025,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18689,7 +18752,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18838,16 +18903,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18992,18 +19058,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23907,8 +23961,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24528,7 +24586,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26112,10 +26172,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27522,8 +27585,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29823,11 +29886,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30672,7 +30738,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30684,6 +30754,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33041,14 +33121,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33056,21 +33136,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34647,9 +34727,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35108,7 +35188,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36220,7 +36302,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37035,13 +37117,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40705,7 +40799,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46069,7 +46165,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46308,7 +46406,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47037,7 +47137,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49718,8 +49822,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53736,7 +53851,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53880,13 +53997,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55076,7 +55199,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55695,6 +55821,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56029,7 +56163,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57462,7 +57598,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58727,6 +58863,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58788,6 +58927,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58810,7 +58952,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59947,6 +60092,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59976,6 +60125,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60017,7 +60170,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64882,21 +65037,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64909,7 +65068,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64938,7 +65097,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64948,22 +65139,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64976,8 +65180,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65175,16 +65381,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73814,7 +74020,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/it.po b/doc/translations/it.po index e07c906b29..019642cd3a 100644 --- a/doc/translations/it.po +++ b/doc/translations/it.po @@ -30,7 +30,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-31 16:43+0000\n" +"PO-Revision-Date: 2022-08-12 17:09+0000\n" "Last-Translator: Mirko <miknsop@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/it/>\n" @@ -62,7 +62,6 @@ msgid "Theme Properties" msgstr "Proprietà del tema" #: doc/tools/make_rst.py -#, fuzzy msgid "Signals" msgstr "Segnali" @@ -848,8 +847,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -859,7 +859,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Ritorna un'interpolazione o un fattore estrapolato considerando il raggio " "specificato nel [code]from[/code] e [code]to[/code], e i valori interpolati " @@ -951,7 +952,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -963,7 +965,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Interpola linearmente tra due valori mediante un valore definito in " "[code]weight[/code]. Per interpolare, [code]weight[/code] dovrebbe rimanere " @@ -1644,16 +1647,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Effettua una mappatura di un valore [code]value[/code] da un intervallo " -"[code][istart, istop][/code] in [code][ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Restituisce 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -5848,19 +5851,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5881,21 +5886,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5905,9 +5914,10 @@ msgstr "Restituisce la tangente del parametro." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -6559,9 +6569,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -6735,8 +6745,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -9758,8 +9768,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9810,10 +9821,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -10059,12 +10080,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10610,7 +10625,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10771,12 +10791,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10927,6 +10951,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -11067,7 +11106,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12749,7 +12791,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12842,7 +12884,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12870,9 +12914,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -13377,13 +13421,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -13409,8 +13454,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13723,12 +13770,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13773,8 +13820,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13822,8 +13871,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13885,7 +13937,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -14010,7 +14062,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -17071,7 +17126,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19826,7 +19883,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19975,16 +20034,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -20130,18 +20190,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Restituisce l'arco-seno del parametro." @@ -25065,8 +25113,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25690,7 +25742,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -27285,10 +27339,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28711,8 +28768,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -31017,11 +31074,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31869,7 +31929,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31881,6 +31945,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -34256,14 +34330,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -34271,22 +34345,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Restituisce il resto dei due vettori." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Calcola il prodotto vettoriale di questo vettore e [code]b[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Calcola il prodotto vettoriale di questo vettore e [code]with[/code]." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Line2D.xml msgid "" @@ -35867,9 +35945,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -36330,7 +36408,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -37474,7 +37554,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -38308,13 +38388,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41993,7 +42085,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -47400,7 +47494,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Calcola il prodotto vettoriale di questo vettore e [code]with[/code]." #: doc/classes/PopupMenu.xml @@ -47639,7 +47735,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -48369,7 +48467,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51050,8 +51152,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -55077,7 +55190,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -55223,13 +55338,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -56419,7 +56540,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -57040,6 +57164,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -57374,7 +57506,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58812,7 +58946,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -60082,6 +60216,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -60143,6 +60280,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -60165,7 +60305,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -61304,6 +61447,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Calcola il prodotto vettoriale di questo vettore e [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -61334,6 +61482,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Calcola il prodotto vettoriale di questo vettore e [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -61375,7 +61528,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -66299,21 +66454,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -66326,7 +66485,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -66355,7 +66514,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66365,22 +66556,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -66393,8 +66597,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66601,17 +66807,16 @@ msgid "Unknown error." msgstr "Errore sconosciuto." #: modules/upnp/doc_classes/UPNPDevice.xml -#, fuzzy -msgid "UPNP device." -msgstr "Dispositivo UPNP." +msgid "Universal Plug and Play (UPnP) device." +msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -75309,7 +75514,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/ja.po b/doc/translations/ja.po index fe76c741d0..0e49cb321e 100644 --- a/doc/translations/ja.po +++ b/doc/translations/ja.po @@ -814,6 +814,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -821,8 +822,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -832,7 +834,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "[code]from[/code] 㨠[code]to[/code] ã§æŒ‡å®šã•れãŸç¯„囲ã¨ã€[code]weight[/code] " "ã§æŒ‡å®šã•れãŸè£œé–“値を考慮ã—ãŸã€è£œé–“ã¾ãŸã¯å¤–挿ã®ä¿‚æ•°ã‚’è¿”ã—ã¾ã™ã€‚[code]weight[/" @@ -918,12 +921,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -935,7 +940,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "ï¼’ã¤ã®å€¤ãŠã‚ˆã³æ£è¦åŒ–ã•れãŸå€¤ã‹ã‚‰ç·šå½¢è£œé–“ã—ã¾ã™ã€‚ã“れ㯠[method inverse_lerp] " "ã®é€†ã§ã™ã€‚\n" @@ -1598,16 +1604,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"範囲 [code][istart, istop][/code] ã®å€¤ [code]value[/code] ã‚’ã€ç¯„囲 [code]" -"[ostart, ostop][/code] ã¸ã¨ãƒžãƒƒãƒ—ã—ã¾ã™ã€‚\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # 0.5 ã¨è¿”ã™\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -6218,24 +6224,22 @@ msgstr "" "åˆã«ã®ã¿æœ‰ç”¨ã§ã€ãã†ã§ãªã‘れã°ã‚¨ãƒ‡ã‚£ã‚¿ã¯è¿½åŠ ç”¨ãƒŽãƒ¼ãƒ‰ã‚’è¡¨ç¤ºã—ã¾ã›ã‚“。" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." -msgstr "ã“ã®ãƒŽãƒ¼ãƒ‰ã®ãƒ†ã‚ストã‚ャプションをå–å¾—ã—ã¾ã™ (特定ã®ã‚¨ãƒ‡ã‚£ã‚¿ã§ä½¿ç”¨)。" +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." +msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" -"åノードをインデックスã§å–å¾—ã—ã¾ã™ ([AnimationRootNode] を継承ã—ãŸã‚¨ãƒ‡ã‚£ã‚¿ã§" -"使用)。" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" -"ã™ã¹ã¦ã®åãƒŽãƒ¼ãƒ‰ã‚’é †ç•ªé€šã‚Šã« [code]name: node[/code] ã®è¾žæ›¸ã¨ã—ã¦å–å¾—ã—ã¾ã™ã€‚" -"[AnimationRootNode] を継承ã™ã‚‹å ´åˆã«ã®ã¿æœ‰ç”¨ã§ã™ã€‚" #: doc/classes/AnimationNode.xml msgid "" @@ -6256,16 +6260,21 @@ msgstr "" "ãƒãƒ¼ã‚«ãƒ«ãƒ¡ãƒ¢ãƒªã§ã€ä¸Žãˆã‚‰ã‚ŒãŸãƒªã‚½ãƒ¼ã‚¹ã¯è¤‡æ•°ã®ãƒ„リーã§å†åˆ©ç”¨ã§ãã¾ã™ã€‚" #: doc/classes/AnimationNode.xml +#, fuzzy 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" "特定ã®ãƒ‘ラメータã®ãƒ‡ãƒ•ォルト値をå–å¾—ã—ã¾ã™ã€‚パラメータã¯ãƒŽãƒ¼ãƒ‰ã«ä½¿ç”¨ã•れるカ" "スタムã®ãƒãƒ¼ã‚«ãƒ«ãƒ¡ãƒ¢ãƒªã§ã€ä¸Žãˆã‚‰ã‚ŒãŸãƒªã‚½ãƒ¼ã‚¹ã¯è¤‡æ•°ã®ãƒ„リーã§å†åˆ©ç”¨ã§ãã¾ã™ã€‚" #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 "" @@ -6274,9 +6283,11 @@ msgstr "" "ã™ã€‚フォーマット㯠[method Object.get_property_list] ã«ä¼¼ã¦ã„ã¾ã™ã€‚" #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" "ã“ã®ãƒŽãƒ¼ãƒ‰ã§ç·¨é›†ã™ã‚‹ãƒ•ィルターをã€ãƒ–レンドツリーエディタã«ã¦è¡¨ç¤ºã•ã›ãŸã„å ´åˆ" "㯠[code]true[/code] ã‚’è¿”ã™ã‚ˆã†ã«ã—ã¾ã™ã€‚" @@ -6288,10 +6299,12 @@ msgstr "" "指定ã—ãŸãƒ‘スãŒãƒ•ィルタリングã•れã¦ã„れ㰠[code]true[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/AnimationNode.xml +#, fuzzy 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -7089,9 +7102,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -7314,9 +7327,10 @@ msgstr "" "[code]animation[/code] ã®åå‰ã‚’è¿”ã—ã¾ã™ã€‚ã‚‚ã—ç„¡ã‘れã°ã€ç©ºã®æ–‡å—列を返ã—ã¾ã™ã€‚" #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" "ã‚ー [code]name[/code] ã‚’æŒã¤ [Animation] ã‚’è¿”ã™ã‹ã€è¦‹ã¤ã‹ã‚‰ãªã„å ´åˆã¯ " "[code]null[/code] ã‚’è¿”ã—ã¾ã™ã€‚" @@ -11197,8 +11211,9 @@ msgstr "" "オーディオãƒã‚¹ã®åŸºåº•リソース。リソースãŒé©ç”¨ã•れã¦ã„ã‚‹ãƒã‚¹ã«å¯¾ã—ã€ã‚ªãƒ¼ãƒ‡ã‚£ã‚ª" "エフェクトをé©ç”¨ã—ã¾ã™ã€‚" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -11258,10 +11273,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -11560,12 +11585,6 @@ msgstr "" "「耳ã–ã‚りã€ã«ãªã‚Šã¾ã™ã€‚ゲームã«ãŠã„ã¦ã¯ã€æ°´æ²¡ã—ãŸæ©Ÿå™¨ã‚„スピーカーãŒå‡ºã™ã‚ˆã†" "ãªéŸ³ã‚’éžå¸¸ã«åŠ¹çŽ‡çš„ã«ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "æªã¿ã®å¼·ã•。値ã®ç¯„囲ã¯0~1ã§ã™ã€‚" @@ -12252,8 +12271,13 @@ msgstr "" "ãƒ•ã‚§ã‚¯ãƒˆã‚’è¿½åŠ ã—ã¾ã™ã€‚" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." -msgstr "ã‚·ã‚¹ãƒ†ãƒ ä¸Šã§æ¤œå‡ºã•れãŸã™ã¹ã¦ã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªå…¥åŠ›ãƒ‡ãƒã‚¤ã‚¹ã®åå‰ã‚’è¿”ã—ã¾ã™ã€‚" +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" #: doc/classes/AudioServer.xml msgid "Generates an [AudioBusLayout] using the available buses and effects." @@ -12444,12 +12468,16 @@ msgstr "利用å¯èƒ½ãªã‚ªãƒ¼ãƒ‡ã‚£ã‚ªãƒã‚¹ã®æ•°ã€‚" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -12607,6 +12635,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml #, fuzzy msgid "MP3 audio stream driver." @@ -12762,7 +12805,10 @@ msgstr "3D空間ã§3Dサウンドをå†ç”Ÿã—ã¾ã™ã€‚" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -14686,7 +14732,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -14779,7 +14825,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -14807,9 +14855,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -15319,13 +15367,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -15351,8 +15400,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -15668,12 +15719,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -15718,8 +15769,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -15767,8 +15820,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -15830,7 +15886,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -15967,7 +16023,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -19020,7 +19079,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -21826,7 +21887,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -21975,16 +22038,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -22130,18 +22194,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "ブレンド軸上ã®ãƒã‚¤ãƒ³ãƒˆã®æ•°ã‚’è¿”ã—ã¾ã™ã€‚" @@ -27092,8 +27144,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -27716,7 +27772,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -29324,10 +29382,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -30766,8 +30827,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -33078,11 +33139,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -33934,7 +33998,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -33946,6 +34014,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -36376,14 +36454,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -36391,22 +36469,29 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "アニメーションã®ãƒˆãƒ©ãƒƒã‚¯æ•°ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "インデックス [code]point[/code] ã®ãƒã‚¤ãƒ³ãƒˆã®ä½ç½®ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" +"ブレンド空間ã‹ã‚‰ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ [code]point[/code] ã®ãƒã‚¤ãƒ³ãƒˆã‚’削除ã—ã¾ã™ã€‚" #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" +"インデックス [code]triangle[/code] ã®ä¸‰è§’形内ã«ã‚ã‚‹ã€ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ " +"[code]point[/code] ã®ãƒã‚¤ãƒ³ãƒˆã®ä½ç½®ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Line2D.xml msgid "" @@ -37986,9 +38071,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -38456,7 +38541,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -39618,7 +39705,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -40460,13 +40547,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -44155,7 +44254,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -49593,7 +49694,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" "与ãˆã‚‰ã‚ŒãŸ[code]id[/code]ã‚’æŒã¤ç‚¹ã®ä½ç½®[code]position[/code]ã‚’è¨å®šã—ã¾ã™ã€‚" @@ -49836,7 +49939,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -50572,7 +50677,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53264,8 +53373,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -57329,7 +57449,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -57476,13 +57598,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -58673,7 +58801,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -59302,6 +59433,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -59656,7 +59795,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -61345,7 +61486,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -62635,6 +62776,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -62696,6 +62840,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -62718,7 +62865,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -63868,6 +64018,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "インデックス [code]bus_idx[/code] ã®ãƒã‚¹ã®éŸ³é‡ã‚’ dB ã§è¿”ã—ã¾ã™ã€‚" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -63898,6 +64053,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "インデックス [code]bus_idx[/code] ã®ãƒã‚¹ã®éŸ³é‡ã‚’ dB ã§è¿”ã—ã¾ã™ã€‚" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -63940,8 +64100,13 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" +"ã‚«ã‚¹ã‚¿ãƒ ãƒœã‚¿ãƒ³ãŒæŠ¼ã•れãŸã¨ãã«è¡¨ç¤ºã•れã¾ã™ã€‚[method add_button] ã‚’å‚ç…§ã—ã¦ã" +"ã ã•ã„。" #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -68905,21 +69070,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -68932,7 +69101,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -68961,7 +69130,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -68971,22 +69172,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -68999,8 +69213,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -69198,16 +69414,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -77981,7 +78197,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/ko.po b/doc/translations/ko.po index ac9274cee6..05cbf2cdba 100644 --- a/doc/translations/ko.po +++ b/doc/translations/ko.po @@ -16,12 +16,13 @@ # 한수현 <shh1473@ajou.ac.kr>, 2022. # vrSono <global.sonogong@gmail.com>, 2022. # 김태우 <ogosengi3@gmail.com>, 2022. +# ì´ì§€ë¯¼ <jiminaleejung@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-29 10:30+0000\n" -"Last-Translator: 김태우 <ogosengi3@gmail.com>\n" +"PO-Revision-Date: 2022-09-07 02:16+0000\n" +"Last-Translator: ì´ì§€ë¯¼ <jiminaleejung@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/ko/>\n" "Language: ko\n" @@ -29,7 +30,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -520,6 +521,8 @@ msgid "" "Converts a dictionary (previously created with [method inst2dict]) back to " "an instance. Useful for deserializing." msgstr "" +"([메서드 inst2dict]으로 ìƒì„±ëœ) 딕셔너리를 ì¸ìŠ¤í„´ìŠ¤ë¡œ 변경합니다. ì—ì§ë ¬í™”ì— " +"ìœ ìš©í•˜ê²Œ 사용ë©ë‹ˆë‹¤." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -690,8 +693,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -701,7 +705,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -725,11 +730,15 @@ msgid "" "Returns whether [code]instance[/code] is a valid object (e.g. has not been " "deleted from memory)." msgstr "" +"[code]ì¸ìŠ¤í„´ìŠ¤[/code]ê°€ ìœ íš¨í•œ ê°ì²´ì¸ì§€ 여부를 반환합니다 (예시. 메모리ì—서 " +"ì‚ì œë˜ì§€ 않았는지)." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Returns whether [code]s[/code] is a NaN (\"Not a Number\" or invalid) value." msgstr "" +"[code]s[/code]ê°€ NaN (\"Not a Number\" í˜¹ì€ ìœ íš¨í•˜ì§€ 않ì€) ê°’ì¸ì§€ 여부를 반환" +"합니다." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -737,6 +746,9 @@ msgid "" "This method is faster than using [method is_equal_approx] with one value as " "zero." msgstr "" +"[code]s[/code]ê°€ 0ì´ê±°ë‚˜ 0ì— ì¸ì ‘한 ê°’ì´ë©´ [code]true[/code]를 반환합니다. \n" +"ì´ ë©”ì„œë“œëŠ” [메서드 is_equal_approx]ì— 0ì„ ì¸ìžê°’으로 사용하는 경우보다 ë¹ ë¦…" +"니다." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -755,7 +767,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -767,7 +780,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1198,10 +1212,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -5019,19 +5038,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5052,21 +5073,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5076,9 +5101,10 @@ msgstr "ë§¤ê°œë³€ìˆ˜ì˜ íƒ„ì 트 ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5730,9 +5756,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5906,8 +5932,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8910,8 +8936,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8962,10 +8989,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9208,12 +9245,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9759,7 +9790,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9920,12 +9956,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10073,6 +10113,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10213,7 +10268,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11893,7 +11951,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11986,7 +12044,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12014,9 +12074,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12517,13 +12577,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12548,10 +12609,19 @@ msgid "Custom drawing in 2D" msgstr "" #: doc/classes/CanvasItem.xml +#, fuzzy msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" +"노드가 [SceneTree]ì— ë“¤ì–´ê°ˆ 때 호출ë©ë‹ˆë‹¤ (예를 들어 ì¸ìŠ¤í„´ì‹±ë˜ê±°ë‚˜, ì”¬ì´ ë°”" +"뀌거나 스í¬ë¦½íЏì—서 [method add_child]를 호출한 경우). 노드가 ìžì†ì„ ê°€ì§€ê³ " +"있다면 ìžì‹ ì˜ [method _enter_tree]ê°€ ë¨¼ì € ë¶ˆë¦¬ê³ ìžì†ì´ ê·¸ 다ìŒì— 불릴 것입니" +"다.\n" +"[method Object._notification]ì˜ [constant NOTIFICATION_ENTER_TREE] ë…¸í‹°ì— ëŒ€" +"ì‘합니다." #: doc/classes/CanvasItem.xml msgid "" @@ -12863,12 +12933,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12913,8 +12983,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12962,8 +13034,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13025,7 +13100,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13150,7 +13225,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16180,7 +16258,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18911,7 +18991,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19060,16 +19142,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19215,18 +19298,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì•„í¬ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." @@ -24202,8 +24273,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24825,7 +24900,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26413,10 +26490,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27825,8 +27905,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -30134,11 +30214,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30984,7 +31067,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30996,6 +31083,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33357,14 +33454,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33372,22 +33469,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/Line2D.xml msgid "" @@ -34964,9 +35065,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35427,7 +35528,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36564,7 +36667,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37390,13 +37493,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41192,7 +41307,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46578,7 +46695,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/PopupMenu.xml @@ -46817,7 +46936,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47547,7 +47668,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50228,8 +50353,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54248,7 +54384,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54392,13 +54530,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55588,7 +55732,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56207,6 +56354,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56541,7 +56696,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57974,7 +58131,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59241,6 +59398,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -59302,6 +59462,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -59324,7 +59487,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60461,6 +60627,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60491,6 +60662,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60532,7 +60708,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65413,21 +65591,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65440,7 +65622,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65469,7 +65651,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65479,22 +65693,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65507,8 +65734,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65706,16 +65935,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74383,7 +74612,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/lt.po b/doc/translations/lt.po index 79790f5e70..54bc7dd212 100644 --- a/doc/translations/lt.po +++ b/doc/translations/lt.po @@ -550,8 +550,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -561,7 +562,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -615,7 +617,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -627,7 +630,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1042,10 +1046,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4856,19 +4865,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4889,21 +4900,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4912,9 +4927,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5566,9 +5582,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5742,8 +5758,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8745,8 +8761,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8797,10 +8814,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9042,12 +9069,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9593,7 +9614,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9754,12 +9780,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9907,6 +9937,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10047,7 +10092,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11725,7 +11773,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11818,7 +11866,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11846,9 +11896,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12345,13 +12395,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12377,8 +12428,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12691,12 +12744,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12741,8 +12794,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12790,8 +12845,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12853,7 +12911,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12978,7 +13036,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15974,7 +16035,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18699,7 +18762,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18848,16 +18913,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19002,18 +19068,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23917,8 +23971,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24538,7 +24596,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26122,10 +26182,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27532,8 +27595,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29833,11 +29896,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30682,7 +30748,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30694,6 +30764,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33051,14 +33131,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33066,21 +33146,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34657,9 +34737,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35118,7 +35198,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36230,7 +36312,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37045,13 +37127,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40715,7 +40809,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46079,7 +46175,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46318,7 +46416,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47047,7 +47147,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49728,8 +49832,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53746,7 +53861,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53890,13 +54007,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55086,7 +55209,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55705,6 +55831,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56039,7 +56173,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57472,7 +57608,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58737,6 +58873,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58798,6 +58937,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58820,7 +58962,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59957,6 +60102,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59986,6 +60135,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60027,7 +60180,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64892,21 +65047,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64919,7 +65078,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64948,7 +65107,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64958,22 +65149,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64986,8 +65190,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65185,16 +65391,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73824,7 +74030,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/lv.po b/doc/translations/lv.po index 1f63bf69bb..36c46e6754 100644 --- a/doc/translations/lv.po +++ b/doc/translations/lv.po @@ -555,8 +555,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -566,7 +567,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -620,7 +622,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -632,7 +635,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1047,10 +1051,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4861,19 +4870,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4894,21 +4905,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4917,9 +4932,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5571,9 +5587,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5747,8 +5763,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8750,8 +8766,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8802,10 +8819,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9047,12 +9074,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9598,7 +9619,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9759,12 +9785,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9912,6 +9942,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10052,7 +10097,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11730,7 +11778,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11823,7 +11871,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11851,9 +11901,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12350,13 +12400,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12382,8 +12433,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12696,12 +12749,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12746,8 +12799,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12795,8 +12850,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12858,7 +12916,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12983,7 +13041,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15979,7 +16040,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18704,7 +18767,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18853,16 +18918,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19007,18 +19073,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23925,8 +23979,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24546,7 +24604,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26130,10 +26190,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27540,8 +27603,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29841,11 +29904,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30690,7 +30756,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30702,6 +30772,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33059,14 +33139,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33074,21 +33154,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34665,9 +34745,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35126,7 +35206,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36238,7 +36320,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37053,13 +37135,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40723,7 +40817,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46087,7 +46183,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46326,7 +46424,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47055,7 +47155,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49736,8 +49840,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53754,7 +53869,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53898,13 +54015,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55094,7 +55217,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55713,6 +55839,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56047,7 +56181,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57480,7 +57616,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58745,6 +58881,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58806,6 +58945,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58828,7 +58970,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59965,6 +60110,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59994,6 +60143,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60035,7 +60188,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64900,21 +65055,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64927,7 +65086,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64956,7 +65115,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64966,22 +65157,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64994,8 +65198,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65193,16 +65399,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73832,7 +74038,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/mr.po b/doc/translations/mr.po index 32832a4d8f..de37d7ffe8 100644 --- a/doc/translations/mr.po +++ b/doc/translations/mr.po @@ -538,8 +538,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -549,7 +550,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -603,7 +605,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -615,7 +618,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1030,10 +1034,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4844,19 +4853,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4877,21 +4888,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4900,9 +4915,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5554,9 +5570,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5730,8 +5746,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8733,8 +8749,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8785,10 +8802,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9030,12 +9057,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9581,7 +9602,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9742,12 +9768,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9895,6 +9925,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10035,7 +10080,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11713,7 +11761,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11806,7 +11854,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11834,9 +11884,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12333,13 +12383,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12365,8 +12416,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12679,12 +12732,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12729,8 +12782,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12778,8 +12833,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12841,7 +12899,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12966,7 +13024,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15962,7 +16023,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18687,7 +18750,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18836,16 +18901,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18990,18 +19056,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23905,8 +23959,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24526,7 +24584,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26110,10 +26170,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27520,8 +27583,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29821,11 +29884,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30670,7 +30736,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30682,6 +30752,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33039,14 +33119,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33054,21 +33134,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34645,9 +34725,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35106,7 +35186,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36218,7 +36300,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37033,13 +37115,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40703,7 +40797,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46067,7 +46163,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46306,7 +46404,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47035,7 +47135,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49716,8 +49820,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53734,7 +53849,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53878,13 +53995,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55074,7 +55197,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55693,6 +55819,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56027,7 +56161,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57460,7 +57596,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58725,6 +58861,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58786,6 +58925,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58808,7 +58950,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59945,6 +60090,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59974,6 +60123,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60015,7 +60168,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64880,21 +65035,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64907,7 +65066,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64936,7 +65095,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64946,22 +65137,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64974,8 +65178,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65173,16 +65379,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73812,7 +74018,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/nb.po b/doc/translations/nb.po index 42dca83c45..ffc7df03eb 100644 --- a/doc/translations/nb.po +++ b/doc/translations/nb.po @@ -550,8 +550,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -561,7 +562,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -615,7 +617,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -627,7 +630,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1042,10 +1046,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4856,19 +4865,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4889,21 +4900,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4912,9 +4927,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5566,9 +5582,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5742,8 +5758,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8745,8 +8761,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8797,10 +8814,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9042,12 +9069,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9593,7 +9614,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9754,12 +9780,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9907,6 +9937,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10047,7 +10092,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11725,7 +11773,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11818,7 +11866,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11846,9 +11896,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12345,13 +12395,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12377,8 +12428,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12691,12 +12744,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12741,8 +12794,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12790,8 +12845,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12853,7 +12911,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12978,7 +13036,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15974,7 +16035,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18699,7 +18762,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18848,16 +18913,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19002,18 +19068,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23917,8 +23971,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24538,7 +24596,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26122,10 +26182,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27532,8 +27595,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29833,11 +29896,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30682,7 +30748,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30694,6 +30764,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33051,14 +33131,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33066,21 +33146,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34657,9 +34737,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35118,7 +35198,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36230,7 +36312,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37045,13 +37127,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40715,7 +40809,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46079,7 +46175,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46318,7 +46416,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47047,7 +47147,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49728,8 +49832,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53746,7 +53861,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53890,13 +54007,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55086,7 +55209,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55705,6 +55831,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56039,7 +56173,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57472,7 +57608,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58737,6 +58873,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58798,6 +58937,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58820,7 +58962,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59957,6 +60102,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59986,6 +60135,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60027,7 +60180,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64892,21 +65047,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64919,7 +65078,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64948,7 +65107,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64958,22 +65149,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64986,8 +65190,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65185,16 +65391,16 @@ msgid "Unknown error." msgstr "Ukjent feil." #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73824,7 +74030,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/ne.po b/doc/translations/ne.po index 0ba02ba939..a4a37692f7 100644 --- a/doc/translations/ne.po +++ b/doc/translations/ne.po @@ -538,8 +538,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -549,7 +550,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -603,7 +605,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -615,7 +618,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1030,10 +1034,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4844,19 +4853,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4877,21 +4888,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4900,9 +4915,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5554,9 +5570,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5730,8 +5746,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8733,8 +8749,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8785,10 +8802,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9030,12 +9057,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9581,7 +9602,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9742,12 +9768,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9895,6 +9925,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10035,7 +10080,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11713,7 +11761,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11806,7 +11854,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11834,9 +11884,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12333,13 +12383,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12365,8 +12416,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12679,12 +12732,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12729,8 +12782,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12778,8 +12833,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12841,7 +12899,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12966,7 +13024,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15962,7 +16023,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18687,7 +18750,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18836,16 +18901,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18990,18 +19056,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23905,8 +23959,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24526,7 +24584,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26110,10 +26170,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27520,8 +27583,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29821,11 +29884,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30670,7 +30736,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30682,6 +30752,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33039,14 +33119,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33054,21 +33134,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34645,9 +34725,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35106,7 +35186,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36218,7 +36300,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37033,13 +37115,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40703,7 +40797,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46067,7 +46163,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46306,7 +46404,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47035,7 +47135,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49716,8 +49820,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53734,7 +53849,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53878,13 +53995,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55074,7 +55197,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55693,6 +55819,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56027,7 +56161,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57460,7 +57596,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58725,6 +58861,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58786,6 +58925,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58808,7 +58950,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59945,6 +60090,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59974,6 +60123,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60015,7 +60168,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64880,21 +65035,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64907,7 +65066,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64936,7 +65095,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64946,22 +65137,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64974,8 +65178,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65173,16 +65379,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73812,7 +74018,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/nl.po b/doc/translations/nl.po index 3053cadb2b..fbecc31cd7 100644 --- a/doc/translations/nl.po +++ b/doc/translations/nl.po @@ -8,12 +8,13 @@ # Pierre Stempin <pierre.stempin@gmail.com>, 2020. # Daan van Luijk <daanvl@outlook.be>, 2021. # voylin <0voylin0@gmail.com>, 2022. +# Gert-dev <qnyasgjhapqyuhoibr@kiabws.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-03-15 01:57+0000\n" -"Last-Translator: voylin <0voylin0@gmail.com>\n" +"PO-Revision-Date: 2022-08-06 05:37+0000\n" +"Last-Translator: Gert-dev <qnyasgjhapqyuhoibr@kiabws.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot-" "class-reference/nl/>\n" "Language: nl\n" @@ -21,7 +22,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -599,8 +600,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -610,7 +612,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -664,7 +667,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -676,7 +680,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1091,10 +1096,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4913,19 +4923,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4946,21 +4958,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4969,9 +4985,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5623,9 +5640,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5799,8 +5816,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8802,8 +8819,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8854,10 +8872,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9099,12 +9127,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9650,7 +9672,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9811,12 +9838,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9964,6 +9995,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10104,7 +10150,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11782,7 +11831,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11875,7 +11924,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11903,9 +11954,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12402,13 +12453,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12434,8 +12486,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12748,12 +12802,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12798,8 +12852,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12847,8 +12903,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12910,7 +12969,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13035,7 +13094,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16031,7 +16093,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18756,7 +18820,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18905,16 +18971,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19059,18 +19126,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23977,8 +24032,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24598,7 +24657,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26182,10 +26243,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27592,8 +27656,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29893,11 +29957,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30742,7 +30809,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30754,6 +30825,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33111,14 +33192,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33126,21 +33207,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34717,9 +34798,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35178,7 +35259,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36290,7 +36373,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37105,13 +37188,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -37680,7 +37775,7 @@ msgstr "" #: doc/classes/Node.xml msgid "Nodes and Scenes" -msgstr "" +msgstr "Noden en scènes" #: doc/classes/Node.xml msgid "All Demos" @@ -40775,7 +40870,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46139,7 +46236,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46378,7 +46477,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47107,7 +47208,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49788,8 +49893,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53807,7 +53923,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53951,13 +54069,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55147,7 +55271,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55766,6 +55893,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56100,7 +56235,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57533,7 +57670,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58798,6 +58935,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58859,6 +58999,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58881,7 +59024,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60018,6 +60164,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60047,6 +60197,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60088,7 +60242,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64953,21 +65109,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64980,7 +65140,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65009,7 +65169,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65019,22 +65211,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65047,8 +65252,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65246,16 +65453,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73885,7 +74092,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/pl.po b/doc/translations/pl.po index 729b6a654c..1286b90c40 100644 --- a/doc/translations/pl.po +++ b/doc/translations/pl.po @@ -834,8 +834,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -845,7 +846,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -923,7 +925,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -935,7 +938,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Interpoluje liniowo pomiÄ™dzy dwoma wartoÅ›ciami poprzez znormalizowanÄ… " "wartość. Jest to odwrotność [method inverse_lerp].\n" @@ -1503,10 +1507,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -5349,19 +5358,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5382,21 +5393,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5406,9 +5421,10 @@ msgstr "Zwraca tangens parametru." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -6060,9 +6076,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -6237,8 +6253,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -9247,8 +9263,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9299,10 +9316,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9545,12 +9572,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10096,7 +10117,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10257,12 +10283,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10410,6 +10440,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10550,7 +10595,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12231,7 +12279,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12324,7 +12372,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12352,9 +12402,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12862,13 +12912,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12894,8 +12945,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13208,12 +13261,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13258,8 +13311,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13307,8 +13362,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13370,7 +13428,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13495,7 +13553,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16496,7 +16557,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19227,7 +19290,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19376,16 +19441,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19531,18 +19597,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Zwraca arcus sinus parametru." @@ -24467,8 +24521,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25089,7 +25147,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26680,10 +26740,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28105,8 +28168,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -30409,11 +30472,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31259,7 +31325,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31271,6 +31341,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33652,14 +33732,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33667,22 +33747,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Zwraca minimalny kÄ…t w radianach tego wektora." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]b[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]b[/code]." #: doc/classes/Line2D.xml msgid "" @@ -35264,9 +35348,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35727,7 +35811,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36877,7 +36963,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37708,13 +37794,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41387,7 +41485,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46792,7 +46892,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]with[/code]." #: doc/classes/PopupMenu.xml @@ -47031,7 +47133,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47761,7 +47865,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50442,8 +50550,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54470,7 +54589,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54617,13 +54738,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55813,7 +55940,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56433,6 +56563,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56767,7 +56905,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58203,7 +58343,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59470,6 +59610,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -59531,6 +59674,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -59553,7 +59699,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60690,6 +60839,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60720,6 +60874,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Liczy iloczyn wektorowy tego wektora oraz [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60761,7 +60920,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65657,21 +65818,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65684,7 +65849,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65713,7 +65878,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65723,22 +65920,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65751,8 +65961,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65950,16 +66162,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74637,7 +74849,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/pt.po b/doc/translations/pt.po index c99a8e1cd6..3ad0c8660d 100644 --- a/doc/translations/pt.po +++ b/doc/translations/pt.po @@ -10,12 +10,16 @@ # Diogo Gomes <dgomes@graphnode.com>, 2022. # El_ExpertPlayer <xpertnathan37@gmail.com>, 2022. # Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>, 2022. +# Rafael Testa <rafael1testa@gmail.com>, 2022. +# Lucas Campos <lucas@lcmps.dev>, 2022. +# Nathan Soares <eu@nathan.com.br>, 2022. +# Baiterson <baiter160@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-29 10:31+0000\n" -"Last-Translator: Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>\n" +"PO-Revision-Date: 2022-08-25 13:04+0000\n" +"Last-Translator: Baiterson <baiter160@gmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/pt/>\n" "Language: pt\n" @@ -23,7 +27,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -513,6 +517,23 @@ msgid "" "want a true content-aware comparison, you have to use [code]deep_equal[/" "code]." msgstr "" +"Compara dois valores verificando seu conteúdo real, por meio de recursão em " +"um [Array] ou [Dictionary] em todos os seus nÃveis.\n" +"Esta função se asemelha ou difere de [code]==[/code] de diversas maneiras:\n" +"- Para [code]null[/code], [code]int[/code], [code]float[/code], " +"[code]String[/code], [code]Object[/code] e [code] RID[/code] tanto " +"[code]deep_equal[/code] quanto [code]==[/code] funcionam da mesma forma.\n" +"- Para [code]Dictionary[/code], [code]==[/code] considera-se igual se, e " +"somente se, ambas as variáveis apontarem para o mesmo [code]Dictionary[/" +"code], sem recursão ou checagem de seu conteúdo.\n" +"- Para [code]Array[/code], [code]==[/code] considera igual se, e somente se, " +"cada item no primeiro [code]Array[/code] for igual ao seu homólogo no " +"segundo [ code]Array[/code], conforme informado pelo próprio [code]==[/" +"code]. Isso implica que [code]==[/code] se faz a recursão em [code]Array[/" +"code], mas não em [code]Dictionary[/code].\n" +"Resumindo, sempre que um [code]Dictionary[/code] estiver potencialmente " +"envolvido, se você quiser uma comparação verdadeira com verificação de " +"conteúdo, você deve usar [code]deep_equal[/code]." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -802,6 +823,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -809,8 +831,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -820,7 +843,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Returna um fator de interpolação ou extrapolação considerando o alcance " "especifico em [code]from[/code] e [code]to[/code], e o valor interpolado " @@ -908,12 +932,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -925,7 +951,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Interpola linearmente entre dois valores pelo fator definido em " "[code]weight[/code]. Para realizar a interpolação, [code]weight[/code] deve " @@ -1340,7 +1367,6 @@ msgstr "" "rastreamento de pilha quando um erro ou aviso é impresso ." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Like [method print], but includes the current stack frame when running with " "the debugger turned on.\n" @@ -1350,11 +1376,12 @@ msgid "" " At: res://test.gd:15:_process()\n" "[/codeblock]" msgstr "" -"Imprime a pilha de chamadas no local do código, só funciona com o depurador " -"ativado.\n" -"SaÃda no console vai parecer assim:\n" +"Similar à [method print], mas inclui a pilha de chamadas no local do código " +"quando o depurador esta ativado.\n" +"A saÃda no console será exibida da seguinte maneira:\n" "[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" +"Test print\n" +" At: res://test.gd:15:_process()\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1607,20 +1634,59 @@ msgid "" "3\n" "[/codeblock]" msgstr "" +"Retorna um [Array] com o intervalo fornecido. [method range] pode ser " +"invocado de três maneiras:\n" +"- [code]range(n: int)[/code]: inicia em 0, incrementa 1 passo até parar " +"[i]antes[/i] de [code]n[/code]. O argumento [code]n[/code] é [b]exclusivo[/" +"b].\n" +"[código]intervalo(b: int, n: int)[/código]: inicia em [código]b[/código], " +"incrementa 1 passo até parar [i]antes[/i] de [code]n[/code]. Os argumentos " +"[code]b[/code] e [code]n[/code] são [b]inclusivo[/b] e [b]exclusivo[/b], " +"respectivamente.\n" +"- [code]range(b: int, n: int, s: int)[/code]: inicia em [code]b[/code], " +"aumenta/diminui [code]s[/code] passos até parar [i]antes[/i] de [code]n[/" +"code]. Os argumentos [code]b[/code] e [code]n[/code] são [b]inclusivo[/b] e " +"[b]exclusivo[/b], respectivamente. O argumento [code]s[/code] [b]pode[/b] " +"ser negativo, mas não [code]0[/code]. Se [code]s[/code] for [code]0[/code], " +"uma mensagem de erro será exibida.\n" +"- [method range] converte todos os argumentos em [int] antes do " +"processamento.\n" +"[b]Observação:[/b] Retorna uma matriz vazia se nenhum valor atender à s " +"restrições do intervalo (por exemplo, [code]range(2, 5, -1)[/code] ou " +"[code]range(5, 5, 1)[/code]).\n" +"Exemplos:\n" +"[codeblock]\n" +"print(range(4)) # Escreve [0, 1, 2, 3]\n" +"print(range(2, 5)) # Escreve [2, 3, 4]\n" +"print(range(0, 6, 2)) # Escreve [0, 2, 4]\n" +"print(range(4, 1, -1)) # Escreve [4, 3, 2]\n" +"[/codeblock]\n" +"Para iterar sobre um [Array] para trás, use:\n" +"[codeblock]\n" +"var array = [3, 6, 9]\n" +"for i in range(array.size(), 0, -1):\n" +" print(array[i - 1])\n" +"[/codeblock]\n" +"SaÃda:\n" +"[codeblock]\n" +"9\n" +"6\n" +"3\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Mapeia um [code]value[/code] do intervalo [code][istart, istop][/code] para " -"o intervalo [code][ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Retorna 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1633,6 +1699,14 @@ msgid "" "[/codeblock]\n" "See also [method floor], [method ceil], [method stepify], and [int]." msgstr "" +"Arredonda [code]s[/code] para o número inteiro mais próximo, com a metade " +"arredondada para cima.\n" +"[codeblock]\n" +"a = round(2.49) # a is 2.0\n" +"a = round(2.5) # a is 3.0\n" +"a = round(2.51) # a is 3.0\n" +"[/codeblock]\n" +"Veja também[method floor], [method ceil], [method stepify], e [int]." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1717,6 +1791,29 @@ msgid "" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" +"Retorna o resultado da interpolação suave do valor de [code]s[/code] entre " +"[code]0[/code] e [code]1[/code], na qual [code]s[/code] se encontra incluso " +"no intervalo dos limites [code]from[/code] e [code]to[/code].\n" +"O valor de retornado é [code]0[/code] se [code]s <= from[/code], e [code]1[/" +"code] se [code]s >= to[/code]. Se [code]s[/code] estiver entre [code]from[/" +"code] e [code]to[/code], o valor retornado segue uma curva em forma de S que " +"mapeia [code]s[/code] entre [ code]0[/code] e [code]1[/code].\n" +"Esta curva em forma de S é o interpolador cúbico de Hermite, dado por " +"[code]f(y) = 3*y^2 - 2*y^3[/code] na qual [code]y = (x-from) / (to -from)[/" +"code].\n" +"[codeblock]\n" +"smoothstep(0, 2, -5.0) # Retorna 0.0\n" +"smoothstep(0, 2, 0.5) # Retorna 0.15625\n" +"smoothstep(0, 2, 1.0) # Retorna 0.5\n" +"smoothstep(0, 2, 2.0) # Retorna 1.0\n" +"[/codeblock]\n" +"Comparado [method ease] com um valor de curva de [code]-1.6521[/code], " +"[method smoothstep] retorna a curva mais suave possÃvel sem mudanças " +"repentinas na derivada. Se você precisar realizar transições mais avançadas, " +"use [Tween] ou [AnimationPlayer].\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" +"smoothstep_ease_comparison.png]Comparação entre os valores retornados por " +"smoothstep() e ease(x, -1.6521)[/url]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1728,8 +1825,17 @@ msgid "" "[b]Note:[/b] Negative values of [code]s[/code] return NaN. If you need " "negative inputs, use [code]System.Numerics.Complex[/code] in C#." msgstr "" +"Retorna a raiz quadrada de [code]s[/code], onde [code]s[/code] é um número " +"não-negativo.\n" +"[codeblock]\n" +"sqrt(9) # Retorna 3\n" +"[/codeblock]\n" +"[b]Nota:[/b] Valores negativos de [code]s[/code] retornam NaN. Se você " +"necessita de inputs negativos, use [code]System.Numerics.Complex[/code] em " +"C#." #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy 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 " @@ -1740,6 +1846,14 @@ msgid "" "n = step_decimals(0.000000005) # n is 9\n" "[/codeblock]" msgstr "" +"Retorna a posição do primeiro dÃgito diferente de 0 após o ponto decimal. " +"Note que o valor máximo retornado é 10, que é uma decisão de design na " +"implementação.\n" +"[codeblock]\n" +"n = step_decimals(5) # n é 0\n" +"n = step_decimals(1.0005) # n é 4\n" +"n = step_decimals(0.000000005) # n é 9\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1752,6 +1866,14 @@ msgid "" "[/codeblock]\n" "See also [method ceil], [method floor], [method round], and [int]." msgstr "" +"Fixa valor flutuante [code]s[/code] para um dado [code]step[/code]. Também " +"pode ser usado para arredondar um número flutuante para um número arbitrário " +"de decimais.\n" +"[codeblock]\n" +"stepify(100, 32) # Retorna 96.0\n" +"stepify(3.14159, 0.01) # Retorna 3.14\n" +"[/codeblock]\n" +"Veja também [method ceil], [method floor], [method round], e [int]." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1764,6 +1886,14 @@ msgid "" "len(b) # Returns 12\n" "[/codeblock]" msgstr "" +"Converte um ou mais argumentos de quaisquer tipos para string na melhor " +"maneira possÃvel.\n" +"[codeblock]\n" +"var a = [10, 20, 30]\n" +"var b = str(a);\n" +"len(a) # Retorna 3\n" +"len(b) # Retorna 12\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1803,6 +1933,11 @@ msgid "" "b = tanh(a) # b is 0.6\n" "[/codeblock]" msgstr "" +"Retorna a tangente hiperbólica de [code]s[/code].\n" +"[codeblock]\n" +"a = log(2.0) # a é 0.693147\n" +"b = tanh(a) # b é 0.6\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1845,6 +1980,11 @@ msgid "" "type_exists(\"Variant\") # Returns false\n" "[/codeblock]" msgstr "" +"Retorna se uma dada classe existe em [ClassDB].\n" +"[codeblock]\n" +"type_exists(\"Sprite\") # Retorna true\n" +"type_exists(\"Variant\") # Retorna false\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -2177,16 +2317,22 @@ msgid "Global scope constants and variables." msgstr "Constantes e variáveis de escopo global." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "" "Global scope constants and variables. This is all that resides in the " "globals, constants regarding error codes, scancodes, property hints, etc.\n" "Singletons are also documented here, since they can be accessed from " "anywhere." msgstr "" +"Constante e variáveis de escopo global. É tudo aquilo que reside no escopo " +"global, constantes relacionadas a códigos de erro, scancodes, dicas de " +"propriedades, etc.\n" +"Singletons também estão documentados aqui, uma vez que podem ser acessados " +"de qualquer lugar." #: doc/classes/@GlobalScope.xml msgid "The [ARVRServer] singleton." -msgstr "" +msgstr "O singleton [ARVRServer]." #: doc/classes/@GlobalScope.xml msgid "The [AudioServer] singleton." @@ -2206,7 +2352,7 @@ msgstr "O singleton [Engine]." #: doc/classes/@GlobalScope.xml msgid "The [Geometry] singleton." -msgstr "" +msgstr "O singleton [Geometry]." #: doc/classes/@GlobalScope.xml msgid "The [IP] singleton." @@ -2245,19 +2391,16 @@ msgid "The [Marshalls] singleton." msgstr "O singleton [Marshalls]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [Navigation2DServer] singleton." -msgstr "O singleton [TranslationServer]." +msgstr "O singleton [Navigation2DServer]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [NavigationMeshGenerator] singleton." -msgstr "O singleton [TranslationServer]." +msgstr "O singleton [NavigationMeshGenerator]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [NavigationServer] singleton." -msgstr "O singleton [TranslationServer]." +msgstr "O singleton [NavigationServer]." #: doc/classes/@GlobalScope.xml msgid "The [OS] singleton." @@ -2269,11 +2412,11 @@ msgstr "O singleton [Performance]." #: doc/classes/@GlobalScope.xml msgid "The [Physics2DServer] singleton." -msgstr "" +msgstr "O singleton [Physics2DServer]." #: doc/classes/@GlobalScope.xml msgid "The [PhysicsServer] singleton." -msgstr "" +msgstr "O singleton [PhysicsServer]." #: doc/classes/@GlobalScope.xml msgid "The [ProjectSettings] singleton." @@ -2289,7 +2432,7 @@ msgstr "O singleton [ResourceSaver]." #: doc/classes/@GlobalScope.xml msgid "The [Time] singleton." -msgstr "" +msgstr "O singleton [Time]." #: doc/classes/@GlobalScope.xml msgid "The [TranslationServer] singleton." @@ -2301,7 +2444,7 @@ msgstr "O singleton [VisualScriptEditor]." #: doc/classes/@GlobalScope.xml msgid "The [VisualServer] singleton." -msgstr "" +msgstr "O singleton [VisualServer]." #: doc/classes/@GlobalScope.xml msgid "Left margin, usually used for [Control] or [StyleBox]-derived classes." @@ -2393,7 +2536,7 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "Scancodes with this bit applied are non-printable." -msgstr "" +msgstr "Scancodes com este bit aplicado não são printáveis." #: doc/classes/@GlobalScope.xml msgid "Escape key." @@ -2405,7 +2548,7 @@ msgstr "Tecla Tab." #: doc/classes/@GlobalScope.xml msgid "Shift+Tab key." -msgstr "" +msgstr "Tecla Shift+Tab." #: doc/classes/@GlobalScope.xml msgid "Backspace key." @@ -2665,8 +2808,9 @@ msgid "" msgstr "Tecla Voltar Media. Não confundir com tecla Voltar no device Android." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Media forward key." -msgstr "" +msgstr "Tecla avançar MÃdia." #: doc/classes/@GlobalScope.xml msgid "Media stop key." @@ -2674,7 +2818,7 @@ msgstr "Tecla de parada de mÃdia." #: doc/classes/@GlobalScope.xml msgid "Media refresh key." -msgstr "" +msgstr "Tecla repetir MÃdia." #: doc/classes/@GlobalScope.xml msgid "Volume down key." @@ -3565,6 +3709,11 @@ msgid "" "- Linux: Up to 80 buttons.\n" "- Windows and macOS: Up to 128 buttons." msgstr "" +"O número máximo de botões de controle suportados pela engine. O limite poder " +"ser menor em plataformas especÃficas:\n" +"- Android: Até 36 botões.\n" +"- Linux: Até 80 botões.\n" +"- Windows e macOS: Até 128 botões." #: doc/classes/@GlobalScope.xml msgid "DualShock circle button." @@ -3584,35 +3733,35 @@ msgstr "Botão triângulo do Dualshock." #: doc/classes/@GlobalScope.xml msgid "Xbox controller B button." -msgstr "" +msgstr "Botão B do controle de Xbox." #: doc/classes/@GlobalScope.xml msgid "Xbox controller A button." -msgstr "" +msgstr "Botão A do controle de Xbox." #: doc/classes/@GlobalScope.xml msgid "Xbox controller X button." -msgstr "" +msgstr "Botão X do controle de Xbox." #: doc/classes/@GlobalScope.xml msgid "Xbox controller Y button." -msgstr "" +msgstr "Botão Y do controle de Xbox." #: doc/classes/@GlobalScope.xml msgid "Nintendo controller A button." -msgstr "" +msgstr "Botão A do controle da Nintendo." #: doc/classes/@GlobalScope.xml msgid "Nintendo controller B button." -msgstr "" +msgstr "Botão B do controle da Nintendo." #: doc/classes/@GlobalScope.xml msgid "Nintendo controller X button." -msgstr "" +msgstr "Botão X do controle da Nintendo." #: doc/classes/@GlobalScope.xml msgid "Nintendo controller Y button." -msgstr "" +msgstr "Botão Y do controle da Nintendo." #: doc/classes/@GlobalScope.xml msgid "Grip (side) buttons on a VR controller." @@ -3678,35 +3827,36 @@ msgstr "Botão direito no direcional do controle." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL guide button." -msgstr "" +msgstr "Botão guia do controle SDL." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL miscellaneous button." msgstr "Botão diverso SDL do controle." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Gamepad SDL paddle 1 button." -msgstr "" +msgstr "Botão paddle 1 do controle SDL." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL paddle 2 button." -msgstr "" +msgstr "Botão paddle 2 do controle SDL." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL paddle 3 button." -msgstr "" +msgstr "Botão paddle 3 do controle SDL." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL paddle 4 button." -msgstr "" +msgstr "Botão paddle 4 do controle SDL." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL touchpad button." -msgstr "" +msgstr "Touchpad do controle SDL." #: doc/classes/@GlobalScope.xml msgid "Gamepad left Shoulder button." -msgstr "" +msgstr "Touchpad botão L1." #: doc/classes/@GlobalScope.xml msgid "Gamepad left trigger." @@ -3718,7 +3868,7 @@ msgstr "Clique na alavanca esquerda do controle." #: doc/classes/@GlobalScope.xml msgid "Gamepad right Shoulder button." -msgstr "" +msgstr "Touchpad botão L2." #: doc/classes/@GlobalScope.xml msgid "Gamepad right trigger." @@ -3785,8 +3935,9 @@ msgid "VR Controller analog trigger." msgstr "Gatilho analógico do controle VR." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "VR Controller analog grip (side buttons)." -msgstr "" +msgstr "VR Controle analógico (botões laterais)" #: doc/classes/@GlobalScope.xml msgid "" @@ -3809,30 +3960,38 @@ msgid "" "MIDI note OFF message. See the documentation of [InputEventMIDI] for " "information of how to use MIDI inputs." msgstr "" +"MIDI nota OFF mensagem. Ver na documentação [InputEventMIDI] como usar." #: doc/classes/@GlobalScope.xml msgid "" "MIDI note ON message. See the documentation of [InputEventMIDI] for " "information of how to use MIDI inputs." -msgstr "" +msgstr "MIDI nota ON mensagem. Ver na documentação [InputEventMIDI] como usar." #: doc/classes/@GlobalScope.xml msgid "" "MIDI aftertouch message. This message is most often sent by pressing down on " "the key after it \"bottoms out\"." msgstr "" +"MIDI aftertouch mensagem. Essa mensagem é mais enviada quando pressionada a " +"tecla e depois de \"bottons out\"." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "" "MIDI control change message. This message is sent when a controller value " "changes. Controllers include devices such as pedals and levers." msgstr "" +"MIDI control change mensagem. Essa mensagem é enviada quando um valor de um " +"controle muda. Controles do tipo pedais e alavancas." #: doc/classes/@GlobalScope.xml msgid "" "MIDI program change message. This message sent when the program patch number " "changes." msgstr "" +"MIDI program change message. Essa mensagem é enviada quando o número de um " +"patch de um programa." #: doc/classes/@GlobalScope.xml msgid "" @@ -3925,6 +4084,19 @@ msgid "" " print(\"Still failing!\")\n" "[/codeblock]" msgstr "" +"Métodos que retornam [enum Error] retornam [constant OK] quando nenhum erro " +"ocorre. Note que muitas funções não retornam um código de erro, mas " +"imprimirão mensagens de erro na saÃda padrão.\n" +"Uma vez que [constant OK] tem valor 0 e todos os outros códigos de erro são " +"inteiros positivos, também pode ser usado em uma checagem booleana, ex:\n" +"[codeblock]\n" +"var err = method_that_returns_error()\n" +"if err != OK:\n" +" print(\"Failure!\")\n" +"# Ou o equivalente:\n" +"if err:\n" +" print(\"Still failing!\")\n" +"[/codeblock]" #: doc/classes/@GlobalScope.xml msgid "Generic error." @@ -3932,31 +4104,34 @@ msgstr "Erro genérico." #: doc/classes/@GlobalScope.xml msgid "Unavailable error." -msgstr "" +msgstr "Erro não disponÃvel." #: doc/classes/@GlobalScope.xml msgid "Unconfigured error." -msgstr "" +msgstr "Erro não configurado." #: doc/classes/@GlobalScope.xml msgid "Unauthorized error." -msgstr "" +msgstr "Erro não autorizado." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Parameter range error." -msgstr "" +msgstr "Erro de intervalo de parâmetro." #: doc/classes/@GlobalScope.xml msgid "Out of memory (OOM) error." -msgstr "" +msgstr "Erro de falta de memória (OOM)." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Not found error." -msgstr "" +msgstr "Arquivo: Erro de arquivo não encontrado." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Bad drive error." -msgstr "" +msgstr "Arquivo: Erro unidade defeituosa." #: doc/classes/@GlobalScope.xml msgid "File: Bad path error." @@ -3971,24 +4146,29 @@ msgid "File: Already in use error." msgstr "Ficheiro: Erro ficheiro já em uso." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Can't open error." -msgstr "" +msgstr "Arquivo: Erro não foi possÃvel abrir." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Can't write error." -msgstr "" +msgstr "Arquivo: Erro não foi possÃvel escrever." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Can't read error." -msgstr "" +msgstr "Arquivo: Erro não foi possÃvel ler." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Unrecognized error." -msgstr "" +msgstr "Arquivo: Erro não reconhecido." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "File: Corrupt error." -msgstr "" +msgstr "Arquivo: Erro corrompido." #: doc/classes/@GlobalScope.xml msgid "File: Missing dependencies error." @@ -3996,27 +4176,28 @@ msgstr "Ficheiro: Erro faltam dependências." #: doc/classes/@GlobalScope.xml msgid "File: End of file (EOF) error." -msgstr "" +msgstr "Arquivo: Erro fim do arquivo (EOF)." #: doc/classes/@GlobalScope.xml msgid "Can't open error." -msgstr "" +msgstr "Erro não foi possÃvel abrir." #: doc/classes/@GlobalScope.xml msgid "Can't create error." -msgstr "" +msgstr "Erro não foi possÃvel criar." #: doc/classes/@GlobalScope.xml msgid "Query failed error." -msgstr "" +msgstr "Erro falha na consulta." #: doc/classes/@GlobalScope.xml msgid "Already in use error." -msgstr "" +msgstr "Erro já está sendo utilizado." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Locked error." -msgstr "" +msgstr "Erro Bloqueado (Locked error)." #: doc/classes/@GlobalScope.xml msgid "Timeout error." @@ -4024,7 +4205,7 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "Can't connect error." -msgstr "" +msgstr "Erro não foi possÃvel conectar." #: doc/classes/@GlobalScope.xml msgid "Can't resolve error." @@ -4036,15 +4217,15 @@ msgstr "Erro de conexão." #: doc/classes/@GlobalScope.xml msgid "Can't acquire resource error." -msgstr "" +msgstr "Erro não foi possÃvel adquirir o recurso." #: doc/classes/@GlobalScope.xml msgid "Can't fork process error." -msgstr "" +msgstr "Erro não foi possÃvel dividir o processo." #: doc/classes/@GlobalScope.xml msgid "Invalid data error." -msgstr "" +msgstr "Erro dados inválidos." #: doc/classes/@GlobalScope.xml msgid "Invalid parameter error." @@ -4079,8 +4260,9 @@ msgid "Linking failed error." msgstr "" #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Script failed error." -msgstr "" +msgstr "Erro falha no script." #: doc/classes/@GlobalScope.xml msgid "Cycling link (import cycle) error." @@ -4095,8 +4277,9 @@ msgid "Duplicate symbol error." msgstr "Erro de sÃmbolo duplicado." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Parse error." -msgstr "" +msgstr "Erro de parse." #: doc/classes/@GlobalScope.xml msgid "Busy error." @@ -4112,13 +4295,15 @@ msgstr "Erro de ajuda." #: doc/classes/@GlobalScope.xml msgid "Bug error." -msgstr "" +msgstr "Erro bug." #: doc/classes/@GlobalScope.xml msgid "" "Printer on fire error. (This is an easter egg, no engine methods return this " "error code.)" msgstr "" +"Erro impressora em chamas. (Isso é um easter egg, nenhum método da engine " +"retornará esse código de erro.)" #: doc/classes/@GlobalScope.xml msgid "No hint for the edited property." @@ -4165,12 +4350,17 @@ msgid "" msgstr "" #: doc/classes/@GlobalScope.xml +#, fuzzy 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 "" +"Sugere que uma propriedade float deve ser editada através de uma função de " +"suavização. A string de sugestão pode incluir [code]\"attenuation\"[/code] " +"para virar a curva horizontalmente e/ou [code]\"inout\"[/code] para incluir " +"também a suavização in/out." #: doc/classes/@GlobalScope.xml msgid "Deprecated hint, unused." @@ -5666,19 +5856,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5699,21 +5891,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5723,9 +5919,10 @@ msgstr "Retorna o RID do ecrã usada por essa camada." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -6384,9 +6581,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -6560,8 +6757,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -9563,8 +9760,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9615,10 +9813,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9860,12 +10068,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "Poder de distorção. O valor pode variar de 0 a 1." @@ -10411,7 +10613,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10572,12 +10779,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10725,6 +10936,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10865,7 +11091,10 @@ msgstr "Reproduz um som posicional em espaço 2D." #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12548,7 +12777,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12641,7 +12870,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12669,9 +12900,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -13171,13 +13402,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -13203,8 +13435,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13517,12 +13751,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13567,8 +13801,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13616,8 +13852,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13683,7 +13922,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13819,10 +14058,12 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" -"Define que a camada irá seguir a janela para simular um efeito pseudo-3D." #: doc/classes/CanvasLayer.xml msgid "" @@ -16831,7 +17072,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19568,7 +19811,9 @@ msgstr "Uma curva matemática." 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19717,16 +19962,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19871,18 +20117,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -24797,8 +25031,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25420,7 +25658,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -27008,10 +27248,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28419,8 +28662,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -30720,11 +30963,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31573,7 +31819,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31585,6 +31835,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33954,14 +34214,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33969,22 +34229,28 @@ msgid "Removes all points from the line." msgstr "Remove todos os pontos da linha." #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +#, fuzzy +msgid "Returns the amount of points in the line." msgstr "Retorna a quantidade de pontos de uma Line2D." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" +"Retorna [code]true[/code] se a guia no Ãndice [code]tab_idx[/code] estiver " +"oculta." #: doc/classes/Line2D.xml msgid "" @@ -35562,9 +35828,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -36024,7 +36290,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -37160,7 +37428,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37985,13 +38253,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -38559,6 +38839,7 @@ msgid "" msgstr "" #: doc/classes/Node.xml +#, fuzzy msgid "Nodes and Scenes" msgstr "Nós e Cenas" @@ -41657,7 +41938,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -47026,7 +47309,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Retorna o nome do nó em [code]idx[/code]." #: doc/classes/PopupMenu.xml @@ -47266,7 +47551,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47995,7 +48282,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50739,8 +51030,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54758,7 +55060,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54902,13 +55206,19 @@ msgstr "A cena atual." #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -56101,7 +56411,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56721,6 +57034,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -57055,7 +57376,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58506,7 +58829,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59773,6 +60096,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -59834,6 +60160,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -59856,7 +60185,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60995,6 +61327,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -61024,6 +61361,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -61065,8 +61407,13 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" +"Emitido quando um botão personalizado é pressionado. Veja [method " +"add_button]." #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -65948,21 +66295,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65975,7 +66326,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -66004,7 +66355,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66014,22 +66397,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -66042,8 +66438,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66241,16 +66639,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74893,7 +75291,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/pt_BR.po b/doc/translations/pt_BR.po index ea624fdf2c..62d868632e 100644 --- a/doc/translations/pt_BR.po +++ b/doc/translations/pt_BR.po @@ -19,7 +19,7 @@ # Lucas E. <lukas.ed45@gmail.com>, 2021. # Júlio César <diolandajr@gmail.com>, 2021, 2022. # Kett Lovahr <vagnerlunes@gmail.com>, 2021. -# Jaide Alonso Ambrosio <jaide.sp@gmail.com>, 2021. +# Jaide Alonso Ambrosio <jaide.sp@gmail.com>, 2021, 2022. # DeeJayLSP <djlsplays@gmail.com>, 2021. # Douglas Leão <djlsplays@gmail.com>, 2021. # Cauê Henrique Sousa Ferrareto <caue313@gmail.com>, 2021. @@ -42,12 +42,13 @@ # Daniel Abrante <danielabrante@protonmail.com>, 2022. # lucas rossy brasil coelho <lucasrossy270@gmail.com>, 2022. # Felipe Kinoshita <kinofhek@gmail.com>, 2022. +# Mr.Albino <ricmorsoleto@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-08-04 06:40+0000\n" -"Last-Translator: Felipe Kinoshita <kinofhek@gmail.com>\n" +"PO-Revision-Date: 2022-08-21 06:02+0000\n" +"Last-Translator: Jaide Alonso Ambrosio <jaide.sp@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/pt_BR/>\n" "Language: pt_BR\n" @@ -853,6 +854,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -860,8 +862,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -871,7 +874,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Retornar a interpolação ou extrapolação do fator considerando o ranger " "especÃfico [code ]para[/code]" @@ -945,12 +949,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -962,7 +968,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Interpola linearmente entre dois valores pelo fator definido em " "[code]weight[/code]. Para realizar a interpolação, [code]weight[/code] deve " @@ -1642,16 +1649,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"Mapeia um [code]value[/code] do intervalo [code][istart, istop][/code] para " -"o intervalo [code][ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Retorna 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -5886,19 +5893,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5919,21 +5928,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5943,9 +5956,10 @@ msgstr "Retorna a tangente do parâmetro." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -6604,9 +6618,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -6781,8 +6795,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -9800,8 +9814,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9852,10 +9867,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -10099,12 +10124,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "Poder de distorção. O valor pode variar de 0 a 1." @@ -10650,7 +10669,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10811,12 +10835,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10964,6 +10992,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -11104,7 +11147,10 @@ msgstr "Reproduz um som posicional em espaço 2D." #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12789,7 +12835,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12882,7 +12928,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12910,9 +12958,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -13418,13 +13466,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -13450,8 +13499,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13764,12 +13815,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13814,8 +13865,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13863,8 +13916,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13930,7 +13986,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -14067,10 +14123,12 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" -"Define que a camada irá seguir a janela para simular um efeito pseudo-3D." #: doc/classes/CanvasLayer.xml msgid "" @@ -17121,7 +17179,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19858,7 +19918,9 @@ msgstr "Uma curva matemática." 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -20007,16 +20069,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -20162,18 +20225,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Retorna o arco-seno do parâmetro." @@ -25100,8 +25151,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25723,7 +25778,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -27315,10 +27372,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28748,8 +28808,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -31054,11 +31114,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31908,7 +31971,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31920,6 +31987,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -34300,14 +34377,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -34315,22 +34392,27 @@ msgid "Removes all points from the line." msgstr "Remove todos os pontos da linha." #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +#, fuzzy +msgid "Returns the amount of points in the line." msgstr "Retorna a quantidade de pontos de uma Line2D." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Retorna o nome do nó em [code]idx[/code]." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" +"Retorna a largura em pÃxeis de [code]wrap_index[/code] em [code]line[/code]." #: doc/classes/Line2D.xml msgid "" @@ -35909,9 +35991,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -36372,7 +36454,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -37520,7 +37604,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -38354,13 +38438,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -42032,7 +42128,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -47441,7 +47539,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Retorna o nome do nó em [code]idx[/code]." #: doc/classes/PopupMenu.xml @@ -47682,7 +47782,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -48412,7 +48514,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51094,8 +51200,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -55122,7 +55239,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -55266,13 +55385,19 @@ msgstr "A cena atual." #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -56466,7 +56591,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -57088,6 +57216,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -57422,7 +57558,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58876,7 +59014,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -60143,6 +60281,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -60204,6 +60345,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -60226,7 +60370,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -61365,6 +61512,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -61395,6 +61547,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Retorna o tipo do nó em at [code]idx[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -61436,8 +61593,13 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" +"Emitido quando um botão personalizado é pressionado. Veja [method " +"add_button]." #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -66347,21 +66509,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -66374,7 +66540,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -66403,7 +66569,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66413,22 +66611,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -66441,8 +66652,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66640,16 +66853,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -75332,7 +75545,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml @@ -76712,6 +76927,8 @@ 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 "" +"Pula a seção atual. Se o nó contêm outros elementos, eles serão ignorados e " +"o cursor irá para o encerramento do elemento atual." #: doc/classes/XMLParser.xml msgid "There's no node (no file or buffer opened)." diff --git a/doc/translations/ro.po b/doc/translations/ro.po index 332dbd0801..b0a4b2085c 100644 --- a/doc/translations/ro.po +++ b/doc/translations/ro.po @@ -566,8 +566,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -577,7 +578,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -631,7 +633,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -643,7 +646,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1058,10 +1062,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4876,19 +4885,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4909,21 +4920,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4932,9 +4947,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5586,9 +5602,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5762,8 +5778,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8765,8 +8781,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8817,10 +8834,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9062,12 +9089,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9613,7 +9634,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9774,12 +9800,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9927,6 +9957,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10067,7 +10112,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11745,7 +11793,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11838,7 +11886,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11866,9 +11916,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12365,13 +12415,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12397,8 +12448,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12711,12 +12764,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12761,8 +12814,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12810,8 +12865,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12873,7 +12931,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12998,7 +13056,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15994,7 +16055,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18719,7 +18782,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18868,16 +18933,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19022,18 +19088,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23940,8 +23994,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24561,7 +24619,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26145,10 +26205,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27555,8 +27618,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29856,11 +29919,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30705,7 +30771,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30717,6 +30787,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33074,14 +33154,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33089,21 +33169,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34680,9 +34760,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35141,7 +35221,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36253,7 +36335,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37069,13 +37151,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40739,7 +40833,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46103,7 +46199,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46342,7 +46440,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47071,7 +47171,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49752,8 +49856,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53770,7 +53885,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53914,13 +54031,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55110,7 +55233,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55729,6 +55855,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56063,7 +56197,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57496,7 +57632,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58761,6 +58897,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58822,6 +58961,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58844,7 +58986,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59981,6 +60126,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60010,6 +60159,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60051,7 +60204,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64916,21 +65071,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64943,7 +65102,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64972,7 +65131,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64982,22 +65173,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65010,8 +65214,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65209,16 +65415,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73848,7 +74054,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/ru.po b/doc/translations/ru.po index b148868ce6..7355406513 100644 --- a/doc/translations/ru.po +++ b/doc/translations/ru.po @@ -5,7 +5,7 @@ # # Alex <Alex.Gorichev@protonmail.com>, 2020. # Nikita <Kulacnikita@ya.ru>, 2020. -# ÐлекÑей Смирнов <tir74@mail.ru>, 2020, 2021. +# ÐлекÑей Смирнов <tir74@mail.ru>, 2020, 2021, 2022. # Chaosus89 <chaosus89@gmail.com>, 2020. # John Smith <19georginos97@gmail.com>, 2020. # NeoLan Qu <it.bulla@mail.ru>, 2020. @@ -50,21 +50,23 @@ # МÐÐ69К <weblate@mah69k.net>, 2022. # Vadim Mitroshkin <Vadim7540@yandex.ru>, 2022. # SonicStalker Games <dmitriyusolsev1971@gmail.com>, 2022. +# Kedr <lava20121991@gmail.com>, 2022. +# Lost Net <pc.mirkn@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-08-04 06:40+0000\n" -"Last-Translator: SonicStalker Games <dmitriyusolsev1971@gmail.com>\n" +"PO-Revision-Date: 2022-08-28 00:17+0000\n" +"Last-Translator: ÐлекÑей Смирнов <tir74@mail.ru>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/ru/>\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\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.14-dev\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.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -862,6 +864,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -869,8 +872,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -880,7 +884,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "Возвращает коÑффициент интерполÑции или ÑкÑтраполÑции Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ диапазона, " "указанного в [code]от[/code] и [code]до[/code], и интерполированное " @@ -972,12 +977,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -989,7 +996,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "Линейно интерполирует между Ð´Ð²ÑƒÐ¼Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñми Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ коÑффициента, " "определенного в [code]weight[/code]. Ð”Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»Ñции [code]веÑ[/" @@ -1714,16 +1722,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"СопоÑтавлÑет [code]value[/code] из диапазона [code][istart, istop][/code] в " -"[code][ostart, ostop][/code].\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # Возвращает 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1849,13 +1857,13 @@ msgstr "" "smoothstep(0, 2, 2.0) # Returns 1.0\n" "[/codeblock]\n" "\n" -"Compared to [method ease] with a curve value of [code]-1.6521[/code], [" -"method smoothstep] returns the smoothest possible curve with no sudden " +"Compared to [method ease] with a curve value of [code]-1.6521[/code], " +"[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" -"smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, -1" -".6521) return values[/url]" +"smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " +"-1.6521) return values[/url]" #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -1902,7 +1910,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy 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 " @@ -1919,10 +1926,10 @@ msgstr "" "[codeblock]\n" "stepify(100, 32) # Возвращает 96\n" "stepify(3.14159, 0.01) # Возвращает 3.14\n" -"[/codeblock]" +"[/codeblock]\n" +"Смотрите также [method ceil], [method floor], [method round], и [int]." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Converts one or more arguments of any type to string in the best way " "possible.\n" @@ -1933,8 +1940,8 @@ msgid "" "len(b) # Returns 12\n" "[/codeblock]" msgstr "" -"Преобразует один или более аргументов в Ñтроку наилучшим возможным " -"образом. \n" +"Преобразует один или неÑколько аргументов любого типа в Ñтроку наилучшим из " +"возможных ÑпоÑобов.\n" "[codeblock]\n" "var a = [10, 20, 30]\n" "var b = str(a);\n" @@ -2373,23 +2380,21 @@ msgid "Global scope constants and variables." msgstr "КонÑтанты и переменные глобальной облаÑти видимоÑти." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "" "Global scope constants and variables. This is all that resides in the " "globals, constants regarding error codes, scancodes, property hints, etc.\n" "Singletons are also documented here, since they can be accessed from " "anywhere." msgstr "" -"КонÑтанты и переменные глобальной облаÑти видимоÑти. Ð’ÑÑ‘, что находитÑÑ Ð² " -"глобальных переменных, конÑтантах, каÑающихÑÑ ÐºÐ¾Ð´Ð¾Ð² ошибок, кодов клавиш, " -"подÑказок ÑвойÑтв и др.\n" -"ЗдеÑÑŒ также задокументированы Ñинглтоны, поÑкольку доÑтуп к ним можно " -"получить из любого меÑта." +"КонÑтанты и переменные глобальной облаÑти видимоÑти. Ðто вÑе, что находитÑÑ " +"в глобальной облаÑти видимоÑти, конÑтанты, каÑающиеÑÑ ÐºÐ¾Ð´Ð¾Ð² ошибок, " +"Ñканкодов, подÑказок ÑвойÑтв и Ñ‚.д.\n" +"Синглтоны также документируютÑÑ Ð·Ð´ÐµÑÑŒ, поÑкольку к ним можно получить доÑтуп " +"из любой точки." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [ARVRServer] singleton." -msgstr "Синглтон [XRServer]." +msgstr "Синглтон [ARVRServer]." #: doc/classes/@GlobalScope.xml msgid "The [AudioServer] singleton." @@ -2408,9 +2413,8 @@ msgid "The [Engine] singleton." msgstr "Синглтон [Engine]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [Geometry] singleton." -msgstr "Синглтон [Geometry2D]." +msgstr "Синглтон [Geometry]." #: doc/classes/@GlobalScope.xml msgid "The [IP] singleton." @@ -2449,19 +2453,16 @@ msgid "The [Marshalls] singleton." msgstr "Синглтон [Marshalls]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [Navigation2DServer] singleton." -msgstr "Синглтон [TranslationServer]." +msgstr "Синглтон [Navigation2DServer]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [NavigationMeshGenerator] singleton." msgstr "Синглтон [NavigationMeshGenerator]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [NavigationServer] singleton." -msgstr "Синглтон [TranslationServer]." +msgstr "Синглтон [NavigationServer]." #: doc/classes/@GlobalScope.xml msgid "The [OS] singleton." @@ -2472,14 +2473,12 @@ msgid "The [Performance] singleton." msgstr "Синглтон [Performance]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [Physics2DServer] singleton." -msgstr "Синглтон [PhysicsServer2D]." +msgstr "Синглтон [Physics2DServer]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [PhysicsServer] singleton." -msgstr "Синглтон [PhysicsServer2D]." +msgstr "Синглтон [PhysicsServer]." #: doc/classes/@GlobalScope.xml msgid "The [ProjectSettings] singleton." @@ -2494,9 +2493,8 @@ msgid "The [ResourceSaver] singleton." msgstr "Синглтон [ResourceSaver]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [Time] singleton." -msgstr "Синглтон [Engine]." +msgstr "Синглтон [Time]." #: doc/classes/@GlobalScope.xml msgid "The [TranslationServer] singleton." @@ -2507,9 +2505,8 @@ msgid "The [VisualScriptEditor] singleton." msgstr "Синглтон [VisualScriptEditor]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [VisualServer] singleton." -msgstr "Синглтон [DisplayServer]." +msgstr "Синглтон [VisualServer]." #: doc/classes/@GlobalScope.xml msgid "Left margin, usually used for [Control] or [StyleBox]-derived classes." @@ -2553,57 +2550,55 @@ msgid "Bottom-left corner." msgstr "Ðижний левый угол." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "" "General vertical alignment, usually used for [Separator], [ScrollBar], " "[Slider], etc." msgstr "" -"Общее выравнивание по вертикали, обычно иÑпользуемое Ð´Ð»Ñ [Separator], " +"Общее вертикальное выравнивание, обычно иÑпользуетÑÑ Ð´Ð»Ñ [Separator], " "[ScrollBar], [Slider] и Ñ‚.д." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "" "General horizontal alignment, usually used for [Separator], [ScrollBar], " "[Slider], etc." msgstr "" -"Общее выравнивание по горизонтали, обычно иÑпользуемое Ð´Ð»Ñ [Separator], " -"[ScrollBar], [Slider] и др." +"Общее горизонтальное выравнивание, обычно иÑпользуетÑÑ Ð´Ð»Ñ [Separator], " +"[ScrollBar], [Slider] и Ñ‚.д." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Horizontal left alignment, usually for text-derived classes." -msgstr "Выравнивание по горизонтали Ñлева, обычно Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых клаÑÑов." +msgstr "" +"Горизонтальное выравнивание по левому краю, обычно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, Ñодержащих " +"текÑÑ‚." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Horizontal center alignment, usually for text-derived classes." -msgstr "Выравнивание по центру по горизонтали, обычно Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых клаÑÑов." +msgstr "" +"Горизонтальное выравнивание по центру, обычно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, Ñодержащих текÑÑ‚." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Horizontal right alignment, usually for text-derived classes." -msgstr "Выравнивание по горизонтали Ñправа, обычно Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых клаÑÑов." +msgstr "" +"Горизонтальное выравнивание по правому краю, обычно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, Ñодержащих " +"текÑÑ‚." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Vertical top alignment, usually for text-derived classes." -msgstr "Выравнивание по вертикали Ñверху, обычно Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых клаÑÑов." +msgstr "" +"Вертикальное выравнивание Ñверху, обычно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, Ñодержащих текÑÑ‚." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Vertical center alignment, usually for text-derived classes." -msgstr "Выравнивание по центру по вертикали, обычно Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых клаÑÑов." +msgstr "" +"Вертикальное выравнивание по центру, обычно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, Ñодержащих текÑÑ‚." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Vertical bottom alignment, usually for text-derived classes." -msgstr "Выравнивание по вертикали внизу, обычно Ð´Ð»Ñ Ñ‚ÐµÐºÑтовых клаÑÑов." +msgstr "Вертикальное выравнивание Ñнизу, обычно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, Ñодержащих текÑÑ‚." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Scancodes with this bit applied are non-printable." -msgstr "Коды клавиш Ñ Ñтим битом — не печатаемые." +msgstr "Сканкоды Ñ Ñ‚Ð°ÐºÐ¸Ð¼ битом непечатаемые." #: doc/classes/@GlobalScope.xml msgid "Escape key." @@ -2614,9 +2609,8 @@ msgid "Tab key." msgstr "Клавиша Tab." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Shift+Tab key." -msgstr "Клавиша Shift + Tab." +msgstr "Клавиша Shift+Tab." #: doc/classes/@GlobalScope.xml msgid "Backspace key." @@ -6330,19 +6324,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -6363,21 +6359,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -6387,9 +6387,10 @@ msgstr "Возвращает [Texture2D] заданного кадра." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -7041,9 +7042,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -7226,10 +7227,13 @@ msgid "" msgstr "" #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" +"ВоÑпроизводит анимацию Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ [code]anim[/code]. ЕÑли [code]anim[/code] не " +"указан, воÑпроизводитÑÑ Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ." #: doc/classes/AnimationPlayer.xml msgid "Returns the list of stored animation names." @@ -10422,8 +10426,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -10474,10 +10479,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -10725,12 +10740,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "Сила иÑкажениÑ. Значение может варьироватьÑÑ Ð¾Ñ‚ 0 до 1." @@ -11278,7 +11287,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -11439,12 +11453,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -11595,6 +11613,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -11735,7 +11768,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -13428,7 +13464,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -13521,7 +13557,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -13549,9 +13587,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -14058,13 +14096,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -14090,8 +14129,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -14407,12 +14448,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -14457,8 +14498,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -14506,8 +14549,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -14569,7 +14615,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -14700,7 +14746,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -17783,7 +17832,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19793,7 +19844,7 @@ msgstr "" #: modules/csg/doc_classes/CSGShape.xml modules/csg/doc_classes/CSGSphere.xml #: modules/csg/doc_classes/CSGTorus.xml msgid "Prototyping levels with CSG" -msgstr "" +msgstr "Прототипирование уровней Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ CSG" #: modules/csg/doc_classes/CSGBox.xml msgid "Depth of the box measured from the center of the box." @@ -20542,7 +20593,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -20691,16 +20744,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -20846,18 +20900,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Возвращает аркÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." @@ -25796,8 +25838,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -26419,7 +26465,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -28012,10 +28060,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -29439,8 +29490,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -31744,11 +31795,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -32597,7 +32651,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -32609,6 +32667,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -35006,14 +35074,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -35021,22 +35089,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Возвращает количеÑтво дорожек в анимации." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Возвращает ÑкалÑрное произведение Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¼ [code]b[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Возвращает ÑкалÑрное произведение Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¼ [code]b[/code]." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Возвращает ÑкалÑрное произведение Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¼ [code]b[/code]." #: doc/classes/Line2D.xml msgid "" @@ -36617,9 +36689,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -37080,7 +37152,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -38230,7 +38304,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -39078,13 +39152,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -42839,7 +42925,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -48273,7 +48361,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Возвращает ÑкалÑрное произведение Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¼ [code]b[/code]." #: doc/classes/PopupMenu.xml @@ -48515,7 +48605,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -49251,7 +49343,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51939,8 +52035,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -56016,7 +56123,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -56161,13 +56270,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -57357,7 +57472,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -57983,6 +58101,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -58317,7 +58443,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -59755,7 +59883,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -61050,6 +61178,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -61111,6 +61242,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -61133,7 +61267,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -62274,6 +62411,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Возвращает ÑкалÑрное произведение Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¼ [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -62304,6 +62446,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Возвращает ÑкалÑрное произведение Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð¾Ð¼ [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -62345,8 +62492,12 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" +"ИзлучаетÑÑ Ð¿Ñ€Ð¸ нажатии пользовательÑкой кнопки. Смотрите [method add_button]." #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -67285,21 +67436,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -67312,7 +67467,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -67341,7 +67496,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -67351,22 +67538,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -67379,8 +67579,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -67578,16 +67780,16 @@ msgid "Unknown error." msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°." #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -76410,7 +76612,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml @@ -77856,6 +78060,14 @@ msgid "" "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 "" +"Сортировка вÑех дочерних узлов на оÑнове их Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ оÑи Y. Ð”Ð»Ñ " +"Ñортировки дочерний узел должен наÑледоватьÑÑ Ð¾Ñ‚ [CanvasItem]. Узлы, имеющие " +"более выÑокую позицию по Y, будут отриÑованы позже, поÑтому они поÑвÑÑ‚ÑÑ " +"поверх узлов, имеющих более низкую позицию по Y.\n" +"ВложенноÑть узлов YSort возможна. Дочерние узлы YSort будут отÑортированы в " +"том же проÑтранÑтве, что и родительÑкий YSort, что позволÑет лучше " +"организовать Ñцену или разделить ее на неÑколько, ÑохранÑÑ Ð¿Ñ€Ð¸ Ñтом " +"уникальную Ñортировку." #: doc/classes/YSort.xml msgid "" diff --git a/doc/translations/sk.po b/doc/translations/sk.po index ddcdeb10f1..35664c2df0 100644 --- a/doc/translations/sk.po +++ b/doc/translations/sk.po @@ -541,8 +541,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -552,7 +553,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -606,7 +608,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -618,7 +621,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1033,10 +1037,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4847,19 +4856,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4880,21 +4891,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4903,9 +4918,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5557,9 +5573,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5733,8 +5749,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8736,8 +8752,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8788,10 +8805,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9033,12 +9060,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9584,7 +9605,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9745,12 +9771,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9898,6 +9928,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10038,7 +10083,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11716,7 +11764,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11809,7 +11857,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11837,9 +11887,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12336,13 +12386,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12368,8 +12419,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12682,12 +12735,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12732,8 +12785,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12781,8 +12836,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12844,7 +12902,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12969,7 +13027,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15965,7 +16026,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18690,7 +18753,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18839,16 +18904,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18993,18 +19059,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23911,8 +23965,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24532,7 +24590,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26116,10 +26176,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27526,8 +27589,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29827,11 +29890,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30676,7 +30742,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30688,6 +30758,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33045,14 +33125,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33060,21 +33140,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34651,9 +34731,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35112,7 +35192,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36224,7 +36306,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37039,13 +37121,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40709,7 +40803,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46073,7 +46169,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46312,7 +46410,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47041,7 +47141,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49722,8 +49826,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53740,7 +53855,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53884,13 +54001,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55080,7 +55203,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55699,6 +55825,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56033,7 +56167,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57466,7 +57602,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58731,6 +58867,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58792,6 +58931,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58814,7 +58956,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59951,6 +60096,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59980,6 +60129,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60021,7 +60174,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64886,21 +65041,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64913,7 +65072,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64942,7 +65101,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64952,22 +65143,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64980,8 +65184,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65179,16 +65385,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73818,7 +74024,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/sr_Cyrl.po b/doc/translations/sr_Cyrl.po index 6a336f195b..7c73175270 100644 --- a/doc/translations/sr_Cyrl.po +++ b/doc/translations/sr_Cyrl.po @@ -552,8 +552,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -563,7 +564,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -617,7 +619,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -629,7 +632,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1044,10 +1048,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4858,19 +4867,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4891,21 +4902,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4914,9 +4929,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5568,9 +5584,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5744,8 +5760,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8747,8 +8763,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8799,10 +8816,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9044,12 +9071,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9595,7 +9616,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9756,12 +9782,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9909,6 +9939,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10049,7 +10094,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11727,7 +11775,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11820,7 +11868,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11848,9 +11898,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12347,13 +12397,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12379,8 +12430,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12693,12 +12746,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12743,8 +12796,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12792,8 +12847,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12855,7 +12913,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12980,7 +13038,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15976,7 +16037,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18701,7 +18764,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18850,16 +18915,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19004,18 +19070,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23922,8 +23976,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24543,7 +24601,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26127,10 +26187,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27537,8 +27600,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29838,11 +29901,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30687,7 +30753,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30699,6 +30769,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33056,14 +33136,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33071,21 +33151,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34662,9 +34742,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35123,7 +35203,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36235,7 +36317,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37050,13 +37132,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40720,7 +40814,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46084,7 +46180,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46323,7 +46421,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47052,7 +47152,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49733,8 +49837,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53751,7 +53866,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53895,13 +54012,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55091,7 +55214,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55710,6 +55836,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56044,7 +56178,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57477,7 +57613,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58742,6 +58878,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58803,6 +58942,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58825,7 +58967,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59962,6 +60107,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59991,6 +60140,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60032,7 +60185,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64897,21 +65052,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64924,7 +65083,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64953,7 +65112,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64963,22 +65154,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64991,8 +65195,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65190,16 +65396,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73829,7 +74035,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/sv.po b/doc/translations/sv.po index b582952401..0d3aa2aa94 100644 --- a/doc/translations/sv.po +++ b/doc/translations/sv.po @@ -542,8 +542,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -553,7 +554,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -607,7 +609,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -619,7 +622,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1034,10 +1038,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4848,19 +4857,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4881,21 +4892,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4904,9 +4919,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5558,9 +5574,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5734,8 +5750,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8737,8 +8753,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8789,10 +8806,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9034,12 +9061,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9585,7 +9606,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9746,12 +9772,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9899,6 +9929,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10039,7 +10084,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11717,7 +11765,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11810,7 +11858,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11838,9 +11888,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12337,13 +12387,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12369,8 +12420,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12683,12 +12736,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12733,8 +12786,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12782,8 +12837,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12845,7 +12903,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12970,7 +13028,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -15966,7 +16027,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18691,7 +18754,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18840,16 +18905,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -18994,18 +19060,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23909,8 +23963,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24530,7 +24588,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26114,10 +26174,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27524,8 +27587,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29825,11 +29888,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30674,7 +30740,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30686,6 +30756,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33043,14 +33123,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33058,21 +33138,21 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34649,9 +34729,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35110,7 +35190,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36222,7 +36304,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37037,13 +37119,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40707,7 +40801,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46071,7 +46167,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46310,7 +46408,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47039,7 +47139,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49720,8 +49824,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53738,7 +53853,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53882,13 +53999,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55078,7 +55201,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55697,6 +55823,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56031,7 +56165,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57464,7 +57600,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58729,6 +58865,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58790,6 +58929,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58812,7 +58954,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -59949,6 +60094,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -59978,6 +60127,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60019,7 +60172,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -64884,21 +65039,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -64911,7 +65070,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -64940,7 +65099,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -64950,22 +65141,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -64978,8 +65182,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65177,16 +65383,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73816,7 +74022,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/th.po b/doc/translations/th.po index 3b8c2afd36..f8e2b189b2 100644 --- a/doc/translations/th.po +++ b/doc/translations/th.po @@ -619,8 +619,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -630,7 +631,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -684,7 +686,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -696,7 +699,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1118,10 +1122,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4948,19 +4957,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4981,21 +4992,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5005,9 +5020,10 @@ msgstr "คืนค่าชื่à¸à¸‚à¸à¸‡à¸à¸¸à¸›à¸à¸£à¸“์เสีย #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5660,9 +5676,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5837,8 +5853,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8841,8 +8857,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8893,10 +8910,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9139,12 +9166,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9690,7 +9711,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9851,12 +9877,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10004,6 +10034,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10144,7 +10189,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11822,7 +11870,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11915,7 +11963,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11943,9 +11993,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12444,13 +12494,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12476,8 +12527,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12790,12 +12843,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12840,8 +12893,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12889,8 +12944,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12952,7 +13010,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13077,7 +13135,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16074,7 +16135,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18799,7 +18862,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18948,16 +19013,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19102,18 +19168,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -24022,8 +24076,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24644,7 +24702,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26231,10 +26291,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27642,8 +27705,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29965,11 +30028,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30834,7 +30900,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30846,6 +30916,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33215,14 +33295,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33230,22 +33310,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Line2D.xml msgid "" @@ -34821,9 +34905,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35283,7 +35367,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36409,7 +36495,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37228,13 +37314,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40951,7 +41049,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46323,7 +46423,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/PopupMenu.xml @@ -46562,7 +46664,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47291,7 +47395,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49977,8 +50085,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53998,7 +54117,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54142,13 +54263,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55338,7 +55465,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55957,6 +56087,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56291,7 +56429,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57725,7 +57865,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58992,6 +59132,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -59053,6 +59196,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -59075,7 +59221,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60212,6 +60361,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60241,6 +60395,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60282,7 +60441,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65152,21 +65313,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65179,7 +65344,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65208,7 +65373,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65218,22 +65415,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65246,8 +65456,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65445,16 +65657,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74103,7 +74315,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/tl.po b/doc/translations/tl.po index 6fe51a2de6..481c9d5527 100644 --- a/doc/translations/tl.po +++ b/doc/translations/tl.po @@ -617,8 +617,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -628,7 +629,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -682,7 +684,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -694,7 +697,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1109,10 +1113,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4923,19 +4932,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4956,21 +4967,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -4979,9 +4994,10 @@ msgstr "" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5633,9 +5649,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5809,8 +5825,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8812,8 +8828,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8864,10 +8881,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9109,12 +9136,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9664,7 +9685,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9825,12 +9851,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9978,6 +10008,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10118,7 +10163,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11796,7 +11844,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11889,7 +11937,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11917,9 +11967,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12419,13 +12469,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12451,8 +12502,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12765,12 +12818,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12815,8 +12868,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12864,8 +12919,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12927,7 +12985,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13052,7 +13110,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16048,7 +16109,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18773,7 +18836,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18922,16 +18987,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19076,18 +19142,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "" @@ -23997,8 +24051,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24618,7 +24676,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26202,10 +26262,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27612,8 +27675,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29913,11 +29976,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30762,7 +30828,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30774,6 +30844,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33140,14 +33220,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33155,21 +33235,24 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." +msgid "Returns the amount of points in the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." msgstr "" +"Kung [code]true[/code], ang mga child nodes ay inaayos, kung hindi ang pag-" +"so-sort ay hindi pinapagana." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +msgid "Removes the point at index [code]index[/code] from the line." msgstr "" #: doc/classes/Line2D.xml msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" #: doc/classes/Line2D.xml @@ -34749,9 +34832,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35210,7 +35293,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36334,7 +36419,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37149,13 +37234,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40819,7 +40916,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46186,7 +46285,9 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "" #: doc/classes/PopupMenu.xml @@ -46425,7 +46526,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47154,7 +47257,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49835,8 +49942,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53853,7 +53971,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -53997,13 +54117,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55193,7 +55319,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55812,6 +55941,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56146,7 +56283,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57579,7 +57718,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58844,6 +58983,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -58905,6 +59047,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -58927,7 +59072,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60064,6 +60212,10 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60093,6 +60245,10 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60134,7 +60290,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65008,21 +65166,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65035,7 +65197,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65064,7 +65226,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65074,22 +65268,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65102,8 +65309,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65301,16 +65510,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -73943,7 +74152,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/tr.po b/doc/translations/tr.po index ffa15621df..0c74573082 100644 --- a/doc/translations/tr.po +++ b/doc/translations/tr.po @@ -21,12 +21,13 @@ # paledega <paledega@yandex.ru>, 2022. # Yekez <yasintonge@gmail.com>, 2022. # Deleted User <noreply+46858@weblate.org>, 2022. +# Mustafa Said AÄŸca <m.said.agca@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-23 03:56+0000\n" -"Last-Translator: Deleted User <noreply+46858@weblate.org>\n" +"PO-Revision-Date: 2022-08-08 15:59+0000\n" +"Last-Translator: Mustafa Said AÄŸca <m.said.agca@gmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/tr/>\n" "Language: tr\n" @@ -90,7 +91,7 @@ msgstr "Kalıtılan:" #: doc/tools/make_rst.py msgid "(overrides %s)" -msgstr "" +msgstr "(%s'yi geçersiz kılar)" #: doc/tools/make_rst.py msgid "Default" @@ -808,8 +809,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -819,7 +821,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -899,7 +902,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -911,7 +915,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "DoÄŸrusal olarak iki sayı arasında, sınırlandırma öğesine (0 ila 1 arasında) " "göre ara deÄŸer hesaplar (interpolate). [method inverse_lerp] yönteminin " @@ -1590,18 +1595,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"[code]value[/code] deÄŸerini [code][istart, istop][/code] aralığından yola " -"çıkarak [code][ostart, ostop][/code] aralığındaki karşılığına ölçekledirerek " -"yerleÅŸtirir (haritalandırır).\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # 0.5 sonucunu döndürür. value=75, ilk aralık " -"0 ila100, ikinci aralık -1 ila 1.\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -5636,19 +5639,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5669,21 +5674,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5693,9 +5702,10 @@ msgstr "Verilen deÄŸerin tanjantını döndürür." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -6347,9 +6357,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -6523,8 +6533,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -9526,8 +9536,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9578,10 +9589,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9824,12 +9845,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10375,7 +10390,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10536,12 +10556,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10689,6 +10713,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10829,7 +10868,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12509,7 +12551,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12602,7 +12644,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12630,9 +12674,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -13140,13 +13184,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -13172,8 +13217,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13486,12 +13533,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13536,8 +13583,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13585,8 +13634,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13648,7 +13700,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13773,7 +13825,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16771,7 +16826,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19502,7 +19559,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19651,16 +19710,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19806,18 +19866,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Verilen bir deÄŸerin ark-sinüsünü döndürür." @@ -24736,8 +24784,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25362,7 +25414,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26952,10 +27006,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28368,8 +28425,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -30671,11 +30728,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31521,7 +31581,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31533,6 +31597,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33901,14 +33975,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33916,22 +33990,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/Line2D.xml msgid "" @@ -35511,9 +35589,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35974,7 +36052,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -37114,7 +37194,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37944,13 +38024,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41620,7 +41712,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -47017,7 +47111,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/PopupMenu.xml @@ -47256,7 +47352,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47986,7 +48084,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50667,8 +50769,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54694,7 +54807,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54838,13 +54953,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -56034,7 +56155,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56653,6 +56777,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56987,7 +57119,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58422,7 +58556,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59689,6 +59823,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -59750,6 +59887,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -59772,7 +59912,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60909,6 +61052,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Verilen deÄŸerin sinüsünü döndürür." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60939,6 +61087,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Verilen deÄŸerin sinüsünü döndürür." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60980,7 +61133,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65865,21 +66020,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65892,7 +66051,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65921,7 +66080,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65931,22 +66122,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65959,8 +66163,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -66158,16 +66364,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74832,7 +75038,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/uk.po b/doc/translations/uk.po index b1272c6b3e..2ebf849588 100644 --- a/doc/translations/uk.po +++ b/doc/translations/uk.po @@ -13,12 +13,14 @@ # Vladyslav Anisimov <uniss@ua.fm>, 2022. # МироÑлав <hlopukmyroslav@gmail.com>, 2022. # Гліб Соколов <ramithes@i.ua>, 2022. +# Yan Chen <cyan97087@gmail.com>, 2022. +# Богдан Матвіїв <bomtvv@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-14 15:48+0000\n" -"Last-Translator: МироÑлав <hlopukmyroslav@gmail.com>\n" +"PO-Revision-Date: 2022-08-23 03:39+0000\n" +"Last-Translator: Богдан Матвіїв <bomtvv@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/uk/>\n" "Language: uk\n" @@ -27,7 +29,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\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.13-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -70,9 +72,8 @@ msgid "Method Descriptions" msgstr "ОпиÑи методів" #: doc/tools/make_rst.py -#, fuzzy msgid "Theme Property Descriptions" -msgstr "ОпиÑи ВлаÑтивоÑтей Теми" +msgstr "ОпиÑи тематичної нерухомоÑті" #: doc/tools/make_rst.py msgid "Inherits:" @@ -441,18 +442,15 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the hyperbolic cosine of [code]s[/code] in radians.\n" "[codeblock]\n" "print(cosh(1)) # Prints 1.543081\n" "[/codeblock]" msgstr "" -"Повертає абÑолютне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ [code]s[/code] (тобто Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±ÐµÐ· " -"знака, працює Ð´Ð»Ñ Ñ†Ñ–Ð»Ð¸Ñ… чиÑел Ñ– чиÑел із рухомою крапкою).\n" +"Повертає гіперболічний коÑÐ¸Ð½ÑƒÑ [code]s[/code] у радіанах.\n" "[codeblock]\n" -"# a дорівнює 1\n" -"a = abs(-1)\n" +"print(cosh(1)) # Виведе 1.543081\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -676,8 +674,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -687,7 +686,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -741,7 +741,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -753,7 +754,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -944,7 +946,6 @@ msgid "" msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the result of [code]base[/code] raised to the power of [code]exp[/" "code].\n" @@ -952,12 +953,9 @@ msgid "" "pow(2, 5) # Returns 32.0\n" "[/codeblock]" msgstr "" -"Повертає аркÑÐ¸Ð½ÑƒÑ [code]s[/code] у радіанах. ВикориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ " -"кута ÑинуÑа [code]s[/code].\n" +"Повертає результат [code]base[/code], піднÑтий до Ñтепеню [code]exp[/code].\n" "[codeblock]\n" -"# s дорівнює 0.523599 або 30 градуÑів, Ñкщо конвертувати за допомогою " -"rad2deg(s)\n" -"s = asin(0.5)\n" +"pow(2, 5) # Повертає 32.0\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1176,10 +1174,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4998,19 +5001,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5031,21 +5036,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5055,9 +5064,10 @@ msgstr "Повертає Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5709,9 +5719,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5885,8 +5895,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8894,8 +8904,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8946,12 +8957,22 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" +msgstr "Звукові шини" + #: doc/classes/AudioEffectCapture.xml msgid "" "Returns [code]true[/code] if at least [code]frames[/code] audio frames are " @@ -9192,12 +9213,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "Звукові шини" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9743,7 +9758,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9904,12 +9924,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10057,6 +10081,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10197,7 +10236,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11878,7 +11920,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11971,7 +12013,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11999,9 +12043,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12503,13 +12547,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12535,8 +12580,10 @@ msgstr "ВлаÑне Ð¼Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð² 2D" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12849,12 +12896,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12899,8 +12946,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12948,8 +12997,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13011,7 +13063,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13136,7 +13188,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16133,7 +16188,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18864,7 +18921,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19013,16 +19072,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19168,18 +19228,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Повертає аркÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." @@ -24091,8 +24139,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24713,7 +24765,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26301,10 +26355,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27720,8 +27777,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -30023,11 +30080,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30873,7 +30933,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30885,6 +30949,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33246,14 +33320,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33261,22 +33335,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Повертає мінімальний кут до заданого вектора у радіанах." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "ОбчиÑлює векторний добуток цього вектора Ñ– [code]b[/code]." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "ОбчиÑлює векторний добуток цього вектора Ñ– [code]b[/code]." #: doc/classes/Line2D.xml msgid "" @@ -34853,9 +34931,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35316,7 +35394,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36455,7 +36535,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37281,13 +37361,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40957,7 +41049,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -41918,7 +42012,6 @@ msgid "" msgstr "" #: doc/classes/PacketPeer.xml -#, fuzzy msgid "" "[i]Deprecated.[/i] Use [code]get_var[/code] and [code]put_var[/code] " "parameters instead.\n" @@ -41928,12 +42021,14 @@ msgid "" "Do not use this option if the serialized object comes from untrusted sources " "to avoid potential security threats such as remote code execution." msgstr "" -"Декодує маÑив байтів назад у значеннÑ. Якщо [code]allow_objects[/code] " -"дорівнює [code]true[/code], Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±'єктів дозволено.\n" -"[b]ПОПЕРЕДЖЕÐÐЯ:[/b] деÑеріалізований об'єкт може міÑтити виконуваний код. " -"Ðе викориÑтовуйте цю опцію, Ñкщо Ñеріалізований об'єкт отримано із " -"неперевірених джерел Ð·Ð°Ð´Ð»Ñ ÑƒÐ½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚ÐµÐ½Ñ†Ñ–Ð¹Ð½Ð¸Ñ… порушень безпеки " -"(віддаленого Ð²Ð¸ÐºÐ¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ)." +"[i]ЗаÑтаріло.[/i] ÐатоміÑть викориÑтовуйте параметри [code]get_var[/code] Ñ– " +"[code]put_var[/code].\n" +"Якщо [code]true[/code], PacketPeer дозволить кодувати та декодувати об’єкт " +"за допомогою [method get_var] Ñ– [method put_var].\n" +"[b]ПопередженнÑ: [/b] ДеÑеріалізовані об’єкти можуть міÑтити код, Ñкий " +"виконуєтьÑÑ. Ðе викориÑтовуйте цей параметр, Ñкщо Ñеріалізований об’єкт " +"походить із ненадійних джерел, щоб уникнути потенційних загроз безпеці, " +"наприклад віддаленого Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ." #: doc/classes/PacketPeer.xml msgid "" @@ -46345,7 +46440,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/PopupMenu.xml @@ -46584,7 +46681,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47314,7 +47413,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49995,8 +50098,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54015,7 +54129,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54159,13 +54275,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55355,7 +55477,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55975,6 +56100,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56309,7 +56442,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57743,7 +57878,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59010,6 +59145,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -59071,6 +59209,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -59093,7 +59234,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60230,6 +60374,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ОбчиÑлює векторний добуток цього вектора Ñ– [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60260,6 +60409,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "ОбчиÑлює векторний добуток цього вектора Ñ– [code]b[/code]." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60301,7 +60455,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65185,21 +65341,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65212,7 +65372,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65241,7 +65401,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65251,22 +65443,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65279,8 +65484,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65478,16 +65685,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74150,7 +74357,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/doc/translations/vi.po b/doc/translations/vi.po index 60ab8769ab..bc880f2cf4 100644 --- a/doc/translations/vi.po +++ b/doc/translations/vi.po @@ -8,12 +8,13 @@ # Hung <hungthitkhia@gmail.com>, 2021. # Giacat Buile <hatconan20024@gmail.com>, 2021. # Quinn Le <quinnsgn@gmail.com>, 2021. +# TrieuPhong <trieuphong965@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-04-25 15:12+0000\n" -"Last-Translator: IoeCmcomc <hopdaigia2004@gmail.com>\n" +"PO-Revision-Date: 2022-09-09 12:42+0000\n" +"Last-Translator: TrieuPhong <trieuphong965@gmail.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/vi/>\n" "Language: vi\n" @@ -21,7 +22,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.12.1-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -796,8 +797,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -807,7 +809,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -879,7 +882,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -891,7 +895,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1393,10 +1398,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -5298,19 +5308,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -5331,21 +5343,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5355,9 +5371,10 @@ msgstr "Trả vá» [Texture2D] cá»§a khung hình được cho." #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -6009,9 +6026,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -6184,10 +6201,13 @@ msgid "" msgstr "" #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" +"Chạy hoạt ảnh tên là [code]anim[/code]. Nếu không cung cấp [code]anim[/code] " +"nà o, thì chạy hoạt ảnh hiện tại." #: doc/classes/AnimationPlayer.xml msgid "Returns the list of stored animation names." @@ -9189,8 +9209,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -9241,10 +9262,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9487,12 +9518,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -10038,7 +10063,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10199,12 +10229,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10352,6 +10386,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10492,7 +10541,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12173,7 +12225,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -12266,7 +12318,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -12294,9 +12348,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12799,13 +12853,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12831,8 +12886,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -13145,12 +13202,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13195,8 +13252,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -13244,8 +13303,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -13307,7 +13369,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13432,7 +13494,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16431,7 +16496,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -19163,7 +19230,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -19312,16 +19381,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19467,18 +19537,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "Trả vá» sin nghịch đảo cá»§a tham số." @@ -24393,8 +24451,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -25015,7 +25077,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26603,10 +26667,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -28017,8 +28084,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -30321,11 +30388,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -31171,7 +31241,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -31183,6 +31257,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33546,14 +33630,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33561,22 +33645,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/Line2D.xml msgid "" @@ -35154,9 +35242,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35617,7 +35705,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36756,7 +36846,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37585,13 +37675,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -41261,7 +41363,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46657,7 +46761,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/PopupMenu.xml @@ -46897,7 +47003,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47627,7 +47735,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50311,8 +50423,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -54336,7 +54459,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54480,13 +54605,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55676,7 +55807,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -56297,6 +56431,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56631,7 +56773,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -58066,7 +58210,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -59333,6 +59477,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -59394,6 +59541,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -59416,7 +59566,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60553,6 +60706,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Trả vá» sin cá»§a tham số." + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60583,6 +60741,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "Trả vá» sin cá»§a tham số." + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60624,7 +60787,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65511,21 +65676,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65538,7 +65707,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65567,7 +65736,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65577,22 +65778,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65605,8 +65819,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65804,16 +66020,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74489,7 +74705,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml @@ -75915,3 +76133,5 @@ msgstr "" msgid "" "If [code]true[/code], child nodes are sorted, otherwise sorting is disabled." msgstr "" +"Nếu [code] true [/code], các nút con sẽ được sắp xếp, nếu không, tÃnh năng " +"sắp xếp sẽ bị vô hiệu hóa." diff --git a/doc/translations/zh_CN.po b/doc/translations/zh_CN.po index 7647bf0081..a69559f289 100644 --- a/doc/translations/zh_CN.po +++ b/doc/translations/zh_CN.po @@ -58,11 +58,12 @@ # è‹è½¼ <youwanyuyu@gmail.com>, 2021. # ErrorDreemurr <diandaokui@qq.com>, 2021. # 烧风 <hk-shao@foxmail.com>, 2022. +# Yan Chen <cyan97087@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-31 16:43+0000\n" +"PO-Revision-Date: 2022-09-08 07:39+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hans/>\n" @@ -71,7 +72,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -369,7 +370,7 @@ msgid "" "not use this option if the serialized object comes from untrusted sources to " "avoid potential security threats (remote code execution)." msgstr "" -"å°†å—节数组解ç 返回一个值。当 [code]allow_objects[/code] 为 [code]true[/code] " +"å°†å—节数组解ç 回一个值。当 [code]allow_objects[/code] 为 [code]true[/code] " "时,å…许解ç 对象。\n" "[b]è¦å‘Šï¼š[/b]ååºåˆ—化得到的对象å¯èƒ½åŒ…å«å¯æ‰§è¡Œçš„代ç 。如果åºåˆ—åŒ–çš„å¯¹è±¡çš„æ¥æºä¸" "å¯ä¿¡ï¼Œè¯·ä¸è¦æ¿€æ´»æ¤é€‰é¡¹ï¼Œä»¥é¿å…潜在的安全å¨èƒï¼ˆè¿œç¨‹æ‰§è¡Œä»£ç )。" @@ -827,6 +828,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -834,8 +836,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -845,7 +848,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" "返回æ’å€¼æˆ–å¤–æŽ¨çš„å› å。范围用 [code]from[/code] å’Œ [code]to[/code] 指定,æ’值" "åŽçš„值用 [code]weight[/code] 指定。如果 [code]weight[/code] 在 [code]from[/" @@ -922,12 +926,14 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -939,7 +945,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "" "在两个值之间按照 [code]weight[/code] å®šä¹‰çš„å› æ•°è¿›è¡Œçº¿æ€§æ’值。进行æ’值时," "[code]weight[/code] 应该在 [code]0.0[/code] å’Œ [code]1.0[/code] 之间(包" @@ -1612,16 +1619,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" -"å°† [code]value[/code] 从范围 [code][istart, istop][/code] æ˜ å°„åˆ° [code]" -"[ostart, ostop][/code]。\n" -"[codeblock]\n" -"range_lerp(75, 0, 100, -1, 1) # 返回 0.5\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -6002,22 +6009,22 @@ msgstr "" "[AnimationRootNode] æ—¶æ‰æœ‰ç”¨ï¼Œå¦åˆ™ç¼–辑器将ä¸ä¼šæ˜¾ç¤ºä½ çš„èŠ‚ç‚¹è¿›è¡Œæ·»åŠ ã€‚" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." -msgstr "èŽ·å–æ¤èŠ‚ç‚¹çš„æ–‡æœ¬æ ‡é¢˜ï¼ˆç”±æŸäº›ç¼–辑器使用)。" +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." +msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." -msgstr "按索引获å–一个å节点(由继承 [AnimationRootNode] 的编辑器使用)。" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." +msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" -"按照 [code]name: node[/code] å—典的顺åºèŽ·å–æ‰€æœ‰å节点。仅在继承 " -"[AnimationRootNode] 时有用。" #: doc/classes/AnimationNode.xml msgid "" @@ -6038,16 +6045,21 @@ msgstr "" "ä¸é‡å¤ä½¿ç”¨ã€‚" #: doc/classes/AnimationNode.xml +#, fuzzy 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" "获å–ä¸€ä¸ªå‚æ•°çš„é»˜è®¤å€¼ã€‚å‚æ•°æ˜¯ç”¨äºŽèŠ‚ç‚¹çš„è‡ªå®šä¹‰æœ¬åœ°å†…å˜ï¼Œç»™å®šèµ„æºå¯ä»¥åœ¨å¤šä¸ªæ ‘ä¸" "é‡ç”¨ã€‚" #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 "" @@ -6055,9 +6067,11 @@ msgstr "" "æ ‘ä¸é‡å¤ä½¿ç”¨ã€‚æ ¼å¼ç±»ä¼¼äºŽ[method Object.get_property_list]。" #: doc/classes/AnimationNode.xml +#, fuzzy msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "返回 [code]true[/code],是å¦å¸Œæœ›æ··åˆæ ‘编辑器在æ¤èŠ‚ç‚¹ä¸Šæ˜¾ç¤ºè¿‡æ»¤å™¨ç¼–è¾‘ã€‚" #: doc/classes/AnimationNode.xml @@ -6065,10 +6079,12 @@ msgid "Returns whether the given path is filtered." msgstr "返回是å¦å¯¹ç»™å®šçš„路径进行过滤。" #: doc/classes/AnimationNode.xml +#, fuzzy 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -6806,23 +6822,24 @@ msgid "" msgstr "按照最çŸè·¯å¾„从当å‰çжæ€è¿‡æ¸¡åˆ°å¦ä¸€ä¸ªçжæ€ã€‚" #: doc/classes/AnimationNodeStateMachineTransition.xml +#, fuzzy 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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 "" -"è®¾ç½®æ¤æ¡ä»¶ï¼Œå¼€å¯è‡ªåЍå‰è¿›ã€‚æä¾›çš„åç§°å°†æˆä¸º [AnimationTree] ä¸Šçš„ä¸€ä¸ªå¸ƒå°”å‚æ•°ï¼Œ" -"å¯ä»¥é€šè¿‡ä»£ç 控制,请å‚阅 [url=$DOCS_URL/tutorials/animation/animation_tree." -"html#controlling-from-code][/url]。例如,如果 [member AnimationTree." -"tree_root] 是一个 [AnimationNodeStateMachine],[member advance_condition] 被" -"设置为 [code]\"idle\"[/code]。\n" +"这个æ¡ä»¶ä¸ºçœŸæ—¶ï¼Œå°†å¼€å¯è‡ªåЍå‰è¿›ã€‚æä¾›çš„åç§°å°†æˆä¸º [AnimationTree] 上的布尔å‚" +"数,å¯ä»¥é€šè¿‡ä»£ç 控制,请å‚阅 [url=$DOCS_URL/tutorials/animation/" +"animation_tree.html#controlling-from-code][/url]。例如,如果 [member " +"AnimationTree.tree_root] 是一个 [AnimationNodeStateMachine],[member " +"advance_condition] 被设置为 [code]\"idle\"[/code]:\n" "[codeblock]\n" "$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " "(linear_velocity.x == 0)\n" @@ -7030,9 +7047,10 @@ msgid "" msgstr "返回 [code]animation[/code] çš„å称,如果没有找到,则返回一个空å—符串。" #: doc/classes/AnimationPlayer.xml +#, fuzzy msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" "返回键为 [code]name[/code] çš„ [Animation] 动画,未找到时为 [code]null[/" "code]。" @@ -7634,7 +7652,7 @@ msgstr "返回给定其åç§°çš„ OneShot 节点的淡出时间。" #: doc/classes/AnimationTreePlayer.xml msgid "Returns whether a OneShot node will auto restart given its name." -msgstr "返回OneShot节点是å¦ä¼šæ ¹æ®å…¶åç§°è‡ªåŠ¨é‡æ–°å¯åŠ¨ã€‚" +msgstr "返回 OneShot 节点是å¦ä¼šæ ¹æ®å…¶åç§°è‡ªåŠ¨é‡æ–°å¯åŠ¨ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "Returns whether a OneShot node is active given its name." @@ -7716,8 +7734,9 @@ msgid "" "If applied after a blend or mix, affects all input animations to that blend " "or mix." msgstr "" -"设置å称为 [code]id[/code] çš„TimeScale节点的时间缩放为[code]scale[/code]。\n" -"时间缩放节点用æ¥åŠ å¿«[Animation]的速度,如果缩放高于1ï¼Œå°±ä¼šå‡æ…¢å®ƒä»¬ã€‚\n" +"设置å称为 [code]id[/code] çš„ TimeScale 节点的时间缩放为 [code]scale[/" +"code]。\n" +"时间缩放节点用æ¥åŠ å¿« [Animation] 的速度,如果缩放高于1ï¼Œå°±ä¼šå‡æ…¢å®ƒä»¬ã€‚\n" "如果在混åˆåŽåº”用,会影å“到该混åˆçš„æ‰€æœ‰è¾“入动画。" #: doc/classes/AnimationTreePlayer.xml @@ -7727,9 +7746,9 @@ msgid "" "This functions as a seek in the [Animation] or the blend or mix of " "[Animation]s input in it." msgstr "" -"设置å称为 [code]id[/code] çš„TimeSeek节点的时间查寻值为[code]seconds[/" +"设置å称为 [code]id[/code] çš„ TimeSeek 节点的时间查寻值为 [code]seconds[/" "code]。\n" -"这在[Animation]或输入的[Animation]的混åˆä¸èµ·åˆ°æŸ¥å¯»çš„作用。" +"这在 [Animation] 或输入的 [Animation] 的混åˆä¸èµ·åˆ°æŸ¥å¯»çš„作用。" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7763,8 +7782,8 @@ msgid "" "transition node with name [code]id[/code] is set to automatically advance to " "the next input upon completion." msgstr "" -"如果过渡节点上å称为 [code]id[/code] çš„[code]input_idx[/code]的输入被设置为在" -"完æˆåŽè‡ªåЍå‰è¿›åˆ°ä¸‹ä¸€ä¸ªè¾“入,则返回 [code]true[/code]。" +"如果过渡节点上å称为 [code]id[/code] çš„ [code]input_idx[/code] 的输入被设置为" +"在完æˆåŽè‡ªåЍå‰è¿›åˆ°ä¸‹ä¸€ä¸ªè¾“入,则返回 [code]true[/code]。" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7778,8 +7797,8 @@ msgid "" "The transition node with name [code]id[/code] advances to its next input " "automatically when the input at [code]input_idx[/code] completes." msgstr "" -"当[code]input_idx[/code]处的输入完æˆåŽï¼Œå称为 [code]id[/code] 的过渡节点自动" -"进行到下一个输入。" +"当 [code]input_idx[/code] 处的输入完æˆåŽï¼Œå称为 [code]id[/code] 的过渡节点自" +"动进行到下一个输入。" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7792,13 +7811,13 @@ msgid "" "The transition node with name [code]id[/code] sets its cross fade time to " "[code]time_sec[/code]." msgstr "" -"å称为 [code]id[/code] çš„è¿‡æ¸¡èŠ‚ç‚¹å°†å…¶äº¤å‰æ·¡åŒ–时间设置为[code]time_sec[/" +"å称为 [code]id[/code] çš„è¿‡æ¸¡èŠ‚ç‚¹å°†å…¶äº¤å‰æ·¡åŒ–时间设置为 [code]time_sec[/" "code]。" #: doc/classes/AnimationTreePlayer.xml msgid "" "If [code]true[/code], the [AnimationTreePlayer] is able to play animations." -msgstr "如果为 [code]true[/code],[AnimationTreePlayer]å°±èƒ½å¤Ÿæ’æ”¾åŠ¨ç”»ã€‚" +msgstr "如果为 [code]true[/code],[AnimationTreePlayer] å°±èƒ½å¤Ÿæ’æ”¾åŠ¨ç”»ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7807,7 +7826,7 @@ msgid "" "[AnimationPlayer] would point its Root Node at." msgstr "" "相对访问其他节点的节点。\n" -"它访问骨骼,应该指å‘[AnimationPlayer]将指å‘å…¶æ ¹èŠ‚ç‚¹çš„åŒä¸€ä¸ªèŠ‚ç‚¹ã€‚" +"å®ƒè®¿é—®éª¨éª¼ï¼Œåº”è¯¥æŒ‡å‘ [AnimationPlayer] 将指å‘å…¶æ ¹èŠ‚ç‚¹çš„åŒä¸€ä¸ªèŠ‚ç‚¹ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7817,7 +7836,7 @@ msgid "" msgstr "" "通过 [AnimationPlayer] çš„è·¯å¾„ï¼Œæ¤ [AnimationTreePlayer] 将动画绑定到动画节" "点。\n" -"设置åŽï¼Œ[Animation]节点å¯ä»¥æ·»åŠ åˆ°[AnimationPlayer]。" +"设置åŽï¼Œ[Animation] 节点å¯ä»¥æ·»åŠ åˆ° [AnimationPlayer]。" #: doc/classes/AnimationTreePlayer.xml msgid "The thread in which to update animations." @@ -7946,7 +7965,7 @@ msgid "" "details about damping." msgstr "" "物体在æ¤åŒºåŸŸåœæ¢æ—‹è½¬çš„速度。代表æ¯ç§’æŸå¤±çš„角速度.\n" -"关于阻尼的更多细节,è§[member ProjectSettings.physics/3d/" +"å…³äºŽé˜»å°¼çš„æ›´å¤šç»†èŠ‚ï¼Œè§ [member ProjectSettings.physics/3d/" "default_angular_damp]。" #: doc/classes/Area.xml doc/classes/Area2D.xml @@ -8051,7 +8070,7 @@ msgid "" "be set to [code]true[/code].\n" "[code]area[/code] the other Area." msgstr "" -"当å¦ä¸€ä¸ª Area 进入这个 Area 时触å‘。需è¦å°†ç›‘控 [member monitoring] 设置为 " +"当å¦ä¸€ä¸ª Area 进入这个 Area 时触å‘ã€‚éœ€è¦ [member monitoring] 被设置为 " "[code]true[/code]。\n" "[code]area[/code] 傿•°æ˜¯å¦å¤–一个 Area。" @@ -8061,9 +8080,9 @@ msgid "" "be set to [code]true[/code].\n" "[code]area[/code] the other Area." msgstr "" -"当å¦ä¸€ä¸ªåŒºåŸŸé€€å‡ºè¿™ä¸ªåŒºåŸŸæ—¶å‘å‡ºçš„ã€‚è¦æ±‚监控[member monitoring]被设置为 " +"当å¦ä¸€ä¸ªåŒºåŸŸé€€å‡ºè¿™ä¸ªåŒºåŸŸæ—¶å‘å‡ºçš„ã€‚è¦æ±‚ [member monitoring] 被设置为 " "[code]true[/code]。\n" -"[code]area[/code]傿•°æ˜¯å¦å¤–一个Area。" +"[code]area[/code] 傿•°æ˜¯å¦å¤–一个 Area。" #: doc/classes/Area.xml msgid "" @@ -8079,17 +8098,17 @@ msgid "" "the [PhysicsServer]. Get the [CollisionShape] node with [code]self." "shape_owner_get_owner(local_shape_index)[/code]." msgstr "" -"当å¦ä¸€ä¸ªåŒºåŸŸçš„一个[Shape]进入这个区域的一个[Shape]æ—¶å‘å‡ºçš„ã€‚è¦æ±‚[member " +"当å¦ä¸€ä¸ªåŒºåŸŸçš„一个 [Shape] 进入这个区域的一个 [Shape] æ—¶å‘å‡ºçš„ã€‚è¦æ±‚ [member " "monitoring] 被设置为 [code]true[/code]。\n" -"[code]area_rid[/code] [PhysicsServer]使用的其他区域的[CollisionObject]çš„" +"[code]area_rid[/code] [PhysicsServer]使用的其他区域的 [CollisionObject] çš„ " "[RID]。\n" "[code]area[/code] 其他区域。\n" -"[code]area_shape_index[/code] [PhysicsServer]使用的其他区域的[Shape]的索引。" -"用[code]area.shape_owner_get_owner(area_shape_index)[/code]获得" -"[CollisionShape]节点。\n" -"[code]local_shape_index[/code]是[PhysicsServer]使用的该区域的[Shape]的索引。" -"用[code]self.shape_owner_get_owner(local_shape_index)[/code]获得" -"[CollisionShape]节点。" +"[code]area_shape_index[/code] [PhysicsServer] 使用的其他区域的 [Shape] 的索" +"引。用 [code]area.shape_owner_get_owner(area_shape_index)[/code] 获得 " +"[CollisionShape] 节点。\n" +"[code]local_shape_index[/code] [PhysicsServer] 使用的该区域的 [Shape] 的索" +"引。用 [code]self.shape_owner_get_owner(local_shape_index)[/code] 获得 " +"[CollisionShape] 节点。" #: doc/classes/Area.xml msgid "" @@ -8143,7 +8162,7 @@ msgstr "" "[code]body[/code] [PhysicsBody] 或 [GridMap] çš„ [Node],如果它å˜åœ¨äºŽæ ‘ä¸çš„" "è¯ã€‚\n" "[code]body_shape_index[/code] [PhysicsServer] 使用的 [PhysicsBody] 或 " -"[GridMap] çš„ [Shape]的索引。用 [code]body." +"[GridMap] çš„ [Shape] 的索引。用 [code]body." "shape_owner_get_owner(body_shape_index)[/code] èŽ·å– [CollisionShape] 节点。\n" "[code]local_shape_index[/code] 这个区域的 [Shape] 的索引,由 [PhysicsServer] " "使用。用 [code]self.shape_owner_get_owner(local_shape_index)[/code] 获得 " @@ -8465,7 +8484,7 @@ msgstr "" "点。\n" "[code]local_shape_index[/code] 这个 Area2D çš„ [Shape2D] 的索引,由 " "[Physics2DServer] 使用。用 [code]self." -"shape_owner_get_owner(local_shape_index)[/code]获å–[CollisionShape2D]节点。" +"shape_owner_get_owner(local_shape_index)[/code]èŽ·å– [CollisionShape2D] 节点。" #: doc/classes/Array.xml msgid "A generic array datatype." @@ -8991,8 +9010,8 @@ msgid "" "and upper index are inclusive, with the [code]step[/code] describing the " "change between indices while slicing." msgstr "" -"å¤åˆ¶å‡½æ•°ä¸æè¿°çš„å集并以数组形å¼è¿”回,如果[code]deep[/code]为 [code]true[/" -"code],则深度å¤åˆ¶æ•°ç»„。下索引和上索引是包å«çš„,[code]step[/code]æè¿°äº†åˆ†ç‰‡æ—¶" +"å¤åˆ¶å‡½æ•°ä¸æè¿°çš„å集并以数组形å¼è¿”回,如果 [code]deep[/code] 为 [code]true[/" +"code],则深度å¤åˆ¶æ•°ç»„。下索引和上索引是包å«çš„,[code]step[/code] æè¿°äº†åˆ†ç‰‡æ—¶" "索引之间的å˜åŒ–。" #: doc/classes/Array.xml @@ -9109,9 +9128,8 @@ msgstr "" "var m = MeshInstance.new()\n" "m.mesh = arr_mesh\n" "[/codeblock]\n" -"这个 [MeshInstance] å·²ç»å‡†å¤‡å°±ç»ªï¼Œä»¥æ·»åŠ åˆ°è¦æ˜¾ç¤ºçš„ [SceneTree] ä¸ã€‚\n" -"程åºå¼å‡ 何体生æˆï¼Œè¯·å‚阅 [ImmediateGeometry]ã€[MeshDataTool]ã€" -"[SurfaceTool]。\n" +"这个 [MeshInstance] å°±å¯ä»¥æ·»åŠ åˆ°è¦æ˜¾ç¤ºçš„ [SceneTree] ä¸äº†ã€‚\n" +"程åºå¼å‡ 何体生æˆè¯·å‚阅 [ImmediateGeometry]ã€[MeshDataTool]ã€[SurfaceTool]。\n" "[b]注æ„:[/b]Godot 对三角形图元模å¼çš„æ£é¢ä½¿ç”¨é¡ºæ—¶é’ˆ[url=https://learnopengl-" "cn.github.io/04%20Advanced%20OpenGL/04%20Face%20culling/]环绕顺åº[/url]。" @@ -9549,7 +9567,7 @@ msgid "" "If provided by the [ARVRInterface], this returns a mesh associated with the " "controller. This can be used to visualize the controller." msgstr "" -"如果由 [ARVRInterface]æä¾›ï¼Œåˆ™è¿”å›žä¸ŽæŽ§åˆ¶å™¨ç›¸å…³çš„ç½‘æ ¼ã€‚è¿™å¯ç”¨äºŽå¯è§†åŒ–控制器。" +"如果由 [ARVRInterface] æä¾›ï¼Œåˆ™è¿”å›žä¸ŽæŽ§åˆ¶å™¨ç›¸å…³çš„ç½‘æ ¼ã€‚è¿™å¯ç”¨äºŽå¯è§†åŒ–控制器。" #: doc/classes/ARVRController.xml msgid "" @@ -9588,8 +9606,8 @@ msgid "" "This is a useful property to animate if you want the controller to vibrate " "for a limited duration." msgstr "" -"控制器振动的程度。范围从 [code]0.0[/code] 到 [code]1.0[/code]。如果更改," -"会相应地更新 [member ARVRPositionalTracker.rumble]。\n" +"控制器振动的程度。范围从 [code]0.0[/code] 到 [code]1.0[/code]。如果更改,会相" +"应地更新 [member ARVRPositionalTracker.rumble]。\n" "å¦‚æžœä½ æƒ³è®©æŽ§åˆ¶å™¨åœ¨é™å®šæ—¶é—´å†…振动,这是一个有用的属性,å¯ä»¥å°†å…¶åŠ¨ç”»åŒ–ã€‚" #: doc/classes/ARVRController.xml @@ -9685,8 +9703,8 @@ msgid "" msgstr "" "调用这个æ¥åˆå§‹åŒ–这个接å£ã€‚第一个被åˆå§‹åŒ–的接å£ç¡®å®šä¸ºä¸»æŽ¥å£ï¼Œç”¨äºŽæ¸²æŸ“输出。\n" "在åˆå§‹åŒ–了接å£ä¹‹åŽï¼Œéœ€è¦å¯ç”¨è§†çª—çš„ AR/VR 模å¼ï¼Œå°†å¼€å§‹æ¸²æŸ“。\n" -"[b]注æ„:[/b]对于任何使用Godot主输出的设备,如移动VRï¼Œä½ å¿…é¡»åœ¨ä¸»è§†çª—ä¸Šå¯ç”¨ " -"AR/VR 模å¼ã€‚\n" +"[b]注æ„:[/b]对于任何使用 Godot 主输出的设备,如移动 VRï¼Œä½ å¿…é¡»åœ¨ä¸»è§†çª—ä¸Šå¯" +"用 AR/VR 模å¼ã€‚\n" "å¦‚æžœä½ ä¸ºä¸€ä¸ªå¤„ç†è‡ªå·±è¾“出的平å°è¿™æ ·åšï¼ˆå¦‚ OpenVR),Godot 就会在å±å¹•ä¸Šåªæ˜¾ç¤ºä¸€" "åªçœ¼ç›è€Œä¸å¤±çœŸã€‚å¦å¤–ï¼Œä½ å¯ä»¥åœ¨åœºæ™¯ä¸æ·»åŠ ä¸€ä¸ªå•独的视窗节点,在该视窗上å¯ç”¨ " "AR/VR。它将被用æ¥è¾“出到 HMDï¼Œè®©ä½ åœ¨ä¸»çª—å£ä¸åšä½ 喜欢的事情,比如用一个å•独的相" @@ -10527,7 +10545,7 @@ msgstr "" "var res = astar.get_id_path(1, 3) # 返回 [1, 2, 3]\n" "[/codeblock]\n" "å¦‚æžœä½ æŠŠç¬¬ 2 点的æƒé‡æ”¹ä¸º 3ï¼Œé‚£ä¹ˆç»“æžœå°±ä¼šå˜æˆ [code][1, 4, 3][/code]ï¼Œå› ä¸ºçŽ°" -"在虽然è·ç¦»é•¿äº†ï¼Œä½†é€šè¿‡ç¬¬ 4 点比通过第 2 点 “容易â€ã€‚" +"在虽然è·ç¦»é•¿äº†ï¼Œä½†é€šè¿‡ç¬¬ 4 点比通过第 2 点“容易â€ã€‚" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10841,10 +10859,10 @@ msgid "" "[b]Note:[/b] This method is not thread-safe. If called from a [Thread], it " "will return an empty [PoolVector2Array] and will print an error message." msgstr "" -"返回一个数组,该数组包å«äº†AStar2D在给定点之间找到的路径ä¸çš„点。该数组从路径的" -"起点到终点排åºã€‚\n" -"[b]注æ„:[/b]è¿™ä¸ªæ–¹æ³•ä¸æ˜¯çº¿ç¨‹å®‰å…¨çš„。如果从一个[Thread]线程ä¸è°ƒç”¨ï¼Œå®ƒå°†è¿”回一" -"个空的[PoolVector2Array],并打å°ä¸€ä¸ªé”™è¯¯ä¿¡æ¯ã€‚" +"返回一个数组,该数组包å«äº† AStar2D 在给定点之间找到的路径ä¸çš„点。该数组从路径" +"的起点到终点排åºã€‚\n" +"[b]注æ„:[/b]è¿™ä¸ªæ–¹æ³•ä¸æ˜¯çº¿ç¨‹å®‰å…¨çš„。如果从 [Thread] 线程ä¸è°ƒç”¨ï¼Œå®ƒå°†è¿”回一个" +"空的 [PoolVector2Array],并打å°ä¸€ä¸ªé”™è¯¯ä¿¡æ¯ã€‚" #: doc/classes/AtlasTexture.xml msgid "" @@ -10914,7 +10932,7 @@ msgid "" "the connections between buses. See [AudioServer] for usage." msgstr "" "å˜å‚¨ä½ç½®ã€é™éŸ³ã€ç‹¬å¥ã€æ—é€šã€æ•ˆæžœã€æ•ˆæžœä½ç½®ã€éŸ³é‡ä»¥åŠæ€»çº¿ä¹‹é—´çš„连接。使用方法" -"å‚阅 [AudioServer] 。" +"è§ [AudioServer] 。" #: doc/classes/AudioEffect.xml msgid "Audio effect for audio." @@ -10926,8 +10944,9 @@ msgid "" "resource is applied on." msgstr "音频总线的基础资æºã€‚åœ¨è¯¥èµ„æºæ‰€åº”用的总线上应用音频效果。" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "音频麦克风录音演示" @@ -10981,15 +11000,20 @@ msgid "Captures audio from an audio bus in real-time." msgstr "ä»ŽéŸ³é¢‘æ€»çº¿ä¸Šå®žæ—¶æ•æ‰éŸ³é¢‘。" #: doc/classes/AudioEffectCapture.xml +#, fuzzy msgid "" "AudioEffectCapture is an AudioEffect which copies all audio frames from the " "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" "AudioEffectCapture æ˜¯ä¸€ç§ AudioEffect,å¯å°†æ‰€é™„音频效果总线的所有音频帧å¤åˆ¶åˆ°" "其内部的环形缓冲器ä¸ã€‚\n" @@ -10997,17 +11021,23 @@ msgstr "" "需è¦è¿›è¡Œå¤„ç†ï¼Œä¾‹å¦‚从麦克风æ•获数æ®ã€å®žçŽ°åº”ç”¨ç¨‹åºå®šä¹‰çš„æ•ˆæžœæˆ–é€šè¿‡ç½‘ç»œä¼ è¾“éŸ³" "频。从麦克风æ•èŽ·éŸ³é¢‘æ•°æ®æ—¶ï¼Œæ ·æœ¬çš„æ ¼å¼ä¸ºç«‹ä½“声 32 使µ®ç‚¹æ•° PCM。" +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" +msgstr "音频总线" + #: doc/classes/AudioEffectCapture.xml msgid "" "Returns [code]true[/code] if at least [code]frames[/code] audio frames are " "available to read in the internal ring buffer." msgstr "" -"如果内部环缓冲器ä¸è‡³å°‘有[code]frames[/code]音频帧å¯ä¾›è¯»å–,则返回 " +"如果内部环形缓冲区ä¸è‡³å°‘有 [code]frames[/code] 个音频帧å¯ä¾›è¯»å–,则返回 " "[code]true[/code]。" #: doc/classes/AudioEffectCapture.xml msgid "Clears the internal ring buffer." -msgstr "清除内部环缓冲区。" +msgstr "清除内部环形缓冲区。" #: doc/classes/AudioEffectCapture.xml msgid "" @@ -11017,13 +11047,13 @@ msgid "" "samples if available, or an empty [PoolVector2Array] if insufficient data " "was available." msgstr "" -"从内部环缓冲区获å–下一个[code]frames[/code]éŸ³é¢‘æ ·æœ¬ã€‚\n" -"如果有的è¯ï¼Œè¿”回一个æ£å¥½åŒ…å«[code]frames[/code]éŸ³é¢‘æ ·æœ¬çš„[PoolVector2Array]," -"如果没有足够的数æ®ï¼Œåˆ™è¿”回一个空[PoolVector2Array]。" +"从内部环形缓冲区获å–åŽç» [code]frames[/code] ä¸ªéŸ³é¢‘æ ·æœ¬ã€‚\n" +"如果有的è¯ï¼Œè¿”回一个æ£å¥½åŒ…å« [code]frames[/code] ä¸ªéŸ³é¢‘æ ·æœ¬çš„ " +"[PoolVector2Array],如果没有足够的数æ®ï¼Œåˆ™è¿”回一个空 [PoolVector2Array]。" #: doc/classes/AudioEffectCapture.xml msgid "Returns the total size of the internal ring buffer in frames." -msgstr "返回内部环缓冲区的总大å°ï¼Œä»¥å¸§ä¸ºå•ä½ã€‚" +msgstr "返回内部环形缓冲区的总大å°ï¼Œä»¥å¸§ä¸ºå•ä½ã€‚" #: doc/classes/AudioEffectCapture.xml msgid "" @@ -11045,7 +11075,7 @@ msgid "" "Length of the internal ring buffer, in seconds. Setting the buffer length " "will have no effect if already initialized." msgstr "" -"内部环缓冲区的长度,å•使˜¯ç§’。如果已ç»åˆå§‹åŒ–,设置缓冲区长度将没有效果。" +"内部环形缓冲区的长度,å•ä½ä¸ºç§’。如果已ç»åˆå§‹åŒ–,设置缓冲区长度将没有效果。" #: doc/classes/AudioEffectChorus.xml msgid "Adds a chorus audio effect." @@ -11270,12 +11300,6 @@ msgstr "" "é€šè¿‡æ‰æ›²æ³¢å½¢ï¼Œé¢‘率内容会å‘生å˜åŒ–ï¼Œè¿™é€šå¸¸ä¼šä½¿å£°éŸ³â€œæ¸…è„†â€æˆ–“粗糙â€ã€‚对于游æˆï¼Œå®ƒ" "å¯ä»¥éžå¸¸æœ‰æ•ˆåœ°æ¨¡æ‹Ÿæ¥è‡ªä¸€äº›é¥±å’Œè®¾å¤‡æˆ–扬声器的声音。" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "音频总线" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "失真度。值的范围å¯åœ¨ 0 到 1 之间。" @@ -11932,8 +11956,13 @@ msgstr "" "[AudioEffect] 效果。" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." -msgstr "返回系统上检测到的所有音频输入设备的å称。" +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" #: doc/classes/AudioServer.xml msgid "Generates an [AudioBusLayout] using the available buses and effects." @@ -12092,7 +12121,7 @@ msgid "" "Sets the volume of the bus at index [code]bus_idx[/code] to [code]volume_db[/" "code]." msgstr "" -"将索引 [code]bus_idx[/code] 处的总线容é‡è®¾ç½®ä¸º [code]volume_db[/code]。" +"将索引 [code]bus_idx[/code] 处的总线音é‡è®¾ç½®ä¸º [code]volume_db[/code]。" #: doc/classes/AudioServer.xml msgid "Swaps the position of two effects in bus [code]bus_idx[/code]." @@ -12109,13 +12138,18 @@ msgid "Number of available audio buses." msgstr "å¯ç”¨éŸ³é¢‘总线的数é‡ã€‚" #: doc/classes/AudioServer.xml -msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +#, fuzzy +msgid "" +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" "当å‰éŸ³é¢‘输出设备的åç§°ï¼ˆè§ [method get_device_list])。在具有多个音频输出的系" "统ä¸ï¼ˆä¾‹å¦‚模拟ã€USBã€HDMI 音频),å¯ç”¨äºŽé€‰æ‹©éŸ³é¢‘输出设备。为 " @@ -12304,6 +12338,21 @@ msgstr "" "[method push_buffer] 效率低,但在 GDScript ä¸ [method push_frame] å¯èƒ½[i]更高" "效[/i]。" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "MP3 音频æµé©±åŠ¨ç¨‹åºã€‚" @@ -12323,7 +12372,7 @@ msgstr "如果为 [code]true[/code],当æµåˆ°è¾¾æœ«å°¾æ—¶å°†è‡ªåŠ¨å¾ªçŽ¯ã€‚" #: modules/minimp3/doc_classes/AudioStreamMP3.xml #: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml msgid "Time in seconds at which the stream starts after being looped." -msgstr "å¾ªçŽ¯åŽæµå¼€å§‹çš„æ—¶é—´ï¼ˆç§’)。" +msgstr "循环时,æµå¼€å§‹çš„æ—¶é—´ï¼Œå•ä½ä¸ºç§’。" #: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml msgid "OGG Vorbis audio stream driver." @@ -12455,8 +12504,12 @@ msgid "Plays positional sound in 2D space." msgstr "在 2D ç©ºé—´ä¸æ’放与ä½ç½®ç›¸å…³çš„声音。" #: doc/classes/AudioStreamPlayer2D.xml +#, fuzzy msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -12464,10 +12517,10 @@ msgid "" "audible to human hearing)." msgstr "" "æ’æ”¾éŸ³é¢‘,éšç€ä¸Žå±å¹•ä¸å¿ƒçš„è·ç¦»è€Œå‡å¼±ã€‚\n" -"å‚阅 [AudioStreamPlayer] æ¥æ’放éžä½ç½®æ€§çš„声音。\n" -"[b]注æ„:[/b]éšè—一个 [AudioStreamPlayer2D] 节点并ä¸èƒ½ç¦ç”¨å…¶éŸ³é¢‘è¾“å‡ºã€‚è¦æš‚æ—¶" -"ç¦ç”¨ [AudioStreamPlayer2D] 的音频输出,请将 [member volume_db] 设置为一个éžå¸¸" -"低的值,如[code]-100[/code](人的å¬è§‰å¬ä¸åˆ°ï¼‰ã€‚" +"å¦è¯·å‚阅 [AudioStreamPlayer] æ¥æ’放éžä½ç½®æ€§çš„声音。\n" +"[b]注æ„:[/b]éšè— [AudioStreamPlayer2D] 节点并ä¸èƒ½ç¦ç”¨å…¶éŸ³é¢‘è¾“å‡ºã€‚è¦æš‚æ—¶ç¦ç”¨ " +"[AudioStreamPlayer2D] 的音频输出,请将 [member volume_db] 设置为éžå¸¸ä½Žçš„值," +"如 [code]-100[/code](人的å¬è§‰å¬ä¸åˆ°ï¼‰ã€‚" #: doc/classes/AudioStreamPlayer2D.xml doc/classes/AudioStreamPlayer3D.xml msgid "Returns the position in the [AudioStream]." @@ -12530,14 +12583,14 @@ msgid "" "audible to human hearing)." msgstr "" "æ’æ”¾å…·æœ‰å®šå‘性的声音效果,如果需è¦ï¼Œå¯éšç€è·ç¦»çš„å¢žåŠ è€Œå‡å¼±ï¼Œäº§ç”Ÿç©ºé—´ä¸å¯å¬åˆ°" -"çš„ä½ç½®æ•ˆæžœã€‚为了更逼真,低通滤波器会自动应用于远处的声音。这å¯ä»¥é€šè¿‡è®¾ç½®" -"[member attenuation_filter_cutoff_hz]为[code]20500[/code]æ¥ç¦ç”¨ã€‚\n" -"默认情况下,音频是从相机的ä½ç½®å¬åˆ°çš„,这å¯ä»¥é€šè¿‡åœ¨åœºæ™¯ä¸æ·»åŠ ä¸€ä¸ª[Listener]节" -"点,并通过对其调用[method Listener.make_current]æ¥å¯ç”¨å®ƒï¼Œä»¥æ”¹å˜ã€‚\n" -"å‚阅[AudioStreamPlayer]æ¥æ’放éžä½ç½®çš„声音。\n" -"[b]注æ„:[/b]éšè—一个[AudioStreamPlayer3D]节点并ä¸èƒ½ç¦ç”¨å…¶éŸ³é¢‘è¾“å‡ºã€‚è¦æš‚æ—¶ç¦" -"用[AudioStreamPlayer3D]的音频输出,请将[member unit_db]设置为一个éžå¸¸ä½Žçš„值," -"如[code]-100[/code](人的å¬è§‰å¬ä¸åˆ°ï¼‰ã€‚" +"çš„ä½ç½®æ•ˆæžœã€‚为了更逼真,低通滤波器会自动应用于远处的声音。这å¯ä»¥é€šè¿‡è®¾ç½® " +"[member attenuation_filter_cutoff_hz] 为 [code]20500[/code] æ¥ç¦ç”¨ã€‚\n" +"默认情况下,音频是从相机的ä½ç½®å¬åˆ°çš„,这å¯ä»¥é€šè¿‡åœ¨åœºæ™¯ä¸æ·»åŠ ä¸€ä¸ª [Listener] " +"节点,并通过对其调用 [method Listener.make_current] æ¥å¯ç”¨å®ƒï¼Œä»¥æ”¹å˜ã€‚\n" +"å‚阅 [AudioStreamPlayer] æ¥æ’放éžä½ç½®çš„声音。\n" +"[b]注æ„:[/b]éšè—一个 [AudioStreamPlayer3D] 节点并ä¸èƒ½ç¦ç”¨å…¶éŸ³é¢‘è¾“å‡ºã€‚è¦æš‚æ—¶" +"ç¦ç”¨ [AudioStreamPlayer3D] 的音频输出,请将 [member unit_db] 设置为一个éžå¸¸ä½Ž" +"的值,如 [code]-100[/code](人的å¬è§‰å¬ä¸åˆ°ï¼‰ã€‚" #: doc/classes/AudioStreamPlayer3D.xml msgid "" @@ -12609,8 +12662,9 @@ msgid "" "doppler_tracking] property is set to a value other than [constant Camera." "DOPPLER_TRACKING_DISABLED]." msgstr "" -"决定 [url=https://en.wikipedia.org/wiki/Doppler_effect]多普勒效应[/url] 应该" -"在哪一æ¥è®¡ç®—。\n" +"决定[url=https://zh.wikipedia.org/wiki/" +"%E5%A4%9A%E6%99%AE%E5%8B%92%E6%95%88%E5%BA%94]多普勒效应[/url]应该在哪一æ¥è®¡" +"算。\n" "[b]注æ„:[/b]ä»…å½“å½“å‰ [Camera] çš„ [member Camera.doppler_tracking] 属性设置" "为 [constant Camera.DOPPLER_TRACKING_DISABLED] 以外的值时有效。" @@ -12640,7 +12694,7 @@ msgstr "设置声级的ç»å¯¹æœ€å¤§å€¼ï¼Œä»¥åˆ†è´ä¸ºå•ä½ã€‚" msgid "" "Sets the distance from which the [member out_of_range_mode] takes effect. " "Has no effect if set to 0." -msgstr "设置[member out_of_range_mode]生效的è·ç¦»ã€‚设置为0时没有效果。" +msgstr "设置 [member out_of_range_mode] 生效的è·ç¦»ã€‚设置为 0 时没有效果。" #: doc/classes/AudioStreamPlayer3D.xml msgid "" @@ -12785,7 +12839,7 @@ msgstr "" #: doc/classes/AudioStreamSample.xml msgid "Audio format. See [enum Format] constants for values." -msgstr "éŸ³é¢‘æ ¼å¼ã€‚å‚阅 [enum Format] 常é‡çš„值。" +msgstr "éŸ³é¢‘æ ¼å¼ã€‚å–å€¼è§ [enum Format] 常é‡ã€‚" #: doc/classes/AudioStreamSample.xml msgid "" @@ -13151,7 +13205,7 @@ msgid "" "When enabled, a lightmap denoiser will be used to reduce the noise inherent " "to Monte Carlo based global illumination." msgstr "" -"å¯ç”¨åŽï¼Œå°†ä½¿ç”¨å…‰ç…§è´´å›¾é™å™ªå™¨æ¥å‡å°‘基于Monte Carlo的全局照明固有的噪声。" +"å¯ç”¨åŽï¼Œå°†ä½¿ç”¨å…‰ç…§è´´å›¾é™å™ªå™¨æ¥å‡å°‘基于 Monte Carlo 的全局照明固有的噪声。" #: doc/classes/BakedLightmap.xml msgid "" @@ -13197,12 +13251,12 @@ msgid "" "Returns if no viable save path is found. This can happen where an [member " "image_path] is not specified or when the save location is invalid." msgstr "" -"如果没有找到åˆé€‚çš„ä¿å˜è·¯å¾„,则返回。这å¯èƒ½å‘生在没有指定[member image_path]或" -"者ä¿å˜ä½ç½®æ— 效的情况下。" +"如果没有找到åˆé€‚çš„ä¿å˜è·¯å¾„,则返回。这å¯èƒ½å‘生在没有指定 [member image_path] " +"或者ä¿å˜ä½ç½®æ— 效的情况下。" #: doc/classes/BakedLightmap.xml doc/classes/SpatialMaterial.xml msgid "Currently unused." -msgstr "当剿œªä½¿ç”¨." +msgstr "当剿œªä½¿ç”¨ã€‚" #: doc/classes/BakedLightmap.xml msgid "Returns when the baker cannot save per-mesh textures to file." @@ -13753,7 +13807,7 @@ msgstr "" #: doc/classes/BitMap.xml msgid "" "Creates a bitmap with the specified size, filled with [code]false[/code]." -msgstr "创建一个指定尺寸的ä½å›¾ï¼Œç”¨[code]false[/code]填充。" +msgstr "创建一个指定尺寸的ä½å›¾ï¼Œç”¨ [code]false[/code] 填充。" #: doc/classes/BitMap.xml msgid "" @@ -13777,7 +13831,7 @@ msgstr "返回ä½å›¾çš„尺寸。" #: doc/classes/BitMap.xml msgid "" "Returns the amount of bitmap elements that are set to [code]true[/code]." -msgstr "返回设置为 [code]true[/code]çš„ä½å›¾å…ƒç´ 的数é‡ã€‚" +msgstr "返回设置为 [code]true[/code] çš„ä½å›¾å…ƒç´ 的数é‡ã€‚" #: doc/classes/BitMap.xml msgid "" @@ -13811,9 +13865,9 @@ msgid "" "bmfont/]BMFont[/url] format.\n" "Handles files with the [code].fnt[/code] extension." msgstr "" -"使用[url=https://www.angelcode.com/products/bmfont/]BMFont[/url]æ ¼å¼çš„å—体æ¥" -"渲染文本。\n" -"å¤„ç†æ‰©å±•å为[code].fnt[/code]的文件。" +"使用 [url=https://www.angelcode.com/products/bmfont/]BMFont[/url] æ ¼å¼çš„å—体" +"æ¥æ¸²æŸ“文本。\n" +"å¤„ç†æ‰©å±•å为 [code].fnt[/code] 的文件。" #: doc/classes/BitmapFont.xml msgid "" @@ -14262,7 +14316,7 @@ msgstr "将文本å‘左对é½ã€‚" #: doc/classes/Button.xml msgid "Align the text to the center." -msgstr "将文本居ä¸å¯¹é½ã€‚。" +msgstr "将文本居ä¸å¯¹é½ã€‚" #: doc/classes/Button.xml msgid "Align the text to the right." @@ -14413,7 +14467,7 @@ msgid "" "[code]enable_next[/code] is [code]true[/code], request to make the next " "camera current, if any." msgstr "" -"如果这是当å‰ç›¸æœºï¼Œåˆ™å°†å…¶ä»Žå½“å‰ç›¸æœºä¸ç§»é™¤ã€‚如果[code]enable_next[/code]是" +"如果这是当å‰ç›¸æœºï¼Œåˆ™å°†å…¶ä»Žå½“å‰ç›¸æœºä¸ç§»é™¤ã€‚如果 [code]enable_next[/code] 为 " "[code]true[/code],请求使下一个相机æˆä¸ºå½“å‰ç›¸æœºï¼ˆå¦‚果有)。" #: doc/classes/Camera.xml @@ -14436,8 +14490,8 @@ msgid "" "Returns [code]true[/code] if the given [code]layer[/code] in the [member " "cull_mask] is enabled, [code]false[/code] otherwise." msgstr "" -"如果[member cull_mask]ä¸ç»™å®šçš„[code]layer[/code]被å¯ç”¨ï¼Œè¿”回 [code]true[/" -"code],å¦åˆ™è¿”回 [code]false[/code]。" +"如果 [member cull_mask] ä¸ç»™å®šçš„ [code]layer[/code] 被å¯ç”¨ï¼Œåˆ™è¿”回 " +"[code]true[/code],å¦åˆ™è¿”回 [code]false[/code]。" #: doc/classes/Camera.xml msgid "" @@ -14507,14 +14561,15 @@ msgstr "" #: doc/classes/Camera.xml msgid "" "Enables or disables the given [code]layer[/code] in the [member cull_mask]." -msgstr "å¯ç”¨æˆ–ç¦ç”¨[member cull_mask]ä¸ç»™å®šçš„[code]layer[/code]。" +msgstr "å¯ç”¨æˆ–ç¦ç”¨ [member cull_mask] ä¸ç»™å®šçš„ [code]layer[/code]。" #: doc/classes/Camera.xml +#, fuzzy 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." +"world space units. See also [member frustum_offset]." msgstr "" "é€šè¿‡æŒ‡å®šå¤§å° [code]size[/code] ã€åç§»é‡ [code]offset[/code] 以åŠä»¥ä¸–界空间为" "å•ä½çš„ [code]z_near[/code] å’Œ [code]z_far[/code] è£å‰ªå¹³é¢ï¼Œå°†ç›¸æœºæŠ•影设置为视" @@ -14643,10 +14698,13 @@ msgstr "" "- 在 21:9 视窗ä¸çº¦117.06 度" #: doc/classes/Camera.xml +#, fuzzy 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" "相机的机身å移。å¯ä»¥æ›´æ”¹é»˜è®¤å€¼ï¼Œä»¥åˆ›å»º \"倾斜frustum \"效果,如[url=https://" "zdoom.org/wiki/Y-shearing]Y-shearing[/url]。" @@ -14680,12 +14738,10 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" -"相机的尺寸,以 1/2 的宽度或高度为å•ä½ã€‚仅适用于æ£äº¤åŠè§†é”¥æ¨¡å¼ã€‚由于 [member " -"keep_aspect] é”å®šåœ¨è½´ä¸Šï¼Œå› æ¤ [code]size[/code] 设置其他轴的尺寸长度。" #: doc/classes/Camera.xml msgid "The vertical (Y) offset of the camera viewport." @@ -14860,7 +14916,7 @@ msgstr "" msgid "" "Make this the current 2D camera for the scene (viewport and layer), in case " "there are many cameras in the scene." -msgstr "使之æˆä¸ºåœºæ™¯ï¼ˆè§†çª—å’Œå›¾å±‚ï¼‰çš„å½“å‰ 2D ç›¸æœºï¼Œä»¥é˜²åœºæ™¯ä¸æœ‰å¾ˆå¤šç›¸æœºã€‚" +msgstr "使之æˆä¸ºè¯¥åœºæ™¯ï¼ˆè§†åŒºå’Œå›¾å±‚ï¼‰çš„å½“å‰ 2D ç›¸æœºï¼Œä»¥é˜²åœºæ™¯ä¸æœ‰å¾ˆå¤šç›¸æœºã€‚" #: doc/classes/Camera2D.xml msgid "" @@ -14906,8 +14962,8 @@ msgid "" "The custom [Viewport] node attached to the [Camera2D]. If [code]null[/code] " "or not a [Viewport], uses the default viewport instead." msgstr "" -"连接到[Camera2D]的自定义[Viewport]节点。如果[code]null[/code]æˆ–ä¸æ˜¯" -"[Viewport],则使用默认的 Viewpor。" +"连接到 [Camera2D] 的自定义 [Viewport] 节点。如果为 [code]null[/code] 或者ä¸" +"是 [Viewport],则使用默认的视区。" #: doc/classes/Camera2D.xml msgid "" @@ -15038,7 +15094,7 @@ msgstr "" #: doc/classes/Camera2D.xml msgid "The camera's process callback. See [enum Camera2DProcessMode]." -msgstr "相机的过程回调。请å‚阅[enum Camera2DProcessMode]。" +msgstr "ç›¸æœºçš„è¿‡ç¨‹å›žè°ƒã€‚è§ [enum Camera2DProcessMode]。" #: doc/classes/Camera2D.xml msgid "If [code]true[/code], the camera view rotates with the target." @@ -15264,18 +15320,20 @@ msgid "Base class of anything 2D." msgstr "任何 2D 对象的基类。" #: doc/classes/CanvasItem.xml +#, fuzzy 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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -15317,10 +15375,18 @@ msgid "Custom drawing in 2D" msgstr "2D ä¸çš„自定义绘图" #: doc/classes/CanvasItem.xml +#, fuzzy msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." -msgstr "引擎调用的å¯è¦†ç›–函数(如果定义了)æ¥ç»˜åˆ¶ç”»å¸ƒé¡¹ç›®ã€‚" +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." +msgstr "" +"当节点进入 [SceneTree] æ—¶è°ƒç”¨ï¼ˆä¾‹å¦‚å®žä¾‹åŒ–æ—¶ï¼Œåœºæ™¯æ”¹å˜æ—¶ï¼Œæˆ–者在脚本ä¸è°ƒç”¨ " +"[method add_child] åŽï¼‰ã€‚如果节点有å节点,则首先调用它的 [method " +"_enter_tree] 回调函数,然åŽå†è°ƒç”¨å节点的回调函数。\n" +"对应于 [method Object._notification] ä¸çš„ [constant NOTIFICATION_ENTER_TREE] " +"通知。" #: doc/classes/CanvasItem.xml msgid "" @@ -15721,7 +15787,7 @@ msgstr "è¿”å›žè¿™ä¸ªé¡¹ç›®ç›¸å¯¹äºŽè§†åŒºçš„å˜æ¢ã€‚" #: doc/classes/CanvasItem.xml msgid "Returns the [World2D] where this item is in." -msgstr "返回æ¤ç‰©å“所在的[World2D]。" +msgstr "返回æ¤ç‰©å“所在的 [World2D]。" #: doc/classes/CanvasItem.xml msgid "" @@ -15742,7 +15808,7 @@ msgid "" "Returns [code]true[/code] if the node is set as top-level. See [method " "set_as_toplevel]." msgstr "" -"如果节点设置为顶层,则返回 [code]true[/code]。å‚阅 [method set_as_toplevel]。" +"如果节点设置为顶层,则返回 [code]true[/code]ã€‚è§ [method set_as_toplevel]。" #: doc/classes/CanvasItem.xml msgid "" @@ -15750,12 +15816,13 @@ msgid "" "to children." msgstr "å¦‚æžœå°†å…¨å±€å˜æ¢é€šçŸ¥ä¼ 达给å级,则返回 [code]true[/code]。" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml +#, fuzzy msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" "如果该节点ä½äºŽ [SceneTree] ä¸ï¼Œå¹¶ä¸”å…¶ [member visible] 属性为 [code]true[/" "code],并且其所有上层节点也å‡å¯è§ï¼Œåˆ™è¿”回 [code]true[/code]。如果任何上层节点" @@ -15814,11 +15881,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" -"å°† [CanvasItem] 排队ç‰å¾…更新。在空闲时间将调用 [constant NOTIFICATION_DRAW] " -"以请求é‡ç»˜ã€‚" #: doc/classes/CanvasItem.xml msgid "" @@ -15873,10 +15940,12 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" -"当 [CanvasItem] å¿…é¡»é‡ç»˜æ—¶å‘出。这åªèƒ½æ˜¯å®žæ—¶è¿žæŽ¥ï¼Œå› 为延迟将ä¸å…许绘制。" #: doc/classes/CanvasItem.xml msgid "Emitted when becoming hidden." @@ -15945,7 +16014,8 @@ msgstr "" "set_notify_local_transform] å¯ç”¨æ—¶ï¼Œæ‰ä¼šæ”¶åˆ°è¿™ä¸ªé€šçŸ¥ã€‚" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +#, fuzzy +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "è¦æ±‚绘制[CanvasItem]。" #: doc/classes/CanvasItem.xml @@ -16097,9 +16167,12 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." -msgstr "将图层设置为跟éšè§†åŒºï¼Œä»¥æ¨¡æ‹Ÿä¼ª 3D 效果。" +msgstr "" #: doc/classes/CanvasLayer.xml msgid "" @@ -16642,10 +16715,10 @@ msgid "" "[b]Note:[/b] In exported release builds the debug info is not available, so " "the returned dictionaries will contain only method names." msgstr "" -"如果[code]no_inheritance[/code]是[code]false[/code],返回一个包å«" -"[code]class[/code]或其父级所有方法的数组。数组的æ¯ä¸ªå…ƒç´ 都是一个" -"[Dictionary],其键值如:[code]args[/code], [code]default_args[/code], " -"[code]flags[/code], [code]id[/code], [code]name[/code], [code]return:" +"如果 [code]no_inheritance[/code] 为 [code]false[/code]ï¼Œè¿”å›žä¸€ä¸ªåŒ…å« " +"[code]class[/code] 或其父级所有方法的数组。数组的æ¯ä¸ªå…ƒç´ 都是一个 " +"[Dictionary],包å«çš„键有:[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]。\n" "[b]注æ„:[/b]在导出的å‘布版本ä¸ï¼Œè°ƒè¯•ä¿¡æ¯ä¸å¯ç”¨ï¼Œæ‰€ä»¥è¿”回的å—典将åªåŒ…嫿–¹æ³•å" "称。" @@ -16895,8 +16968,8 @@ 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 "" -"返回一个[code]owner_id[/code]æ ‡è¯†ç¬¦çš„[Array]ã€‚ä½ å¯ä»¥åœ¨å…¶ä»–使用" -"[code]owner_id[/code]ä½œä¸ºå‚æ•°çš„æ–¹æ³•ä¸ä½¿ç”¨è¿™äº›id。" +"返回一个 [code]owner_id[/code] æ ‡è¯†ç¬¦çš„ [Array]ã€‚ä½ å¯ä»¥åœ¨å…¶ä»–使用 " +"[code]owner_id[/code] ä½œä¸ºå‚æ•°çš„æ–¹æ³•ä¸ä½¿ç”¨è¿™äº›id。" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "If [code]true[/code], the shape owner and its shapes are disabled." @@ -17546,10 +17619,10 @@ msgid "" "var darkgreen = green.darkened(0.2) # 20% darker than regular green\n" "[/codeblock]" msgstr "" -"返回一个新的颜色,这个颜色按指定的百分比(比例从0 到 1ï¼‰å˜æš—。\n" +"返回一个新的颜色,这个颜色按指定的百分比(比例从 0 到 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" +"var darkgreen = green.darkened(0.2) # 比普通的绿色深 20%\n" "[/codeblock]" #: doc/classes/Color.xml @@ -19799,8 +19872,10 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." -msgstr "从å¦ä¸€ä¸ªæŽ§ä»¶ä¸çªƒå–焦点,并æˆä¸ºç„¦ç‚¹æŽ§ä»¶ï¼ˆè¯·å‚阅[member focus_mode])。" +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." +msgstr "" #: doc/classes/Control.xml msgid "" @@ -19955,9 +20030,9 @@ msgid "" "changed. Setting [member rect_min_size] directly calls this method " "automatically." msgstr "" -"使æ¤èŠ‚ç‚¹å’Œçˆ¶èŠ‚ç‚¹ï¼ˆç›´è‡³æœ€é«˜çº§åˆ«ï¼‰ä¸çš„大å°ç¼“å˜æ— 效。打算在更改返回值时与" -"[method get_minimum_size]一起使用。设置[member rect_min_size]直接直接自动调用" -"æ¤æ–¹æ³•。" +"使这个节点åŠå…¶ç›´è‡³æœ€é¡¶å±‚çš„å„级父节点ä¸çš„大å°ç¼“å˜å¤±æ•ˆã€‚应在 [method " +"get_minimum_size] 的返回值å‘生å˜åŒ–æ—¶é…åˆä½¿ç”¨ã€‚直接设置 [member " +"rect_min_size] 会自动调用这个方法。" #: doc/classes/Control.xml msgid "" @@ -20300,10 +20375,10 @@ msgid "" "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 "" -"告诉Godot,默认情况下,如果用户按下键盘上的å‘下ç®å¤´æˆ–æ¸¸æˆæ‰‹æŸ„上的å‘下ç®å¤´ï¼Œåˆ™" -"应将焦点对准哪个节点。您å¯ä»¥é€šè¿‡ç¼–辑[code]ui_down[/code]输入æ“ä½œæ¥æ›´æ”¹é”®ã€‚该" -"节点必须是[Control]。如果未设置æ¤å±žæ€§ï¼Œåˆ™Godot会将焦点放在该控件底部最接近的" -"[Control]。" +"告诉 Godot,默认情况下,如果用户按下键盘上的å‘下ç®å¤´æˆ–æ¸¸æˆæ‰‹æŸ„上的å‘下ç®å¤´ï¼Œ" +"则应将焦点对准哪个节点。您å¯ä»¥é€šè¿‡ç¼–辑 [code]ui_down[/code] 输入æ“ä½œæ¥æ›´æ”¹" +"键。该节点必须是 [Control]。如果未设置æ¤å±žæ€§ï¼Œåˆ™ Godot 会将焦点放在该控件底部" +"最接近的 [Control]。" #: doc/classes/Control.xml msgid "" @@ -20313,10 +20388,10 @@ msgid "" "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 "" -"告诉Godot,默认情况下,如果用户按下键盘上的å‘å·¦ç®å¤´æˆ–æ¸¸æˆæ‰‹æŸ„上的å‘左键,应该" -"将焦点对准键盘上的哪个节点。您å¯ä»¥é€šè¿‡ç¼–辑[code]ui_left[/code]输入æ“ä½œæ¥æ›´æ”¹" -"键。该节点必须是[Control]。如果未设置æ¤å±žæ€§ï¼Œåˆ™Godot会将焦点放在该控件左侧最" -"接近的[Control]。" +"告诉 Godot,默认情况下,如果用户按下键盘上的å‘å·¦ç®å¤´æˆ–æ¸¸æˆæ‰‹æŸ„上的å‘左键,应" +"该将焦点对准键盘上的哪个节点。您å¯ä»¥é€šè¿‡ç¼–辑 [code]ui_left[/code] 输入æ“作æ¥" +"更改键。该节点必须是 [Control]。如果未设置æ¤å±žæ€§ï¼Œåˆ™ Godot 会将焦点放在该控件" +"左侧最接近的 [Control]。" #: doc/classes/Control.xml msgid "" @@ -20326,10 +20401,10 @@ msgid "" "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 "" -"告诉Godot,如果用户按键盘上的å³é”®æˆ–é»˜è®¤çš„æ¸¸æˆæ‰‹æŸ„上的å³é”®ï¼Œå®ƒåº”该把键盘焦点给" -"å“ªä¸ªèŠ‚ç‚¹ã€‚ä½ å¯ä»¥é€šè¿‡ç¼–辑[code]ui_right[/code]è¾“å…¥åŠ¨ä½œæ¥æ”¹å˜è¿™ä¸ªé”®ã€‚该节点必须" -"是一个[Control]。如果没有设置这个属性,Godot将把焦点交给离这个节点底部最近的" -"[Control]。" +"告诉 Godot,如果用户按键盘上的å³é”®æˆ–é»˜è®¤çš„æ¸¸æˆæ‰‹æŸ„上的å³é”®ï¼Œå®ƒåº”该把键盘焦点" +"ç»™å“ªä¸ªèŠ‚ç‚¹ã€‚ä½ å¯ä»¥é€šè¿‡ç¼–辑 [code]ui_right[/code] è¾“å…¥åŠ¨ä½œæ¥æ”¹å˜è¿™ä¸ªé”®ã€‚该节点" +"必须是一个 [Control]。如果没有设置这个属性,Godot 将把焦点交给离这个节点底部" +"最近的 [Control]。" #: doc/classes/Control.xml msgid "" @@ -20339,10 +20414,10 @@ msgid "" "[Control]. If this property is not set, Godot will give focus to the closest " "[Control] to the bottom of this one." msgstr "" -"告诉Godot默认情况下,如果用户按下键盘上的顶部ç®å¤´æˆ–æ¸¸æˆæ‰‹æŸ„上的顶部,则应该将" -"焦点对准键盘上的哪个节点。您å¯ä»¥é€šè¿‡ç¼–辑[code]ui_top[/code]输入æ“ä½œæ¥æ›´æ”¹é”®ã€‚" -"该节点必须是[Control]。如果未设置æ¤å±žæ€§ï¼Œåˆ™Godot会将焦点放在该控件底部最接近" -"çš„[Control]。" +"告诉 Godot 默认情况下,如果用户按下键盘上的顶部ç®å¤´æˆ–æ¸¸æˆæ‰‹æŸ„上的顶部,则应该" +"将焦点对准键盘上的哪个节点。您å¯ä»¥é€šè¿‡ç¼–辑 [code]ui_top[/code] 输入æ“ä½œæ¥æ›´æ”¹" +"键。该节点必须是 [Control]。如果未设置æ¤å±žæ€§ï¼Œåˆ™ Godot 会将焦点放在该控件底部" +"最接近的 [Control]。" #: doc/classes/Control.xml msgid "" @@ -20352,9 +20427,9 @@ msgid "" "If this property is not set, Godot will select a \"best guess\" based on " "surrounding nodes in the scene tree." msgstr "" -"告诉Godot,如果用户默认按键盘上的Tabé”®ï¼Œå®ƒåº”è¯¥æŠŠé”®ç›˜ç„¦ç‚¹ç»™å“ªä¸ªèŠ‚ç‚¹ã€‚ä½ å¯ä»¥é€š" -"过编辑[code]ui_focus_next[/code]è¾“å…¥åŠ¨ä½œæ¥æ”¹å˜è¿™ä¸ªé”®ã€‚\n" -"如果这个属性没有设置,Godotä¼šæ ¹æ®åœºæ™¯æ ‘ä¸çš„周围节点选择一个 \"最佳猜测\"。" +"告诉 Godot,如果用户默认按键盘上的 Tab é”®ï¼Œå®ƒåº”è¯¥æŠŠé”®ç›˜ç„¦ç‚¹ç»™å“ªä¸ªèŠ‚ç‚¹ã€‚ä½ å¯ä»¥" +"通过编辑 [code]ui_focus_next[/code] è¾“å…¥åŠ¨ä½œæ¥æ”¹å˜è¿™ä¸ªé”®ã€‚\n" +"如果这个属性没有设置,Godot ä¼šæ ¹æ®åœºæ™¯æ ‘ä¸çš„周围节点选择一个“最佳猜测â€ã€‚" #: doc/classes/Control.xml msgid "" @@ -20364,9 +20439,9 @@ msgid "" "If this property is not set, Godot will select a \"best guess\" based on " "surrounding nodes in the scene tree." msgstr "" -"告诉Godot,如果用户按键盘上的Shift+Tab键,它应该把键盘焦点给哪个节点,这是默" -"è®¤ã€‚ä½ å¯ä»¥é€šè¿‡ç¼–辑[code]ui_focus_prev[/code]è¾“å…¥åŠ¨ä½œæ¥æ”¹å˜è¿™ä¸ªé”®ã€‚\n" -"如果没有设置这个属性,Godotä¼šæ ¹æ®åœºæ™¯æ ‘ä¸çš„周围节点选择一个 \"最佳猜测\"。" +"告诉 Godot,如果用户按键盘上的 Shift+Tab 键,它应该把键盘焦点给哪个节点,这是" +"é»˜è®¤ã€‚ä½ å¯ä»¥é€šè¿‡ç¼–辑 [code]ui_focus_prev[/code] è¾“å…¥åŠ¨ä½œæ¥æ”¹å˜è¿™ä¸ªé”®ã€‚\n" +"如果没有设置这个属性,Godot ä¼šæ ¹æ®åœºæ™¯æ ‘ä¸çš„周围节点选择一个“最佳猜测â€ã€‚" #: doc/classes/Control.xml msgid "" @@ -20409,18 +20484,19 @@ msgid "" "[/codeblock]" msgstr "" "改å˜å·¥å…·æç¤ºçš„æ–‡æœ¬ã€‚å½“ç”¨æˆ·çš„é¼ æ ‡å…‰æ ‡åœ¨è¿™ä¸ªæŽ§ä»¶ä¸Šåœç•™ç‰‡åˆ»ï¼Œå·¥å…·æç¤ºå°±ä¼šå‡ºçŽ°ï¼Œ" -"å‰ææ˜¯[member mouse_filter]属性éž[constant MOUSE_FILTER_IGNORE]ã€‚ä½ å¯ä»¥ç”¨é¡¹ç›®" -"设置ä¸çš„[code]gui/timers/tooltip_delay_sec[/code]选项改å˜å·¥å…·æç¤ºå‡ºçŽ°çš„æ—¶" -"间。\n" -"工具æç¤ºçš„å¼¹å‡ºå°†ä½¿ç”¨é»˜è®¤çš„å®žçŽ°ï¼Œæˆ–è€…ä½ å¯ä»¥é€šè¿‡è¦†ç›–[method " -"_make_custom_tooltip]æä¾›ä¸€ä¸ªè‡ªå®šä¹‰çš„实现。默认的工具æç¤ºåŒ…括一个[PopupPanel]" -"å’Œ[Label],其主题属性å¯ä»¥é€šè¿‡[code]\"TooltipPanel\"[/code]å’Œ" -"[code]\"TooltipLabel\"[/code]方法分别进行自定义。如:\n" +"å‰ææ˜¯ [member mouse_filter] å±žæ€§éž [constant MOUSE_FILTER_IGNORE]ã€‚ä½ å¯ä»¥ç”¨" +"项目设置ä¸çš„ [code]gui/timers/tooltip_delay_sec[/code] 选项改å˜å·¥å…·æç¤ºå‡ºçŽ°çš„" +"时间。\n" +"工具æç¤ºçš„å¼¹å‡ºå°†ä½¿ç”¨é»˜è®¤çš„å®žçŽ°ï¼Œæˆ–è€…ä½ å¯ä»¥é€šè¿‡è¦†ç›– [method " +"_make_custom_tooltip] æä¾›ä¸€ä¸ªè‡ªå®šä¹‰çš„实现。默认的工具æç¤ºåŒ…括一个 " +"[PopupPanel] å’Œ [Label],其主题属性å¯ä»¥é€šè¿‡ [Theme] 的方法对 " +"[code]\"TooltipPanel\"[/code] å’Œ [code]\"TooltipLabel\"[/code] 分别进行自定" +"义。如:\n" "[codeblock]\n" "var style_box = StyleBoxFlat.new()\n" "style_box.set_bg_color(Color(1, 1, 0))\n" "style_box.set_border_width_all(2)\n" -"# 我们在这里å‡è®¾`theme`属性已ç»è¢«äº‹å…ˆåˆ†é…了一个自定义的Theme。\n" +"# 我们在这里å‡è®¾`theme`属性已ç»è¢«äº‹å…ˆåˆ†é…了一个自定义的 Theme。\n" "theme.set_stylebox(\"panel\", \"TooltipPanel\", style_box)\n" "theme.set_color(\"font_color\", \"TooltipLabel\", Color(0, 1, 1))\n" "[/codeblock]" @@ -20432,9 +20508,9 @@ msgid "" "handling. The viewport first hides the modal and after marks the input as " "handled." msgstr "" -"å¯ç”¨å½“ä½ å…³é—æŽ§ä»¶æ¨¡æ€æ—¶ï¼Œè¾“入是å¦ä¼ æ’。\n" -"如果为 [code]false[/code]ï¼Œåœ¨è§†åŒºè¾“å…¥äº‹ä»¶å¤„ç†æ—¶å°†åœæ¢äº‹ä»¶å¤„ç†ã€‚视区首先éšè—模" -"æ€ï¼Œä¹‹åŽå°†è¾“å…¥æ ‡è®°ä¸ºå·²å¤„ç†ã€‚" +"关闿¨¡æ€æŽ§ä»¶æ—¶ï¼Œè¾“入是å¦ä¼ æ’。\n" +"如果为 [code]false[/code],事件处ç†å°†åœæ¢åœ¨è§†åŒºçš„输入事件处ç†ã€‚该视区会先将模" +"æ€æŽ§ä»¶éšè—,然åŽå†å°†è¾“å…¥æ ‡è®°ä¸ºå·²å¤„ç†ã€‚" #: doc/classes/Control.xml msgid "" @@ -21324,7 +21400,7 @@ msgstr "返回由 [enum Parameter] æŒ‡å®šçš„å‚æ•°çš„éšæœºæ€§ç³»æ•°ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" "Returns the enabled state of the given flag (see [enum Flags] for options)." -msgstr "è¿”å›žç»™å®šæ ‡å¿—çš„å¯ç”¨çжæ€ï¼ˆæœ‰å…³é€‰é¡¹ï¼Œè¯·å‚阅 [enum Flags])。" +msgstr "è¿”å›žç»™å®šæ ‡å¿—çš„å¯ç”¨çжæ€ï¼ˆå¯é€‰é¡¹è§ [enum Flags])。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Restarts the particle emitter." @@ -21345,7 +21421,7 @@ msgstr "设置 [enum Parameter] æŒ‡å®šçš„å‚æ•°çš„éšæœºæ€§å› å。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Enables or disables the given flag (see [enum Flags] for options)." -msgstr "å¯ç”¨æˆ–ç¦ç”¨ç»™å®šæ ‡å¿—(有关选项,请å‚阅 [enum Flags])。" +msgstr "å¯ç”¨æˆ–ç¦ç”¨ç»™å®šæ ‡å¿—(å¯é€‰é¡¹è§ [enum Flags])。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/Particles.xml doc/classes/Particles2D.xml @@ -21463,7 +21539,7 @@ msgstr "指定粒åå‘å°„æ–¹å‘çš„å•ä½å‘é‡ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/Particles.xml doc/classes/Particles2D.xml msgid "Particle draw order. Uses [enum DrawOrder] values." -msgstr "ç²’å绘制顺åºã€‚使用 [enum DrawOrder] 值。" +msgstr "ç²’å绘制顺åºã€‚使用 [enum DrawOrder] 的值。" #: doc/classes/CPUParticles.xml msgid "" @@ -21611,7 +21687,7 @@ msgstr "色相å˜åŒ–éšæœºçŽ‡ã€‚" msgid "" "Initial velocity magnitude for each particle. Direction comes from [member " "spread] and the node's orientation." -msgstr "æ¯ä¸ªç²’åçš„åˆå§‹é€Ÿåº¦å¤§å°ã€‚æ–¹å‘æ¥è‡ª[member spread]和节点的方å‘。" +msgstr "æ¯ä¸ªç²’åçš„åˆå§‹é€Ÿåº¦å¤§å°ã€‚æ–¹å‘å–决于 [member spread] 和该节点的æœå‘。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21621,7 +21697,7 @@ msgstr "åˆå§‹é€Ÿåº¦éšæœºçŽ‡ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/Particles.xml doc/classes/Particles2D.xml msgid "The amount of time each particle will exist (in seconds)." -msgstr "æ¯ä¸ªç²’åå˜åœ¨çš„æ—¶é—´ï¼Œä»¥ç§’为å•ä½ã€‚" +msgstr "æ¯ä¸ªç²’åå˜åœ¨çš„æ—¶é—´ï¼ˆä»¥ç§’为å•ä½ï¼‰ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21677,7 +21753,7 @@ msgid "" msgstr "" "应用于æ¯ä¸ªç²’å的轨é“速度。使粒å在局部XYå¹³é¢ä¸Šç»•原点旋转。用æ¯ç§’绕原点旋转的" "次数æ¥è¡¨ç¤ºã€‚\n" -"åªæœ‰å½“[member flag_disable_z]为 [code]true[/code] 时,æ¤å±žæ€§æ‰å¯ç”¨ã€‚" +"åªæœ‰å½“ [member flag_disable_z] 为 [code]true[/code] 时,æ¤å±žæ€§æ‰å¯ç”¨ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's orbital velocity will vary along this [Curve]." @@ -21998,8 +22074,8 @@ msgid "" "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 "" -"ç²’å系统的帧速率固定为一个值。例如,将值更改为2将使粒å以æ¯ç§’2帧的速度渲染。" -"注æ„,这ä¸ä¼šå‡æ…¢ç²’å系统本身的仿真速度。" +"ç²’å系统的帧速率固定为一个值。例如,将值更改为 2 将使粒å以æ¯ç§’ 2 帧的速度渲" +"染。注æ„,这ä¸ä¼šå‡æ…¢ç²’å系统本身的仿真速度。" #: doc/classes/CPUParticles2D.xml doc/classes/Particles2D.xml msgid "" @@ -22146,8 +22222,8 @@ msgid "" "[b]Note:[/b] The maximum size of accepted ciphertext is limited by the key " "size." msgstr "" -"用æä¾›çš„ç§äºº[code]key[/code]解密给定的[code]ciphertext[/code]。\n" -"[b]注æ„:[/b]所接å—çš„å¯†ç æ–‡æœ¬çš„æœ€å¤§å°ºå¯¸å—到密钥大å°é™åˆ¶ã€‚" +"用æä¾›çš„ç§é’¥ [code]key[/code] 解密给定的密文 [code]ciphertext[/code]。\n" +"[b]注æ„:[/b]所接å—的密文的最大尺寸å—到密钥大å°çš„é™åˆ¶ã€‚" #: doc/classes/Crypto.xml msgid "" @@ -22156,8 +22232,8 @@ msgid "" "[b]Note:[/b] The maximum size of accepted plaintext is limited by the key " "size." msgstr "" -"用æä¾›çš„公钥 [code]key[/code] åŠ å¯†ç»™å®šçš„[code]plaintext[/code]。\n" -"[b]注æ„:[/b]接å—的明文的最大尺寸å—到密钥大å°çš„é™åˆ¶ã€‚" +"用æä¾›çš„公钥 [code]key[/code] åŠ å¯†ç»™å®šçš„æ˜Žæ–‡ [code]plaintext[/code]。\n" +"[b]注æ„:[/b]所接å—的明文的最大尺寸å—到密钥大å°çš„é™åˆ¶ã€‚" #: doc/classes/Crypto.xml msgid "" @@ -22217,9 +22293,9 @@ msgid "" "Currently, only [constant HashingContext.HASH_SHA256] and [constant " "HashingContext.HASH_SHA1] are supported." msgstr "" -"使用 [code]key[/code] ç”Ÿæˆ [code]msg[/code] çš„ [url=https://en.wikipedia.org/" -"wiki/HMAC]HMAC[/url] 摘è¦ã€‚[code]hash_type[/code] 傿•°æ˜¯ç”¨äºŽå†…部和外部哈希的" -"哈希算法。\n" +"使用密钥 [code]key[/code] ç”Ÿæˆ [code]msg[/code] çš„ [url=https://en.wikipedia." +"org/wiki/HMAC]HMAC[/url] 摘è¦ã€‚[code]hash_type[/code] 傿•°æ˜¯ç”¨äºŽå†…部和外部哈" +"希的哈希算法。\n" "ç›®å‰ä»…æ”¯æŒ [constant HashingContext.HASH_SHA256] å’Œ [constant HashingContext." "HASH_SHA1]。" @@ -22591,7 +22667,7 @@ msgid "" "coordinates will match geometry exactly with no tiling." msgstr "" "当 [member mode] 为 [constant MODE_PATH] 时,这是纹ç†åæ ‡æ²¿ç€è·¯å¾„çš„è·ç¦»ï¼Œä»¥ç±³" -"为å•ä½ï¼Œå°†è¿›è¡Œå¹³é“ºã€‚当设置为0时,纹ç†åæ ‡å°†ä¸Žå‡ ä½•å›¾å½¢å®Œå…¨åŒ¹é…,没有平铺。" +"为å•ä½ï¼Œå°†è¿›è¡Œå¹³é“ºã€‚当设置为 0 时,纹ç†åæ ‡å°†ä¸Žå‡ ä½•å›¾å½¢å®Œå…¨åŒ¹é…,没有平铺。" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" @@ -22671,16 +22747,16 @@ msgid "" "will determine the distance, in meters, each interval of the path will " "extrude." msgstr "" -"当 [member mode] 被设置为路径[constant MODE_PATH] 时,[member path_interval] " -"将决定路径的æ¯ä¸ªé—´éš”将被挤出的è·ç¦»ï¼Œå•ä½ä¸ºç±³ã€‚" +"当 [member mode] 被设置为 [constant MODE_PATH] 时,[member path_interval] å°†" +"决定路径的æ¯ä¸ªé—´éš”将被挤出的è·ç¦»ï¼Œå•ä½ä¸ºç±³ã€‚" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" "When [member mode] is set to [constant MODE_PATH], [member path_interval] " "will subdivide the polygons along the path." msgstr "" -"当 [member mode] 被设置为路径 [constant MODE_PATH]时,[member path_interval] " -"将沿ç€è·¯å¾„细分多边形。" +"当 [member mode] 被设置为 [constant MODE_PATH]时,[member path_interval] 将沿" +"ç€è·¯å¾„细分多边形。" #: modules/csg/doc_classes/CSGPrimitive.xml msgid "Base class for CSG primitives." @@ -22806,8 +22882,8 @@ msgid "" "CSG child node as the operation is between this node and the previous child " "of this nodes parent." msgstr "" -"在æ¤å½¢çŠ¶ä¸Šæ‰§è¡Œçš„æ“作。对于第一个CSGåèŠ‚ç‚¹ï¼Œå°†å¿½ç•¥æ¤æ“ä½œï¼Œå› ä¸ºæ“作是在æ¤èŠ‚ç‚¹ä¸Ž" -"该节点父级的上一个å级之间进行的。" +"在æ¤å½¢çŠ¶ä¸Šæ‰§è¡Œçš„æ“作。对于第一个 CSG åèŠ‚ç‚¹ï¼Œå°†å¿½ç•¥æ¤æ“ä½œï¼Œå› ä¸ºæ“作是在æ¤èŠ‚ç‚¹" +"与该节点父级的上一个å级之间进行的。" #: modules/csg/doc_classes/CSGShape.xml msgid "" @@ -22824,8 +22900,8 @@ msgid "" "always act like a static body. Note that the collision shape is still active " "even if the CSG shape itself is hidden." msgstr "" -"为我们的 CSG 形状å‘物ç†å¼•æ“Žæ·»åŠ ç¢°æ’žå½¢çŠ¶ã€‚è¿™å°†å§‹ç»ˆåƒä¸€ä¸ªé™æ€ç‰©ä½“。请注æ„,å³ä½¿" -"CSG形状本身被éšè—,碰撞形状ä»å¤„于活动状æ€ã€‚" +"为我们的 CSG 形状å‘物ç†å¼•æ“Žæ·»åŠ ç¢°æ’žå½¢çŠ¶ã€‚è¿™å°†å§‹ç»ˆåƒä¸€ä¸ªé™æ€ç‰©ä½“。请注æ„,å³" +"使 CSG 形状本身被éšè—,碰撞形状ä»å¤„于活动状æ€ã€‚" #: modules/csg/doc_classes/CSGShape.xml msgid "" @@ -22930,8 +23006,8 @@ msgid "" "effect making the torus seem rounded. If [code]false[/code] the torus will " "have a flat shaded look." msgstr "" -"如果[code]true[/code]设置圆环的法线以æä¾›å¹³æ»‘æ•ˆæžœï¼Œåˆ™ä½¿åœ†çŽ¯çœ‹èµ·æ¥æ˜¯åœ†å½¢çš„。如" -"果为 [code]false[/code],则圆环将具有平å¦çš„阴影表现。" +"如果 [code]true[/code] 设置圆环的法线以æä¾›å¹³æ»‘æ•ˆæžœï¼Œåˆ™ä½¿åœ†çŽ¯çœ‹èµ·æ¥æ˜¯åœ†å½¢çš„。" +"如果为 [code]false[/code],则圆环将具有平å¦çš„阴影表现。" #: modules/mono/doc_classes/CSharpScript.xml msgid "" @@ -23240,10 +23316,13 @@ msgid "A mathematic curve." msgstr "æ•°å¦æ›²çº¿ã€‚" #: doc/classes/Curve.xml +#, fuzzy 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" "å¯ä»¥ä¿å˜å¹¶é‡æ–°ç”¨äºŽå…¶ä»–对象的曲线。默认情况下,它在 Y 轴上的范围在 [code]0[/" "code] 到 [code]1[/code] 之间,并且ä½ç½®ç‚¹ç›¸å¯¹äºŽ [code]0.5[/code] Y ä½ç½®ã€‚" @@ -23407,16 +23486,18 @@ msgstr "" "åŠ¨é‡‡æ ·ç”¨äºŽå…¶ä»–ç›®çš„ã€‚\n" "它ä¿ç•™äº†æ²¿æ›²çº¿çš„预计算点的缓å˜ï¼Œä»¥åŠ å¿«è¿›ä¸€æ¥çš„计算。" -#: doc/classes/Curve2D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml +#, fuzzy +msgid "" +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" "在曲线的 [code]position[/code] ä¸Šæ·»åŠ ä¸€ä¸ªç‚¹ï¼Œç›¸å¯¹äºŽè¯¥ [Curve2D] çš„ä½ç½®ï¼Œä»¥åŠ" "控制点 [code]in[/code] å’Œ [code]out[/code]。\n" @@ -23476,8 +23557,8 @@ msgid "" "console, and returns [code](0, 0)[/code]." msgstr "" "返回从顶点 [code]idx[/code] 引出的控制点ä½ç½®ã€‚返回的ä½ç½®æ˜¯ç›¸å¯¹äºŽé¡¶ç‚¹ " -"[code]idx[/code]ã€‚å¦‚æžœç´¢å¼•è¶Šç•Œï¼Œå‡½æ•°ä¼šå‘æŽ§åˆ¶å°å‘é€é”™è¯¯ï¼Œå¹¶è¿”回 [code](0, " -"0)[/code]。" +"[code]idx[/code]ã€‚å¦‚æžœç´¢å¼•è¶Šç•Œï¼Œå‡½æ•°ä¼šå‘æŽ§åˆ¶å°å‘é€é”™è¯¯ï¼Œå¹¶è¿”回 [code](0, 0)[/" +"code]。" #: doc/classes/Curve2D.xml msgid "" @@ -23621,25 +23702,6 @@ msgstr "" "它沿曲线ä¿ç•™äº†ä¸€ä¸ªé¢„先计算好的点缓å˜ï¼Œä»¥åŠ å¿«è¿›ä¸€æ¥çš„计算。" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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 "" -"在曲线的 [code]position[/code] ä¸Šæ·»åŠ ä¸€ä¸ªç‚¹ï¼Œç›¸å¯¹äºŽè¯¥ [Curve2D] çš„ä½ç½®ï¼Œä»¥åŠ" -"控制点 [code]in[/code] å’Œ [code]out[/code]。\n" -"如果给定了 [code]at_position[/code],这个点会被æ’å…¥åˆ°ç‚¹å· [code]at_position[/" -"code] 之å‰ï¼Œå¹¶å°†è¿™ä¸ªç‚¹ï¼ˆä»¥åŠä¹‹åŽçš„æ¯ä¸€ä¸ªç‚¹ï¼‰ç§»åˆ°è¢«æ’入点之åŽã€‚如果 " -"[code]at_position[/code] æ²¡æœ‰ç»™å®šï¼Œæˆ–è€…æ˜¯éžæ³•值([code]at_position <0[/code] " -"或 [code]at_position >= [method get_point_count][/code]ï¼‰ï¼Œè¯¥ç‚¹å°†è¢«è¿½åŠ åœ¨ç‚¹åˆ—" -"表的最åŽã€‚" - -#: doc/classes/Curve3D.xml msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "以 [PoolVector3Array] 的形å¼è¿”回缓å˜çš„点。" @@ -24599,7 +24661,7 @@ msgid "" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" "åˆ›å»ºä¸€ä¸ªç›®å½•ã€‚å‚æ•°å¯ä»¥æ˜¯å½“å‰ç›®å½•的相对路径,也å¯ä»¥æ˜¯ç»å¯¹è·¯å¾„ã€‚ç›®æ ‡ç›®å½•åº”è¯¥æ”¾" -"置在一个已ç»å˜åœ¨çš„目录ä¸ï¼ˆå¦‚æžœè¦é€’归创建完整的路径,请å‚阅[method " +"置在一个已ç»å˜åœ¨çš„目录ä¸ï¼ˆå¦‚æžœè¦é€’归创建完整的路径,请å‚阅 [method " "make_dir_recursive])。\n" "返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" @@ -24886,11 +24948,11 @@ msgstr "返回给定 [code]type[/code] 的间è·ï¼ˆè§ [enum SpacingType])。" #: doc/classes/DynamicFont.xml msgid "Removes the fallback font at index [code]idx[/code]." -msgstr "移除ä½äºŽç´¢å¼•[code]idx[/code]处的åŽå¤‡å—体。" +msgstr "移除ä½äºŽç´¢å¼• [code]idx[/code] 处的åŽå¤‡å—体。" #: doc/classes/DynamicFont.xml msgid "Sets the fallback font at index [code]idx[/code]." -msgstr "设置索引[code]idx[/code]处的åŽå¤‡å—体。" +msgstr "设置索引 [code]idx[/code] 处的åŽå¤‡å—体。" #: doc/classes/DynamicFont.xml msgid "" @@ -25013,7 +25075,7 @@ msgstr "矢é‡å—体文件的路径。" #: doc/classes/DynamicFontData.xml msgid "The font hinting mode used by FreeType. See [enum Hinting] for options." -msgstr "FreeType 使用的å—体æç¤ºæ¨¡å¼ã€‚å‚阅 [enum Hinting] 选项。" +msgstr "FreeType 使用的å—体æç¤ºæ¨¡å¼ã€‚å¯é€‰é¡¹è§ [enum Hinting]。" #: doc/classes/DynamicFontData.xml msgid "" @@ -25237,8 +25299,8 @@ msgid "" "specified by [code]class_name[/code]." msgstr "" "如果 [code]class_name[/code] 指定的类ä¸çš„ [code]property[/code] 属性被ç¦ç”¨ï¼Œ" -"则返回 [code]true[/code]。ç¦ç”¨æŸä¸€å±žæ€§åŽï¼Œå½“选ä¸ç»§æ‰¿è‡ª " -"[code]class_name[/code] 类的节点时,该属性将ä¸ä¼šå‡ºçŽ°åœ¨æ£€æŸ¥å™¨ä¸ã€‚" +"则返回 [code]true[/code]。ç¦ç”¨æŸä¸€å±žæ€§åŽï¼Œå½“选ä¸ç»§æ‰¿è‡ª [code]class_name[/" +"code] 类的节点时,该属性将ä¸ä¼šå‡ºçŽ°åœ¨æ£€æŸ¥å™¨ä¸ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25254,9 +25316,8 @@ msgid "" "format obtained by using the feature profile manager's [b]Export[/b] button " "or the [method save_to_file] method." msgstr "" -"从文件ä¸åŠ è½½ä¸€ä¸ªç¼–è¾‘å™¨åŠŸèƒ½é…置文件。该文件必须éµå¾ª JSON " -"æ ¼å¼ï¼Œé€šè¿‡ä½¿ç”¨åŠŸèƒ½é…置文件管ç†å™¨çš„[b]导出[/b]按钮或 [method save_to_file] " -"方法获得。" +"从文件ä¸åŠ è½½ä¸€ä¸ªç¼–è¾‘å™¨åŠŸèƒ½é…置文件。该文件必须éµå¾ª JSON æ ¼å¼ï¼Œé€šè¿‡ä½¿ç”¨åŠŸèƒ½é…" +"置文件管ç†å™¨çš„[b]导出[/b]按钮或 [method save_to_file] 方法获得。" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25264,9 +25325,8 @@ msgid "" "imported using the feature profile manager's [b]Import[/b] button or the " "[method load_from_file] method." msgstr "" -"将编辑器的功能é…ç½®ä¿å˜åˆ° JSON " -"æ ¼å¼çš„æ–‡ä»¶ä¸ã€‚ç„¶åŽå¯ä»¥ä½¿ç”¨åŠŸèƒ½é…置文件管ç†å™¨çš„[b]导入[/b]按钮或 [method " -"load_from_file] 方法导入它。" +"将编辑器的功能é…ç½®ä¿å˜åˆ° JSON æ ¼å¼çš„æ–‡ä»¶ä¸ã€‚ç„¶åŽå¯ä»¥ä½¿ç”¨åŠŸèƒ½é…置文件管ç†å™¨çš„" +"[b]导入[/b]按钮或 [method load_from_file] 方法导入它。" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25274,9 +25334,8 @@ msgid "" "by [code]class_name[/code]. When disabled, the class won't appear in the " "Create New Node dialog." msgstr "" -"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ " -"[code]class_name[/code] 指定的类。ç¦ç”¨åŽï¼Œè¯¥ç±»ä¸ä¼šå‡ºçŽ°åœ¨â€œåˆ›å»ºæ–° " -"Nodeâ€å¯¹è¯æ¡†ä¸ã€‚" +"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ [code]class_name[/" +"code] 指定的类。ç¦ç”¨åŽï¼Œè¯¥ç±»ä¸ä¼šå‡ºçŽ°åœ¨â€œåˆ›å»ºæ–° Nodeâ€å¯¹è¯æ¡†ä¸ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25285,9 +25344,9 @@ msgid "" "appear in the Create New Node dialog but the inspector will be read-only " "when selecting a node that extends the class." msgstr "" -"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ " -"[code]class_name[/code] 指定的类的编辑。ç¦ç”¨åŽï¼Œè¯¥ç±»ä»ç„¶ä¼šå‡ºçŽ°åœ¨â€œåˆ›å»ºæ–° " -"Nodeâ€å¯¹è¯æ¡†ä¸ï¼Œä½†åœ¨é€‰ä¸ç»§æ‰¿çš„节点时,检查器将åªè¯»ã€‚" +"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ [code]class_name[/" +"code] 指定的类的编辑。ç¦ç”¨åŽï¼Œè¯¥ç±»ä»ç„¶ä¼šå‡ºçŽ°åœ¨â€œåˆ›å»ºæ–° Nodeâ€å¯¹è¯æ¡†ä¸ï¼Œä½†åœ¨é€‰ä¸" +"继承的节点时,检查器将åªè¯»ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25296,10 +25355,9 @@ msgid "" "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 "" -"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ " -"[code]class_name[/code] 指定的类ä¸çš„ [code]property[/code] " -"属性的编辑。ç¦ç”¨æŸä¸€å±žæ€§åŽï¼Œé€‰ä¸ç»§æ‰¿è‡ª [code]class_name[/code] " -"指定的类的节点时,这个属性将ä¸ä¼šå‡ºçŽ°åœ¨æ£€æŸ¥å™¨ä¸ã€‚" +"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ [code]class_name[/" +"code] 指定的类ä¸çš„ [code]property[/code] 属性的编辑。ç¦ç”¨æŸä¸€å±žæ€§åŽï¼Œé€‰ä¸ç»§æ‰¿" +"自 [code]class_name[/code] 指定的类的节点时,这个属性将ä¸ä¼šå‡ºçŽ°åœ¨æ£€æŸ¥å™¨ä¸ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -29688,8 +29746,8 @@ msgid "" "HDR values to be suitable for rendering on a SDR display. (Godot doesn't " "support rendering on HDR displays yet.)" msgstr "" -"è¦ä½¿ç”¨çš„è‰²è°ƒæ˜ å°„æ¨¡å¼ã€‚è‰²è°ƒæ˜ å°„æ˜¯å°† HDR 值“转æ¢â€ä¸ºé€‚åˆåœ¨ SDR " -"显示器上呈现的值过程。(Godot å°šä¸æ”¯æŒåœ¨ HDR 显示器上进行渲染。)" +"è¦ä½¿ç”¨çš„è‰²è°ƒæ˜ å°„æ¨¡å¼ã€‚è‰²è°ƒæ˜ å°„æ˜¯å°† HDR 值“转æ¢â€ä¸ºé€‚åˆåœ¨ SDR 显示器上呈现的值" +"过程。(Godot å°šä¸æ”¯æŒåœ¨ HDR 显示器上进行渲染。)" #: doc/classes/Environment.xml msgid "" @@ -30146,11 +30204,13 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" -"将整个文件作为 [String] å—符串返回。\n" -"将按照 UTF-8 ç¼–ç è§£æžæ–‡æœ¬ã€‚" #: doc/classes/File.xml msgid "Returns next [code]len[/code] bytes of the file as a [PoolByteArray]." @@ -30932,13 +30992,16 @@ msgstr "" "å¦è¯·å‚阅 [method CanvasItem.draw_string]。" #: doc/classes/Font.xml +#, fuzzy 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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" "使用å—体在画布项目的指定ä½ç½®ç»˜åˆ¶å—符 [code]char[/code],使用的颜色是 " "[code]modulate[/code]ï¼Œå¹¶ä¸”ä¼šæ ¹æ®å®½åº¦åšè£å‰ªï¼Œå¦‚æžœä¼ å…¥äº† [code]next[/code] 还" @@ -31905,11 +31968,11 @@ msgid "" "(hole) produced which could be distinguished by calling [method " "is_polygon_clockwise]." msgstr "" -"å°†[code]polygon_a[/code]与[code]polygon_b[/code]相交并返回相交的多边形数组。" -"这在多边形之间执行[constant OPERATION_INTERSECTION]。æ¢å¥è¯è¯´ï¼Œè¿”回多边形共享" -"的公共区域。如果没有å‘生相交,则返回一个空数组。\n" -"该æ“作å¯èƒ½å¯¼è‡´äº§ç”Ÿå¤–部多边形(边界)和内部多边形(å”),å¯ä»¥é€šè¿‡è°ƒç”¨[method " -"is_polygon_clockwise]æ¥åŒºåˆ†ã€‚" +"å°† [code]polygon_a[/code] 与 [code]polygon_b[/code] 相交并返回相交的多边形数" +"组。这在多边形之间执行 [constant OPERATION_INTERSECTION]。æ¢å¥è¯è¯´ï¼Œè¿”回多边" +"形共享的公共区域。如果没有å‘生相交,则返回一个空数组。\n" +"该æ“作å¯èƒ½å¯¼è‡´äº§ç”Ÿå¤–部多边形(边界)和内部多边形(å”),å¯ä»¥é€šè¿‡è°ƒç”¨ [method " +"is_polygon_clockwise] æ¥åŒºåˆ†ã€‚" #: doc/classes/Geometry.xml msgid "" @@ -31968,10 +32031,9 @@ msgid "" "[Vector2] that specifies the positions of each tile, [code]size[/code] " "contains the overall size of the whole atlas as [Vector2]." msgstr "" -"给定表示图å—çš„ [Vector2] " -"数组,构建一个地图集。返回的å—典有两个键:[code]points[/code] 是 [Vector2] " -"的数组,用于指定æ¯ä¸ªå›¾å—çš„ä½ç½®ï¼Œ[code]size[/code] åŒ…å«æ•´ä¸ªå›¾é›†çš„æ•´ä½“大å°ï¼Œ" -"是一个 [Vector2]。" +"给定表示图å—çš„ [Vector2] 数组,构建一个地图集。返回的å—典有两个键:" +"[code]points[/code] 是 [Vector2] 的数组,用于指定æ¯ä¸ªå›¾å—çš„ä½ç½®ï¼Œ[code]size[/" +"code] åŒ…å«æ•´ä¸ªå›¾é›†çš„æ•´ä½“大å°ï¼Œæ˜¯ä¸€ä¸ª [Vector2]。" #: doc/classes/Geometry.xml msgid "" @@ -32047,14 +32109,14 @@ msgid "" "(hole) produced which could be distinguished by calling [method " "is_polygon_clockwise]." msgstr "" -"通过[code]delta[/code]å•ä½ï¼ˆåƒç´ )对[code]多边形线polyline[/code]进行充气或放" -"气,产生多边形。如果[code]delta[/code]ä¸ºæ£æ•°ï¼Œåˆ™ä½¿å¤šæ®µçº¿å‘外增长。返回一个多" -"è¾¹å½¢æ•°ç»„ï¼Œå› ä¸ºå……æ°”/放气å¯èƒ½å¯¼è‡´å¤šä¸ªç¦»æ•£çš„多边形。如果[code]delta[/code]为负" -"数,返回一个空数组。\n" -"æ¯ä¸ªå¤šè¾¹å½¢çš„顶点将由[code]join_type[/code]决定,è§[enum PolyJoinType]。\n" -"æ¯ä¸ªå¤šè¾¹å½¢çš„端点将由[code]end_type[/code]决定,è§[enum PolyEndType]。\n" -"该æ“作å¯èƒ½ä¼šäº§ç”Ÿä¸€ä¸ªå¤–部多边形(边界)和内部多边形(å”),å¯ä»¥é€šè¿‡è°ƒç”¨" -"[method is_polygon_clockwise]æ¥åŒºåˆ†ã€‚" +"对多段线 [code]polyline[/code]进行 [code]delta[/code] 个å•ä½ï¼ˆåƒç´ )的充气或" +"放气,产生多边形。如果 [code]delta[/code] ä¸ºæ£æ•°ï¼Œåˆ™ä½¿å¤šæ®µçº¿å‘外增长。返回一" +"ä¸ªå¤šè¾¹å½¢æ•°ç»„ï¼Œå› ä¸ºå……æ°”/放气å¯èƒ½å¯¼è‡´å¤šä¸ªç¦»æ•£çš„多边形。如果 [code]delta[/code] " +"为负数,返回一个空数组。\n" +"æ¯ä¸ªå¤šè¾¹å½¢çš„顶点将由 [code]join_type[/code] å†³å®šï¼Œè§ [enum PolyJoinType]。\n" +"æ¯ä¸ªå¤šè¾¹å½¢çš„端点将由 [code]end_type[/code] å†³å®šï¼Œè§ [enum PolyEndType]。\n" +"该æ“作å¯èƒ½ä¼šäº§ç”Ÿä¸€ä¸ªå¤–部多边形(边界)和内部多边形(å”),å¯ä»¥é€šè¿‡è°ƒç”¨ " +"[method is_polygon_clockwise] æ¥åŒºåˆ†ã€‚" #: doc/classes/Geometry.xml msgid "" @@ -32071,9 +32133,9 @@ msgid "" "[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 "" -"测试从[code]from[/code]开始,方å‘为[code]dir[/code]çš„3D射线是å¦ä¸Ž[code]a[/" -"code]ã€[code]b[/code]å’Œ[code]c[/code]指定的三角形相交。如果是,返回相交点为" -"[Vector3]。如果没有å‘生相交,将返回一个空的[Variant]。" +"测试从 [code]from[/code] 开始,方å‘为 [code]dir[/code] çš„ 3D 射线是å¦ä¸Ž " +"[code]a[/code]ã€[code]b[/code] å’Œ [code]c[/code] 指定的三角形相交。如果是,返" +"回相交点为 [Vector3]。如果没有å‘生相交,将返回一个空的 [Variant]。" #: doc/classes/Geometry.xml msgid "" @@ -32893,12 +32955,16 @@ msgid "" msgstr "颜色æ’值器资æºï¼Œå¯ç”¨äºŽåœ¨ç”¨æˆ·å®šä¹‰çš„颜色点之间生æˆé¢œè‰²ã€‚" #: doc/classes/Gradient.xml +#, fuzzy 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" "给定一组颜色,这个资æºå°†ä¾æ¬¡ä¸¤ä¸¤æ’值。这æ„味ç€ï¼Œå¦‚æžœä½ æœ‰é¢œè‰² 1ã€é¢œè‰² 2和颜色 " "3,æ¸å˜å°†ä»Žé¢œè‰² 1 æ’值到颜色2ã€ä»Žé¢œè‰² 2 æ’值到颜色 3。æ¸å˜æœ€åˆæœ‰ä¸¤ç§é¢œè‰²ï¼ˆé»‘" @@ -33204,8 +33270,8 @@ msgid "" "Makes it not possible to connect between two different slot types. The type " "is defined with the [method GraphNode.set_slot] method." msgstr "" -"使得两个ä¸åŒæ§½åž‹ä¹‹é—´çš„连接æˆä¸ºä¸å¯èƒ½ã€‚该类型是通过[method GraphNode.set_slot]" -"方法定义的。" +"使得两个ä¸åŒæ§½åž‹ä¹‹é—´çš„连接æˆä¸ºä¸å¯èƒ½ã€‚该类型是通过 [method GraphNode." +"set_slot] 方法定义的。" #: doc/classes/GraphEdit.xml msgid "" @@ -33231,7 +33297,7 @@ msgstr "" #: doc/classes/GraphEdit.xml msgid "Sets the specified [code]node[/code] as the one selected." -msgstr "选ä¸ä¸€ä¸ªç‰¹å®šçš„节点 [code]node[/code]." +msgstr "将指定的 [code]node[/code] 节点设置为选ä¸çš„节点。" #: doc/classes/GraphEdit.xml msgid "If [code]true[/code], the minimap is visible." @@ -33251,7 +33317,8 @@ msgstr "å°å›¾çŸ©å½¢çš„大å°ã€‚åœ°å›¾è‡ªèº«åŸºäºŽç½‘æ ¼åŒºåŸŸçš„å¤§å°ï¼Œå¹¶è¢« msgid "" "If [code]true[/code], enables disconnection of existing connections in the " "GraphEdit by dragging the right end." -msgstr "如果为 [code]true[/code],通过拖动å³ç«¯ï¼Œå¯ä»¥æ–å¼€ GraphEdit ä¸çŽ°æœ‰çš„è¿žæŽ¥ã€‚" +msgstr "" +"如果为 [code]true[/code],通过拖动å³ç«¯ï¼Œå¯ä»¥æ–å¼€ GraphEdit ä¸çŽ°æœ‰çš„è¿žæŽ¥ã€‚" #: doc/classes/GraphEdit.xml msgid "The scroll offset." @@ -33501,7 +33568,7 @@ msgstr "返回槽[code]idx[/code]的左边(输入)颜色[Color]。" #: doc/classes/GraphNode.xml msgid "Returns the right (output) [Color] of the slot [code]idx[/code]." -msgstr "返回槽[code]idx[/code]çš„å³è¾¹ï¼ˆè¾“出)颜色[Color]。" +msgstr "返回槽[code]idx[/code]çš„å³è¾¹ï¼ˆè¾“出)颜色 [Color]。" #: doc/classes/GraphNode.xml msgid "Returns the left (input) type of the slot [code]idx[/code]." @@ -33539,17 +33606,17 @@ msgid "" "Individual properties can be set using one of the [code]set_slot_*[/code] " "methods. You must enable at least one side of the slot to do so." msgstr "" -"设置ID为[code]idx[/code]çš„æ’æ§½çš„属性。\n" -"如果[code]enable_left[/code]/[code]right[/code],就会出现一个端å£ï¼Œè¯¥æ’槽就å¯" -"以从这一侧连接。\n" -"[code]type_left[/code]/[code]right[/code]是端å£çš„一个任æ„ç±»åž‹ã€‚åªæœ‰å…·æœ‰ç›¸åŒç±»" -"åž‹å€¼çš„ç«¯å£æ‰èƒ½è¢«è¿žæŽ¥ã€‚\n" -"[code]color_left[/code]/[code]right[/code]是端å£åœ¨è¿™ä¸€ä¾§çš„å›¾æ ‡çš„è‰²è°ƒã€‚\n" -"[code]custom_left[/code]/[code]right[/code]是这一侧的端å£çš„自定义纹ç†ã€‚\n" -"[b]注æ„:[/b]这个方法åªè®¾ç½®æ§½çš„属性。è¦åˆ›å»ºæ§½ï¼Œéœ€è¦åœ¨GraphNode䏿·»åŠ ä¸€ä¸ª" -"[Control]的派生类。\n" -"å¯ä»¥ä½¿ç”¨[code]set_slot_*[/code]方法之一æ¥è®¾ç½®å•ä¸ªå±žæ€§ã€‚ä½ å¿…é¡»è‡³å°‘å¯ç”¨æ’槽的一" -"è¾¹æ‰èƒ½è¿™æ ·åšã€‚" +"设置 ID 为 [code]idx[/code] çš„æ’æ§½çš„属性。\n" +"如果 [code]enable_left[/code]/[code]right[/code],就会出现一个端å£ï¼Œè¯¥æ’槽就" +"å¯ä»¥ä»Žè¿™ä¸€ä¾§è¿žæŽ¥ã€‚\n" +"[code]type_left[/code]/[code]right[/code] 是端å£çš„一个任æ„ç±»åž‹ã€‚åªæœ‰å…·æœ‰ç›¸åŒ" +"ç±»åž‹å€¼çš„ç«¯å£æ‰èƒ½è¢«è¿žæŽ¥ã€‚\n" +"[code]color_left[/code]/[code]right[/code] 是端å£åœ¨è¿™ä¸€ä¾§çš„å›¾æ ‡çš„è‰²è°ƒã€‚\n" +"[code]custom_left[/code]/[code]right[/code] 是这一侧的端å£çš„自定义纹ç†ã€‚\n" +"[b]注æ„:[/b]这个方法åªè®¾ç½®æ§½çš„属性。è¦åˆ›å»ºæ§½ï¼Œéœ€è¦åœ¨ GraphNode 䏿·»åŠ ä¸€ä¸ª " +"[Control] 的派生类。\n" +"å¯ä»¥ä½¿ç”¨ [code]set_slot_*[/code] 方法之一æ¥è®¾ç½®å•ä¸ªå±žæ€§ã€‚ä½ å¿…é¡»è‡³å°‘å¯ç”¨æ’槽的" +"一边æ‰èƒ½è¿™æ ·åšã€‚" #: doc/classes/GraphNode.xml msgid "" @@ -33563,7 +33630,8 @@ msgstr "" msgid "" "Sets the [Color] of the right (output) side of the slot [code]idx[/code] to " "[code]color_right[/code]." -msgstr "å°†æ’æ§½ [code]idx[/code] çš„å³ä¾§ï¼ˆè¾“出)的颜色 [Color] 设置为 " +msgstr "" +"å°†æ’æ§½ [code]idx[/code] çš„å³ä¾§ï¼ˆè¾“出)的颜色 [Color] 设置为 " "[code]color_right[/code]。" #: doc/classes/GraphNode.xml @@ -33622,9 +33690,9 @@ msgid "" "[b]Note:[/b] Dragging the handle will only emit the [signal resize_request] " "signal, the GraphNode needs to be resized manually." msgstr "" -"如果为 [code]true[/code],用户å¯ä»¥è°ƒæ•´å›¾å½¢èŠ‚ç‚¹GraphNode的大å°ã€‚\n" -"[b]注æ„:[/b]拖动手柄åªä¼šå‘出 [signal resize_request] ä¿¡å·ï¼Œå›¾å½¢èŠ‚ç‚¹GraphNode" -"éœ€è¦æ‰‹åŠ¨è°ƒæ•´å¤§å°ã€‚" +"如果为 [code]true[/code],用户å¯ä»¥è°ƒæ•´ GraphNode 的大å°ã€‚\n" +"[b]注æ„:[/b]拖动手柄åªä¼šå‘出 [signal resize_request] ä¿¡å·ï¼ŒGraphNode éœ€è¦æ‰‹" +"动调整大å°ã€‚" #: doc/classes/GraphNode.xml msgid "If [code]true[/code], the GraphNode is selected." @@ -33637,7 +33705,7 @@ msgid "" "the GraphNode needs to be removed manually." msgstr "" "如果为 [code]true[/code]ï¼Œåˆ™å…³é—æŒ‰é’®å°†å¯è§ã€‚\n" -"[b]注æ„:[/b]按下它åªä¼šå‘出[signal close_request]ä¿¡å·ï¼Œéœ€è¦æ‰‹åŠ¨åˆ é™¤å›¾å½¢èŠ‚ç‚¹" +"[b]注æ„:[/b]按下它åªä¼šå‘出 [signal close_request] ä¿¡å·ï¼Œéœ€è¦æ‰‹åŠ¨åˆ é™¤ " "GraphNode。" #: doc/classes/GraphNode.xml @@ -34561,11 +34629,12 @@ msgid "Low-level hyper-text transfer protocol client." msgstr "ä½Žçº§åˆ«çš„è¶…æ–‡æœ¬ä¼ è¾“å议客户端。" #: doc/classes/HTTPClient.xml +#, fuzzy 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -37088,7 +37157,7 @@ msgstr "下一个顶点的 UV。" #: doc/classes/ImmediateGeometry.xml msgid "The next vertex's second layer UV." -msgstr "下一个顶点的第二层UV。" +msgstr "下一个顶点的第二层 UV。" #: doc/classes/Input.xml msgid "A singleton that deals with inputs." @@ -37163,13 +37232,13 @@ msgid "" "measurement for each axis is m/s² while on iOS and UWP it's a multiple of " "the Earth's gravitational acceleration [code]g[/code] (~9.81 m/s²)." msgstr "" -"å¦‚æžœè®¾å¤‡æœ‰åŠ é€Ÿåº¦ä¼ æ„Ÿå™¨ï¼Œåˆ™è¿”å›žè®¾å¤‡çš„åŠ é€Ÿåº¦ã€‚å¦åˆ™ï¼Œè¯¥æ–¹æ³•返回[constant " +"å¦‚æžœè®¾å¤‡æœ‰åŠ é€Ÿåº¦ä¼ æ„Ÿå™¨ï¼Œåˆ™è¿”å›žè®¾å¤‡çš„åŠ é€Ÿåº¦ã€‚å¦åˆ™ï¼Œè¯¥æ–¹æ³•返回 [constant " "Vector3.ZERO]。\n" -"请注æ„,å³ä½¿ä½ çš„è®¾å¤‡æœ‰ä¸€ä¸ªåŠ é€Ÿåº¦è®¡ï¼Œå½“ä»Žç¼–è¾‘å™¨è¿è¡Œæ—¶ï¼Œè¯¥æ–¹æ³•也会返回一个空的" -"[Vector3]ã€‚ä½ å¿…é¡»å°†é¡¹ç›®å¯¼å‡ºåˆ°ä¸€ä¸ªæ”¯æŒçš„è®¾å¤‡ä¸Šï¼Œä»¥ä¾¿ä»ŽåŠ é€Ÿåº¦è®¡ä¸Šè¯»å–æ•°å€¼ã€‚\n" -"[b]注æ„:[/b]这个方法åªåœ¨iOSã€Androidå’ŒUWP上工作。在其他平å°ä¸Šï¼Œå®ƒæ€»æ˜¯è¿”回" -"[constant Vector3.ZERO]。在Android上,æ¯ä¸ªè½´çš„æµ‹é‡å•使˜¯m/s²,而在iOSå’ŒUWP" -"上,它是地çƒé‡åŠ›åŠ é€Ÿåº¦çš„å€æ•°[code]g[/code](~9.81 m/s²)。" +"请注æ„,å³ä½¿ä½ çš„è®¾å¤‡æœ‰åŠ é€Ÿåº¦è®¡ï¼Œå½“ä»Žç¼–è¾‘å™¨è¿è¡Œæ—¶ï¼Œè¯¥æ–¹æ³•也会返回空的 " +"[Vector3]ã€‚ä½ å¿…é¡»å°†é¡¹ç›®å¯¼å‡ºåˆ°æ”¯æŒçš„设备上,æ‰èƒ½ä»ŽåŠ é€Ÿåº¦è®¡ä¸Šè¯»åˆ°æ•°å€¼ã€‚\n" +"[b]注æ„:[/b]这个方法åªåœ¨ iOSã€Android å’Œ UWP 上有效。在其他平å°ä¸Šï¼Œå®ƒæ€»æ˜¯è¿”" +"回 [constant Vector3.ZERO]。在 Android 上,æ¯ä¸ªè½´çš„æµ‹é‡å•使˜¯ m/s²,而在 iOS " +"å’Œ UWP 上,它是地çƒé‡åŠ›åŠ é€Ÿåº¦çš„å€æ•° [code]g[/code](~9.81 m/s²)。" #: doc/classes/Input.xml msgid "" @@ -37321,9 +37390,9 @@ msgid "" "[b]Note:[/b] This method only works on Android, iOS and UWP. On other " "platforms, it always returns [constant Vector3.ZERO]." msgstr "" -"如果设备有ç£åŠ›ä¼ æ„Ÿå™¨ï¼Œåˆ™è¿”å›žè®¾å¤‡æ‰€æœ‰è½´çš„ç£åœºå¼ºåº¦ï¼Œå¾®ç‰¹æ–¯æ‹‰ã€‚å¦åˆ™ï¼Œè¯¥æ–¹æ³•返回" -"[constant Vector3.ZERO]。\n" -"[b]注æ„:[/b]这个方法åªåœ¨Androidã€iOSå’ŒUWP上有效。在其他平å°ä¸Šï¼Œæ€»æ˜¯è¿”回" +"如果设备有ç£åŠ›ä¼ æ„Ÿå™¨ï¼Œåˆ™è¿”å›žè®¾å¤‡æ‰€æœ‰è½´çš„ç£åœºå¼ºåº¦ï¼Œå•ä½ä¸ºå¾®ç‰¹æ–¯æ‹‰ã€‚å¦åˆ™ï¼Œè¯¥æ–¹" +"法返回 [constant Vector3.ZERO]。\n" +"[b]注æ„:[/b]这个方法åªåœ¨ Androidã€iOS å’Œ UWP 上有效。在其他平å°ä¸Šï¼Œæ€»æ˜¯è¿”回 " "[constant Vector3.ZERO]。" #: doc/classes/Input.xml @@ -37422,7 +37491,7 @@ msgid "" "Returns [code]true[/code] if you are pressing the joypad button (see [enum " "JoystickList])." msgstr "" -"å¦‚æžœä½ æ£åœ¨æŒ‰ä¸‹æ‰‹æŸ„按钮,则返回 [code]true[/code],å‚阅[enum JoystickList]。" +"å¦‚æžœä½ æ£åœ¨æŒ‰ä¸‹æ‰‹æŸ„按钮,则返回 [code]true[/code]ï¼ˆè§ [enum JoystickList])。" #: doc/classes/Input.xml msgid "" @@ -37641,12 +37710,16 @@ msgid "Stops the vibration of the joypad." msgstr "åœæ¢æ¸¸æˆæ‰‹æŸ„的振动。" #: doc/classes/Input.xml +#, fuzzy msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" "振动 Android å’Œ iOS 设备。\n" "[b]注æ„:[/b]Android 需è¦å¯¼å‡ºè®¾ç½®ä¸çš„ [code]VIBRATE[/code] æƒé™ã€‚iOS 䏿”¯æŒæŒ" @@ -37824,13 +37897,13 @@ msgstr "ç§»åŠ¨å…‰æ ‡ã€‚è¡¨ç¤ºé‚£äº›ä¸œè¥¿å¯ä»¥ç§»åŠ¨ã€‚" msgid "" "Vertical split mouse cursor. On Windows, it's the same as [constant " "CURSOR_VSIZE]." -msgstr "åž‚ç›´æ‹†åˆ†é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上,它与 [constant CURSOR_VSIZE] 相åŒã€‚" +msgstr "åž‚ç›´æ‹†åˆ†é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上与 [constant CURSOR_VSIZE] 相åŒã€‚" #: doc/classes/Input.xml msgid "" "Horizontal split mouse cursor. On Windows, it's the same as [constant " "CURSOR_HSIZE]." -msgstr "æ°´å¹³åˆ†å‰²çš„é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上,它与 [constant CURSOR_HSIZE] 相åŒã€‚" +msgstr "æ°´å¹³åˆ†å‰²çš„é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上与 [constant CURSOR_HSIZE] 相åŒã€‚" #: doc/classes/Input.xml msgid "Help cursor. Usually a question mark." @@ -38712,8 +38785,12 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." -msgstr "䏿˜¯çº¿ç¨‹å®‰å…¨çš„。如果从线程调用,请使用 [method Object.call_deferred]。" +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." +msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" @@ -38726,6 +38803,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -38892,8 +38979,8 @@ 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 "" -"移除所有[code]hostname[/code]主机å的缓å˜å¼•用。如果没有给出[code]hostname[/" -"code],所有缓å˜çš„IP地å€å°†è¢«åˆ 除。" +"移除所有 [code]hostname[/code] 主机å的缓å˜å¼•用。如果没有给出 " +"[code]hostname[/code],所有缓å˜çš„ IP 地å€å°†è¢«åˆ 除。" #: doc/classes/IP.xml msgid "" @@ -38939,7 +39026,7 @@ msgid "" "[method get_resolve_item_status])." msgstr "" "给定队列 [code]id[/code],返回排队主机åçš„ IP 地å€ã€‚出现错误或解æžå°šæœªå‘生时" -"返回一个空å—符串(å‚阅 [method get_resolve_item_status])。" +"返回一个空å—ç¬¦ä¸²ï¼ˆè§ [method get_resolve_item_status])。" #: doc/classes/IP.xml msgid "" @@ -39460,11 +39547,11 @@ msgstr "指导线的颜色[Color]。指导线是在æ¯è¡Œé¡¹ç›®ä¹‹é—´ç”»çš„一æ #: doc/classes/ItemList.xml msgid "The horizontal spacing between items." -msgstr "项目èœå•之间的水平间è·ã€‚" +msgstr "项目之间的水平间è·ã€‚" #: doc/classes/ItemList.xml msgid "The spacing between item's icon and text." -msgstr "项目èœå•çš„å›¾æ ‡å’Œæ–‡æœ¬ä¹‹é—´çš„é—´è·ã€‚" +msgstr "é¡¹ç›®çš„å›¾æ ‡å’Œæ–‡æœ¬ä¹‹é—´çš„é—´è·ã€‚" #: doc/classes/ItemList.xml msgid "The vertical spacing between each line of text." @@ -39482,31 +39569,31 @@ msgstr "项目文本的å—体 [Font] 。" msgid "" "Default [StyleBox] for the [ItemList], i.e. used when the control is not " "being focused." -msgstr "[ItemList] çš„é»˜è®¤æ ·å¼ç›’ [StyleBox],å³åœ¨æŽ§ä»¶æœªèŽ·å¾—ç„¦ç‚¹æ—¶ä½¿ç”¨ã€‚" +msgstr "该 [ItemList] çš„é»˜è®¤æ ·å¼ç›’ [StyleBox],å³ä¼šåœ¨è¯¥æŽ§ä»¶æœªèŽ·å¾—ç„¦ç‚¹æ—¶ä½¿ç”¨ã€‚" #: doc/classes/ItemList.xml msgid "[StyleBox] used when the [ItemList] is being focused." -msgstr "当 [ItemList] 被èšç„¦æ—¶ä½¿ç”¨çš„æ ·å¼ç›’ [StyleBox]。" +msgstr "当该 [ItemList] èŽ·å¾—ç„¦ç‚¹æ—¶æ‰€ä½¿ç”¨çš„æ ·å¼ç›’ [StyleBox]。" #: doc/classes/ItemList.xml msgid "[StyleBox] used for the cursor, when the [ItemList] is being focused." -msgstr "当 [ItemList] 被èšç„¦æ—¶ï¼Œç”¨äºŽå…‰æ ‡çš„æ ·å¼ç›’ [StyleBox]。" +msgstr "当该 [ItemList] èŽ·å¾—ç„¦ç‚¹æ—¶ï¼Œç”¨ä½œå…‰æ ‡çš„æ ·å¼ç›’ [StyleBox]。" #: doc/classes/ItemList.xml msgid "" "[StyleBox] used for the cursor, when the [ItemList] is not being focused." -msgstr "当 [ItemList] 没有被èšç„¦æ—¶ï¼Œç”¨äºŽå…‰æ ‡çš„æ ·å¼ç›’ [StyleBox]。" +msgstr "当该 [ItemList] æœªèŽ·å¾—ç„¦ç‚¹æ—¶ï¼Œç”¨ä½œå…‰æ ‡çš„æ ·å¼ç›’ [StyleBox]。" #: doc/classes/ItemList.xml msgid "" "[StyleBox] for the selected items, used when the [ItemList] is not being " "focused." -msgstr "æ‰€é€‰é¡¹çš„æ ·å¼ç›’ [StyleBox],当 [ItemList] 没有获得焦点时使用。" +msgstr "æ‰€é€‰é¡¹çš„æ ·å¼ç›’ [StyleBox],当该 [ItemList] 未获得焦点时使用。" #: doc/classes/ItemList.xml msgid "" "[StyleBox] for the selected items, used when the [ItemList] is being focused." -msgstr "æ‰€é€‰é¡¹çš„æ ·å¼ç›’ [StyleBox],当 [ItemList] 没有获得焦点时使用。" +msgstr "æ‰€é€‰é¡¹çš„æ ·å¼ç›’ [StyleBox],当该 [ItemList] 获得焦点时使用。" #: doc/classes/JavaScript.xml msgid "" @@ -39538,8 +39625,8 @@ msgid "" "JavaScript. The reference must be kept until the callback happens, or it " "won't be called at all. See [JavaScriptObject] for usage." msgstr "" -"创建脚本函数的引用,å¯ä»¥è¢«JavaScriptç”¨ä½œå›žè°ƒã€‚è¿™ä¸ªå¼•ç”¨å¿…é¡»ä¿æŒåˆ°å›žè°ƒå‘生为" -"æ¢ï¼Œå¦åˆ™å®ƒå°±ä¸ä¼šè¢«è°ƒç”¨ã€‚使用方法å‚阅[JavaScriptObject]。" +"创建脚本函数的引用,å¯ä»¥è¢« JavaScript ç”¨ä½œå›žè°ƒã€‚è¿™ä¸ªå¼•ç”¨å¿…é¡»ä¿æŒåˆ°å›žè°ƒå‘生为" +"æ¢ï¼Œå¦åˆ™å®ƒå°±ä¸ä¼šè¢«è°ƒç”¨ã€‚ä½¿ç”¨æ–¹æ³•è§ [JavaScriptObject]。" #: doc/classes/JavaScript.xml msgid "" @@ -39547,8 +39634,9 @@ msgid "" "[code]object[/code] must a valid property of the JavaScript [code]window[/" "code]. See [JavaScriptObject] for usage." msgstr "" -"使用[code]new[/code]æž„é€ å‡½æ•°åˆ›å»ºæ–°çš„JavaScript对象。[code]object[/code]必须是" -"JavaScript[code]window[/code]的有效属性。使用方法å‚阅[JavaScriptObject]。" +"使用 [code]new[/code] æž„é€ å‡½æ•°åˆ›å»ºæ–°çš„ JavaScript 对象。[code]object[/code] " +"必须是 JavaScript [code]window[/code] çš„æœ‰æ•ˆå±žæ€§ã€‚ä½¿ç”¨æ–¹æ³•è§ " +"[JavaScriptObject]。" #: doc/classes/JavaScript.xml msgid "" @@ -39563,12 +39651,12 @@ msgid "" "[b]Note:[/b] Browsers might ask the user for permission or block the " "download if multiple download requests are made in a quick succession." msgstr "" -"æç¤ºç”¨æˆ·ä¸‹è½½ä¸€ä¸ªåŒ…嫿Œ‡å®š[code]buffer[/code]缓冲区的文件。该文件将具有给定的" -"[code]name[/code]å’Œ[code]mime[/code]类型。\n" -"[b]注æ„:[/b]æµè§ˆå™¨å¯èƒ½ä¼šæ ¹æ®æ–‡ä»¶[code]name[/code]的扩展å,覆盖所æä¾›çš„" -"[url=https://en.wikipedia.org/wiki/Media_type]MIME类型[/url]。\n" -"[b]注æ„:[/b]如果[method download_buffer]䏿˜¯ç”±ç”¨æˆ·äº¤äº’调用,如点击按钮,æµè§ˆ" -"器å¯èƒ½ä¼šé˜»æ¢ä¸‹è½½ã€‚\n" +"æç¤ºç”¨æˆ·ä¸‹è½½ä¸€ä¸ªåŒ…嫿Œ‡å®š [code]buffer[/code] 缓冲区的文件。该文件将具有给定" +"çš„ [code]name[/code] å’Œ [code]mime[/code] 类型。\n" +"[b]注æ„:[/b]æµè§ˆå™¨å¯èƒ½ä¼šæ ¹æ®æ–‡ä»¶ [code]name[/code] 的扩展å,覆盖所æä¾›çš„ " +"[url=https://en.wikipedia.org/wiki/Media_type]MIME 类型[/url]。\n" +"[b]注æ„:[/b]如果 [method download_buffer] 䏿˜¯ç”±ç”¨æˆ·äº¤äº’调用,如点击按钮,æµ" +"览器å¯èƒ½ä¼šé˜»æ¢ä¸‹è½½ã€‚\n" "[b]注æ„:[/b]å¦‚æžœå¿«é€Ÿè¿žç»æå‡ºå¤šä¸ªä¸‹è½½è¯·æ±‚ï¼Œæµè§ˆå™¨å¯èƒ½ä¼šè¦æ±‚ç”¨æˆ·åŒæ„或阻æ¢ä¸‹" "载。" @@ -39582,10 +39670,11 @@ msgid "" "evaluated in the execution context of a function within the engine's runtime " "environment." msgstr "" -"在æµè§ˆå™¨çª—å£ä¸æ‰§è¡Œå—符串[code]code[/code]作为JavaScript代ç 。这是对实际的全局" -"JavaScript函数[code]eval()[/code]的调用。\n" -"如果[code]use_global_execution_context[/code]是[code]true[/code],代ç 将在全" -"局执行环境ä¸è¢«æ±‚值。å¦åˆ™ï¼Œå®ƒå°†åœ¨å¼•擎è¿è¡Œæ—¶çŽ¯å¢ƒä¸å‡½æ•°çš„æ‰§è¡Œä¸Šä¸‹æ–‡ä¸è¿›è¡Œæ±‚值。" +"在æµè§ˆå™¨çª—å£ä¸å°† [code]code[/code] å—符串作为 JavaScript ä»£ç æ‰§è¡Œã€‚这是对实际" +"的全局 JavaScript 函数 [code]eval()[/code] 的调用。\n" +"如果 [code]use_global_execution_context[/code] 为 [code]true[/code],代ç 将在" +"全局执行环境ä¸è¢«æ±‚值。å¦åˆ™ï¼Œå®ƒå°†åœ¨å¼•擎è¿è¡Œæ—¶çŽ¯å¢ƒä¸å‡½æ•°çš„æ‰§è¡Œä¸Šä¸‹æ–‡ä¸è¿›è¡Œæ±‚" +"值。" #: doc/classes/JavaScript.xml msgid "" @@ -39595,9 +39684,9 @@ msgid "" "which will contain the JavaScript [code]arguments[/code]. See " "[JavaScriptObject] for usage." msgstr "" -"返回å¯ä»¥è¢«è„šæœ¬ä½¿ç”¨çš„JavaScript对象的接å£ã€‚这个[code]interface[/code]必须是" -"JavaScript[code]window[/code]的一个有效属性。回调必须接å—一个[Array]傿•°ï¼Œå®ƒ" -"将包å«JavaScript [code]arguments[/code]。å‚阅[JavaScriptObject]的用法。" +"返回å¯ä»¥è¢«è„šæœ¬ä½¿ç”¨çš„ JavaScript 对象的接å£ã€‚这个 [code]interface[/code] å¿…é¡»" +"是 JavaScript [code]window[/code] 的一个有效属性。回调必须接å—一个 [Array] å‚" +"数,它将包å«JavaScript [code]arguments[/code]ã€‚ç”¨æ³•è§ [JavaScriptObject]。" #: doc/classes/JavaScript.xml msgid "" @@ -39796,7 +39885,8 @@ msgstr "" #: doc/classes/Joint2D.xml msgid "" "If [code]true[/code], [member node_a] and [member node_b] can not collide." -msgstr "如果为 [code]true[/code],[member node_a]å’Œ[member node_b]ä¸èƒ½ç¢°æ’žã€‚" +msgstr "" +"如果为 [code]true[/code],则 [member node_a] å’Œ [member node_b] æ— æ³•ç¢°æ’žã€‚" #: doc/classes/Joint2D.xml msgid "The first body attached to the joint. Must derive from [PhysicsBody2D]." @@ -39805,7 +39895,7 @@ msgstr "连接到关节的第一个实体。必须继承自 [PhysicsBody2D] 。" #: doc/classes/Joint2D.xml msgid "" "The second body attached to the joint. Must derive from [PhysicsBody2D]." -msgstr "连接到关节的第二实体。必须继承自 [PhysicsBody2D]。" +msgstr "连接到关节的第二个实体。必须继承自 [PhysicsBody2D]。" #: doc/classes/JSON.xml msgid "Helper class for parsing JSON data." @@ -40009,10 +40099,10 @@ msgid "" "standard on top of [Dictionary]; you will have to convert between a " "[Dictionary] and [JSON] with other functions." msgstr "" -"[url=https://www.jsonrpc.org/]JSON-RPC[/url]æ˜¯ä¸€ä¸ªæ ‡å‡†ï¼Œå®ƒå°†ä¸€ä¸ªæ–¹æ³•è°ƒç”¨åŒ…è£…" -"在一个[JSON]对象ä¸ã€‚è¯¥å¯¹è±¡æœ‰ä¸€ä¸ªç‰¹å®šçš„ç»“æž„ï¼Œå¹¶æ ‡è¯†å‡ºå“ªä¸ªæ–¹æ³•è¢«è°ƒç”¨ï¼Œè¯¥å‡½æ•°çš„" -"傿•°ï¼Œå¹¶æºå¸¦ä¸€ä¸ªIDæ¥è·Ÿè¸ªå“应。这个类在[Dictionary]ä¹‹ä¸Šå®žçŽ°äº†è¯¥æ ‡å‡†ï¼›ä½ å¿…é¡»ç”¨" -"其他函数在[Dictionary]å’Œ[JSON]之间进行转æ¢ã€‚" +"[url=https://www.jsonrpc.org/]JSON-RPC[/url] æ˜¯ä¸€é¡¹æ ‡å‡†ï¼Œå®ƒå°†æ–¹æ³•è°ƒç”¨åŒ…è£…åœ¨ä¸€" +"个 [JSON] 对象ä¸ã€‚è¯¥å¯¹è±¡æœ‰ä¸€ä¸ªç‰¹å®šçš„ç»“æž„ï¼Œå¹¶æ ‡è¯†å‡ºå“ªä¸ªæ–¹æ³•è¢«è°ƒç”¨ï¼Œè¯¥å‡½æ•°çš„å‚" +"数,并æºå¸¦ä¸€ä¸ª ID æ¥è·Ÿè¸ªå“应。这个类在 [Dictionary] ä¹‹ä¸Šå®žçŽ°äº†è¯¥æ ‡å‡†ï¼›ä½ å¿…é¡»" +"用其他函数在 [Dictionary] å’Œ [JSON] 之间进行转æ¢ã€‚" #: doc/classes/JSONRPC.xml msgid "" @@ -40154,8 +40244,8 @@ msgid "" "move_and_slide_with_snap] and when [method is_on_floor] returns [code]true[/" "code]." msgstr "" -"返回最åŽä¸€ä¸ªç¢°æ’žç‚¹çš„地æ¿çš„è¡¨é¢æ³•çº¿ã€‚åªæœ‰åœ¨è°ƒç”¨[method move_and_slide]或" -"[method move_and_slide_with_snap]åŽï¼Œä»¥åŠ[method is_on_floor]返回 " +"返回最åŽä¸€ä¸ªç¢°æ’žç‚¹çš„地æ¿çš„è¡¨é¢æ³•çº¿ã€‚åªæœ‰åœ¨è°ƒç”¨ [method move_and_slide] 或 " +"[method move_and_slide_with_snap] åŽï¼Œä»¥åŠ [method is_on_floor] 返回 " "[code]true[/code] æ—¶æ‰æœ‰æ•ˆã€‚" #: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml @@ -40326,8 +40416,8 @@ msgid "" "[code]lock[/code]. See also [member move_lock_x], [member move_lock_y] and " "[member move_lock_z]." msgstr "" -"æ ¹æ®[code]lock[/code]的值,é”å®šæˆ–è§£é”æŒ‡å®šçš„[code]axis[/code]。å‚阅[member " -"move_lock_x]ã€[member move_lock_y]å’Œ[member move_lock_z]。" +"æ ¹æ® [code]lock[/code] 的值,é”å®šæˆ–è§£é”æŒ‡å®šçš„ [code]axis[/code]。å¦è¯·å‚阅 " +"[member move_lock_x]ã€[member move_lock_y] å’Œ [member move_lock_z]。" #: doc/classes/KinematicBody.xml msgid "" @@ -40369,8 +40459,8 @@ msgid "" "scale to avoid visible jittering, or for stability with a stack of kinematic " "bodies." msgstr "" -"在è¿åŠ¨å‡½æ•°ä¸ç”¨äºŽç¢°æ’žæ¢å¤çš„é¢å¤–è¾¹è·ï¼Œå‚阅 [method move_and_collide]ã€[method " -"move_and_slide]ã€[method move_and_slide_with_snap]。\n" +"在è¿åŠ¨å‡½æ•°ä¸ç”¨äºŽç¢°æ’žæ¢å¤çš„é¢å¤–è¾¹è·ï¼ˆè§ [method move_and_collide]ã€[method " +"move_and_slide]ã€[method move_and_slide_with_snap])。\n" "如果物体离å¦ä¸€ä¸ªç‰©ä½“至少这么近,它就会认为它们æ£åœ¨å‘生碰撞,并在执行实际è¿åЍ" "之å‰è¢«æŽ¨å¼€ã€‚\n" "一个较高的值æ„味ç€å®ƒåœ¨æ£€æµ‹ç¢°æ’žæ—¶æ›´åŠ çµæ´»ï¼Œè¿™æœ‰åŠ©äºŽæŒç»æ£€æµ‹å¢™å£å’Œåœ°æ¿ã€‚\n" @@ -40384,9 +40474,9 @@ msgid "" "for example on moving platforms. Do [b]not[/b] use together with [method " "move_and_slide] or [method move_and_collide] functions." msgstr "" -"如果为 [code]true[/code],则物体的è¿åŠ¨å°†ä¸Žç‰©ç†å¸§åŒæ¥ã€‚当通过[AnimationPlayer]" -"为è¿åŠ¨è®¾ç½®åŠ¨ç”»æ—¶ï¼Œä¾‹å¦‚åœ¨ç§»åŠ¨å¹³å°ä¸Šï¼Œè¿™ä¸ªåŠŸèƒ½å¾ˆæœ‰ç”¨ã€‚è¯·[b]ä¸è¦[/b]与 [method " -"move_and_slide] 或 [method move_and_collide] 函数一起使用。" +"如果为 [code]true[/code],则物体的è¿åŠ¨å°†ä¸Žç‰©ç†å¸§åŒæ¥ã€‚当通过 " +"[AnimationPlayer] 为è¿åŠ¨è®¾ç½®åŠ¨ç”»æ—¶ï¼Œä¾‹å¦‚åœ¨ç§»åŠ¨å¹³å°ä¸Šï¼Œè¿™ä¸ªåŠŸèƒ½å¾ˆæœ‰ç”¨ã€‚è¯·[b]ä¸" +"è¦[/b]与 [method move_and_slide] 或 [method move_and_collide] 函数一起使用。" #: doc/classes/KinematicBody.xml msgid "" @@ -40455,14 +40545,14 @@ msgid "" "characters that collide against a world, but don't require advanced physics." msgstr "" "è¿åŠ¨ä½“æ˜¯ç‰¹æ®Šç±»åž‹çš„ç‰©ä½“ï¼Œæ—¨åœ¨è®©ç”¨æˆ·æŽ§åˆ¶ã€‚å®ƒä»¬å®Œå…¨ä¸å—物ç†å½±å“;对于其他类型的" -"ç‰©ä½“ï¼Œå¦‚è§’è‰²æˆ–åˆšä½“ï¼Œå®ƒä»¬ä¸Žé™æ€ä½“ä¸€æ ·ã€‚ç„¶è€Œï¼Œå®ƒä»¬æœ‰ä¸¤ä¸ªä¸»è¦ç”¨é€”:\n" -"[b]模拟è¿åŠ¨ï¼š[/b]å½“è¿™äº›ç‰©ä½“è¢«æ‰‹åŠ¨ç§»åŠ¨æ—¶ï¼Œæ— è®ºæ˜¯ä»Žä»£ç 还是从" -"[AnimationPlayer],将[member AnimationPlayer.playback_process_mode]设置为 " -"\"physics\",物ç†å°†è‡ªåŠ¨è®¡ç®—å…¶çº¿æ€§å’Œè§’é€Ÿåº¦çš„ä¼°å€¼ã€‚è¿™ä½¿å¾—å®ƒä»¬å¯¹äºŽç§»åŠ¨å¹³å°æˆ–å…¶ä»–" -"AnimationPlayer控制的物体éžå¸¸æœ‰ç”¨ï¼Œæ¯”如一扇门ã€ä¸€åº§èƒ½æ‰“开的桥ç‰ã€‚\n" -"[b]è¿åŠ¨åž‹è§’è‰²ï¼š[/b] KinematicBody2D也有一个API用于移动物体([method " -"move_and_collide]å’Œ[method move_and_slide]æ–¹æ³•ï¼‰ï¼ŒåŒæ—¶è¿›è¡Œç¢°æ’žæµ‹è¯•。这使得它" -"们在实现对世界进行碰撞,但ä¸éœ€è¦é«˜çº§ç‰©ç†çš„角色时éžå¸¸æœ‰ç”¨ã€‚" +"ç‰©ä½“ï¼Œå¦‚è§’è‰²æˆ–åˆšä½“ï¼Œå®ƒä»¬ä¸Žé™æ€ä½“ä¸€æ ·ã€‚ç„¶è€Œï¼Œå®ƒä»¬æœ‰ä¸¤ä¸ªä¸»è¦ç”¨é€”:\n" +"[b]模拟è¿åŠ¨ï¼š[/b]å½“è¿™äº›ç‰©ä½“è¢«æ‰‹åŠ¨ç§»åŠ¨æ—¶ï¼Œæ— è®ºæ˜¯ä»Žä»£ç 还是从 " +"[AnimationPlayer],将 [member AnimationPlayer.playback_process_mode] 设置" +"为“physicsâ€ï¼Œç‰©ç†å°†è‡ªåŠ¨è®¡ç®—å…¶çº¿æ€§å’Œè§’é€Ÿåº¦çš„ä¼°å€¼ã€‚è¿™ä½¿å¾—å®ƒä»¬å¯¹äºŽç§»åŠ¨å¹³å°æˆ–å…¶" +"ä»– AnimationPlayer 控制的物体éžå¸¸æœ‰ç”¨ï¼Œæ¯”如门ã€åŠæ¡¥ç‰ã€‚\n" +"[b]è¿åЍå¦è§’色:[/b]KinematicBody2D 也有一个 API 用于移动物体([method " +"move_and_collide] å’Œ [method move_and_slide] æ–¹æ³•ï¼‰ï¼ŒåŒæ—¶è¿›è¡Œç¢°æ’žæµ‹è¯•。这使得" +"它们在实现对世界进行碰撞,但ä¸éœ€è¦é«˜çº§ç‰©ç†çš„角色时éžå¸¸æœ‰ç”¨ã€‚" #: doc/classes/KinematicBody2D.xml msgid "Using KinematicBody2D" @@ -41028,8 +41118,8 @@ msgid "" "sorted from back to front (subject to priority)." msgstr "" "设置文本轮廓的渲染优先级。优先级高的物体将被排åºåœ¨ä¼˜å…ˆçº§ä½Žçš„物体å‰é¢ã€‚\n" -"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant " -"ALPHA_CUT_DISABLED](默认值)时适用。\n" +"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant ALPHA_CUT_DISABLED](默认" +"值)时适用。\n" "[b]注æ„:[/b]ä»…é€‚ç”¨äºŽé€æ˜Žç‰©ä½“的排åºã€‚è¿™ä¸ä¼šå½±å“逿˜Žç‰©ä½“相对于ä¸é€æ˜Žç‰©ä½“的排åº" "æ–¹å¼ã€‚è¿™æ˜¯å› ä¸ºä¸é€æ˜Žå¯¹è±¡ä¸è¢«æŽ’åºï¼Œè€Œé€æ˜Žå¯¹è±¡åˆ™ä»ŽåŽå¾€å‰æŽ’åºï¼ˆå–决于优先级)。" @@ -41049,8 +41139,8 @@ msgid "" "sorted from back to front (subject to priority)." msgstr "" "设置文本的渲染优先级。优先级高的物体将被排åºåœ¨ä¼˜å…ˆçº§ä½Žçš„物体å‰é¢ã€‚\n" -"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant " -"ALPHA_CUT_DISABLED](默认值)时适用。\n" +"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant ALPHA_CUT_DISABLED](默认" +"值)时适用。\n" "[b]注æ„:[/b]ä»…é€‚ç”¨äºŽé€æ˜Žç‰©ä½“的排åºã€‚è¿™ä¸ä¼šå½±å“逿˜Žç‰©ä½“相对于ä¸é€æ˜Žç‰©ä½“的排åº" "æ–¹å¼ã€‚è¿™æ˜¯å› ä¸ºä¸é€æ˜Žå¯¹è±¡ä¸è¢«æŽ’åºï¼Œè€Œé€æ˜Žå¯¹è±¡åˆ™ä»ŽåŽå¾€å‰æŽ’åºï¼ˆå–决于优先级)。" @@ -41657,42 +41747,40 @@ msgstr "" #: doc/classes/Line2D.xml 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 "" -"在 [code]position[/code] æ·»åŠ ç‚¹ã€‚å°†ç‚¹è¿½åŠ åˆ°ç›´çº¿çš„æœ«å°¾ã€‚\n" -"如果给定了ä½ç½® [code]at_position[/code],则在ä½ç½® [code]at_position[/code] 之" -"剿’入该点,并将该点(以åŠä¹‹åŽçš„æ¯ä¸ªç‚¹ï¼‰ç§»åŠ¨åˆ°æ’入点之åŽã€‚如果未给出ä½ç½®å¤„çš„ " -"[code]at_position[/code]ï¼Œæˆ–è€…æ˜¯éžæ³•值([code]at_position < 0[/code] 或 " -"[code]at_position >= [method get_point_count][/code]ï¼‰ï¼Œåˆ™è¯¥ç‚¹å°†è¿½åŠ åˆ°ç‚¹åˆ—è¡¨" -"的末尾。" +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." +msgstr "" #: doc/classes/Line2D.xml msgid "Removes all points from the line." msgstr "移除直线上的所有点。" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "返回该 Line2D 上点的数é‡ã€‚" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "返回骨架ä¸çš„骨骼数é‡ã€‚" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "返回点 [code]i[/code] çš„ä½ç½®ã€‚" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "返回索引 [code]point[/code] 处的点的ä½ç½®ã€‚" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." msgstr "将索引 [code]i[/code] 处的点从直线ä¸ç§»é™¤ã€‚" #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." msgstr "" "用æä¾›çš„ [code]position[/code] ä½ç½®è¦†ç›–索引 [code]i[/code] 处点的ä½ç½®ã€‚" @@ -42323,7 +42411,7 @@ msgstr "" #: doc/classes/LinkButton.xml msgid "" "Determines when to show the underline. See [enum UnderlineMode] for options." -msgstr "决定何时显示下划线。å‚阅 [enum UnderlineMode] 的选项。" +msgstr "决定何时显示下划线。å¯é€‰é¡¹è§ [enum UnderlineMode]。" #: doc/classes/LinkButton.xml msgid "The LinkButton will always show an underline at the bottom of its text." @@ -42992,7 +43080,7 @@ msgstr "" #: doc/classes/MenuButton.xml msgid "Emitted when [PopupMenu] of this MenuButton is about to show." -msgstr "å½“æ¤ MenuButton çš„ [PopupMenu] å³å°†æ˜¾ç¤ºæ—¶è§¦å‘。" +msgstr "当这个 MenuButton çš„ [PopupMenu] å³å°†æ˜¾ç¤ºæ—¶è§¦å‘。" #: doc/classes/MenuButton.xml msgid "Default text [Color] of the [MenuButton]." @@ -43590,13 +43678,14 @@ msgid "Node that instances meshes into a scenario." msgstr "ç½‘æ ¼å®žä¾‹ä¸Žåœºæ™¯ç›¸ç»“åˆçš„节点。" #: doc/classes/MeshInstance.xml +#, fuzzy 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" "MeshInstance æ˜¯ä¸€ä¸ªèŠ‚ç‚¹ï¼Œå®ƒèŽ·å– [Mesh] 资æºå¹¶åˆ›å»ºä¸€ä¸ªå®žä¾‹ï¼Œå°†å…¶æ·»åŠ åˆ°å½“å‰åœºæ™¯" "ä¸ã€‚è¿™æ˜¯æœ€å¸¸è¢«ç”¨æ¥æ¸²æŸ“ 3D å‡ ä½•ä½“çš„ç±»ï¼Œè¿™å¯ä»¥åœ¨å¾ˆå¤šåœ°æ–¹ä½¿ç”¨ [Mesh] 实例,它å…" @@ -43798,8 +43887,8 @@ msgid "" "The [Texture] that will be used if using the default [CanvasItemMaterial]. " "Can be accessed as [code]TEXTURE[/code] in CanvasItem shader." msgstr "" -"如果使用默认的[CanvasItemMaterial],就会使用[Texture]。å¯ä»¥åœ¨CanvasItemç€è‰²å™¨" -"ä¸ä½œä¸º[code]TEXTURE[/code]访问。" +"如果使用默认的 [CanvasItemMaterial],就会使用 [Texture]。å¯ä»¥åœ¨ CanvasItem ç€" +"色器ä¸ä½œä¸º [code]TEXTURE[/code] 访问。" #: doc/classes/MeshInstance2D.xml doc/classes/MultiMeshInstance2D.xml msgid "Emitted when the [member texture] is changed." @@ -44169,12 +44258,15 @@ msgstr "" "set_as_bulk_array] 也å¯ä»¥è¿›è¡Œæ’值。" #: doc/classes/MultiMesh.xml +#, fuzzy msgid "" "Sets the color of a specific instance by [i]multiplying[/i] the mesh's " "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" "通过[i]乘以[/i]ç½‘æ ¼çš„çŽ°æœ‰é¡¶ç‚¹é¢œè‰²æ¥è®¾ç½®ç‰¹å®šå®žä¾‹çš„颜色。\n" "为了使颜色生效,请确ä¿[MultiMesh]上的[member color_format]䏿˜¯[code]null[/" @@ -44435,7 +44527,7 @@ msgid "" "[code]id[/code] (see [method NetworkedMultiplayerPeer.set_target_peer]). " "Default ID is [code]0[/code], i.e. broadcast to all peers." msgstr "" -"将给定的原始å—节 [code]bytes[/code]å‘é€åˆ°ç”± [code]id[/code] 确定的特定对ç‰ä½“" +"将给定的原始å—节 [code]bytes[/code] å‘é€åˆ°ç”± [code]id[/code] 确定的特定对ç‰ä½“" "ï¼ˆè§ [method NetworkedMultiplayerPeer.set_target_peer])。默认 ID 是 " "[code]0[/code],å³å‘所有对ç‰ä½“广æ’。" @@ -44621,7 +44713,7 @@ msgid "" "Behave like [constant RPC_MODE_MASTER] but also make the call or property " "change locally. Analogous to the [code]mastersync[/code] keyword." msgstr "" -"类似于 [constant RPC_MODE_MASTER]ï¼Œä½†ä¹Ÿä½¿æ–¹æ³•è°ƒç”¨æˆ–å±žæ€§æ”¹å˜æœ¬åœ°ã€‚类似于 " +"行为类似于 [constant RPC_MODE_MASTER]ï¼Œä½†ä¹Ÿä½¿æ–¹æ³•è°ƒç”¨æˆ–å±žæ€§æ”¹å˜æœ¬åœ°ã€‚类似于 " "[code]mastersync[/code] 关键å—。" #: doc/classes/MultiplayerAPI.xml @@ -44663,9 +44755,9 @@ msgid "" "[b]Note:[/b] This function returns [constant OK] if the thread already has " "ownership of the mutex." msgstr "" -"试图é”定æ¤[Mutex],但并ä¸é˜»å¡žã€‚æˆåŠŸæ—¶è¿”å›ž[constant OK],å¦åˆ™è¿”回[constant " +"试图é”å®šæ¤ [Mutex],但并ä¸é˜»å¡žã€‚æˆåŠŸæ—¶è¿”å›ž [constant OK],å¦åˆ™è¿”回 [constant " "ERR_BUSY]。\n" -"[b]注æ„:[/b]å¦‚æžœçº¿ç¨‹å·²ç»æ‹¥æœ‰äº†è¯¥Mutex的所有æƒï¼Œè¯¥å‡½æ•°è¿”回[constant OK]。" +"[b]注æ„:[/b]å¦‚æžœçº¿ç¨‹å·²ç»æ‹¥æœ‰äº†è¯¥ Mutex 的所有æƒï¼Œè¯¥å‡½æ•°è¿”回 [constant OK]。" #: doc/classes/Mutex.xml msgid "" @@ -44720,7 +44812,7 @@ msgid "" msgstr "" "æž„å»ºåŸºç¡€ç±»åž‹çš„æ–°å¯¹è±¡ï¼Œå¹¶é™„åŠ æ¤ç±»åž‹çš„脚本。\n" "[b]注æ„:[/b]ä¼ é€’ç»™è¿™ä¸ªå‡½æ•°çš„ä»»ä½•å‚æ•°å°†è¢«å¿½ç•¥ï¼Œä¸ä¼šä¼ é€’ç»™å±€éƒ¨æž„é€ å‡½æ•°ã€‚è¿™å°†åœ¨" -"未æ¥çš„APIæ‰©å±•ä¸æ”¹å˜ã€‚" +"未æ¥çš„ API æ‰©å±•ä¸æ”¹å˜ã€‚" #: doc/classes/Navigation.xml msgid "Mesh-based navigation and pathfinding node." @@ -45475,7 +45567,7 @@ msgstr "忽略 Y 轴上的碰撞。在水平é¢ä¸Šç§»åŠ¨æ—¶å¿…é¡»ä¸º [code]true[ #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "The maximum number of neighbors for the agent to consider." -msgstr "ä»£ç†æ‰€éœ€è€ƒè™‘的最大邻居数。" +msgstr "è¯¥ä»£ç†æ‰€éœ€è€ƒè™‘的最大邻居数。" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "The maximum speed that an agent can move." @@ -45576,9 +45668,10 @@ msgid "" msgstr "抵达由 [method set_target_location] è®¾ç½®çš„çŽ©å®¶å®šä¹‰ç›®æ ‡æ—¶å‘出通知。" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +#, fuzzy msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "调用 [method set_velocity] åŽï¼Œè®¡ç®—出防撞速度时å‘出通知。" #: doc/classes/NavigationAgent2D.xml @@ -45680,14 +45773,14 @@ msgid "" "environment are traversable to aid agents in pathfinding through complicated " "spaces." msgstr "" -"å¯¼èˆªç½‘æ ¼æ˜¯å¤šè¾¹å½¢çš„é›†åˆï¼Œç”¨äºŽå®šä¹‰çŽ¯å¢ƒä¸çš„哪些区域是å¯é历的,以帮助代ç†åœ¨å¤æ‚" +"å¯¼èˆªç½‘æ ¼æ˜¯å¤šè¾¹å½¢çš„é›†åˆï¼Œç”¨äºŽå®šä¹‰çŽ¯å¢ƒä¸çš„哪些区域是å¯ä»¥ç©¿è¶Šçš„,帮助代ç†åœ¨å¤æ‚" "的空间ä¸å¯»è·¯ã€‚" #: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml msgid "" "Adds a polygon using the indices of the vertices you get when calling " "[method get_vertices]." -msgstr "使用调用[method get_vertices]å¾—åˆ°çš„é¡¶ç‚¹çš„ç´¢å¼•æ·»åŠ ä¸€ä¸ªå¤šè¾¹å½¢ã€‚" +msgstr "使用调用 [method get_vertices] å¾—åˆ°çš„é¡¶ç‚¹çš„ç´¢å¼•æ·»åŠ ä¸€ä¸ªå¤šè¾¹å½¢ã€‚" #: doc/classes/NavigationMesh.xml msgid "" @@ -45711,7 +45804,7 @@ msgstr "" msgid "" "Returns a [PoolIntArray] containing the indices of the vertices of a created " "polygon." -msgstr "返回包å«åˆ›å»ºçš„多边形顶点索引的[PoolIntArray]。" +msgstr "返回包å«åˆ›å»ºçš„多边形顶点索引的 [PoolIntArray]。" #: doc/classes/NavigationMesh.xml msgid "Returns the number of polygons in the navigation mesh." @@ -45721,7 +45814,7 @@ msgstr "è¿”å›žå¯¼èˆªç½‘æ ¼ä¸çš„多边形数é‡ã€‚" msgid "" "Returns a [PoolVector3Array] containing all the vertices being used to " "create the polygons." -msgstr "返回包å«ç”¨äºŽåˆ›å»ºå¤šè¾¹å½¢çš„æ‰€æœ‰é¡¶ç‚¹çš„[PoolVector3Array]。" +msgstr "返回包å«ç”¨äºŽåˆ›å»ºå¤šè¾¹å½¢çš„æ‰€æœ‰é¡¶ç‚¹çš„ [PoolVector3Array]。" #: doc/classes/NavigationMesh.xml msgid "" @@ -45739,7 +45832,7 @@ msgstr "" msgid "" "Sets the vertices that can be then indexed to create polygons with the " "[method add_polygon] method." -msgstr "设置顶点,然åŽä½¿ç”¨ [method add_polygon] 方法创建多边形。" +msgstr "设置顶点,å¯ä»¥ä½¿ç”¨ [method add_polygon] 方法对其进行索引,创建多边形。" #: doc/classes/NavigationMesh.xml msgid "" @@ -45781,7 +45874,7 @@ msgstr "ç”¨äºŽå—æ®µ Y è½´å•元的尺寸。" #: doc/classes/NavigationMesh.xml msgid "" "The sampling distance to use when generating the detail mesh, in cell unit." -msgstr "生æˆç»†åˆ†ç½‘æ ¼æ—¶ä½¿ç”¨çš„é‡‡æ ·è·ç¦»ï¼Œä»¥å•元为å•ä½ã€‚" +msgstr "生æˆç»†åˆ†ç½‘æ ¼æ—¶ä½¿ç”¨çš„é‡‡æ ·è·ç¦»ï¼Œä»¥å•å…ƒæ ¼ä¸ºå•ä½ã€‚" #: doc/classes/NavigationMesh.xml msgid "" @@ -45802,7 +45895,7 @@ msgid "" "multiple of [member cell_size]." msgstr "" "æ²¿ç½‘æ ¼è¾¹ç•Œçš„è½®å»“çš„æœ€å¤§å…许长度。\n" -"[b]注æ„:[/b]烘焙时,这个值会å‘ä¸Šå–æ•´åˆ°æœ€æŽ¥è¿‘çš„[member cell_size]çš„å€æ•°ã€‚" +"[b]注æ„:[/b]烘焙时,这个值会å‘ä¸Šå–æ•´åˆ°æœ€æŽ¥è¿‘çš„ [member cell_size] çš„å€æ•°ã€‚" #: doc/classes/NavigationMesh.xml msgid "" @@ -45856,7 +45949,7 @@ msgstr "" msgid "" "The source of the geometry used when baking. See [enum SourceGeometryMode] " "for possible values." -msgstr "çƒ˜ç„™æ—¶ä½¿ç”¨çš„å‡ ä½•ä½“çš„æºã€‚å¯èƒ½çš„å–å€¼è§ [enum SourceGeometryMode]。" +msgstr "çƒ˜ç„™æ—¶ä½¿ç”¨çš„å‡ ä½•ä½“çš„æ¥æºã€‚å¯èƒ½çš„å–å€¼è§ [enum SourceGeometryMode]。" #: doc/classes/NavigationMesh.xml msgid "" @@ -45865,7 +45958,7 @@ msgid "" "SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN] or [constant " "SOURCE_GEOMETRY_GROUPS_EXPLICIT]." msgstr "" -"è¦æ‰«æçš„å‡ ä½•ä½“ç»„çš„å称。\n" +"分组的åç§°ï¼Œä¼šåœ¨è¯¥åˆ†ç»„ä¸æ‰«æå‡ 何体。\n" "åªæœ‰å½“ [member geometry_source_geometry_mode] 是 [constant " "SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN] 或 [constant " "SOURCE_GEOMETRY_GROUPS_EXPLICIT] æ—¶æ‰ä½¿ç”¨ã€‚" @@ -45884,8 +45977,8 @@ msgid "" "For example, a value of 20 will set the number of cells to 400." msgstr "" "如果å¯èƒ½çš„è¯ï¼Œä»»ä½•å°äºŽè¿™ä¸ªå°ºå¯¸çš„区域将与较大的区域åˆå¹¶ã€‚\n" -"[b]注æ„:[/b]这个值将被平方æ¥è®¡ç®—å•å…ƒæ ¼çš„æ•°é‡ã€‚例如,一个20的值将把å•å…ƒæ ¼çš„æ•°" -"é‡è®¾ä¸º400。" +"[b]注æ„:[/b]这个值将被平方æ¥è®¡ç®—å•å…ƒæ ¼çš„æ•°é‡ã€‚例如,值为 20 时将把å•å…ƒæ ¼çš„æ•°" +"é‡è®¾ä¸º 400。" #: doc/classes/NavigationMesh.xml msgid "" @@ -46093,13 +46186,13 @@ msgid "" "The cost of traveling distances inside this region can be controlled with " "the [member travel_cost] multiplier." msgstr "" -"[NavigationMesh] 的实例。[Navigation] èŠ‚ç‚¹æ ¹æ®å®ƒçš„ [NavigationMesh] " -"èµ„æºæ¥ç¡®å®šå“ªäº›å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" +"[NavigationMesh] 的实例。[Navigation] èŠ‚ç‚¹æ ¹æ®å®ƒçš„ [NavigationMesh] èµ„æºæ¥ç¡®" +"定哪些å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" "默认情况下,这个节点会在默认的 [World] 导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚如果这个节点是 " "[Navigation] 节点的å项,就会在该导航节点的导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚\n" "如果两个地图共享类似的边界,就å¯ä»¥ç›¸äº’è¿žæŽ¥ã€‚ä½ å¯ä»¥é€šè¿‡ [method " -"NavigationServer.map_set_edge_connection_margin] " -"设置两个顶点连接两æ¡è¾¹ç•Œæ‰€éœ€çš„æœ€å°è·ç¦»ã€‚\n" +"NavigationServer.map_set_edge_connection_margin] 设置两个顶点连接两æ¡è¾¹ç•Œæ‰€éœ€" +"的最å°è·ç¦»ã€‚\n" "[b]注æ„:[/b]å°†ä¸¤ä¸ªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼ç›¸äº’é‡å å¹¶ä¸è¶³ä»¥å°†å…¶ç›¸è¿žã€‚它们必须共享类似的" "边界。\n" "从å¦ä¸€ä¸ªåœ°åŒºè¿›å…¥è¿™ä¸ªåœ°å›¾çš„æ¶ˆè€—å¯ä»¥é€šè¿‡ [member enter_cost] 进行控制。\n" @@ -46430,13 +46523,13 @@ msgid "" "The pathfinding cost of traveling distances inside this region can be " "controlled with the [member travel_cost] multiplier." msgstr "" -"导航地图上的地区。[Navigation2DServer] æ ¹æ®å®ƒçš„ [NavigationPolygon] " -"èµ„æºæ¥ç¡®å®šå“ªäº›å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" +"导航地图上的地区。[Navigation2DServer] æ ¹æ®å®ƒçš„ [NavigationPolygon] èµ„æºæ¥ç¡®" +"定哪些å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" "默认情况下,这个节点会在默认的 [World2D] 导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚如果这个节点是 " "[Navigation2D] 节点的å项,就会在该导航节点的导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚\n" "如果两个地图共享类似的边界,就å¯ä»¥ç›¸äº’è¿žæŽ¥ã€‚ä½ å¯ä»¥é€šè¿‡ [method " -"Navigation2DServer.map_set_edge_connection_margin] " -"设置两个顶点连接两æ¡è¾¹ç•Œæ‰€éœ€çš„æœ€å°è·ç¦»ã€‚\n" +"Navigation2DServer.map_set_edge_connection_margin] 设置两个顶点连接两æ¡è¾¹ç•Œæ‰€" +"需的最å°è·ç¦»ã€‚\n" "[b]注æ„:[/b]å°†ä¸¤ä¸ªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼ç›¸äº’é‡å å¹¶ä¸è¶³ä»¥å°†å…¶ç›¸è¿žã€‚它们必须共享类似的" "边界。\n" "从å¦ä¸€ä¸ªåœ°åŒºè¿›å…¥è¿™ä¸ªåœ°å›¾çš„寻路消耗å¯ä»¥é€šè¿‡ [member enter_cost] 进行控制。\n" @@ -46610,15 +46703,26 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." -msgstr "使用给定的 [code]peer_id[/code] åˆå§‹åŒ–该对ç‰ä½“(必须在 1 å’Œ 2147483647 " -"之间)。" +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." +msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." -msgstr "设置连接的状æ€ã€‚è§ [enum NetworkedMultiplayerPeer.ConnectionStatus]。" +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." +msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "Set the max packet size that this peer can handle." @@ -46632,15 +46736,15 @@ msgid "" "it's received)." msgstr "" "当本地 [MultiplayerAPI] ç”Ÿæˆæ•°æ®åŒ…时触å‘。\n" -"ä½ çš„è„šæœ¬åº”å½“èŽ·å–这个数æ®åŒ…并将其通过网络å‘é€ç»™è¯·æ±‚的对ç‰ä½“(" -"å¯¹æ–¹æ”¶åˆ°è¯¥æ•°æ®æ—¶åº”当调用 [method deliver_packet])。" +"ä½ çš„è„šæœ¬åº”å½“èŽ·å–这个数æ®åŒ…并将其通过网络å‘é€ç»™è¯·æ±‚的对ç‰ä½“ï¼ˆå¯¹æ–¹æ”¶åˆ°è¯¥æ•°æ®æ—¶" +"应当调用 [method deliver_packet])。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" "PacketPeer implementation using the [url=http://enet.bespin.org/index." "html]ENet[/url] library." msgstr "" -"使用[url=http://enet.bespin.org/index.html]ENet[/url]库实现PacketPeer。" +"使用 [url=http://enet.bespin.org/index.html]ENet[/url] 库实现 PacketPeer。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -46772,8 +46876,9 @@ msgid "" "needs to be in IPv4 or IPv6 address format, for example: " "[code]\"192.168.1.1\"[/code]." msgstr "" -"创建æœåŠ¡å™¨æ—¶ä½¿ç”¨çš„IP。默认情况下,这被设置为通é…符[code]\"*\"[/code],它绑定" -"到所有å¯ç”¨çš„æŽ¥å£ã€‚IPåœ°å€æ ¼å¼ä¸ºIPv4或IPv6,例如:[code]\"192.168.1.1\"[/code]。" +"创建æœåŠ¡å™¨æ—¶ä½¿ç”¨çš„ IP。默认情况下,这被设置为通é…符 [code]\"*\"[/code],它绑" +"定到所有å¯ç”¨çš„æŽ¥å£ã€‚给定的 IP åœ°å€æ ¼å¼éœ€è¦æ˜¯ IPv4 或 IPv6,例如:" +"[code]\"192.168.1.1\"[/code]。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -46932,8 +47037,8 @@ msgid "" "requiring the fewest CPU resources. This option may also be used to make " "network debugging using tools like Wireshark easier." msgstr "" -"æ— åŽ‹ç¼©ã€‚è¿™ä½¿ç”¨æœ€å¤šçš„å¸¦å®½ï¼Œä½†å…·æœ‰å 用最少 CPU 资æºçš„好处。这个选项å¯ä»¥ç”¨äºŽ" -"Wiresharkç‰å·¥å…·ä½¿ç”¨ï¼Œæ›´å®¹æ˜“进行网络调试。" +"æ— åŽ‹ç¼©ã€‚è¿™ä½¿ç”¨æœ€å¤šçš„å¸¦å®½ï¼Œä½†å…·æœ‰å 用最少 CPU 资æºçš„好处。这个选项å¯ä»¥ç”¨äºŽ " +"Wireshark ç‰å·¥å…·ä½¿ç”¨ï¼Œæ›´å®¹æ˜“进行网络调试。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -46960,13 +47065,13 @@ msgid "" "packets smaller than 4 KB. Therefore, it's recommended to use other " "compression algorithms in most cases." msgstr "" -"[url=https://www.zlib.net/]Zlib[/url]压缩。与 [constant COMPRESS_FASTLZ] 相" +"[url=https://www.zlib.net/]Zlib[/url] 压缩。与 [constant COMPRESS_FASTLZ] 相" "比,这个选项使用较少的带宽,但代价是使用更多的 CPU 资æºã€‚请注æ„,这ç§ç®—法对å°" "于4KB的数æ®åŒ…䏿˜¯å¾ˆæœ‰æ•ˆã€‚å› æ¤ï¼Œå»ºè®®åœ¨å¤§å¤šæ•°æƒ…况下使用其他压缩算法。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "[url=https://facebook.github.io/zstd/]Zstandard[/url] compression." -msgstr "[url=https://facebook.github.io/zstd/]Zstandard[/url]压缩。" +msgstr "[url=https://facebook.github.io/zstd/]Zstandard[/url] 压缩。" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "A high-level network interface to simplify multiplayer interactions." @@ -47068,8 +47173,8 @@ msgid "" "consider whether the order matters." msgstr "" "æ•°æ®åŒ…ä¸è¢«ç¡®è®¤ï¼Œå¯¹ä¸¢å¤±çš„æ•°æ®åŒ…ä¸è¿›è¡Œé‡å‘å°è¯•。数æ®åŒ…å¯ä»¥ä»¥ä»»ä½•顺åºåˆ°è¾¾ã€‚å¯èƒ½" -"比[constant TRANSFER_MODE_UNRELIABLE_ORDERED]快。用于éžå…³é”®æ•°æ®ï¼Œå¹¶æ³¨æ„考虑顺" -"åºæ˜¯å¦é‡è¦ã€‚" +"比 [constant TRANSFER_MODE_UNRELIABLE_ORDERED] 快。用于éžå…³é”®æ•°æ®ï¼Œå¹¶æ³¨æ„考虑" +"é¡ºåºæ˜¯å¦é‡è¦ã€‚" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "" @@ -47080,8 +47185,8 @@ msgid "" "example movement and positional data." msgstr "" "æ•°æ®åŒ…ä¸è¢«ç¡®è®¤ï¼Œå¯¹ä¸¢å¤±çš„æ•°æ®åŒ…ä¸è¿›è¡Œé‡å‘å°è¯•。数æ®åŒ…按其å‘é€é¡ºåºæŽ¥æ”¶ã€‚有å¯èƒ½" -"比[constant TRANSFER_MODE_RELIABLE]快。用于éžå…³é”®æ•°æ®æˆ–由于é‡å‘å°è¯•而迟迟ä¸èƒ½" -"收到的数æ®ï¼Œä¾‹å¦‚è¿åŠ¨å’Œä½ç½®æ•°æ®ã€‚" +"比 [constant TRANSFER_MODE_RELIABLE] 快。用于éžå…³é”®æ•°æ®æˆ–由于é‡å‘å°è¯•而迟迟ä¸" +"能收到的数æ®ï¼Œä¾‹å¦‚è¿åŠ¨å’Œä½ç½®æ•°æ®ã€‚" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "" @@ -47094,8 +47199,8 @@ msgid "" msgstr "" "æ•°æ®åŒ…必须被接收,并应进行é‡å‘å°è¯•,直到数æ®åŒ…被确认。数æ®åŒ…必须按照其å‘é€çš„" "é¡ºåºæŽ¥æ”¶ã€‚æœ€å¯é çš„ä¼ è¾“æ¨¡å¼ï¼Œä½†ç”±äºŽå¼€é”€å¾ˆå¤§ï¼Œå¯èƒ½æ˜¯æœ€æ…¢çš„。用于必须按顺åºä¼ 输" -"和到达的关键数æ®ï¼Œä¾‹å¦‚,æ£åœ¨è§¦å‘的能力或èŠå¤©ä¿¡æ¯ã€‚ä»”ç»†è€ƒè™‘ä¿¡æ¯æ˜¯å¦çœŸçš„æ˜¯å…³é”®" -"的,并尽é‡å°‘用。" +"和到达的关键数æ®ï¼Œä¾‹å¦‚触å‘的能力或èŠå¤©ä¿¡æ¯ã€‚ä»”ç»†è€ƒè™‘ä¿¡æ¯æ˜¯å¦çœŸçš„æ˜¯å…³é”®çš„,并" +"å°½é‡å°‘用。" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "The ongoing connection disconnected." @@ -47444,8 +47549,8 @@ msgstr "" "set_input_as_handled]。\n" "对于游æˆè¾“入,[method _unhandled_input] å’Œ [method _unhandled_key_input] 通常" "更适åˆï¼Œå› 为它们å…许 GUI 首先拦截事件。\n" -"[b]注æ„:[/b]è¿™ä¸ªæ–¹æ³•åªæœ‰åœ¨èŠ‚ç‚¹å˜åœ¨äºŽåœºæ™¯æ ‘䏿—¶æ‰ä¼šè¢«è°ƒç”¨ï¼ˆä¹Ÿå°±æ˜¯è¯´ï¼Œå¦‚果它" -"éžâ€œå¤å„¿â€ï¼‰ã€‚" +"[b]注æ„:[/b]è¿™ä¸ªæ–¹æ³•åªæœ‰åœ¨èŠ‚ç‚¹å˜åœ¨äºŽåœºæ™¯æ ‘䏿—¶æ‰ä¼šè¢«è°ƒç”¨ï¼ˆä¹Ÿå°±æ˜¯è¯´ï¼Œå¦‚果它ä¸" +"是“å¤å„¿â€ï¼‰ã€‚" #: doc/classes/Node.xml msgid "" @@ -47508,8 +47613,8 @@ msgid "" "call with [method request_ready], which may be called anywhere before adding " "the node again." msgstr "" -"å½“èŠ‚ç‚¹â€œå°±ç»ªâ€æ—¶è¢«è°ƒç”¨ã€‚å节点的 [method _ready] 回调会首先被触å‘,而父节点会在" -"ä¹‹åŽæ”¶åˆ°å°±ç»ªé€šçŸ¥ã€‚\n" +"å½“è¯¥èŠ‚ç‚¹â€œå°±ç»ªâ€æ—¶è¢«è°ƒç”¨ã€‚å节点的 [method _ready] 回调会首先被触å‘,而父节点会" +"åœ¨ä¹‹åŽæ”¶åˆ°å°±ç»ªé€šçŸ¥ã€‚\n" "对应于 [method Object._notification] ä¸çš„ [constant NOTIFICATION_READY] 通" "知。也请å‚阅å˜é‡çš„ [code]onready[/code] 关键å—。\n" "通常用于åˆå§‹åŒ–。对于更早的åˆå§‹åŒ–,å¯ä»¥ä½¿ç”¨ [method Object._init]。也请å‚阅 " @@ -47625,10 +47730,10 @@ msgid "" "will have a human-readable name based on the name of the node being " "instanced instead of its type." msgstr "" -"æ·»åŠ [code]child_node[/code]作为å节点。该å节点在å节点列表ä¸è¢«ç½®äºŽç»™å®šçš„" -"[code]node[/code]之下。\n" -"如果[code]legible_unique_name[/code]是[code]true[/code],å节点将有一个基于被" -"实例化的节点åç§°ï¼Œè€Œä¸æ˜¯å…¶ç±»åž‹å¯è¯»çš„å称。" +"å°† [code]child_node[/code] æ·»åŠ ä¸ºå节点。该å节点在å节点列表ä¸è¢«ç½®äºŽç»™å®šçš„ " +"[code]node[/code] 之下。\n" +"如果 [code]legible_unique_name[/code] 为 [code]true[/code],å节点将有一个基" +"于被实例化的节点åç§°ï¼Œè€Œä¸æ˜¯å…¶ç±»åž‹å¯è¯»çš„å称。" #: doc/classes/Node.xml msgid "" @@ -47685,10 +47790,10 @@ msgid "" "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 "" -"å¤åˆ¶èŠ‚ç‚¹ï¼Œè¿”å›žä¸€ä¸ªæ–°çš„èŠ‚ç‚¹ã€‚\n" -"ä½ å¯ä»¥ä½¿ç”¨[code]flags[/code]æ¥å¾®è°ƒè¿™ä¸ªè¡Œä¸ºï¼ˆè§[enum DuplicateFlags])。\n" -"[b]注æ„:[/b]如果节点包å«ä¸€ä¸ªå¸¦æœ‰æž„é€ å‚æ•°çš„脚本(å³éœ€è¦å‘[method Object." -"_init]方法æä¾›å‚数),它将ä¸èƒ½æ£å¸¸å·¥ä½œã€‚åœ¨è¿™ç§æƒ…况下,节点将被å¤åˆ¶è€Œæ²¡æœ‰è„š" +"å¤åˆ¶è¯¥èŠ‚ç‚¹ï¼Œè¿”å›žä¸€ä¸ªæ–°çš„èŠ‚ç‚¹ã€‚\n" +"ä½ å¯ä»¥ä½¿ç”¨ [code]flags[/code] æ¥å¾®è°ƒè¿™ä¸ªè¡Œä¸ºï¼ˆè§ [enum DuplicateFlags])。\n" +"[b]注æ„:[/b]如果节点包å«ä¸€ä¸ªå¸¦æœ‰æž„é€ å‚æ•°çš„脚本(å³éœ€è¦å‘ [method Object." +"_init] 方法æä¾›å‚数),它将ä¸èƒ½æ£å¸¸å·¥ä½œã€‚åœ¨è¿™ç§æƒ…况下,节点将被å¤åˆ¶è€Œæ²¡æœ‰è„š" "本。" #: doc/classes/Node.xml @@ -47746,9 +47851,9 @@ msgid "" "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 "" -"按索引返回一个å节点(è§[method get_child_count])。这个方法ç»å¸¸è¢«ç”¨äºŽé历一" +"按索引返回一个åèŠ‚ç‚¹ï¼ˆè§ [method get_child_count])。这个方法ç»å¸¸è¢«ç”¨äºŽé历一" "个节点的所有å节点。\n" -"è¦é€šè¿‡ä¸€ä¸ªå节点的åå—访问它,请使用[method get_node]。" +"è¦é€šè¿‡ä¸€ä¸ªå节点的åå—访问它,请使用 [method get_node]。" #: doc/classes/Node.xml msgid "Returns the number of child nodes." @@ -47793,13 +47898,13 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Returns the node's index, i.e. its position among the siblings of its parent." -msgstr "返回节点的索引,å³å®ƒåœ¨å…¶çˆ¶èŠ‚ç‚¹çš„å…„å¼ŸèŠ‚ç‚¹ä¸çš„ä½ç½®ã€‚" +msgstr "返回该节点的索引,å³å®ƒåœ¨å…¶çˆ¶èŠ‚ç‚¹çš„å…„å¼ŸèŠ‚ç‚¹ä¸çš„ä½ç½®ã€‚" #: doc/classes/Node.xml msgid "" "Returns the peer ID of the network master for this node. See [method " "set_network_master]." -msgstr "返回æ¤èŠ‚ç‚¹çš„ç½‘ç»œä¸»èŠ‚ç‚¹çš„å¯¹ç‰ IDã€‚è§ [method set_network_master]。" +msgstr "è¿”å›žè¿™ä¸ªèŠ‚ç‚¹çš„ç½‘ç»œä¸»èŠ‚ç‚¹çš„å¯¹ç‰ IDã€‚è§ [method set_network_master]。" #: doc/classes/Node.xml msgid "" @@ -47990,7 +48095,7 @@ msgstr "如果给定节点是当å‰èŠ‚ç‚¹çš„ç›´æŽ¥æˆ–é—´æŽ¥å节点,则返回 msgid "" "Returns [code]true[/code] if the node is folded (collapsed) in the Scene " "dock." -msgstr "如果节点在场景dockä¸æŠ˜å (collapsed),则返回 [code]true[/code]。" +msgstr "å¦‚æžœè¯¥èŠ‚ç‚¹åœ¨åœºæ™¯é¢æ¿ä¸æŠ˜å ,则返回 [code]true[/code]。" #: doc/classes/Node.xml msgid "" @@ -48225,10 +48330,10 @@ msgid "" "of it. After using [code]raise[/code], a Control will be drawn on top of its " "siblings." msgstr "" -"å°†æ¤èŠ‚ç‚¹ç§»åˆ°çˆ¶èŠ‚ç‚¹çš„å节点层次的底部。这在GUI([Control]节点)ä¸é€šå¸¸å¾ˆæœ‰ç”¨ï¼Œ" -"å› ä¸ºå®ƒä»¬çš„ç»˜åˆ¶é¡ºåºå–å†³äºŽå®ƒä»¬åœ¨æ ‘ä¸çš„顺åºã€‚最上é¢çš„节点首先被绘制出æ¥ï¼Œç„¶åŽåœ¨" -"å±‚æ¬¡ç»“æž„ä¸æœ€ä¸Šé¢çš„节点下é¢çš„æ‰€æœ‰åŒçº§è¢«ä¾æ¬¡ç»˜åˆ¶åœ¨å®ƒçš„上é¢ã€‚使用[code]raise[/" -"code]åŽï¼Œä¸€ä¸ªæŽ§ä»¶å°†è¢«ç»˜åˆ¶åœ¨å…¶åŒçº§çš„上é¢ã€‚" +"将这个节点移到父节点的å节点层次的底部。这在 GUI([Control]节点)ä¸é€šå¸¸å¾ˆæœ‰" +"ç”¨ï¼Œå› ä¸ºå®ƒä»¬çš„ç»˜åˆ¶é¡ºåºå–å†³äºŽå®ƒä»¬åœ¨æ ‘ä¸çš„顺åºã€‚最上é¢çš„节点首先被绘制出æ¥ï¼Œç„¶" +"åŽåœ¨å±‚æ¬¡ç»“æž„ä¸æœ€ä¸Šé¢çš„节点下é¢çš„æ‰€æœ‰åŒçº§è¢«ä¾æ¬¡ç»˜åˆ¶åœ¨å®ƒçš„上é¢ã€‚使用 " +"[code]raise[/code] åŽï¼ŒæŽ§ä»¶å°†è¢«ç»˜åˆ¶åœ¨å…¶åŒçº§ä¹‹ä¸Šã€‚" #: doc/classes/Node.xml msgid "" @@ -48595,8 +48700,8 @@ msgid "" "character, which is reserved for unique names when using [method add_child]. " "When setting the name manually, any [code]@[/code] will be removed." msgstr "" -"节点的å称。æ¤å称在兄弟节点(æ¥è‡ªåŒä¸€çˆ¶èŠ‚ç‚¹çš„å…¶ä»–åèŠ‚ç‚¹ï¼‰ä¸æ˜¯å”¯ä¸€çš„。当设置" -"为现有å称时,节点将自动é‡å‘½å。\n" +"该节点的å称。这个å称在兄弟节点(æ¥è‡ªåŒä¸€çˆ¶èŠ‚ç‚¹çš„å…¶ä»–åèŠ‚ç‚¹ï¼‰ä¸æ˜¯å”¯ä¸€çš„。当" +"设置为现有å称时,节点将自动é‡å‘½å。\n" "[b]注æ„:[/b]自动生æˆçš„åç§°å¯èƒ½åŒ…å« [code]@[/code] å—符,在使用 [method " "add_child] æ—¶ä¿ç•™è¯¥å—符用于唯一å称。手动设置åç§°æ—¶ï¼Œå°†åˆ é™¤ä»»ä½• [code]@[/" "code]。" @@ -48617,9 +48722,10 @@ msgid "" "will not be visible in the scene tree, though it will be visible in the " "2D/3D view." msgstr "" -"节点的所有者。节点的所有者å¯ä»¥æ˜¯ä»»ä½•å…¶ä»–èŠ‚ç‚¹ï¼ˆéœ€è¦æ˜¯çˆ¶èŠ‚ç‚¹æˆ–ç¥–çˆ¶èŠ‚ç‚¹ç‰ï¼Œå³åœº" -"æ™¯æ ‘ä¸Šçš„ç¥–å…ˆï¼‰ã€‚ï¼ˆé€šè¿‡ [PackedScene])ä¿å˜ä¸€ä¸ªèŠ‚ç‚¹æ—¶ï¼Œå®ƒæ‹¥æœ‰çš„æ‰€æœ‰èŠ‚ç‚¹ä¹Ÿä¼šéš" -"之ä¿å˜ã€‚è¿™æ ·å°±å¯ä»¥åˆ›å»ºå¤æ‚çš„ [SceneTree],能够进行实例化与次实例化。\n" +"该节点的所有者。节点的所有者å¯ä»¥æ˜¯ä»»ä½•å…¶ä»–èŠ‚ç‚¹ï¼ˆéœ€è¦æ˜¯æ²¿åœºæ™¯æ ‘å‘上的有效节" +"点,如父节点ã€ç¥–父节点ç‰ï¼‰ã€‚(通过 [PackedScene])ä¿å˜èŠ‚ç‚¹æ—¶ï¼Œå®ƒæ‹¥æœ‰çš„æ‰€æœ‰èŠ‚" +"点也会éšä¹‹ä¿å˜ã€‚è¿™æ ·å°±å¯ä»¥åˆ›å»ºå¤æ‚çš„ [SceneTree],能够进行实例化与次实例" +"化。\n" "[b]注æ„:[/b]如果想è¦å°†å节点æŒä¹…化进 [PackedScene],除了调用 [method " "add_child] ä¹‹å¤–ä½ è¿˜å¿…é¡»è®¾ç½® [member owner]。通常在[url=$DOCS_URL/tutorials/" "plugins/running_code_in_the_editor.html]工具脚本[/url]å’Œ[url=$DOCS_URL/" @@ -48650,7 +48756,7 @@ msgid "" "process priority value is [i]lower[/i] will have their processing callbacks " "executed first." msgstr "" -"节点在已å¯ç”¨çš„处ç†å›žè°ƒï¼ˆå³ [constant NOTIFICATION_PROCESS]ã€[constant " +"该节点在已å¯ç”¨çš„处ç†å›žè°ƒï¼ˆå³ [constant NOTIFICATION_PROCESS]ã€[constant " "NOTIFICATION_PHYSICS_PROCESS] åŠå…¶å†…部对应物)的执行顺åºä¸çš„优先级。进程优先" "级值[i]较低[/i]的节点将首先执行其处ç†å›žè°ƒã€‚" @@ -50342,8 +50448,8 @@ msgid "" msgstr "" "为这个 [OmniLight] 使用的阴影渲染模å¼ã€‚è§ [enum ShadowMode]。\n" "[b]注æ„:[/b]在 GLES2 ä¸ï¼Œåªæœ‰æ”¯æŒæ·±åº¦ç«‹æ–¹ä½“贴图功能的 GPU æ‰æ”¯æŒ [constant " -"SHADOW_CUBE]。Radeon HD 4000 系列ç‰è¾ƒè€çš„ GPU " -"䏿”¯æŒç«‹æ–¹ä½“è´´å›¾é˜´å½±ï¼Œå› æ¤ä¼šå›žé€€åˆ°ä½¿ç”¨åŒæŠ›ç‰©é¢é˜´å½±ã€‚" +"SHADOW_CUBE]。Radeon HD 4000 系列ç‰è¾ƒè€çš„ GPU 䏿”¯æŒç«‹æ–¹ä½“è´´å›¾é˜´å½±ï¼Œå› æ¤ä¼šå›ž" +"é€€åˆ°ä½¿ç”¨åŒæŠ›ç‰©é¢é˜´å½±ã€‚" #: doc/classes/OmniLight.xml msgid "" @@ -50358,8 +50464,8 @@ msgid "" "SHADOW_DUAL_PARABOLOID], but higher-quality. Only supported on GPUs that " "feature support for depth cubemaps." msgstr "" -"阴影被渲染至一个立方体贴图。比 [constant SHADOW_DUAL_PARABOLOID] " -"æ…¢ï¼Œä½†è´¨é‡æ›´é«˜ã€‚ä»…åœ¨æ”¯æŒæ·±åº¦ç«‹æ–¹ä½“贴图功能的 GPU 上支æŒã€‚" +"阴影被渲染至一个立方体贴图。比 [constant SHADOW_DUAL_PARABOLOID] æ…¢ï¼Œä½†è´¨é‡æ›´" +"é«˜ã€‚ä»…åœ¨æ”¯æŒæ·±åº¦ç«‹æ–¹ä½“贴图功能的 GPU 上支æŒã€‚" #: doc/classes/OmniLight.xml msgid "Use more detail vertically when computing the shadow." @@ -50488,8 +50594,8 @@ msgid "" "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 "" -"ä¸åŒå…«åº¦éŸ³é˜¶çš„è´¡çŒ®å› å。[code]persistence[/code]值为1表示所有的八度有相åŒçš„è´¡" -"献,值为0.5表示æ¯ä¸ªå…«åº¦çš„贡献是å‰ä¸€ä¸ªçš„一åŠã€‚" +"ä¸åŒå…«åº¦çš„è´¡çŒ®å› å。[code]persistence[/code] 值为 1 表示所有的八度有相åŒçš„è´¡" +"献,值为 0.5 表示æ¯ä¸ªå…«åº¦çš„贡献是å‰ä¸€ä¸ªçš„一åŠã€‚" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" @@ -51607,6 +51713,7 @@ msgstr "" "[b]注æ„:[/b]返回 HTML5 å’Œ UWP 上的空å—ç¬¦ä¸²ï¼Œå› ä¸ºæ¤æ–¹æ³•尚未在这些平å°ä¸Šå®žæ–½ã€‚" #: doc/classes/OS.xml +#, fuzzy msgid "" "Returns the current UNIX epoch timestamp in seconds.\n" "[b]Important:[/b] This is the system clock that the user can manually set. " @@ -51614,7 +51721,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" "以秒为å•ä½è¿”回当å‰çš„ UNIX 纪元时间戳。\n" "[b]é‡è¦ï¼š[/b]这是用户å¯ä»¥æ‰‹åŠ¨è®¾ç½®çš„ç³»ç»Ÿæ—¶é’Ÿã€‚[b]永远ä¸è¦ä½¿ç”¨[/b]è¿™ç§æ–¹æ³•进行" @@ -51798,12 +51907,12 @@ msgid "" "template (debug or release), use [code]OS.has_feature(\"standalone\")[/code] " "instead." msgstr "" -"如果用于è¿è¡Œé¡¹ç›®çš„Godot二进制文件是[i]debug[/i]导出,或在编辑器ä¸è¿è¡Œæ—¶ï¼Œè¿”" -"回 [code]true[/code]。\n" -"如果用于è¿è¡Œé¡¹ç›®çš„Godot二进制文件是[i]release[/i]导出,则返回 [code]false[/" -"code]。\n" -"è¦æ£€æŸ¥ç”¨äºŽè¿è¡Œé¡¹ç›®çš„GodotäºŒè¿›åˆ¶æ–‡ä»¶æ˜¯å¦æ˜¯è¢«å¯¼å‡ºç‰ˆæœ¬ï¼ˆè°ƒè¯•或å‘布),请使用" -"[code]OS.has_feature(\"standalone\")[/code]代替。" +"如果用于è¿è¡Œé¡¹ç›®çš„ Godot 二进制文件是[i]调试[/i]导出模æ¿ï¼Œæˆ–是在编辑器ä¸è¿è¡Œ" +"时,则返回 [code]true[/code]。\n" +"如果用于è¿è¡Œé¡¹ç›®çš„ Godot 二进制文件是[i]å‘布[/i]导出模æ¿ï¼Œåˆ™è¿”回 " +"[code]false[/code]。\n" +"è¦æ£€æŸ¥ç”¨äºŽè¿è¡Œé¡¹ç›®çš„ Godot 二进制文件是å¦ä¸ºå¯¼å‡ºæ¨¡æ¿ï¼ˆè°ƒè¯•或å‘布),请使用 " +"[code]OS.has_feature(\"standalone\")[/code] 代替。" #: doc/classes/OS.xml msgid "" @@ -52904,10 +53013,9 @@ msgid "" "[constant ERR_OUT_OF_MEMORY]." msgstr "" "ç¼–ç [Variant] æ—¶å…许的最大缓冲区大å°ã€‚æé«˜æ¤å€¼ä»¥æ”¯æŒæ›´å¤§çš„内å˜åˆ†é…。\n" -"[method put_var] æ–¹æ³•åœ¨å †æ ˆä¸Šåˆ†é…内å˜ï¼Œä½¿ç”¨çš„缓冲区将自动增长到最接近的二次" -"æ–¹ï¼Œä»¥åŒ¹é… [Variant] 的大å°ã€‚如果 [Variant] 大于 " -"[code]encode_buffer_max_size[/code],则该方法将以 [constant " -"ERR_OUT_OF_MEMORY] 出错。" +"[method put_var] æ–¹æ³•åœ¨æ ˆä¸Šåˆ†é…内å˜ï¼Œä½¿ç”¨çš„缓冲区将自动增长到最接近的二次方," +"ä»¥åŒ¹é… [Variant] 的大å°ã€‚如果 [Variant] 大于 [code]encode_buffer_max_size[/" +"code],则该方法将以 [constant ERR_OUT_OF_MEMORY] 出错。" #: doc/classes/PacketPeerDTLS.xml msgid "DTLS packet peer." @@ -54632,7 +54740,7 @@ msgstr "" "返回一个包å«è¿åŠ¨çš„å®‰å…¨å’Œä¸å®‰å…¨æ¯”例(0 到 1 之间)的数组。安全比例是在没有碰撞" "的情况下å¯ä»¥è¿›è¡Œçš„è¿åŠ¨çš„æœ€å¤§æ¯”ä¾‹ã€‚ä¸å®‰å…¨æ¯”例是碰撞必须移动的è·ç¦»çš„æœ€å°éƒ¨åˆ†ã€‚" "如果没有检测到碰撞,将返回 [code][1.0, 1.0][/code] 的结果。\n" -"[b]注æ„:[/b]任何已ç»ç¢°æ’žçš„[Shape2D](比如内部的)会被忽略。使用 [method " +"[b]注æ„:[/b]任何已ç»ç¢°æ’žçš„ [Shape2D](比如内部的)会被忽略。使用 [method " "collide_shape] 确定形状已ç»ç¢°æ’žçš„ [Shape2D]。" #: doc/classes/Physics2DDirectSpaceState.xml @@ -54667,20 +54775,20 @@ msgid "" "[code]rid[/code]: The intersecting object's [RID].\n" "[code]shape[/code]: The shape index of the colliding shape." msgstr "" -"通过[Physics2DShapeQueryParameters]对象给出的形状与空间的检查交点。如果它与一" -"个以上的形状å‘生碰撞,则选择最近的一个。如果该形状没有与任何对象相交,那么将" -"返回一个空å—典。\n" -"[b]注æ„:[/b]这个方法ä¸è€ƒè™‘对象的[code]motion[/code]属性。返回的对象是包å«ä»¥" -"䏋嗿®µçš„å—典。\n" -"[code]collider_id[/code]:碰撞对象的ID。\n" -"[code]linear_velocity[/code]:碰撞物体的速度[Vector2]。如果对象是一个" -"[Area2D],结果是[code](0, 0)[/code]。\n" -"[code]metadata[/code]:相交形状的元数æ®ã€‚这个元数æ®ä¸Ž[method Object.get_meta]" -"ä¸åŒï¼Œå®ƒæ˜¯ç”¨[method Physics2DServer.shape_set_data]设置的。\n" -"[code]normal[/code]:ç‰©ä½“åœ¨äº¤ç‚¹å¤„çš„è¡¨é¢æ³•线。\n" -"[code]point[/code]:相交点。\n" -"[code]rid[/code]:相交物体的[RID]。\n" -"[code]shape[/code]:碰撞形状的形状索引。" +"通过 [Physics2DShapeQueryParameters] 对象给出的形状与空间的检查交点。如果它与" +"一个以上的形状å‘生碰撞,则选择最近的一个。如果该形状没有与任何对象相交,那么" +"将返回一个空å—典。\n" +"[b]注æ„:[/b]这个方法ä¸è€ƒè™‘对象的 [code]motion[/code] 属性。返回的对象是包å«" +"以䏋嗿®µçš„å—典。\n" +"[code]collider_id[/code]:碰撞对象的 ID。\n" +"[code]linear_velocity[/code]:碰撞物体的速度 [Vector2]。如果对象是一个 " +"[Area2D],结果是 [code](0, 0)[/code]。\n" +"[code]metadata[/code]:相交形状的元数æ®ã€‚这个元数æ®ä¸Ž [method Object." +"get_meta] ä¸åŒï¼Œå®ƒæ˜¯ç”¨ [method Physics2DServer.shape_set_data] 设置的。\n" +"[code]normal[/code]ï¼šç‰©ä½“åœ¨äº¤ç‚¹å¤„çš„è¡¨é¢æ³•线。\n" +"[code]point[/code]:相交点。\n" +"[code]rid[/code]:相交物体的 [RID]。\n" +"[code]shape[/code]:碰撞形状的形状索引。" #: doc/classes/Physics2DDirectSpaceState.xml msgid "" @@ -55912,7 +56020,7 @@ msgstr "" "返回一个包å«è¿åŠ¨çš„å®‰å…¨å’Œä¸å®‰å…¨æ¯”例(0 到 1 之间)的数组。安全比例是在没有碰撞" "的情况下å¯ä»¥è¿›è¡Œçš„è¿åŠ¨çš„æœ€å¤§æ¯”ä¾‹ã€‚ä¸å®‰å…¨æ¯”例是碰撞必须移动的è·ç¦»çš„æœ€å°éƒ¨åˆ†ã€‚" "如果未检测到碰撞,将返回 [code][1.0, 1.0][/code] 的结果。\n" -"[b]注æ„:[/b]任何已ç»ç¢°æ’žçš„[Shape2D](比如内部的)会被忽略。使用 [method " +"[b]注æ„:[/b]任何已ç»ç¢°æ’žçš„ [Shape2D](比如内部的)会被忽略。使用 [method " "collide_shape] 确定形状已ç»ç¢°æ’žçš„ [Shape]。" #: doc/classes/PhysicsDirectSpaceState.xml @@ -57622,7 +57730,8 @@ msgid "" "Returns a [String] with each element of the array joined with the given " "[code]delimiter[/code]." msgstr "" -"返回一个[String],数组的æ¯ä¸ªå…ƒç´ 都用给定的[code]delimiter[/code]分隔符连接。" +"返回一个 [String],数组的æ¯ä¸ªå…ƒç´ 都用给定的 [code]delimiter[/code] 分隔符连" +"接。" #: doc/classes/PoolStringArray.xml msgid "Appends a string element at end of the array." @@ -58270,7 +58379,10 @@ msgstr "" "[b]注æ„:[/b]被移除项åŽçš„é¡¹çš„ç´¢å¼•å°†è¢«ç§»ä½ 1。" #: doc/classes/PopupMenu.xml -msgid "Sets the currently focused item as the given [code]index[/code]." +#, fuzzy +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "将当å‰èšç„¦é¡¹ç›®è®¾ç½®ä¸ºç»™å®šçš„索引 [code]index[/code]。" #: doc/classes/PopupMenu.xml @@ -58529,10 +58641,13 @@ msgid "Class for displaying popups with a panel background." msgstr "ç”¨äºŽæ˜¾ç¤ºå¸¦æœ‰é¢æ¿èƒŒæ™¯çš„弹出窗å£çš„类。" #: doc/classes/PopupPanel.xml +#, fuzzy 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" "ç”¨äºŽæ˜¾ç¤ºå…·æœ‰é¢æ¿èƒŒæ™¯çš„弹出窗å£çš„类。在æŸäº›æƒ…况下,它å¯èƒ½æ¯” [Popup] 更容易使" "ç”¨ï¼Œå› ä¸ºå®ƒæä¾›äº†ä¸€ä¸ªå¯é…ç½®çš„èƒŒæ™¯ã€‚å¦‚æžœä½ æ£åœ¨åˆ¶ä½œçª—å£ï¼Œæœ€å¥½æ˜¯æŸ¥çœ‹ " @@ -59490,10 +59605,12 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" -"如果为 [code]true[/code],将å…许麦克风输入。导出到 Android 或 iOS 时须设置适" -"当的æƒé™ã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -59878,7 +59995,7 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "Maximum call stack allowed for debugging GDScript." -msgstr "调试GDScriptæ—¶å…è®¸çš„æœ€å¤§è°ƒç”¨å †æ ˆã€‚" +msgstr "调试 GDScript æ—¶å…è®¸çš„æœ€å¤§è°ƒç”¨å †æ ˆã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -62805,11 +62922,20 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" -"用于å¯ç”¨å„å‘异性的纹ç†çš„æœ€å¤§å„å‘异性过滤器级别。从倾斜角度查看时,较高的值将" -"导致更清晰的纹ç†ï¼Œä½†ä¼šç‰ºç‰²æ€§èƒ½ã€‚åªæœ‰äºŒçš„æŒ‡æ•°å€çš„值是有效(如 2ã€4ã€8ã€16)。" #: doc/classes/ProjectSettings.xml msgid "" @@ -63863,7 +63989,7 @@ msgstr "" "pcg-random.org/]PCG32[/url]。\n" "[b]注æ„:[/b]åº•å±‚ç®—æ³•æ˜¯å®žçŽ°ç»†èŠ‚ã€‚å› æ¤ï¼Œè·¨ Godot 版本的å¯é‡å¤éšæœºæµä¸åº”该ä¾èµ–" "于æ¤ã€‚\n" -"è¦æ ¹æ®æ—¶é—´ç›¸å…³ç§å生æˆéšæœºæµ®ç‚¹æ•°ï¼Œåœ¨ç»™å®šèŒƒå›´å†…ï¼š\n" +"è¦æ ¹æ®æ—¶é—´ç›¸å…³ç§å生æˆï¼ˆç»™å®šèŒƒå›´å†…çš„ï¼‰éšæœºæµ®ç‚¹æ•°ï¼š\n" "[codeblock]\n" "var rng = RandomNumberGenerator.new()\n" "func _ready():\n" @@ -63883,14 +64009,14 @@ msgid "" "Generates a pseudo-random float between [code]0.0[/code] and [code]1.0[/" "code] (inclusive)." msgstr "" -"生æˆä¸€ä¸ª[code]0.0[/code]å’Œ[code]1.0[/code]ï¼ˆåŒ…æ‹¬ç«¯ç‚¹ï¼‰ä¹‹é—´çš„ä¼ªéšæœºæµ®ç‚¹æ•°ã€‚" +"生æˆä¸€ä¸ª [code]0.0[/code] å’Œ [code]1.0[/code]ï¼ˆåŒ…æ‹¬ç«¯ç‚¹ï¼‰ä¹‹é—´çš„ä¼ªéšæœºæµ®ç‚¹æ•°ã€‚" #: doc/classes/RandomNumberGenerator.xml msgid "" "Generates a pseudo-random float between [code]from[/code] and [code]to[/" "code] (inclusive)." msgstr "" -"生æˆä¸€ä¸ª[code]from[/code]å’Œ[code]to[/code]ï¼ˆåŒ…æ‹¬ç«¯ç‚¹ï¼‰ä¹‹é—´çš„ä¼ªéšæœºæµ®ç‚¹æ•°ã€‚" +"生æˆä¸€ä¸ª [code]from[/code] å’Œ [code]to[/code]ï¼ˆåŒ…æ‹¬ç«¯ç‚¹ï¼‰ä¹‹é—´çš„ä¼ªéšæœºæµ®ç‚¹æ•°ã€‚" #: doc/classes/RandomNumberGenerator.xml msgid "" @@ -64040,14 +64166,14 @@ msgid "" "Maximum value. Range is clamped if [code]value[/code] is greater than " "[code]max_value[/code]." msgstr "" -"最大值。如果[code]value[/code]大于[code]max_value[/code],则会被范围é™åˆ¶ã€‚" +"最大值。如果 [code]value[/code] 大于 [code]max_value[/code],则会被范围é™åˆ¶ã€‚" #: doc/classes/Range.xml msgid "" "Minimum value. Range is clamped if [code]value[/code] is less than " "[code]min_value[/code]." msgstr "" -"最å°å€¼ã€‚如果[code]value[/code]å°äºŽ[code]min_value[/code],则会被范围é™åˆ¶ã€‚" +"最å°å€¼ã€‚如果 [code]value[/code] å°äºŽ [code]min_value[/code],则会被范围é™åˆ¶ã€‚" #: doc/classes/Range.xml msgid "" @@ -64593,7 +64719,7 @@ msgstr "" #: doc/classes/ReferenceRect.xml msgid "Reference frame for GUI." -msgstr "GUI的引用框架。" +msgstr "GUI çš„å‚考框。" #: doc/classes/ReferenceRect.xml msgid "" @@ -64607,21 +64733,21 @@ msgstr "" #: doc/classes/ReferenceRect.xml msgid "Sets the border [Color] of the [ReferenceRect]." -msgstr "设置 [ReferenceRect] 的边框 [Color]。" +msgstr "设置该 [ReferenceRect] 的边框 [Color]。" #: doc/classes/ReferenceRect.xml msgid "" "Sets the border width of the [ReferenceRect]. The border grows both inwards " "and outwards with respect to the rectangle box." -msgstr "设置 [ReferenceRect] 的边框宽度。边界相对于矩形框å‘内和å‘外生长。" +msgstr "设置该 [ReferenceRect] çš„è¾¹æ¡†å®½åº¦ã€‚è¾¹ç•Œç›¸å¯¹äºŽçŸ©å½¢æ¡†åŒæ—¶å‘内å‘外伸长。" #: doc/classes/ReferenceRect.xml msgid "" "If set to [code]true[/code], the [ReferenceRect] will only be visible while " "in editor. Otherwise, [ReferenceRect] will be visible in game." msgstr "" -"如果设置为 [code]true[/code],[ReferenceRect]å°†åªåœ¨ç¼–辑器ä¸å¯è§ã€‚å¦åˆ™ï¼Œ" -"[ReferenceRect]将在游æˆä¸å¯è§ã€‚" +"如果设置为 [code]true[/code],该 [ReferenceRect] å°†åªåœ¨ç¼–辑器ä¸å¯è§ã€‚å¦åˆ™ï¼Œ" +"[ReferenceRect] 将在游æˆä¸å¯è§ã€‚" #: doc/classes/ReflectionProbe.xml msgid "" @@ -64729,7 +64855,7 @@ msgstr "定义å射强度。" msgid "" "Sets the ambient light color to be used when this probe is set to [member " "interior_enable]." -msgstr "è®¾ç½®çŽ¯å¢ƒå…‰çš„é¢œè‰²ï¼Œå½“æ¤æŽ¢é’ˆè¢«è®¾ç½®ä¸º[member interior_enable]时使用。" +msgstr "è®¾ç½®çŽ¯å¢ƒå…‰çš„é¢œè‰²ï¼Œå½“æ¤æŽ¢é’ˆè¢«è®¾ç½®ä¸º [member interior_enable] 时使用。" #: doc/classes/ReflectionProbe.xml msgid "" @@ -64745,7 +64871,7 @@ msgid "" "Sets the energy multiplier for this reflection probe's ambient light " "contribution when set to [member interior_enable]." msgstr "" -"当设置为[member interior_enable]时,为该å射探针的环境光贡献设置能é‡ä¹˜æ•°ã€‚" +"当设置为 [member interior_enable] 时,为该å射探针的环境光贡献设置能é‡ä¹˜æ•°ã€‚" #: doc/classes/ReflectionProbe.xml msgid "" @@ -64753,8 +64879,8 @@ msgid "" "lighting is then controlled by the [code]interior_ambient_*[/code] " "properties." msgstr "" -"如果为 [code]true[/code],å射将忽略天空的贡献。然åŽçŽ¯å¢ƒç…§æ˜Žç”±" -"[code]internal_ambient_*[/code]属性控制。" +"如果为 [code]true[/code],å射将忽略天空的贡献。然åŽçŽ¯å¢ƒç…§æ˜Žç”± " +"[code]internal_ambient_*[/code] 属性控制。" #: doc/classes/ReflectionProbe.xml msgid "" @@ -64787,7 +64913,7 @@ msgid "" "Sets how frequently the [ReflectionProbe] is updated. Can be [constant " "UPDATE_ONCE] or [constant UPDATE_ALWAYS]." msgstr "" -"设置 [ReflectionProbe] 的更新频率。å¯ä»¥æ˜¯ [constant UPDATE_ONCE] 或 " +"设置该 [ReflectionProbe] 的更新频率。å¯ä»¥æ˜¯ [constant UPDATE_ONCE] 或 " "[constant UPDATE_ALWAYS]。" #: doc/classes/ReflectionProbe.xml @@ -65059,9 +65185,9 @@ msgid "" "Returns -1 if the group did not match or doesn't exist." msgstr "" "返回æºå—符串ä¸åŒ¹é…的起始ä½ç½®ã€‚æ•获组的起始ä½ç½®å¯ä»¥é€šè¿‡æä¾›å®ƒçš„组å·ä½œä¸ºä¸€ä¸ªæ•´" -"数或它的å—符串å称(如果它是一个命åç»„ï¼‰æ¥æ£€ç´¢ã€‚默认值为0,指的是整个表达" +"数或它的å—符串å称(如果它是一个命åç»„ï¼‰æ¥æ£€ç´¢ã€‚默认值为 0,指的是整个表达" "å¼ã€‚\n" -"å¦‚æžœç»„æ²¡æœ‰åŒ¹é…æˆ–ä¸å˜åœ¨ï¼Œè¿”回-1。" +"å¦‚æžœç»„æ²¡æœ‰åŒ¹é…æˆ–ä¸å˜åœ¨ï¼Œè¿”回 -1。" #: modules/regex/doc_classes/RegExMatch.xml msgid "" @@ -65072,7 +65198,7 @@ msgid "" "Returns an empty string if the group did not match or doesn't exist." msgstr "" "返回æºå—符串ä¸åŒ¹é…çš„å串。æ•获组å¯ä»¥é€šè¿‡æä¾›å®ƒçš„组å·ä½œä¸ºæ•´æ•°æˆ–它的å—符串åç§°" -"(如果它是一个命åç»„ï¼‰æ¥æ£€ç´¢ã€‚默认值为0,指的是整个表达å¼ã€‚\n" +"(如果它是一个命åç»„ï¼‰æ¥æ£€ç´¢ã€‚默认值为 0,指的是整个表达å¼ã€‚\n" "å¦‚æžœç»„æ²¡æœ‰åŒ¹é…æˆ–ä¸å˜åœ¨ï¼Œåˆ™è¿”回一个空å—符串。" #: modules/regex/doc_classes/RegExMatch.xml @@ -65164,7 +65290,7 @@ msgid "" msgstr "" "RemoteTransform2D 将自己的 [Transform2D] 推é€åˆ°åœºæ™¯ä¸å¦ä¸€ä¸ª [CanvasItem] 派生" "的节点(称为远程节点)。\n" -"它å¯ä»¥è¢«è®¾ç½®ä¸ºæ›´æ–°å¦ä¸€ä¸ªNodeçš„ä½ç½®ã€æ—‹è½¬æˆ–比例。它å¯ä»¥ä½¿ç”¨å…¨å±€åæ ‡æˆ–å±€éƒ¨å" +"它å¯ä»¥è¢«è®¾ç½®ä¸ºæ›´æ–°å¦ä¸€ä¸ª Node çš„ä½ç½®ã€æ—‹è½¬æˆ–比例。它å¯ä»¥ä½¿ç”¨å…¨å±€åæ ‡æˆ–å±€éƒ¨å" "æ ‡ã€‚" #: doc/classes/RemoteTransform2D.xml @@ -65237,12 +65363,13 @@ msgid "" msgstr "" "å¤åˆ¶èµ„æºï¼Œè¿”回一个å¤åˆ¶äº†å¯¼å‡ºæˆå‘˜å±žæ€§çš„æ–°èµ„æºã€‚[b]注æ„:[/b]为了å¤åˆ¶èµ„æºï¼Œæž„é€ " "å‡½æ•°è¢«è°ƒç”¨ï¼Œæ²¡æœ‰å‚æ•°ã€‚å½“æž„é€ å‡½æ•°æ²¡æœ‰é»˜è®¤å€¼æ—¶ï¼Œè¿™ä¸ªæ–¹æ³•ä¼šå‡ºé”™ã€‚\n" -"默认情况下,为了æé«˜æ•ˆçŽ‡ï¼Œå资æºåœ¨èµ„æºå‰¯æœ¬ä¹‹é—´è¢«å…±äº«ã€‚è¿™å¯ä»¥é€šè¿‡å‘" -"[code]subresources[/code]傿•°ä¼ 递[code]true[/code]æ¥æ”¹å˜ï¼Œå®ƒå°†å¤åˆ¶å资æºã€‚\n" -"[b]注æ„:[/b]如果[code]subresources[/code]是[code]true[/code]ï¼Œè¿™ä¸ªæ–¹æ³•å°†åªæ‰§" -"行一个浅层拷è´ã€‚å资æºä¸çš„嵌套资æºä¸ä¼šè¢«å¤åˆ¶ï¼Œä»ç„¶ä¼šè¢«å…±äº«ã€‚\n" -"[b]注æ„:[/b]当å¤åˆ¶ä¸€ä¸ªèµ„æºæ—¶ï¼Œåªæœ‰å¯¼å‡º[code]export[/code]的属性被å¤åˆ¶ã€‚å…¶ä»–" -"属性将被设置为新资æºä¸çš„默认值。" +"默认情况下,为了æé«˜æ•ˆçŽ‡ï¼Œå资æºåœ¨èµ„æºå‰¯æœ¬ä¹‹é—´è¢«å…±äº«ã€‚è¿™å¯ä»¥é€šè¿‡å‘ " +"[code]subresources[/code] 傿•°ä¼ 递 [code]true[/code] æ¥æ”¹å˜ï¼Œå®ƒå°†å¤åˆ¶å资" +"æºã€‚\n" +"[b]注æ„:[/b]如果 [code]subresources[/code] 为 [code]true[/code],这个方法将" +"åªæ‰§è¡Œä¸€ä¸ªæµ…层拷è´ã€‚å资æºä¸çš„嵌套资æºä¸ä¼šè¢«å¤åˆ¶ï¼Œä»ç„¶ä¼šè¢«å…±äº«ã€‚\n" +"[b]注æ„:[/b]当å¤åˆ¶ä¸€ä¸ªèµ„æºæ—¶ï¼Œåªæœ‰å¯¼å‡º [code]export[/code] 的属性被å¤åˆ¶ã€‚å…¶" +"他属性将被设置为新资æºä¸çš„默认值。" #: doc/classes/Resource.xml msgid "" @@ -65480,7 +65607,7 @@ msgid "" "Returns the list of extensions available for saving the resource object, " "provided it is recognized (see [method recognize])." msgstr "" -"返回å¯ç”¨äºŽä¿å˜èµ„æºå¯¹è±¡çš„æ‰©å±•åˆ—è¡¨ï¼Œå‰ææ˜¯å®ƒè¢«è¯†åˆ«ï¼ˆè§[method recognize])。" +"返回å¯ç”¨äºŽä¿å˜èµ„æºå¯¹è±¡çš„æ‰©å±•åˆ—è¡¨ï¼Œå‰ææ˜¯å®ƒè¢«è¯†åˆ«ï¼ˆè§ [method recognize])。" #: doc/classes/ResourceFormatSaver.xml msgid "Returns whether the given resource object can be saved by this saver." @@ -65509,7 +65636,7 @@ msgid "" "[EditorImportPlugin]." msgstr "" "è¿™æ˜¯åœ¨æ ¸å¿ƒéƒ¨åˆ†å®žçŽ°çš„èµ„æºå¯¼å…¥å™¨çš„基类。è¦ä½¿ç”¨ç¼–辑器æ’ä»¶å®žçŽ°ä½ è‡ªå·±çš„èµ„æºå¯¼å…¥" -"器,请å‚阅[EditorImportPlugin]。" +"å™¨ï¼Œè§ [EditorImportPlugin]。" #: doc/classes/ResourceImporter.xml msgid "Import plugins" @@ -65574,11 +65701,11 @@ msgid "" "Returns another [enum Error] code if the poll has failed." msgstr "" "å¯¹åŠ è½½æ“作进行轮询,å³åŠ è½½ä¸€ä¸ªæ•°æ®å—到下一个阶段。\n" -"如果轮询æˆåŠŸï¼Œä½†åŠ è½½æ“作还没有完æˆï¼ˆä¸é—´é˜¶æ®µï¼‰ï¼Œåˆ™è¿”回[constant OK]。这æ„味ç€" -"[method poll]å°†ä¸å¾—ä¸å†æ¬¡è¢«è°ƒç”¨ï¼Œç›´åˆ°æœ€åŽé˜¶æ®µå®Œæˆã€‚\n" -"å¦‚æžœåŠ è½½æ“ä½œå·²ç»æˆåŠŸå®Œæˆï¼Œè¿”回[constant ERR_FILE_EOF]。å¯ä»¥é€šè¿‡è°ƒç”¨[method " -"get_resource]èŽ·å¾—åŠ è½½çš„èµ„æºã€‚\n" -"如果轮询失败,返回å¦ä¸€ä¸ª[enum Error]错误代ç 。" +"如果轮询æˆåŠŸï¼Œä½†åŠ è½½æ“作还没有完æˆï¼ˆä¸é—´é˜¶æ®µï¼‰ï¼Œåˆ™è¿”回 [constant OK]。这æ„味" +"ç€ [method poll] å°†ä¸å¾—ä¸å†æ¬¡è¢«è°ƒç”¨ï¼Œç›´åˆ°æœ€åŽé˜¶æ®µå®Œæˆã€‚\n" +"å¦‚æžœåŠ è½½æ“ä½œå·²ç»æˆåŠŸå®Œæˆï¼Œè¿”回 [constant ERR_FILE_EOF]。å¯ä»¥é€šè¿‡è°ƒç”¨ [method " +"get_resource] èŽ·å¾—åŠ è½½çš„èµ„æºã€‚\n" +"如果轮询失败,返回å¦ä¸€ä¸ª [enum Error] 错误代ç 。" #: doc/classes/ResourceInteractiveLoader.xml msgid "" @@ -65590,10 +65717,10 @@ msgid "" "Returns another [enum Error] code if a poll has failed, aborting the " "operation." msgstr "" -"连ç»åœ°å¯¹åŠ è½½æ“作进行轮询,直到资æºè¢«å®Œå…¨åŠ è½½æˆ–æ–¹æ³•[method poll]轮询失败。\n" -"å¦‚æžœåŠ è½½æ“作æˆåŠŸå®Œæˆï¼Œè¿”回[constant ERR_FILE_EOF]。å¯ä»¥é€šè¿‡è°ƒç”¨[method " -"get_resource]èŽ·å¾—åŠ è½½çš„èµ„æºã€‚\n" -"如果轮询失败,返回å¦ä¸€ä¸ª[enum Error]错误代ç ï¼Œä¸æ¢æ“作。" +"连ç»åœ°å¯¹åŠ è½½æ“作进行轮询,直到资æºè¢«å®Œå…¨åŠ è½½æˆ–æ–¹æ³• [method poll] 轮询失败。\n" +"å¦‚æžœåŠ è½½æ“作æˆåŠŸå®Œæˆï¼Œè¿”回 [constant ERR_FILE_EOF]。å¯ä»¥é€šè¿‡è°ƒç”¨ [method " +"get_resource] èŽ·å¾—åŠ è½½çš„èµ„æºã€‚\n" +"如果轮询失败,返回å¦ä¸€ä¸ª [enum Error] 错误代ç ï¼Œä¸æ¢æ“作。" #: doc/classes/ResourceLoader.xml msgid "Singleton used to load resource files." @@ -65607,7 +65734,7 @@ msgid "" "them to a format that can be used by the engine." msgstr "" "ç”¨äºŽä»Žæ–‡ä»¶ç³»ç»ŸåŠ è½½èµ„æºæ–‡ä»¶çš„å•例。\n" -"å®ƒä½¿ç”¨åœ¨å¼•æ“Žä¸æ³¨å†Œçš„许多[ResourceFormatLoader]ç±»ï¼ˆæ— è®ºæ˜¯å†…ç½®çš„è¿˜æ˜¯æ¥è‡ªæ’ä»¶" +"å®ƒä½¿ç”¨åœ¨å¼•æ“Žä¸æ³¨å†Œçš„许多 [ResourceFormatLoader] ç±»ï¼ˆæ— è®ºæ˜¯å†…ç½®çš„è¿˜æ˜¯æ¥è‡ªæ’ä»¶" "的)æ¥å°†æ–‡ä»¶åŠ è½½åˆ°å†…å˜ä¸ï¼Œå¹¶å°†å®ƒä»¬è½¬æ¢ä¸ºå¼•擎å¯ä»¥ä½¿ç”¨çš„æ ¼å¼ã€‚" #: doc/classes/ResourceLoader.xml @@ -65646,10 +65773,10 @@ msgid "" "can be overridden by using [method Resource.take_over_path] on a new " "resource for that same path." msgstr "" -"返回给定路径[code]path[/code]的缓å˜èµ„æºæ˜¯å¦å¯ç”¨ã€‚\n" -"一旦资æºè¢«å¼•æ“ŽåŠ è½½ï¼Œå®ƒå°±ä¼šè¢«ç¼“å˜åœ¨å†…å˜ä¸ï¼Œä»¥ä¾¿æ›´å¿«åœ°è®¿é—®ï¼Œæœªæ¥å¯¹[method load]" -"或[method load_interactive]方法的调用将使用缓å˜çš„版本。缓å˜çš„资æºå¯ä»¥é€šè¿‡å¯¹åŒ" -"一路径的新资æºä½¿ç”¨[method Resource.take_over_path]æ¥è¦†ç›–。" +"返回给定路径 [code]path[/code] 的缓å˜èµ„æºæ˜¯å¦å¯ç”¨ã€‚\n" +"一旦资æºè¢«å¼•æ“ŽåŠ è½½ï¼Œå®ƒå°±ä¼šè¢«ç¼“å˜åœ¨å†…å˜ä¸ï¼Œä»¥ä¾¿æ›´å¿«åœ°è®¿é—®ï¼Œæœªæ¥å¯¹ [method " +"load] 或 [method load_interactive] 方法的调用将使用缓å˜çš„版本。缓å˜çš„资æºå¯ä»¥" +"通过对åŒä¸€è·¯å¾„的新资æºä½¿ç”¨ [method Resource.take_over_path] æ¥è¦†ç›–。" #: doc/classes/ResourceLoader.xml msgid "" @@ -65671,17 +65798,17 @@ msgid "" "be used in most situations, leaving the use of [ResourceLoader] for more " "advanced scenarios." msgstr "" -"在给定的路径[code]path[/code]ä¸ŠåŠ è½½ä¸€ä¸ªèµ„æºï¼Œç¼“å˜ç»“果以便进一æ¥è®¿é—®ã€‚\n" -"便¬¡æŸ¥è¯¢æ³¨å†Œçš„[ResourceFormatLoader],找到第一个å¯ä»¥å¤„ç†è¯¥æ–‡ä»¶æ‰©å±•åçš„åŠ è½½" -"器,然åŽå°è¯•åŠ è½½ã€‚å¦‚æžœåŠ è½½å¤±è´¥ï¼Œå…¶ä½™çš„ResourceFormatLoaders也会被å°è¯•。\n" -"一个å¯é€‰çš„[code]type_hint[/code]类型æç¤ºå¯ä»¥ç”¨æ¥è¿›ä¸€æ¥æŒ‡å®š" -"[ResourceFormatLoader]应处ç†çš„[Resource]资æºç±»åž‹ã€‚任何继承自[Resource]的东西" -"都å¯ä»¥è¢«ç”¨ä½œç±»åž‹æç¤ºï¼Œä¾‹å¦‚图åƒ[Image]。\n" -"如果[code]no_cache[/code]是[code]true[/code],资æºç¼“å˜å°†è¢«ç»•过,资æºå°†è¢«é‡æ–°" -"åŠ è½½ã€‚å¦åˆ™ï¼Œå¦‚果缓å˜çš„资æºå˜åœ¨ï¼Œå°†è¢«è¿”回。\n" -"如果没有[ResourceFormatLoader]å¯ä»¥å¤„ç†è¯¥æ–‡ä»¶ï¼Œåˆ™è¿”回一个空资æºã€‚\n" -"GDScript有一个简化的[method @GDScript.load]内置方法,å¯ä»¥åœ¨å¤§å¤šæ•°æƒ…况下使用," -"把[ResourceLoader]的使用留给更高级的场景。" +"在给定的路径 [code]path[/code] ä¸ŠåŠ è½½ä¸€ä¸ªèµ„æºï¼Œç¼“å˜ç»“果以便进一æ¥è®¿é—®ã€‚\n" +"便¬¡æŸ¥è¯¢æ³¨å†Œçš„ [ResourceFormatLoader],找到第一个å¯ä»¥å¤„ç†è¯¥æ–‡ä»¶æ‰©å±•åçš„åŠ è½½" +"器,然åŽå°è¯•åŠ è½½ã€‚å¦‚æžœåŠ è½½å¤±è´¥ï¼Œå…¶ä½™çš„ ResourceFormatLoader 也会被å°è¯•。\n" +"一个å¯é€‰çš„ [code]type_hint[/code] 类型æç¤ºå¯ä»¥ç”¨æ¥è¿›ä¸€æ¥æŒ‡å®š " +"[ResourceFormatLoader] 应处ç†çš„ [Resource] 资æºç±»åž‹ã€‚任何继承自 [Resource] çš„" +"东西都å¯ä»¥è¢«ç”¨ä½œç±»åž‹æç¤ºï¼Œä¾‹å¦‚ [Image]。\n" +"如果 [code]no_cache[/code] 是 [code]true[/code],资æºç¼“å˜å°†è¢«ç»•过,资æºå°†è¢«é‡" +"æ–°åŠ è½½ã€‚å¦åˆ™ï¼Œå¦‚果缓å˜çš„资æºå˜åœ¨ï¼Œå°†è¢«è¿”回。\n" +"如果没有 [ResourceFormatLoader] å¯ä»¥å¤„ç†è¯¥æ–‡ä»¶ï¼Œåˆ™è¿”回一个空资æºã€‚\n" +"GDScript 有一个简化的 [method @GDScript.load] 内置方法,å¯ä»¥åœ¨å¤§å¤šæ•°æƒ…况下使" +"用,把 [ResourceLoader] 的使用留给更高级的场景。" #: doc/classes/ResourceLoader.xml msgid "" @@ -65694,11 +65821,11 @@ msgid "" "Anything that inherits from [Resource] can be used as a type hint, for " "example [Image]." msgstr "" -"开始交互å¼åŠ è½½ä¸€ä¸ªèµ„æºã€‚返回的[ResourceInteractiveLoader]对象å…è®¸ä»¥é«˜ç²’åº¦åŠ " -"载,连ç»è°ƒç”¨å…¶[method ResourceInteractiveLoader.poll]轮询方法æ¥åŠ è½½åˆ†å—。\n" -"一个å¯é€‰çš„[code]type_hint[/code]类型æç¤ºå¯ä»¥ç”¨æ¥è¿›ä¸€æ¥æŒ‡å®šåº”该由" -"[ResourceFormatLoader]处ç†çš„资æº[Resource]类型。任何继承自[Resource]的东西都" -"å¯ä»¥è¢«ç”¨ä½œç±»åž‹æç¤ºï¼Œä¾‹å¦‚[Image]。" +"开始交互å¼åŠ è½½ä¸€ä¸ªèµ„æºã€‚返回的 [ResourceInteractiveLoader] 对象å…è®¸ä»¥é«˜ç²’åº¦åŠ " +"载,连ç»è°ƒç”¨å…¶ [method ResourceInteractiveLoader.poll] 轮询方法æ¥åŠ è½½åˆ†å—。\n" +"一个å¯é€‰çš„ [code]type_hint[/code] 类型æç¤ºå¯ä»¥ç”¨æ¥è¿›ä¸€æ¥æŒ‡å®šåº”该由 " +"[ResourceFormatLoader] 处ç†çš„èµ„æº [Resource] 类型。任何继承自 [Resource] 的东" +"西都å¯ä»¥è¢«ç”¨ä½œç±»åž‹æç¤ºï¼Œä¾‹å¦‚ [Image]。" #: doc/classes/ResourceLoader.xml msgid "" @@ -65731,9 +65858,9 @@ msgid "" "will be renamed to \"[code]name[/code] N\" where N is an incrementing number " "starting from 2." msgstr "" -"å°†ä¸€ä¸ªèµ„æºæ·»åŠ åˆ°é¢„åŠ è½½å™¨ä¸ï¼Œå¹¶ç»™å‡º[code]name[/code]。如果给定的[code]name[/" -"code]的资æºå·²ç»å˜åœ¨ï¼Œæ–°çš„资æºå°†è¢«é‡å‘½å为\"[code]name[/code] N\",其ä¸N是一个" -"从2开始的递增数å—。" +"å°†ä¸€ä¸ªèµ„æºæ·»åŠ åˆ°é¢„åŠ è½½å™¨ä¸ï¼Œå¹¶ç»™å‡º [code]name[/code]。如果给定的 [code]name[/" +"code] 的资æºå·²ç»å˜åœ¨ï¼Œæ–°çš„资æºå°†è¢«é‡å‘½å为 \"[code]name[/code] N\"ï¼Œå…¶ä¸ N 是" +"一个从 2 开始的递增数å—。" #: doc/classes/ResourcePreloader.xml msgid "Returns the resource associated to [code]name[/code]." @@ -65748,22 +65875,23 @@ msgid "" "Returns [code]true[/code] if the preloader contains a resource associated to " "[code]name[/code]." msgstr "" -"å¦‚æžœé¢„åŠ è½½å™¨åŒ…å«ä¸€ä¸ªä¸Ž[code]name[/code]相关的资æºï¼Œåˆ™è¿”回 [code]true[/code]。" +"å¦‚æžœé¢„åŠ è½½å™¨åŒ…å«ä¸€ä¸ªä¸Ž [code]name[/code] 相关的资æºï¼Œåˆ™è¿”回 [code]true[/" +"code]。" #: doc/classes/ResourcePreloader.xml msgid "" "Removes the resource associated to [code]name[/code] from the preloader." -msgstr "ä»Žé¢„åŠ è½½å™¨ä¸åˆ 除与[code]name[/code]有关的资æºã€‚" +msgstr "ä»Žé¢„åŠ è½½å™¨ä¸åˆ 除与 [code]name[/code] 有关的资æºã€‚" #: doc/classes/ResourcePreloader.xml msgid "" "Renames a resource inside the preloader from [code]name[/code] to " "[code]newname[/code]." -msgstr "å°†é¢„åŠ è½½å™¨ä¸çš„资æºä»Ž[code]name[/code]é‡å‘½å为[code]newname[/code]。" +msgstr "å°†é¢„åŠ è½½å™¨ä¸çš„资æºä»Ž [code]name[/code] é‡å‘½å为 [code]newname[/code]。" #: doc/classes/ResourceSaver.xml msgid "Singleton for saving Godot-specific resource types." -msgstr "用于ä¿å˜Godot特定资æºç±»åž‹çš„å•例。" +msgstr "用于ä¿å˜ Godot 特定资æºç±»åž‹çš„å•例。" #: doc/classes/ResourceSaver.xml msgid "" @@ -65773,10 +65901,10 @@ msgid "" "text-based (e.g. [code].tres[/code] or [code].tscn[/code]) or binary files " "(e.g. [code].res[/code] or [code].scn[/code])." msgstr "" -"用于将Godot特定的资æºç±»åž‹ä¿å˜åˆ°æ–‡ä»¶ç³»ç»Ÿçš„å•例。\n" -"å®ƒä½¿ç”¨åœ¨å¼•æ“Žä¸æ³¨å†Œçš„许多[ResourceFormatSaver]ç±»ï¼ˆæ— è®ºæ˜¯å†…ç½®çš„è¿˜æ˜¯æ¥è‡ªæ’ä»¶" -"çš„ï¼‰ï¼Œå°†å¼•æ“Žç‰¹å®šçš„èµ„æºæ•°æ®ä¿å˜åˆ°åŸºäºŽæ–‡æœ¬ï¼ˆå¦‚[code].res[/code]或[code].tscn[/" -"code])或二进制文件(如[code].res[/code]或[code].scn[/code])。" +"用于将 Godot 特定的资æºç±»åž‹ä¿å˜åˆ°æ–‡ä»¶ç³»ç»Ÿçš„å•例。\n" +"å®ƒä½¿ç”¨åœ¨å¼•æ“Žä¸æ³¨å†Œçš„许多 [ResourceFormatSaver] ç±»ï¼ˆæ— è®ºæ˜¯å†…ç½®çš„è¿˜æ˜¯æ¥è‡ªæ’ä»¶" +"çš„ï¼‰ï¼Œå°†å¼•æ“Žç‰¹å®šçš„èµ„æºæ•°æ®ä¿å˜åˆ°åŸºäºŽæ–‡æœ¬ï¼ˆå¦‚ [code].res[/code] 或 [code]." +"tscn[/code])或二进制文件(如 [code].res[/code] 或 [code].scn[/code])。" #: doc/classes/ResourceSaver.xml msgid "" @@ -65792,9 +65920,9 @@ msgid "" "behavior.\n" "Returns [constant OK] on success." msgstr "" -"使用识别资æºå¯¹è±¡çš„[ResourceFormatSaver]将资æºä¿å˜åˆ°ç»™å®šè·¯å¾„çš„ç£ç›˜ã€‚\n" +"使用识别资æºå¯¹è±¡çš„ [ResourceFormatSaver] 将资æºä¿å˜åˆ°ç»™å®šè·¯å¾„çš„ç£ç›˜ã€‚\n" "å¯ä»¥æŒ‡å®š [code]flags[/code] ä½æŽ©ç æ¥è‡ªå®šä¹‰ä¿å˜è¡Œä¸ºã€‚\n" -"æˆåŠŸåŽè¿”回[constant OK]。" +"æˆåŠŸåŽè¿”回 [constant OK]。" #: doc/classes/ResourceSaver.xml msgid "Save the resource with a path relative to the scene which uses it." @@ -65869,8 +65997,8 @@ msgid "" "successfully. If the method returns [code]false[/code], it will skip " "transformation to avoid displaying broken text." msgstr "" -"覆盖这个方法æ¥ä¿®æ”¹[code]char_fx[/code]ä¸çš„属性。如果å—符å¯ä»¥è¢«æˆåŠŸè½¬æ¢ï¼Œè¯¥æ–¹" -"法必须返回 [code]true[/code]。如果该方法返回 [code]false[/code],它将跳过转" +"覆盖这个方法æ¥ä¿®æ”¹ [code]char_fx[/code] ä¸çš„属性。如果å—符å¯ä»¥è¢«æˆåŠŸè½¬æ¢ï¼Œè¯¥" +"方法必须返回 [code]true[/code]。如果该方法返回 [code]false[/code],它将跳过转" "æ¢ï¼Œä»¥é¿å…æ˜¾ç¤ºç ´ç¢Žçš„æ–‡æœ¬ã€‚" #: doc/classes/RichTextLabel.xml @@ -65902,9 +66030,9 @@ msgid "" "characters instead. This will be resolved in Godot 4.0." msgstr "" "富文本å¯ä»¥åŒ…å«è‡ªå®šä¹‰æ–‡æœ¬ã€å—体ã€å›¾åƒå’Œä¸€äº›åŸºæœ¬æ ¼å¼ã€‚è¯¥æ ‡ç¾ä¼šå°†è¿™äº›ä»¥å†…éƒ¨æ ‡ç¾" -"å †æ ˆçš„å½¢å¼è¿›è¡Œç®¡ç†ã€‚它还å¯ä»¥é€‚应给定的宽度/高度。\n" -"[b]注æ„:[/b]为 [member bbcode_text] è®¾ç½®å†…å®¹ä¼šæ¸…é™¤æ ‡ç¾å †æ ˆå¹¶æ ¹æ®è¯¥å±žæ€§çš„内容" -"é‡å»ºã€‚对 [member bbcode_text] 所åšçš„ä»»ä½•ç¼–è¾‘éƒ½å°†åˆ é™¤å…ˆå‰ä»Žå…¶ä»–æ‰‹åŠ¨æ¥æºï¼ˆä¾‹å¦‚ " +"æ ˆçš„å½¢å¼è¿›è¡Œç®¡ç†ã€‚它还å¯ä»¥é€‚应给定的宽度/高度。\n" +"[b]注æ„:[/b]为 [member bbcode_text] è®¾ç½®å†…å®¹ä¼šæ¸…é™¤æ ‡ç¾æ ˆå¹¶æ ¹æ®è¯¥å±žæ€§çš„内容é‡" +"建。对 [member bbcode_text] 所åšçš„ä»»ä½•ç¼–è¾‘éƒ½å°†åˆ é™¤å…ˆå‰ä»Žå…¶ä»–æ‰‹åŠ¨æ¥æºï¼ˆä¾‹å¦‚ " "[method append_bbcode] å’Œ [code]push_*[/code] / [method pop] 方法)所åšçš„ç¼–" "辑。\n" "[b]注æ„:[/b]RichTextLabel 䏿”¯æŒçº ç¼ çš„ BBCode æ ‡ç¾ã€‚例如,ä¸è¦ä½¿ç”¨ [code]" @@ -65934,7 +66062,7 @@ msgid "" "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 "" -"将图åƒçš„å¼€å¤´å’Œç»“å°¾æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †ä¸ï¼Œå¯ä»¥é€‰æ‹©æä¾› [code]width[/code] å’Œ " +"将图åƒçš„å¼€å¤´å’Œç»“å°¾æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾æ ˆä¸ï¼Œå¯ä»¥é€‰æ‹©æä¾› [code]width[/code] å’Œ " "[code]height[/code] æ¥è°ƒæ•´å›¾åƒçš„大å°ã€‚\n" "如果 [code]width[/code] 或 [code]height[/code] 被设置为 0,图åƒçš„大å°è¢«è°ƒæ•´ä¸º" "ä¿æŒåŽŸå§‹é•¿å®½æ¯”ã€‚" @@ -65955,7 +66083,7 @@ msgid "" "[b]Note:[/b] This method internals' can't possibly fail, but an error code " "is returned for backwards compatibility, which will always be [constant OK]." msgstr "" -"è§£æž [code]bbcode[/code] å¹¶æ ¹æ®éœ€è¦å°†æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †æ ˆä¸ã€‚\n" +"è§£æž [code]bbcode[/code] å¹¶æ ¹æ®éœ€è¦å°†æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾æ ˆä¸ã€‚\n" "[b]注æ„:[/b]ä½¿ç”¨æ¤æ–¹æ³•ï¼Œæ‚¨æ— æ³•å…³é—在之å‰çš„ [method append_bbcode] è°ƒç”¨ä¸æ‰“å¼€" "çš„æ ‡ç¾ã€‚è¿™æ ·åšæ˜¯ä¸ºäº†æé«˜æ€§èƒ½ï¼Œç‰¹åˆ«æ˜¯åœ¨æ›´æ–°å¤§åž‹ RichTextLabel æ—¶ï¼Œå› ä¸ºæ¯æ¬¡é‡å»º" "整个 BBCode 会更慢。如果您ç»å¯¹éœ€è¦åœ¨å°†æ¥çš„æ–¹æ³•调用ä¸å…³é—æ ‡ç¾ï¼Œè¯·é™„åŠ [member " @@ -65965,7 +66093,7 @@ msgstr "" #: doc/classes/RichTextLabel.xml msgid "Clears the tag stack and sets [member bbcode_text] to an empty string." -msgstr "æ¸…é™¤æ ‡è®°å †æ ˆå¹¶å°† [member bbcode_text] 设置为空å—符串。" +msgstr "æ¸…é™¤æ ‡ç¾æ ˆå¹¶å°† [member bbcode_text] 设置为空å—符串。" #: doc/classes/RichTextLabel.xml msgid "Returns the height of the content." @@ -66000,7 +66128,7 @@ msgstr "" #: doc/classes/RichTextLabel.xml msgid "Adds a newline tag to the tag stack." -msgstr "åœ¨æ ‡ç¾å †ä¸æ·»åŠ ä¸€ä¸ªæ¢è¡Œæ ‡ç¾ã€‚" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ªæ¢è¡Œæ ‡ç¾ã€‚" #: doc/classes/RichTextLabel.xml msgid "" @@ -66039,40 +66167,40 @@ msgid "" "the same as adding a [code][b][/code] tag if not currently in a [code][i][/" "code] tag." msgstr "" -"åœ¨æ ‡ç¾å †ä¸æ·»åŠ ä¸€ä¸ª[code][font][/code]æ ‡ç¾ï¼Œå—ä½“ä¸ºé»‘ä½“ã€‚å¦‚æžœå½“å‰æ²¡æœ‰[code][i]" -"[/code]æ ‡ç¾ï¼Œè¿™ä¸Žæ·»åŠ ä¸€ä¸ª[code][b][/code]æ ‡ç¾ç›¸åŒã€‚" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][font][/code] æ ‡ç¾ï¼Œå—ä½“ä¸ºé»‘ä½“ã€‚å¦‚æžœå½“å‰æ²¡æœ‰ [code]" +"[i][/code] æ ‡ç¾ï¼Œè¿™ä¸Žæ·»åŠ ä¸€ä¸ª [code][b][/code] æ ‡ç¾ç›¸åŒã€‚" #: doc/classes/RichTextLabel.xml msgid "" "Adds a [code][font][/code] tag with a bold italics font to the tag stack." -msgstr "åœ¨æ ‡ç¾å †ä¸æ·»åŠ ä¸€ä¸ª[code][font][/code]æ ‡ç¾ï¼Œå—体为粗斜体。" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][font][/code] æ ‡ç¾ï¼Œå—体为粗斜体。" #: doc/classes/RichTextLabel.xml 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 "" -"将一个[code][cell][/code]æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †ä¸ã€‚必须在一个[code][table][/code]æ ‡" -"ç¾å†…。详情è§[method push_table]。" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][cell][/code] æ ‡ç¾ã€‚å¿…é¡»ä½äºŽ [code][table][/code] æ ‡" +"ç¾å†…ã€‚è¯¦è§ [method push_table]。" #: doc/classes/RichTextLabel.xml msgid "Adds a [code][color][/code] tag to the tag stack." -msgstr "将一个[code][color][/code]æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †ã€‚" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][color][/code] æ ‡ç¾ã€‚" #: doc/classes/RichTextLabel.xml msgid "" "Adds a [code][font][/code] tag to the tag stack. Overrides default fonts for " "its duration." msgstr "" -"将一个[code][font][/code]æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †ä¸ã€‚在其有效期内覆盖默认å—体。" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][font][/code] æ ‡ç¾ã€‚在其有效期内覆盖默认å—体。" #: doc/classes/RichTextLabel.xml 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 "" -"å°† [code][indent][/code] æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †æ ˆã€‚å°† [code]level[/code] ä¹˜ä»¥å½“å‰ " -"[member tab_size] 以确定新的边è·é•¿åº¦ã€‚" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][indent][/code] æ ‡ç¾ã€‚å°† [code]level[/code] 乘以当" +"å‰ [member tab_size] 以确定新的边è·é•¿åº¦ã€‚" #: doc/classes/RichTextLabel.xml msgid "" @@ -66080,8 +66208,8 @@ msgid "" "the same as adding a [code][i][/code] tag if not currently in a [code][b][/" "code] tag." msgstr "" -"åœ¨æ ‡ç¾å †ä¸æ·»åŠ ä¸€ä¸ª[code][font][/code]æ ‡ç¾ï¼Œå—ä½“ä¸ºæ–œä½“ã€‚å¦‚æžœå½“å‰æ²¡æœ‰[code][b]" -"[/code]æ ‡ç¾ï¼Œè¿™ä¸Žæ·»åŠ [code][i][/code]æ ‡ç¾ç›¸åŒã€‚" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][font][/code] æ ‡ç¾ï¼Œå—ä½“ä¸ºæ–œä½“ã€‚å¦‚æžœå½“å‰æ²¡æœ‰ [code]" +"[b][/code] æ ‡ç¾ï¼Œè¿™ä¸Žæ·»åŠ [code][i][/code] æ ‡ç¾ç›¸åŒã€‚" #: doc/classes/RichTextLabel.xml msgid "" @@ -66089,36 +66217,36 @@ msgid "" "[code][ol][/code] or [code][ul][/code], but supports more list types. Not " "fully implemented!" msgstr "" -"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª[code][list][/code]æ ‡ç¾ã€‚类似于BBCodes [code][ol][/code] " -"或 [code][ul][/code] ï¼Œä½†æ”¯æŒæ›´å¤šçš„列表类型。未完全实现!" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][list][/code] æ ‡ç¾ã€‚类似于 BBCode çš„ [code][ol][/" +"code] 或 [code][ul][/code] ï¼Œä½†æ”¯æŒæ›´å¤šçš„列表类型。未完全实现ï¼" #: doc/classes/RichTextLabel.xml 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 "" -"æ·»åŠ ä¸€ä¸ª[code][meta][/code]æ ‡ç¾åˆ°æ ‡ç¾å †ä¸ã€‚类似于BBCode [code][url=something]" -"{text}[/url][/code],但支æŒéž[String]元数æ®ç±»åž‹ã€‚" +"åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][meta][/code] æ ‡ç¾ã€‚类似于BBCode çš„ [code]" +"[url=something]{text}[/url][/code],但支æŒéž [String] 元数æ®ç±»åž‹ã€‚" #: doc/classes/RichTextLabel.xml msgid "Adds a [code][font][/code] tag with a monospace font to the tag stack." -msgstr "åœ¨æ ‡ç¾å †ä¸æ·»åŠ ä¸€ä¸ª[code][font][/code]æ ‡ç¾ï¼Œè¯¥æ ‡ç¾ä¸ºç‰å®½å—体。" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][font][/code] æ ‡ç¾ï¼Œè¯¥æ ‡ç¾ä¸ºç‰å®½å—体。" #: doc/classes/RichTextLabel.xml msgid "Adds a [code][font][/code] tag with a normal font to the tag stack." -msgstr "åœ¨æ ‡ç¾å †ä¸æ·»åŠ ä¸€ä¸ªå…·æœ‰æ£å¸¸å—体的[code][font][/code]æ ‡ç¾ã€‚" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ªå…·æœ‰æ£å¸¸å—体的 [code][font][/code] æ ‡ç¾ã€‚" #: doc/classes/RichTextLabel.xml msgid "Adds a [code][s][/code] tag to the tag stack." -msgstr "将一个[code][s][/code]æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †ä¸ã€‚" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][s][/code] æ ‡ç¾ã€‚" #: doc/classes/RichTextLabel.xml msgid "Adds a [code][table=columns][/code] tag to the tag stack." -msgstr "将一个[code][table=columns][/code]æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾æ ˆã€‚" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][table=columns][/code] æ ‡ç¾ã€‚" #: doc/classes/RichTextLabel.xml msgid "Adds a [code][u][/code] tag to the tag stack." -msgstr "将一个[code][u][/code]æ ‡ç¾æ·»åŠ åˆ°æ ‡ç¾å †ä¸ã€‚" +msgstr "åœ¨æ ‡ç¾æ ˆä¸æ·»åŠ ä¸€ä¸ª [code][u][/code] æ ‡ç¾ã€‚" #: doc/classes/RichTextLabel.xml msgid "" @@ -66259,7 +66387,7 @@ msgid "" "Does not parse BBCodes. Does not modify [member bbcode_text]." msgstr "" "æ ‡ç¾çš„原始文本。\n" -"设置åŽï¼Œæ¸…é™¤æ ‡ç¾å †æ ˆå¹¶åœ¨å…¶é¡¶éƒ¨æ·»åŠ ä¸€ä¸ªåŽŸå§‹æ–‡æœ¬æ ‡ç¾ã€‚ä¸è§£æž BBCode。ä¸ä¿®æ”¹ " +"设置åŽï¼Œæ¸…é™¤æ ‡ç¾æ ˆå¹¶åœ¨å…¶é¡¶éƒ¨æ·»åŠ ä¸€ä¸ªåŽŸå§‹æ–‡æœ¬æ ‡ç¾ã€‚ä¸è§£æž BBCode。ä¸ä¿®æ”¹ " "[member bbcode_text]。" #: doc/classes/RichTextLabel.xml @@ -66283,7 +66411,7 @@ msgid "" msgstr "" "å½“ç”¨æˆ·ç‚¹å‡»å…ƒæ ‡è®°ä¹‹é—´çš„å†…å®¹æ—¶è§¦å‘。如果元是在文本ä¸å®šä¹‰çš„,例如[code]" "[url={\"data\"=\"hi\"}]hi[/url][/code],则该信å·çš„傿•°ä¸º[String]类型。如果需" -"è¦ç‰¹å®šç±»åž‹æˆ–对象,则必须使用 [method push_meta] æ–¹æ³•å°†æ•°æ®æ‰‹åЍæ’å…¥æ ‡ç¾å †æ ˆã€‚" +"è¦ç‰¹å®šç±»åž‹æˆ–对象,则必须使用 [method push_meta] æ–¹æ³•å°†æ•°æ®æ‰‹åЍæ’å…¥æ ‡ç¾æ ˆã€‚" #: doc/classes/RichTextLabel.xml msgid "Triggers when the mouse exits a meta tag." @@ -66892,8 +67020,8 @@ 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 msgid "" @@ -67003,7 +67131,7 @@ msgid "" "collision (should there be one)." msgstr "" "如果在给定的å‘é‡ä¸ç§»åŠ¨ä¼šå¯¼è‡´ç¢°æ’žï¼Œåˆ™è¿”å›ž [code]true[/code]。[code]margin[/" -"code]å¢žåŠ å‚与碰撞检测的形状的大å°ï¼Œ[code]result[/code] 是一个 " +"code] å¢žåŠ å‚与碰撞检测的形状的大å°ï¼Œ[code]result[/code] 是一个 " "[Physics2DTestMotionResult] 类型的对象,它包å«å…³äºŽç¢°æ’žçš„é¢å¤–ä¿¡æ¯ï¼ˆå¦‚果有的" "è¯ï¼‰ã€‚" @@ -67725,8 +67853,8 @@ msgid "" msgstr "" "在转æ¢è¿‡ç¨‹ä¸ï¼Œ[Room] å†…å¯¹è±¡çš„å‡ ä½•å½¢çŠ¶ï¼Œæˆ–è‡ªå®šä¹‰æŒ‡å®šçš„æ‰‹åŠ¨ç»‘å®šï¼Œç”¨äºŽç”Ÿæˆ [b]凸" "多边形绑定[/b]。\n" -"这个凸多边形在å¯è§æ€§ç³»ç»Ÿä¸æ˜¯ [b]必需的[/b],并且用于许多目的。最é‡è¦çš„æ˜¯ï¼Œå®ƒ" -"用于决定[Camera](或物体)是å¦åœ¨[Room]内。凸多边形生æˆç®—法很好,但有时它会创" +"这个凸多边形在å¯è§æ€§ç³»ç»Ÿä¸æ˜¯[b]必需的[/b],并且用于许多目的。最é‡è¦çš„æ˜¯ï¼Œå®ƒç”¨" +"于决定 [Camera](或物体)是å¦åœ¨ [Room] 内。凸多边形生æˆç®—法很好,但有时它会创" "建太多(或太少)的平é¢ï¼Œæ— 法很好地表示空间体积。\n" "[code]room_simplify[/code] 值å¯ç”¨äºŽå¯¹è¯¥è¿‡ç¨‹è¿›è¡Œç²¾ç»†æŽ§åˆ¶ã€‚它决定了如何相似平é¢" "æ‰èƒ½å°†å®ƒä»¬è§†ä¸ºç›¸åŒï¼ˆå¹¶åˆ 除é‡å¤é¡¹ï¼‰ã€‚该值å¯ä»¥è®¾ç½®åœ¨ 0ï¼ˆæ— ç®€åŒ–ï¼‰å’Œ 1(最大简" @@ -68138,13 +68266,16 @@ msgstr "" "[method change_scene] 调用之åŽï¼Œä½ æ— æ³•ç«‹å³è®¿é—®åˆ°å®ƒã€‚" #: doc/classes/SceneTree.xml +#, fuzzy 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.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" "å°†æ£åœ¨è¿è¡Œçš„场景改å˜ä¸ºç»™å®šçš„ [PackedScene] 的新实例。\n" "æˆåŠŸæ—¶è¿”å›ž [constant OK],如果场景ä¸èƒ½è¢«å®žä¾‹åŒ–,则返回 [constant " @@ -68331,18 +68462,20 @@ msgstr "当å‰åœºæ™¯ã€‚" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" -"如果为 [code]true[/code],以调试为目的从编辑器è¿è¡Œæ¸¸æˆæ—¶ï¼Œç¢°æ’žå½¢çŠ¶å°†æ˜¯å¯è§" -"的。" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" -"如果为 [code]true[/code],以调试为目的从编辑器è¿è¡Œæ¸¸æˆæ—¶ï¼Œå¯¼èˆªå¤šè¾¹å½¢å°†æ˜¯å¯è§" -"的。" #: doc/classes/SceneTree.xml msgid "The root of the edited scene." @@ -69930,8 +70063,11 @@ msgstr "" "[code]color[/code]。确切的绘制方法是æ¯ä¸ªå½¢çŠ¶ç‰¹æœ‰çš„ï¼Œæ— æ³•é…置。" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." -msgstr "形状的自定义求解器å置。" +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." +msgstr "" #: doc/classes/ShortCut.xml msgid "A shortcut for binding input." @@ -70688,24 +70824,35 @@ msgstr "" msgid "" "Returns whether this node uses a scale of [code](1, 1, 1)[/code] or its " "local transformation scale." -msgstr "返回该节点是å¦ä½¿ç”¨[code](1, 1, 1)[/code]çš„æ¯”ä¾‹æˆ–å…¶æœ¬åœ°è½¬æ¢æ¯”例。" +msgstr "返回该节点是å¦ä½¿ç”¨ [code](1, 1, 1)[/code] çš„æ¯”ä¾‹æˆ–å…¶æœ¬åœ°å˜æ¢æ¯”例。" #: doc/classes/Spatial.xml msgid "" "Returns whether this node is set as Toplevel, that is whether it ignores its " "parent nodes transformations." -msgstr "返回该节点是å¦è¢«è®¾ç½®ä¸ºToplevel,也就是是å¦å¿½ç•¥å…¶çˆ¶èŠ‚ç‚¹çš„å˜æ¢ã€‚" +msgstr "返回该节点是å¦è¢«è®¾ç½®ä¸ºé¡¶å±‚(Toplevelï¼‰ï¼Œå³æ˜¯å¦å¿½ç•¥å…¶çˆ¶èŠ‚ç‚¹çš„å˜æ¢ã€‚" #: doc/classes/Spatial.xml msgid "" "Returns whether the node notifies about its global and local transformation " "changes. [Spatial] will not propagate this by default." msgstr "" -"返回节点是å¦é€šçŸ¥å…¶å…¨å±€å’Œå±€éƒ¨çš„å˜æ¢å˜åŒ–。默认情况下,[Spatial]ä¸ä¼šå¯¹æ¤è¿›è¡Œä¼ " +"返回节点是å¦é€šçŸ¥å…¶å…¨å±€å’Œå±€éƒ¨çš„å˜æ¢å˜åŒ–。默认情况下 [Spatial] ä¸ä¼šå¯¹æ¤è¿›è¡Œä¼ " "æ’。" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" +"如果该节点ä½äºŽ [SceneTree] ä¸ï¼Œå¹¶ä¸”å…¶ [member visible] 属性为 [code]true[/" +"code],并且其所有上层节点也å‡å¯è§ï¼Œåˆ™è¿”回 [code]true[/code]。如果任何上层节点" +"被éšè—ï¼Œåˆ™è¯¥èŠ‚ç‚¹åœ¨åœºæ™¯æ ‘ä¸å°†ä¸å¯è§ã€‚" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -70733,8 +70880,8 @@ msgid "" "itself to point toward the [code]target[/code] as per [method look_at]. " "Operations take place in global space." msgstr "" -"将节点移动到指定的[code]position[/code]ï¼Œç„¶åŽæŒ‰ç…§[method look_at]çš„è¦æ±‚旋转自" -"己以指å‘[code]target[/code]。æ“作是在全局空间进行的。" +"将节点移动到指定的 [code]position[/code]ï¼Œç„¶åŽæŒ‰ç…§ [method look_at] çš„è¦æ±‚æ—‹" +"è½¬è‡ªå·±ä»¥æŒ‡å‘ [code]target[/code]。æ“作是在全局空间进行的。" #: doc/classes/Spatial.xml msgid "" @@ -70756,7 +70903,7 @@ 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 "" -"围绕轴(å•ä½ [Vector3]ï¼‰æ—‹è½¬æœ¬åœ°å˜æ¢ï¼ŒæŒ‡å®šè§’度(弧度)。旋转轴是在物体的本地" +"围绕轴(å•ä½ [Vector3]ï¼‰æ—‹è½¬å±€éƒ¨å˜æ¢ï¼ŒæŒ‡å®šè§’度(弧度)。旋转轴是在物体的本地" "åæ ‡ç³»ä¸ã€‚" #: doc/classes/Spatial.xml @@ -70979,9 +71126,9 @@ msgid "" msgstr "" "å½“ç©ºé—´èŠ‚ç‚¹çš„å…¨å±€å˜æ¢å‘生å˜åŒ–时,空间节点会收到这个通知。这æ„味ç€å½“å‰èŠ‚ç‚¹æˆ–çˆ¶" "节点改å˜äº†å®ƒçš„å˜æ¢ã€‚\n" -"为了使[constant NOTIFICATION_TRANSFORM_CHANGED]生效,用户首先需è¦ç”¨[method " -"set_notify_transform]å‘é€è¯·æ±‚。如果节点是在编辑器的上下文ä¸ï¼Œå¹¶ä¸”它有一个有效" -"çš„gizmo,那么该通知也会被å‘é€ã€‚" +"为了使 [constant NOTIFICATION_TRANSFORM_CHANGED] 生效,用户首先需è¦ç”¨ " +"[method set_notify_transform] å‘é€è¯·æ±‚。如果节点是在编辑器的上下文ä¸ï¼Œå¹¶ä¸”它" +"有一个有效的控制器(Gizmo),那么该通知也会被å‘é€ã€‚" #: doc/classes/Spatial.xml msgid "" @@ -71033,8 +71180,7 @@ msgid "" "Returns [code]true[/code], if the specified flag is enabled. See [enum " "Flags] enumerator for options." msgstr "" -"å¦‚æžœæŒ‡å®šçš„æ ‡å¿—è¢«å¯ç”¨ï¼Œè¿”回 [code]true[/code]。å‚阅 [enum Flags] 枚举器的选" -"项。" +"å¦‚æžœæŒ‡å®šçš„æ ‡å¿—è¢«å¯ç”¨ï¼Œè¿”回 [code]true[/code]ã€‚é€‰é¡¹è§ [enum Flags] 枚举值。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71063,8 +71209,8 @@ msgid "" msgstr "" "如果为 [code]true[/code],则å¯ç”¨æŒ‡å®šçš„æ ‡å¿—ã€‚æ ‡å¿—æ˜¯å¯ä»¥æ‰“开和关é—çš„å¯é€‰è¡Œä¸ºã€‚" "使用该函数一次åªèƒ½å¯ç”¨ä¸€ä¸ªæ ‡å¿—,ä¸èƒ½å°†æ ‡å¿—枚举值åƒä½æŽ©ç ä¸€æ ·è¿›è¡Œåˆå¹¶ï¼Œä¸€æ¬¡å¯" -"用或ç¦ç”¨å¤šä¸ªæ ‡å¿—。也å¯ä»¥é€šè¿‡å°†ç›¸åº”æˆå‘˜è®¾ç½®ä¸º [code]true[/code] æ¥å¯ç”¨æ ‡å¿—。有" -"关选项,请å‚阅 [enum Flags] 枚举器。" +"用或ç¦ç”¨å¤šä¸ªæ ‡å¿—。也å¯ä»¥é€šè¿‡å°†ç›¸åº”æˆå‘˜è®¾ç½®ä¸º [code]true[/code] æ¥å¯ç”¨æ ‡å¿—。选" +"é¡¹è§ [enum Flags] 枚举值。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71094,6 +71240,7 @@ msgstr "" "纹ç†ï¼Œé‚£ä¹ˆè¿™ä¸ªå€¼ä¼šä¸Žå…¶ Alpha 通é“相乘。" #: doc/classes/SpatialMaterial.xml +#, fuzzy msgid "" "If [code]true[/code], anisotropy is enabled. Anisotropy changes the shape of " "the specular blob and aligns it to tangent space. This is useful for brushed " @@ -71103,7 +71250,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" "如果为 [code]true[/code],则å¯ç”¨å„å‘异性。å„å‘异性会改å˜é•œé¢å射斑点的形状并" "将其与切线空间对其。å¯ç”¨äºŽæ‹‰ä¸é“æå’Œæ¯›å‘å射。\n" @@ -71391,7 +71540,7 @@ msgstr "指定è¦ä½¿ç”¨çš„æ·¡å…¥æ·¡å‡ºç±»åž‹ã€‚å¯ä»¥æ˜¯ä»»ä½•一个 [enum Dista #: doc/classes/SpatialMaterial.xml msgid "The emitted light's color. See [member emission_enabled]." -msgstr "å‘出的光的颜色。å‚阅 [member emission_enabled]。" +msgstr "å‘å‡ºçš„å…‰çš„é¢œè‰²ã€‚è§ [member emission_enabled]。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71428,7 +71577,7 @@ msgstr "纹ç†ï¼ŒæŒ‡å®šæŸç‚¹çš„表é¢å‘光的程度。" msgid "" "Forces a conversion of the [member albedo_texture] from sRGB space to linear " "space." -msgstr "强制将 [member albedo_texture] 从sRGB空间转æ¢ä¸ºçº¿æ€§ç©ºé—´ã€‚" +msgstr "强制将 [member albedo_texture] 从 sRGB 空间转æ¢ä¸ºçº¿æ€§ç©ºé—´ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Enables signed distance field rendering shader." @@ -71464,7 +71613,7 @@ msgid "" "If [code]true[/code], transparency is enabled on the body. See also [member " "params_blend_mode]." msgstr "" -"如果为 [code]true[/code],则å¯ç”¨ç‰©ä½“çš„é€æ˜Žåº¦ã€‚å‚阅 [member " +"如果为 [code]true[/code],则å¯ç”¨ç‰©ä½“çš„é€æ˜Žåº¦ã€‚å¦è¯·å‚阅 [member " "params_blend_mode]。" #: doc/classes/SpatialMaterial.xml @@ -71565,7 +71714,7 @@ msgstr "" msgid "" "Texture used to specify metallic for an object. This is multiplied by " "[member metallic]." -msgstr "用于指定对象的金属质感。æ¤å€¼ä¹˜ [member metallic]。" +msgstr "用于指定对象的金属质感。这个值会与 [member metallic] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71634,9 +71783,9 @@ msgid "" "head instead of on the table. See [url=https://github.com/godotengine/godot/" "issues/41567]GitHub issue #41567[/url] for details." msgstr "" -"控制对象如何é¢å‘æ‘„åƒæœºã€‚å‚阅[enum BillboardMode]。\n" -"[b]注æ„:[/b]广告牌模å¼ä¸é€‚åˆVRï¼Œå› ä¸ºå½“å±å¹•è´´åœ¨ä½ çš„å¤´éƒ¨è€Œä¸æ˜¯åœ¨æ¡Œå上时,摄åƒ" -"机的左å³å‘é‡ä¸æ˜¯æ°´å¹³çš„。å‚阅[url=https://github.com/godotengine/godot/" +"控制对象如何é¢å‘æ‘„åƒæœºã€‚è§ [enum BillboardMode]。\n" +"[b]注æ„:[/b]广告牌模å¼ä¸é€‚åˆ VRï¼Œå› ä¸ºå½“å±å¹•è´´åœ¨ä½ çš„å¤´éƒ¨è€Œä¸æ˜¯åœ¨æ¡Œå上时,摄" +"åƒæœºçš„å·¦å³å‘é‡ä¸æ˜¯æ°´å¹³çš„ã€‚è¯¦è§ [url=https://github.com/godotengine/godot/" "issues/41567]GitHub issue #41567[/url]。" #: doc/classes/SpatialMaterial.xml @@ -71646,7 +71795,7 @@ msgid "" "transparent pipeline. See [enum BlendMode]." msgstr "" "æè´¨çš„æ··åˆæ¨¡å¼ã€‚\n" -"[b]注æ„:[/b]除 [code]Mix[/code] ä»¥å¤–çš„å€¼ä¼šå¼ºåˆ¶å¯¹è±¡è¿›å…¥é€æ˜Žç®¡é“。å‚阅 [enum " +"[b]注æ„:[/b]除 [code]Mix[/code] ä»¥å¤–çš„å€¼ä¼šå¼ºåˆ¶å¯¹è±¡è¿›å…¥é€æ˜Žç®¡é“ã€‚è§ [enum " "BlendMode]。" #: doc/classes/SpatialMaterial.xml @@ -71673,7 +71822,7 @@ msgid "" "If [code]true[/code], enables the vertex grow setting. See [member " "params_grow_amount]." msgstr "" -"如果为 [code]true[/code],å¯ç”¨é¡¶ç‚¹ç”Ÿé•¿è®¾ç½®ã€‚å‚è§[member params_grow_amount]。" +"如果为 [code]true[/code],å¯ç”¨é¡¶ç‚¹ç”Ÿé•¿è®¾ç½®ã€‚è§ [member params_grow_amount]。" #: doc/classes/SpatialMaterial.xml msgid "Grows object vertices in the direction of their normals." @@ -71685,19 +71834,19 @@ msgstr "ç›®å‰åœ¨ Godot 䏿œªå®žçŽ°ã€‚" #: doc/classes/SpatialMaterial.xml msgid "The point size in pixels. See [member flags_use_point_size]." -msgstr "点的大å°ï¼Œä»¥åƒç´ 为å•ä½ã€‚å‚è§[member flags_use_point_size]。" +msgstr "点的大å°ï¼Œä»¥åƒç´ 为å•ä½ã€‚è§ [member flags_use_point_size]。" #: doc/classes/SpatialMaterial.xml msgid "The method for rendering the specular blob. See [enum SpecularMode]." -msgstr "镜é¢å射斑点的渲染方法。请å‚阅 [enum SpecularMode]。" +msgstr "镜é¢åå°„æ–‘ç‚¹çš„æ¸²æŸ“æ–¹æ³•ã€‚è§ [enum SpecularMode]。" #: doc/classes/SpatialMaterial.xml msgid "" "If [code]true[/code], the shader will discard all pixels that have an alpha " "value less than [member params_alpha_scissor_threshold]." msgstr "" -"如果为 [code]true[/code],ç€è‰²å™¨å°†ä¸¢å¼ƒæ‰€æœ‰alpha值å°äºŽ[member " -"params_alpha_scissor_threshold]çš„åƒç´ 。" +"如果为 [code]true[/code],ç€è‰²å™¨å°†ä¸¢å¼ƒæ‰€æœ‰ Alpha 值å°äºŽ [member " +"params_alpha_scissor_threshold] çš„åƒç´ 。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71705,7 +71854,7 @@ msgid "" "when using [constant BILLBOARD_PARTICLES]. See [member " "params_billboard_mode]." msgstr "" -"ç²’åç²¾çµè¡¨ä¸çš„æ°´å¹³å¸§æ•°ã€‚仅在使用 [constant BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚å‚阅" +"ç²’åç²¾çµè¡¨ä¸çš„æ°´å¹³å¸§æ•°ã€‚仅在使用 [constant BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚è§ " "[member params_billboard_mode]。" #: doc/classes/SpatialMaterial.xml @@ -71714,7 +71863,7 @@ msgid "" "using [constant BILLBOARD_PARTICLES]. See [member params_billboard_mode]." msgstr "" "如果为 [code]true[/code],循环粒å动画。仅在使用 [constant " -"BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚å‚阅[member params_billboard_mode]。" +"BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚è§ [member params_billboard_mode]。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71722,7 +71871,7 @@ msgid "" "when using [constant BILLBOARD_PARTICLES]. See [member " "params_billboard_mode]." msgstr "" -"ç²’åç²¾çµè¡¨ä¸çš„垂直帧数。仅在使用 [constant BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚å‚阅" +"ç²’åç²¾çµè¡¨ä¸çš„垂直帧数。仅在使用 [constant BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚è§ " "[member params_billboard_mode]。" #: doc/classes/SpatialMaterial.xml @@ -71760,7 +71909,7 @@ msgstr "æŠ˜å°„æ•ˆæžœçš„å¼ºåº¦ã€‚è¾ƒé«˜çš„å€¼ä¼šä½¿æŠ˜å°„çš„è¡¨çŽ°æ›´åŠ æ‰æ›²ã€‚ msgid "" "Texture that controls the strength of the refraction per-pixel. Multiplied " "by [member refraction_scale]." -msgstr "控制æ¯ä¸ªåƒç´ 折射强度的纹ç†ã€‚乘以[member refraction_scale]。" +msgstr "控制æ¯ä¸ªåƒç´ 折射强度的纹ç†ã€‚会与 [member refraction_scale] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71770,9 +71919,9 @@ msgid "" "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 "" -"指定å˜å‚¨æŠ˜å°„ä¿¡æ¯çš„[member refraction_texture]的通é“ã€‚å½“ä½ åœ¨çº¹ç†ä¸å˜å‚¨å¤šç§æ•ˆæžœ" -"çš„ä¿¡æ¯æ—¶ï¼Œè¿™å¾ˆæœ‰ç”¨ã€‚ä¾‹å¦‚ï¼Œå¦‚æžœä½ åœ¨çº¢è‰²é€šé“ä¸å˜å‚¨é‡‘属效果,在è“色通é“ä¸å˜å‚¨ç²—" -"糙度,在绿色通é“ä¸å˜å‚¨çŽ¯å¢ƒé®æŒ¡ï¼Œå°±å¯ä»¥å‡å°‘使用纹ç†çš„æ•°é‡ã€‚" +"指定å˜å‚¨æŠ˜å°„ä¿¡æ¯çš„ [member refraction_texture] 的通é“ã€‚å½“ä½ åœ¨çº¹ç†ä¸å˜å‚¨å¤šç§æ•ˆ" +"æžœçš„ä¿¡æ¯æ—¶ï¼Œè¿™å¾ˆæœ‰ç”¨ã€‚ä¾‹å¦‚ï¼Œå¦‚æžœä½ åœ¨çº¢è‰²é€šé“ä¸å˜å‚¨é‡‘属效果,在è“色通é“ä¸å˜å‚¨" +"粗糙度,在绿色通é“ä¸å˜å‚¨çŽ¯å¢ƒé®æŒ¡ï¼Œå°±å¯ä»¥å‡å°‘使用纹ç†çš„æ•°é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Sets the strength of the rim lighting effect." @@ -71794,7 +71943,7 @@ msgstr "" msgid "" "Texture used to set the strength of the rim lighting effect per-pixel. " "Multiplied by [member rim]." -msgstr "纹ç†ç”¨äºŽè®¾ç½®æ¯ä¸ªåƒç´ 的边缘光照效果的强度。乘以 [member rim]。" +msgstr "纹ç†ç”¨äºŽè®¾ç½®æ¯ä¸ªåƒç´ 的边缘光照效果的强度。会与 [member rim] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71818,7 +71967,7 @@ msgstr "" msgid "" "Texture used to control the roughness per-pixel. Multiplied by [member " "roughness]." -msgstr "用于控制æ¯ä¸ªåƒç´ 粗糙度的纹ç†ã€‚乘以 [member roughness]。" +msgstr "用于控制æ¯ä¸ªåƒç´ 粗糙度的纹ç†ã€‚会与 [member roughness] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71837,8 +71986,8 @@ msgid "" "Texture used to control the subsurface scattering strength. Stored in the " "red texture channel. Multiplied by [member subsurf_scatter_strength]." msgstr "" -"ç”¨äºŽæŽ§åˆ¶æ¬¡è¡¨é¢æ•£å°„强度的纹ç†ã€‚å˜å‚¨åœ¨çº¢è‰²çº¹ç†é€šé“ä¸ã€‚乘以 [member " -"subsurf_scatter_strength]。" +"ç”¨äºŽæŽ§åˆ¶æ¬¡è¡¨é¢æ•£å°„强度的纹ç†ã€‚å˜å‚¨åœ¨çº¢è‰²çº¹ç†é€šé“ä¸ã€‚会与 [member " +"subsurf_scatter_strength] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71854,7 +72003,7 @@ msgstr "如果为 [code]true[/code],则å¯ç”¨ä¼ 输效果。" msgid "" "Texture used to control the transmission effect per-pixel. Added to [member " "transmission]." -msgstr "纹ç†ç”¨äºŽæŽ§åˆ¶æ¯ä¸ªåƒç´ çš„ä¼ è¾“æ•ˆæžœã€‚æ·»åŠ åˆ° [member transmission]。" +msgstr "纹ç†ç”¨äºŽæŽ§åˆ¶æ¯ä¸ªåƒç´ çš„ä¼ è¾“æ•ˆæžœã€‚ä¼šä¸Ž [member transmission] ç›¸åŠ ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71862,7 +72011,7 @@ msgid "" "added to [code]UV[/code] in the vertex function. This can be used to offset " "a texture." msgstr "" -"[code]UV[/code]åæ ‡çš„åç§»é‡ã€‚这个é‡å°†è¢«æ·»åŠ åˆ°é¡¶ç‚¹å‡½æ•°ä¸çš„ [code]UV[/code] " +"[code]UV[/code] åæ ‡çš„åç§»é‡ã€‚这个é‡å°†è¢«æ·»åŠ åˆ°é¡¶ç‚¹å‡½æ•°ä¸çš„ [code]UV[/code] " "ä¸ã€‚è¿™å¯ä»¥ç”¨æ¥å移纹ç†ã€‚" #: doc/classes/SpatialMaterial.xml @@ -71870,7 +72019,7 @@ msgid "" "How much to scale the [code]UV[/code] coordinates. This is multiplied by " "[code]UV[/code] in the vertex function." msgstr "" -"缩放 [code]UV[/code] åæ ‡çš„多少。这个值乘以顶点函数ä¸çš„ [code]UV[/code]。" +"[code]UV[/code] åæ ‡çš„缩放é‡ã€‚这个值会与顶点函数ä¸çš„ [code]UV[/code] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71912,7 +72061,7 @@ msgid "" "How much to scale the [code]UV2[/code] coordinates. This is multiplied by " "[code]UV2[/code] in the vertex function." msgstr "" -"缩放 [code]UV[/code] åæ ‡çš„多少。这个值乘以顶点函数ä¸çš„ [code]UV[/code]。" +"[code]UV2[/code] åæ ‡çš„缩放é‡ã€‚这个值会与顶点函数ä¸çš„ [code]UV2[/code] 相乘。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71979,7 +72128,7 @@ msgstr "指定æ¯ä¸ªåƒç´ æµå›¾æ–¹å‘的纹ç†ï¼Œç”¨äºŽ [member anisotropy]。" #: doc/classes/SpatialMaterial.xml msgid "Texture specifying per-pixel ambient occlusion value." -msgstr "指定æ¯ä¸ªåƒç´ çŽ¯å¢ƒé®æŒ¡å€¼çš„纹ç†ã€‚" +msgstr "指定æ¯ä¸ªåƒç´ 环境光é®è”½çš„纹ç†ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Texture specifying per-pixel depth." @@ -71987,7 +72136,7 @@ msgstr "指定æ¯ä¸ªåƒç´ 深度的纹ç†ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Texture specifying per-pixel subsurface scattering." -msgstr "指定æ¯ä¸ªåƒç´ çš„äºšè¡¨é¢æ•£å°„的纹ç†ã€‚" +msgstr "指定æ¯ä¸ªåƒç´ çš„æ¬¡è¡¨é¢æ•£å°„的纹ç†ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Texture specifying per-pixel transmission color." @@ -72097,7 +72246,7 @@ msgstr "ä¸é€æ˜Žå’Œé€æ˜Žçš„对象都è¦è®¡ç®—深度绘制。" #: doc/classes/SpatialMaterial.xml msgid "No depth draw." -msgstr "没有深度的绘制。" +msgstr "ä¸è¿›è¡Œæ·±åº¦ç»˜åˆ¶ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" @@ -72107,7 +72256,7 @@ msgstr "å¯¹äºŽé€æ˜Žå¯¹è±¡ï¼Œé¦–先对ä¸é€æ˜Žéƒ¨åˆ†è¿›è¡Œä¸é€æ˜Žä¼ 递,然 #: doc/classes/SpatialMaterial.xml msgid "Default cull mode. The back of the object is culled when not visible." -msgstr "默认的è£å‰ªæ¨¡å¼ã€‚当ä¸å¯è§æ—¶ï¼Œå¯¹è±¡çš„背é¢ä¼šè¢«å‰”除。" +msgstr "默认的剔除模å¼ã€‚对象的背é¢ä¼šåœ¨ä¸å¯è§æ—¶è¢«å‰”除。" #: doc/classes/SpatialMaterial.xml msgid "The front of the object is culled when not visible." @@ -72259,11 +72408,11 @@ msgstr "广告牌模å¼è¢«ç¦ç”¨ã€‚" #: doc/classes/SpatialMaterial.xml msgid "The object's Z axis will always face the camera." -msgstr "对象的Z轴将始终é¢å‘相机。" +msgstr "对象的 Z 轴将始终é¢å‘相机。" #: doc/classes/SpatialMaterial.xml msgid "The object's X axis will always face the camera." -msgstr "对象的X轴将始终é¢å‘相机。" +msgstr "对象的 X 轴将始终é¢å‘相机。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -72319,7 +72468,7 @@ msgid "" "faster than [constant DISTANCE_FADE_PIXEL_ALPHA]." msgstr "" "æ ¹æ®æ¯ä¸ªåƒç´ 与相机的è·ç¦»ï¼Œä½¿ç”¨æŠ–åŠ¨æ–¹æ³•å¹³æ»‘åœ°æ·¡åŒ–å¯¹è±¡ã€‚æŠ–åŠ¨ä¼šæ ¹æ®è®¾å®šçš„æ¨¡å¼ä¸¢" -"弃åƒç´ ,在ä¸å¯ç”¨é€æ˜Žçš„æƒ…况下平滑淡化。在æŸäº›ç¡¬ä»¶ä¸Šï¼Œè¿™æ¯” [constant " +"弃åƒç´ ,在ä¸å¯ç”¨é€æ˜Žçš„æƒ…况下平滑淡化。在æŸäº›ç¡¬ä»¶ä¸Šæ¯” [constant " "DISTANCE_FADE_PIXEL_ALPHA] 更快。" #: doc/classes/SpatialMaterial.xml @@ -72330,8 +72479,8 @@ msgid "" "faster than [constant DISTANCE_FADE_PIXEL_ALPHA]." msgstr "" "æ ¹æ®å¯¹è±¡ä¸Žç›¸æœºçš„è·ç¦»ï¼Œä½¿ç”¨æŠ–åŠ¨çš„æ–¹æ³•å¹³æ»‘åœ°æ·¡åŒ–å¯¹è±¡ã€‚æŠ–åŠ¨æ ¹æ®è®¾å®šçš„æ¨¡å¼ä¸¢å¼ƒåƒ" -"ç´ ï¼Œåœ¨ä¸å¯ç”¨é€æ˜Žåº¦çš„æƒ…况下平滑淡化。在æŸäº›ç¡¬ä»¶ä¸Šï¼Œè¿™å¯èƒ½æ¯”[constant " -"DISTANCE_FADE_PIXEL_ALPHA]更快。" +"ç´ ï¼Œåœ¨ä¸å¯ç”¨é€æ˜Žåº¦çš„æƒ…况下平滑淡化。在æŸäº›ç¡¬ä»¶ä¸Šå¯èƒ½æ¯” [constant " +"DISTANCE_FADE_PIXEL_ALPHA] 更快。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -72826,9 +72975,10 @@ msgstr "" "region_rect]。" #: doc/classes/Sprite3D.xml +#, fuzzy msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" "è¦ç»˜åˆ¶çš„ [Texture] 对象。如果 [member GeometryInstance.material_override] 被" "使用,这将被覆盖。" @@ -72919,8 +73069,8 @@ msgid "" "sorted from back to front (subject to priority)." msgstr "" "设置该精çµçš„æ¸²æŸ“优先级。优先级高的物体将被排åºåœ¨ä¼˜å…ˆçº§ä½Žçš„物体å‰é¢ã€‚\n" -"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant " -"ALPHA_CUT_DISABLED](默认值)时适用。\n" +"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant ALPHA_CUT_DISABLED](默认" +"值)时适用。\n" "[b]注æ„:[/b]ä»…é€‚ç”¨äºŽé€æ˜Žç‰©ä½“的排åºã€‚è¿™ä¸ä¼šå½±å“逿˜Žç‰©ä½“相对于ä¸é€æ˜Žç‰©ä½“的排åº" "æ–¹å¼ã€‚è¿™æ˜¯å› ä¸ºä¸é€æ˜Žå¯¹è±¡ä¸è¢«æŽ’åºï¼Œè€Œé€æ˜Žå¯¹è±¡åˆ™ä»ŽåŽå¾€å‰æŽ’åºï¼ˆå–决于优先级)。" @@ -73703,7 +73853,7 @@ msgstr "" msgid "" "Returns a copy of the string with special characters escaped using the C " "language standard." -msgstr "返回一个使用Cè¯è¨€æ ‡å‡†è½¬ä¹‰çš„特殊å—符的å—符串的副本。" +msgstr "返回一个使用 C è¯è¨€æ ‡å‡†è½¬ä¹‰çš„特殊å—符的å—符串的副本。" #: doc/classes/String.xml msgid "" @@ -74421,11 +74571,15 @@ msgid "Returns the right side of the string from a given position." msgstr "返回该å—符串指定ä½ç½®å³ä¾§çš„内容。" #: doc/classes/String.xml +#, fuzzy 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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -74510,9 +74664,13 @@ msgid "Returns a simplified canonical path." msgstr "返回简化的规范路径。" #: doc/classes/String.xml +#, fuzzy msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -74545,11 +74703,15 @@ msgstr "" "如果您需è¦ä½¿ç”¨æ›´å¤æ‚的规则拆分å—符串,请改用 [RegEx] 类。" #: doc/classes/String.xml +#, fuzzy 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" "使用分隔符å—符串将å—符串拆分为浮点数,并返回åå—符串数组。\n" "例如,如果被 [code]\",\"[/code] 分割,[code]\"1,2.5,3\"[/code] 将返回 [code]" @@ -75970,6 +76132,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "如果å¯ç”¨é¼ æ ‡å³é”®é€‰æ‹©ï¼Œåˆ™è¿”回 [code]true[/code]。" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "返回索引 [code]tab_idx[/code] 处的选项å¡çš„æ ‡é¢˜ã€‚" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "返回å‘å·¦å移的éšè—选项å¡çš„æ•°é‡ã€‚" @@ -75999,6 +76166,11 @@ msgid "" msgstr "如果为 [code]true[/code],å¯ç”¨é¼ æ ‡å³é”®é€‰æ‹©é€‰é¡¹å¡ã€‚" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "为索引 [code]tab_idx[/code] 处的选项å¡è®¾ç½®å›¾æ ‡ã€‚" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "为索引 [code]tab_idx[/code] 处的选项å¡è®¾ç½® [code]icon[/code]。" @@ -76012,8 +76184,8 @@ msgid "" "dragging tabs between [Tabs]. Enable drag with [member " "drag_to_rearrange_enabled]." msgstr "" -"å®šä¹‰é‡æ–°æŽ’列组的ID。为æ¯ä¸ª[Tabs]选择相åŒçš„值,以便在[Tabs]ä¹‹é—´æ‹–åŠ¨æ ‡ç¾ã€‚用" -"[member drag_to_rearrange_enabled]å¯ç”¨æ‹–动。" +"å®šä¹‰é‡æ–°æŽ’列组的 ID。为æ¯ä¸ª [Tabs] 选择相åŒçš„值,以便在 [Tabs] ä¹‹é—´æ‹–åŠ¨æ ‡ç¾ã€‚" +"用 [member drag_to_rearrange_enabled] å¯ç”¨æ‹–动。" #: doc/classes/Tabs.xml msgid "Select tab at index [code]tab_idx[/code]." @@ -76042,12 +76214,14 @@ msgid "" "Emitted when the active tab is rearranged via mouse drag. See [member " "drag_to_rearrange_enabled]." msgstr "" -"é€šè¿‡é¼ æ ‡æ‹–åŠ¨é‡æ–°æŽ’åˆ—æ´»åŠ¨é€‰é¡¹å¡æ—¶å‘出。å‚阅 [member " -"drag_to_rearrange_enabled]。" +"é€šè¿‡é¼ æ ‡æ‹–åŠ¨é‡æ–°æŽ’åˆ—æ´»åŠ¨é€‰é¡¹å¡æ—¶å‘å‡ºã€‚è§ [member drag_to_rearrange_enabled]。" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." -msgstr "当选项å¡è¢«å³é”®å•击时å‘出。" +#, fuzzy +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." +msgstr "按下自定义按钮时å‘å‡ºã€‚è§ [method add_button]。" #: doc/classes/Tabs.xml msgid "Emitted when a tab is clicked, even if it is the current tab." @@ -76473,13 +76647,13 @@ msgid "" " var res_column = result[TextEdit.SEARCH_RESULT_COLUMN]\n" "[/codeblock]" msgstr "" -"在文本内部进行æœç´¢ã€‚æœç´¢æ ‡å¿—å¯ä»¥åœ¨[enum SearchFlags]æžšä¸¾ä¸æŒ‡å®šã€‚\n" -"如果没有找到结果,返回一个空的[code]PoolIntArray[/code]。å¦åˆ™ï¼Œå¯ä»¥é€šè¿‡[enum " -"SearchResult]æžšä¸¾ä¸æŒ‡å®šçš„索引访问结果行和列,例如。\n" +"在文本内部进行æœç´¢ã€‚æœç´¢æ ‡å¿—å¯ä»¥ç”¨ [enum SearchFlags] 枚举指定。\n" +"如果没有找到结果,返回一个空的 [code]PoolIntArray[/code]。å¦åˆ™ï¼Œå¯ä»¥é€šè¿‡ " +"[enum SearchResult] æžšä¸¾ä¸æŒ‡å®šçš„索引访问结果行和列,例如:\n" "[codeblock]\n" "var result = search(key, flags, line, column)\n" "if result.size() > 0:\n" -" # 找到的结果。\n" +" # 找到结果。\n" " var res_line = result[TextEdit.SEARCH_RESULT_LINE)\n" " var res_column = result[TextEdit.SEARCH_RESULT_COLUMN]\n" "[/codeblock]" @@ -76510,8 +76684,8 @@ msgid "" "code]. Deletes the bookmark if [code]bookmark[/code] is [code]false[/code].\n" "Bookmarks are shown in the [member breakpoint_gutter]." msgstr "" -"如果 [code]bookmark[/code] 为 [code]true[/code],则为行 [code]line[/code] " -"设置书ç¾ã€‚如果 [code]bookmark[/code] 为 [code]false[/code]ï¼Œåˆ™åˆ é™¤è¯¥ä¹¦ç¾ã€‚\n" +"如果 [code]bookmark[/code] 为 [code]true[/code],则为行 [code]line[/code] 设" +"置书ç¾ã€‚如果 [code]bookmark[/code] 为 [code]false[/code]ï¼Œåˆ™åˆ é™¤è¯¥ä¹¦ç¾ã€‚\n" "ä¹¦ç¾æ˜¾ç¤ºåœ¨ [member breakpoint_gutter] ä¸ã€‚" #: doc/classes/TextEdit.xml @@ -76944,7 +77118,7 @@ msgid "" "Returns an [Image] that is a copy of data from this [Texture]. [Image]s can " "be accessed and manipulated directly." msgstr "" -"返回一个 [Image]ï¼Œå®ƒæ˜¯æ¤ [Texture] 䏿•°æ®çš„副本。[Image] 图åƒå¯ä»¥ç›´æŽ¥è®¿é—®å’Œæ“" +"返回一个 [Image],它是这个 [Texture] 䏿•°æ®çš„副本。[Image] å¯ä»¥ç›´æŽ¥è®¿é—®å’Œæ“" "作。" #: doc/classes/Texture.xml @@ -77290,7 +77464,7 @@ msgstr "返回纹ç†çš„高度。高度通常由Y轴表示。" #: doc/classes/TextureLayered.xml msgid "" "Returns an [Image] resource with the data from specified [code]layer[/code]." -msgstr "返回一个带有指定[code]layer[/code]层数æ®çš„[Image]图åƒèµ„æºã€‚" +msgstr "返回一个带有指定 [code]layer[/code] 层数æ®çš„ [Image] 图åƒèµ„æºã€‚" #: doc/classes/TextureLayered.xml msgid "" @@ -78335,14 +78509,14 @@ 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 "" -"返回一个[Vector2]数组,其ä¸åŒ…å«å›¾å—集䏿‰€æœ‰å•å…ƒæ ¼çš„ä½ç½®ï¼ˆå›¾å—索引éž[code]-1[/" -"code])。" +"返回一个 [Vector2] 数组,其ä¸åŒ…å«å›¾å—集䏿‰€æœ‰å•å…ƒæ ¼çš„ä½ç½®ï¼ˆå›¾å—ç´¢å¼•éž " +"[code]-1[/code])。" #: doc/classes/TileMap.xml msgid "" "Returns an array of all cells with the given tile index specified in " "[code]id[/code]." -msgstr "返回所有具有[code]id[/code]䏿Œ‡å®šçš„图å—索引的å•å…ƒæ ¼çš„æ•°ç»„ã€‚" +msgstr "返回所有具有 [code]id[/code] 䏿Œ‡å®šçš„图å—索引的å•å…ƒæ ¼çš„æ•°ç»„ã€‚" #: doc/classes/TileMap.xml msgid "Returns a rectangle enclosing the used (non-empty) tiles of the map." @@ -79678,7 +79852,7 @@ msgid "" "[b]Note:[/b] This is a \"pass-by\" (not \"bypass\") press mode." msgstr "" "如果为 [code]true[/code],åªè¦æŒ‰ä¸‹çš„æ‰‹æŒ‡è¿›å‡ºæŒ‰é’®ï¼Œå°±ä¼šå‘出 [signal pressed] " -"å’Œ[signal released] ]ä¿¡å·ï¼Œå³ä½¿åŽ‹åŠ›å¼€å§‹äºŽæŒ‰é’®çš„æœ‰æ•ˆåŒºåŸŸä¹‹å¤–ã€‚\n" +"å’Œ [signal released] ä¿¡å·ï¼Œå³ä½¿åŽ‹åŠ›å¼€å§‹äºŽæŒ‰é’®çš„æœ‰æ•ˆåŒºåŸŸä¹‹å¤–ã€‚\n" "[b]注æ„:[/b]这是一ç§â€œpass-byâ€çš„æŒ‰åŽ‹æ¨¡å¼ ï¼Œè€Œä¸æ˜¯â€œbypassâ€ã€‚" #: doc/classes/TouchScreenButton.xml @@ -81989,21 +82163,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "使具有相åŒåç§°çš„åŽç»åŠ¨ä½œåˆå¹¶ä¸ºä¸€ä¸ªã€‚" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." -msgstr "UPNP 网络功能。" +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." +msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -82016,7 +82194,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -82045,81 +82223,78 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" -msgstr "" -"æä¾› UPNP 功能æ¥å‘现本地网络上的 [UPNPDevice],并对它们执行指令,如管ç†ç«¯å£æ˜ " -"射(端å£è½¬å‘)和查询本地和远程网络 IP 地å€ã€‚注æ„ï¼Œè¿™ä¸ªç±»çš„æ–¹æ³•æ˜¯åŒæ¥çš„,会阻" -"塞调用线程。\n" -"è¦è½¬å‘一个特定的端å£ï¼š\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" -"è¦å…³é—一个特定的端å£ï¼ˆä¾‹å¦‚ï¼Œåœ¨ä½ ä½¿ç”¨å®Œå®ƒä¹‹åŽï¼‰ï¼š\n" -"[codeblock]\n" -"upnp.delete_port_mapping(port)\n" -"[/codeblock]\n" -"[b]注æ„:[/b]UPnP å‘现会阻塞当å‰çº¿ç¨‹ã€‚è¦åœ¨ä¸é˜»å¡žä¸»çº¿ç¨‹çš„æƒ…况下执行å‘现,å¯ä»¥" -"åƒè¿™æ ·ä½¿ç”¨ [Thread]:\n" -"[codeblock]\n" -"# å½“å®Œæˆ UPnP ç«¯å£æ˜ 射设置时å‘å‡ºï¼ˆæ— è®ºæˆåŠŸæˆ–å¤±è´¥ï¼‰ã€‚\n" -"signal upnp_completed(error)\n" -"\n" -"# 将其替æ¢ä¸ºæ‚¨è‡ªå·±çš„æœåŠ¡å™¨ç«¯å£å·ï¼ˆä»‹äºŽ 1025 å’Œ 65535之间)。\n" -"const SERVER_PORT = 3928\n" -"var thread = null\n" -"\n" -"func _upnp_setup(server_port):\n" -" # UPNP 查询需è¦ä¸€äº›æ—¶é—´ã€‚\n" -" var upnp = UPNP.new()\n" -" var err = upnp.discover()\n" -"\n" -" if err != OK:\n" -" push_error(str(err))\n" -" emit_signal(\"upnp_completed\", err)\n" -" return\n" -"\n" -" if upnp.get_gateway() and upnp.get_gateway().is_valid_gateway():\n" -" upnp.add_port_mapping(server_port, server_port, ProjectSettings." -"get_setting(\"application/config/name\"), \"UDP\")\n" -" upnp.add_port_mapping(server_port, server_port, ProjectSettings." -"get_setting(\"application/config/name\"), \"TCP\")\n" -" emit_signal(\"upnp_completed\", OK)\n" -"\n" -"func _ready():\n" -" thread = Thread.new()\n" -" thread.start(self, \"_upnp_setup\", SERVER_PORT)\n" -"\n" -"func _exit_tree():\n" -" # 当线程æ£åœ¨è¿è¡Œæ—¶ï¼Œåœ¨è¿™é‡Œç‰å¾…çº¿ç¨‹ç»“æŸæ¥å¤„ç†æ¸¸æˆé€€å‡ºã€‚\n" -" thread.wait_to_finish()\n" -"[/codeblock]" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." +msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "Adds the given [UPNPDevice] to the list of discovered devices." msgstr "将给定的 [UPNPDevice] æ·»åŠ åˆ°å·²å‘现设备的列表ä¸ã€‚" #: modules/upnp/doc_classes/UPNP.xml +#, fuzzy 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" "æ·»åŠ ä¸€ä¸ªæ˜ å°„ï¼Œå°†é»˜è®¤ç½‘å…³ä¸Šçš„å¤–éƒ¨[code]port[/code],介于1å’Œ65535之间,转å‘到本" @@ -82140,12 +82315,15 @@ msgid "Clears the list of discovered devices." msgstr "清除已å‘现设备的列表。" #: modules/upnp/doc_classes/UPNP.xml +#, fuzzy 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" "如果默认网关上å˜åœ¨ç»™å®šçš„端å£å’Œå议组åˆçš„ç«¯å£æ˜ å°„ï¼ˆè§ [method get_gateway])," "åˆ™å°†å…¶åˆ é™¤ã€‚[code]port[/code] 必须是 1 到 65535 之间的有效端å£ï¼Œ[code]proto[/" @@ -82371,16 +82549,17 @@ msgid "Unknown error." msgstr "未知错误。" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." -msgstr "UPNP 设备。" +msgid "Universal Plug and Play (UPnP) device." +msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml +#, fuzzy 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." +"Universal Plug and Play (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 "" "UPNP 设备。å‚阅 [UPNP] 了解 UPNP å‘现和实用功能。æä¾›å¯¹ UPNP 控制命令的低层访" "问。å…许管ç†ç«¯å£æ˜ 射(端å£è½¬å‘)和查询设备的网络信æ¯ï¼Œå¦‚本地和外部IP地å€å’Œçж" @@ -82468,7 +82647,7 @@ msgstr "未知设备。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Invalid control." -msgstr "æ— æ•ˆæŽ§ä»¶ã€‚" +msgstr "æ— æ•ˆæŽ§åˆ¶ã€‚" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Memory allocation error." @@ -82891,8 +83070,8 @@ msgid "" "Returns a vector composed of the [method @GDScript.fposmod] of this vector's " "components and [code]modv[/code]'s components." msgstr "" -"返回一个由这个å‘é‡çš„[code]modv[/code]分é‡å’Œ[method @GDScript.fposmod]分é‡ç»„æˆ" -"çš„å‘é‡ã€‚" +"返回一个由这个å‘é‡çš„ [code]modv[/code] 分é‡å’Œ [method @GDScript.fposmod] 分é‡" +"组æˆçš„å‘é‡ã€‚" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "Returns this vector projected onto the vector [code]b[/code]." @@ -82958,7 +83137,7 @@ msgstr "" msgid "" "Returns a perpendicular vector rotated 90 degrees counter-clockwise compared " "to the original, with the same length." -msgstr "返回一个与原æ¥ç›¸æ¯”逆时针旋转90度的垂直å‘é‡ï¼Œé•¿åº¦ä¸å˜ã€‚" +msgstr "返回一个与原æ¥ç›¸æ¯”逆时针旋转 90 度的垂直å‘é‡ï¼Œé•¿åº¦ä¸å˜ã€‚" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -83320,8 +83499,9 @@ msgid "" "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 "" -"返回一个介于0.0å’Œ1.0ä¹‹é—´çš„å€¼ï¼Œè¡¨ç¤ºè¿™ä¸ªè½®åæ˜¯å¦æ‰“滑。0.0表示打滑,å³è½¦è½®å¤±åŽ»äº†" -"抓地力,例如冰雪地形,1.0è¡¨ç¤ºä¸æ‰“滑,å³è½¦è½®æœ‰å……分的抓地力,例如干燥的沥é’路。" +"返回一个介于 0.0 å’Œ 1.0 ä¹‹é—´çš„å€¼ï¼Œè¡¨ç¤ºè¿™ä¸ªè½®åæ˜¯å¦æ‰“滑。0.0 表示打滑(车轮失" +"去了抓地力,例如冰雪地形),1.0 è¡¨ç¤ºä¸æ‰“滑(车轮有充分的抓地力,例如干燥的沥" +"é’路)。" #: doc/classes/VehicleWheel.xml msgid "Returns [code]true[/code] if this wheel is in contact with a surface." @@ -84069,10 +84249,10 @@ msgid "" "Viewport or from [code]SCREEN_TEXTURE[/code] becomes unavailable. For more " "information see [method VisualServer.viewport_set_render_direct_to_screen]." msgstr "" -"如果为 [code]true[/code],会直接将 Viewport 渲染到å±å¹•ä¸Šï¼Œè€Œä¸æ˜¯æ¸²æŸ“åˆ°æ ¹è§†çª—" -"上。åªåœ¨ GLES2 ä¸å¯ç”¨ã€‚这是一个低级别的优化,在大多数情况下ä¸åº”该使用。如果使" -"用,从 Viewport 或从 [code]SCREEN_TEXTURE[/code] 读å–å°†å˜å¾—ä¸å¯ç”¨ã€‚更多信æ¯å‚" -"阅 [method VisualServer.viewport_set_render_direct_to_screen]。" +"如果为 [code]true[/code],会直接将该 Viewport 渲染到å±å¹•ä¸Šï¼Œè€Œä¸æ˜¯æ¸²æŸ“åˆ°æ ¹è§†" +"窗上。åªåœ¨ GLES2 ä¸å¯ç”¨ã€‚这是一个低级别的优化,在大多数情况下ä¸åº”该使用。如果" +"使用,从该 Viewport 或从 [code]SCREEN_TEXTURE[/code] 读å–å°†å˜å¾—ä¸å¯ç”¨ã€‚更多信" +"æ¯å‚阅 [method VisualServer.viewport_set_render_direct_to_screen]。" #: doc/classes/Viewport.xml msgid "" @@ -84133,17 +84313,17 @@ msgid "" "Values around [code]0.5[/code] generally give the best results. See also " "[member fxaa]." msgstr "" -"如果设置为大于[code]0.0[/code]的值,对比度适应性é”化将被应用到3D视窗ä¸ã€‚这具" -"æœ‰è¾ƒä½Žçš„æ€§èƒ½æˆæœ¬ï¼Œå¯ä»¥ç”¨æ¥æ¢å¤ä½¿ç”¨FXAA所æŸå¤±çš„一些é”度。一般æ¥è¯´ï¼Œ[code]0.5[/" -"code]å·¦å³çš„æ•°å€¼å¯ä»¥å¾—到最好的效果。å‚阅[member fxaa]。" +"如果设置为大于 [code]0.0[/code] 的值,对比度适应性é”化将被应用到3D视窗ä¸ã€‚è¿™" +"å…·æœ‰è¾ƒä½Žçš„æ€§èƒ½æˆæœ¬ï¼Œå¯ä»¥ç”¨æ¥æ¢å¤ä½¿ç”¨ FXAA 所æŸå¤±çš„一些é”度。一般æ¥è¯´ï¼Œ" +"[code]0.5[/code] å·¦å³çš„æ•°å€¼å¯ä»¥å¾—到最好的效果。å¦è¯·å‚阅 [member fxaa]。" #: doc/classes/Viewport.xml msgid "" "The width and height of viewport. Must be set to a value greater than or " "equal to 2 pixels on both dimensions. Otherwise, nothing will be displayed." msgstr "" -"视窗的宽度和高度。必须在两个维度上设置为大于或ç‰äºŽ2åƒç´ 的值。å¦åˆ™ï¼Œå°†ä¸ä¼šæ˜¾ç¤º" -"任何东西。" +"视窗的宽度和高度。必须在两个维度上设置为大于或ç‰äºŽ 2 åƒç´ 的值。å¦åˆ™ï¼Œå°†ä¸ä¼šæ˜¾" +"示任何东西。" #: doc/classes/Viewport.xml msgid "If [code]true[/code], the size override affects stretch as well." @@ -84201,7 +84381,7 @@ msgid "" "Emitted when the size of the viewport is changed, whether by [method " "set_size_override], resize of window, or some other means." msgstr "" -"当视窗的大å°è¢«æ”¹å˜æ—¶ï¼Œæ— 论是通过[method set_size_override],调整窗å£çš„大å°ï¼Œ" +"当视窗的大å°è¢«æ”¹å˜æ—¶ï¼Œæ— 论是通过 [method set_size_override]ã€è°ƒæ•´çª—å£çš„大å°ï¼Œ" "还是其他方å¼ï¼Œéƒ½ä¼šè§¦å‘。" #: doc/classes/Viewport.xml @@ -84236,11 +84416,11 @@ msgstr "æ¤è±¡é™å°†åˆ†ä¸º 4 个,最多使用 4 个阴影贴图。" #: doc/classes/Viewport.xml msgid "This quadrant will be split 16 ways and used by up to 16 shadow maps." -msgstr "æ¤è±¡é™å°†è¢«åˆ†æˆ16个方å‘,并被最多16å¼ é˜´å½±è´´å›¾ä½¿ç”¨ã€‚" +msgstr "æ¤è±¡é™å°†è¢«åˆ†æˆ 16 个方å‘,并被最多 16 å¼ é˜´å½±è´´å›¾ä½¿ç”¨ã€‚" #: doc/classes/Viewport.xml msgid "This quadrant will be split 64 ways and used by up to 64 shadow maps." -msgstr "这个象é™å°†è¢«åˆ†æˆ64个方å‘,并被最多64å¼ é˜´å½±è´´å›¾ä½¿ç”¨ã€‚" +msgstr "这个象é™å°†è¢«åˆ†æˆ 64 个方å‘,并被最多 64 å¼ é˜´å½±è´´å›¾ä½¿ç”¨ã€‚" #: doc/classes/Viewport.xml msgid "" @@ -84248,7 +84428,7 @@ msgid "" "Unless the [member shadow_atlas_size] is very high, the shadows in this " "quadrant will be very low resolution." msgstr "" -"这个象é™å°†è¢«åˆ†æˆ256个方å‘,并被最多256ä¸ªé˜´å½±è´´å›¾ä½¿ç”¨ã€‚é™¤éž [member " +"这个象é™å°†è¢«åˆ†æˆ 256 个方å‘,并被最多 256 ä¸ªé˜´å½±è´´å›¾ä½¿ç”¨ã€‚é™¤éž [member " "shadow_atlas_size] éžå¸¸é«˜ï¼Œå¦åˆ™è¿™ä¸ªè±¡é™å†…的阴影分辨率会éžå¸¸ä½Žã€‚" #: doc/classes/Viewport.xml @@ -84257,12 +84437,12 @@ msgid "" "Unless the [member shadow_atlas_size] is very high, the shadows in this " "quadrant will be very low resolution." msgstr "" -"这个象é™å°†è¢«åˆ†æˆ1024个方å‘,并被最多1024ä¸ªé˜´å½±è´´å›¾ä½¿ç”¨ã€‚é™¤éž [member " +"这个象é™å°†è¢«åˆ†æˆ 1024 个方å‘,并被最多 1024 ä¸ªé˜´å½±è´´å›¾ä½¿ç”¨ã€‚é™¤éž [member " "shadow_atlas_size] éžå¸¸é«˜ï¼Œå¦åˆ™è¿™ä¸ªè±¡é™å†…的阴影分辨率会éžå¸¸ä½Žã€‚" #: doc/classes/Viewport.xml msgid "Represents the size of the [enum ShadowAtlasQuadrantSubdiv] enum." -msgstr "代表[enum ShadowAtlasQuadrantSubdiv]枚举的大å°ã€‚" +msgstr "代表 [enum ShadowAtlasQuadrantSubdiv] 枚举的大å°ã€‚" #: doc/classes/Viewport.xml msgid "Amount of objects in frame." @@ -84882,7 +85062,7 @@ msgstr "返回给定函数的å±å¹•ä¸å¿ƒçš„ä½ç½®ã€‚" #: modules/visual_script/doc_classes/VisualScript.xml msgid "Returns a node given its id and its function." -msgstr "返回一个节点,指定它的id和它的函数。" +msgstr "返回一个节点,指定它的 id 和它的函数。" #: modules/visual_script/doc_classes/VisualScript.xml msgid "Returns a node's position in pixels." @@ -85175,7 +85355,7 @@ 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 "" -"返回一个在å‰ä¸¤ä¸ªè¾“入之间线性æ’值的数å—,以第三个输入为基础。使用公å¼[code]a " +"返回一个在å‰ä¸¤ä¸ªè¾“入之间线性æ’值的数å—ï¼Œä»¥ç¬¬ä¸‰ä¸ªè¾“å…¥ä¸ºåŸºç¡€ã€‚ä½¿ç”¨å…¬å¼ [code]a " "+ (a - b) * t[/code]。" #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml @@ -85203,16 +85383,16 @@ msgid "" "N (where N is smaller than 2^32 - 1), you can use it with the remainder " "function." msgstr "" -"è¿”å›žä¸€ä¸ªéšæœºçš„32使•´æ•°å€¼ã€‚为了获得0到Nä¹‹é—´çš„éšæœºå€¼ï¼ˆå…¶ä¸Nå°äºŽ2^32 - 1ï¼‰ï¼Œä½ å¯" -"以将其与余数函数一起使用。" +"è¿”å›žä¸€ä¸ªéšæœºçš„ 32 使•´æ•°å€¼ã€‚为了获得 0 到 N ä¹‹é—´çš„éšæœºå€¼ï¼ˆå…¶ä¸ N å°äºŽ 2^32 - " +"1ï¼‰ï¼Œä½ å¯ä»¥å°†å…¶ä¸Žä½™æ•°å‡½æ•°ä¸€èµ·ä½¿ç”¨ã€‚" #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml 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 "" -"返回一个介于0 到 1ä¹‹é—´çš„éšæœºæµ®ç‚¹å€¼ã€‚è¦èŽ·å¾—ä¸€ä¸ªä»‹äºŽ0到Nä¹‹é—´çš„éšæœºå€¼ï¼Œå¯ä»¥å°†å…¶" -"与乘法结åˆä½¿ç”¨ã€‚" +"返回一个介于 0 到 1 ä¹‹é—´çš„éšæœºæµ®ç‚¹å€¼ã€‚è¦èŽ·å¾—ä¸€ä¸ªä»‹äºŽ 0 到 N ä¹‹é—´çš„éšæœºå€¼ï¼Œå¯" +"以将其与乘法结åˆä½¿ç”¨ã€‚" #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Return a random floating-point value between the two inputs." @@ -85347,7 +85527,7 @@ msgid "" "[/codeblock]" msgstr "" "返回一个在å‰ä¸¤ä¸ªè¾“入之间平滑内æ’的数å—,基于第三个输入。类似于 [constant " -"MATH_LERP],但在开始时æ’å€¼è¾ƒå¿«ï¼Œç»“æŸæ—¶æ’值较慢。使用Hermiteæ’值公å¼ã€‚\n" +"MATH_LERP],但在开始时æ’å€¼è¾ƒå¿«ï¼Œç»“æŸæ—¶æ’值较慢。使用 Hermite æ’值公å¼ã€‚\n" "[codeblock]\n" "var t = clamp((weight - from) / (to - from), 0.0, 1.0)\n" "return t * t * (3.0 - 2.0 * t)\n" @@ -85592,15 +85772,15 @@ msgid "" "When returning, you can mask the returned value with one of the " "[code]STEP_*[/code] constants." msgstr "" -"执行自定义节点的逻辑,返回è¦ä½¿ç”¨çš„输出åºåˆ—端å£çš„索引,或者在有错误时返回一个" +"执行自定义节点的逻辑,返回è¦ä½¿ç”¨çš„输出åºåˆ—端å£çš„索引,或者在有错误时返回一个 " "[String]。\n" -"[code]inputs[/code]数组包å«è¾“入端å£çš„值。\n" -"[code]output[/code]是一个数组,其索引应被设置为相应的输出。\n" -"[code]start_mode[/code]通常是[constant START_MODE_BEGIN_SEQUENCE],除éžä½ 使用" -"了[code]STEP_*[/code]常é‡ã€‚\n" -"[code]working_mem[/code]是一个数组,å¯ä»¥ç”¨æ¥åœ¨è‡ªå®šä¹‰èŠ‚ç‚¹çš„è¿è¡Œä¹‹é—´æŒç»ä¿å˜ä¿¡" -"æ¯ã€‚其大å°éœ€è¦ç”¨[method _get_working_memory_size]æ¥é¢„定义。\n" -"å½“è¿”å›žæ—¶ï¼Œä½ å¯ä»¥ç”¨[code]STEP_*[/code]ä¸çš„ä¸€ä¸ªå¸¸é‡æ¥å±è”½è¿”回值。" +"[code]inputs[/code] 数组包å«è¾“入端å£çš„值。\n" +"[code]output[/code] 是一个数组,其索引应被设置为相应的输出。\n" +"[code]start_mode[/code] 通常是[constant START_MODE_BEGIN_SEQUENCE],除éžä½ 使" +"用了 [code]STEP_*[/code] 常é‡ã€‚\n" +"[code]working_mem[/code] 是一个数组,å¯ä»¥ç”¨æ¥åœ¨è‡ªå®šä¹‰èŠ‚ç‚¹çš„è¿è¡Œä¹‹é—´æŒç»ä¿å˜ä¿¡" +"æ¯ã€‚其大å°éœ€è¦ç”¨ [method _get_working_memory_size] æ¥é¢„定义。\n" +"å½“è¿”å›žæ—¶ï¼Œä½ å¯ä»¥ç”¨ [code]STEP_*[/code] ä¸çš„ä¸€ä¸ªå¸¸é‡æ¥å±è”½è¿”回值。" #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "The start mode used the first time when [method _step] is called." @@ -86103,7 +86283,7 @@ msgstr "æ•°å¦å¸¸é‡ã€‚" #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml msgid "Unity: [code]1[/code]." -msgstr "Unity:[code]1[/code]。" +msgstr "å•ä½ä¸€ï¼š[code]1[/code]。" #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml msgid "Pi: [code]3.141593[/code]." @@ -86438,7 +86618,7 @@ msgid "" "[b]Output Ports:[/b]\n" "none" msgstr "" -"结æŸä¸€ä¸ªå‡½æ•°çš„æ‰§è¡Œå¹¶å°†æŽ§åˆ¶æƒè¿”回给调用函数。å¯é€‰ï¼Œå®ƒå¯ä»¥è¿”回一个[Variant]" +"结æŸä¸€ä¸ªå‡½æ•°çš„æ‰§è¡Œå¹¶å°†æŽ§åˆ¶æƒè¿”回给调用函数。å¯é€‰ï¼Œå®ƒå¯ä»¥è¿”回一个 [Variant] " "值。\n" "[b]输入端å£ï¼š[/b]\n" "- åºåˆ—\n" @@ -89274,9 +89454,8 @@ msgid "" "viewport_set_use_32_bpc_depth].\n" "[b]Note:[/b] Only available on the GLES3 backend." msgstr "" -"如果为 " -"[code]true[/code],该视区会渲染至高动æ€èŒƒå›´ï¼ˆHDRï¼‰è€Œä¸æ˜¯æ ‡å‡†åЍæ€èŒƒå›´ï¼ˆSDR)。" -"å¦è¯·å‚阅 [method viewport_set_use_32_bpc_depth]。\n" +"如果为 [code]true[/code],该视区会渲染至高动æ€èŒƒå›´ï¼ˆHDRï¼‰è€Œä¸æ˜¯æ ‡å‡†åЍæ€èŒƒå›´" +"(SDR)。å¦è¯·å‚阅 [method viewport_set_use_32_bpc_depth]。\n" "[b]注æ„:[/b]仅在 GLES3 åŽç«¯å¯ç”¨ã€‚" #: doc/classes/VisualServer.xml @@ -89382,8 +89561,8 @@ msgid "" "on the same [Viewport] to set HDR to [code]true[/code].\n" "[b]Note:[/b] Only available on the GLES3 backend." msgstr "" -"如果为 [code]true[/code],分é…该视区的帧缓冲时将使用完整浮点数精度(32 " -"ä½ï¼‰è€Œä¸æ˜¯åŠæµ®ç‚¹æ•°ç²¾åº¦ï¼ˆ16 ä½ï¼‰ã€‚åªæœ‰åœ¨åŒä¸€ä¸ª [Viewport] 上通过 [method " +"如果为 [code]true[/code],分é…该视区的帧缓冲时将使用完整浮点数精度(32 ä½ï¼‰è€Œ" +"䏿˜¯åŠæµ®ç‚¹æ•°ç²¾åº¦ï¼ˆ16 ä½ï¼‰ã€‚åªæœ‰åœ¨åŒä¸€ä¸ª [Viewport] 上通过 [method " "viewport_set_use_32_bpc_depth] å°† HDR 设为 [code]true[/code] 时有效。\n" "[b]注æ„:[/b]仅在 GLES3 åŽç«¯ä¸å¯ç”¨ã€‚" @@ -90873,8 +91052,8 @@ msgid "" "function]. Returns a boolean scalar. Translates to [code]if[/code] " "instruction in shader code." msgstr "" -"通过 [member function] 比较[code]a[/code]å’Œ[code]b[/code]çš„ [member type]。返" -"å›žä¸€ä¸ªå¸ƒå°”æ ‡é‡ã€‚在ç€è‰²å™¨ä»£ç ä¸è½¬æ¢æˆ[code]if[/code]指令。" +"通过 [member function] 比较 [code]a[/code] å’Œ [code]b[/code] çš„ [member " +"type]ã€‚è¿”å›žä¸€ä¸ªå¸ƒå°”æ ‡é‡ã€‚在ç€è‰²å™¨ä»£ç ä¸è½¬æ¢æˆ [code]if[/code] 指令。" #: doc/classes/VisualShaderNodeCompare.xml msgid "" @@ -91397,12 +91576,12 @@ msgstr "ç§»é™¤æ‰€æœ‰å…ˆå‰æŒ‡å®šçš„输出端å£ã€‚" #: doc/classes/VisualShaderNodeGroupBase.xml msgid "" "Returns a free input port ID which can be used in [method add_input_port]." -msgstr "返回一个空闲的输入端å£ID,å¯ä»¥åœ¨[method add_input_port]ä¸ä½¿ç”¨ã€‚" +msgstr "è¿”å›žä¸€ä¸ªç©ºé—²çš„è¾“å…¥ç«¯å£ ID,å¯ä»¥åœ¨ [method add_input_port] ä¸ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeGroupBase.xml msgid "" "Returns a free output port ID which can be used in [method add_output_port]." -msgstr "返回一个空闲的输出端å£ID,å¯ä»¥åœ¨[method add_output_port]ä¸ä½¿ç”¨ã€‚" +msgstr "è¿”å›žä¸€ä¸ªç©ºé—²çš„è¾“å‡ºç«¯å£ ID,å¯ä»¥åœ¨ [method add_output_port] ä¸ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeGroupBase.xml msgid "" @@ -92509,8 +92688,11 @@ msgstr "" "ä¾èµ–,并å…许引用被释放。" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." -msgstr "返回æ¤å¼±å¼•用所指的 [Object]。" +#, fuzzy +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." +msgstr "返回指定属性的åˆå§‹å€¼ã€‚如果属性ä¸å˜åœ¨ï¼Œåˆ™è¿”回 [code]null[/code]。" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "Closes this data channel, notifying the other peer." @@ -93353,7 +93535,7 @@ msgstr "" #: modules/websocket/doc_classes/WebSocketServer.xml msgid "Returns [code]true[/code] if a peer with the given ID is connected." -msgstr "如果一个具有给定ID的对ç‰ä½“被连接,则返回 [code]true[/code]。" +msgstr "如果一个具有给定 ID 的对ç‰ä½“被连接,则返回 [code]true[/code]。" #: modules/websocket/doc_classes/WebSocketServer.xml msgid "" @@ -93473,8 +93655,8 @@ msgid "" "[b]Note:[/b] This signal is [i]not[/i] emitted when used as high-level " "multiplayer peer." msgstr "" -"å½“æ”¶åˆ°ä¸€ä¸ªæ–°æ¶ˆæ¯æ—¶è§¦å‘。\n" -"[b]注æ„:[/b]这个信å·åœ¨ç”¨ä½œé«˜çº§å¤šäººå¯¹ç‰çš„æ—¶å€™ï¼Œ[i]ä¸ä¼š[/i]触å‘。" +"å½“æ”¶åˆ°æ–°æ¶ˆæ¯æ—¶è§¦å‘。\n" +"[b]注æ„:[/b]这个信å·[i]ä¸ä¼š[/i]在用作高级多人对ç‰ä½“时触å‘。" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "AR/VR interface using WebXR." @@ -93936,10 +94118,10 @@ msgid "" msgstr "" "å‘出该消æ¯ä»¥è¡¨æ˜Žå¼•用空间已被é‡ç½®æˆ–釿–°é…置。\n" "何时或是å¦å‘出å–决于用户的æµè§ˆå™¨æˆ–设备,但å¯èƒ½åŒ…括当用户改å˜äº†ä»–们的游æˆç©ºé—´" -"çš„å°ºå¯¸ï¼Œä½ å¯ä»¥é€šè¿‡[member bounds_geometry]访问,或按下/按ä½ä¸€ä¸ªæŒ‰é’®æ¥é‡æ–°å®šä½" -"他们的ä½ç½®ã€‚\n" -"å‚阅[url=https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpace/" -"reset_event]WebXRçš„XRReferenceSpaceé‡ç½®äº‹ä»¶[/url]。" +"çš„å°ºå¯¸ï¼Œä½ å¯ä»¥é€šè¿‡ [member bounds_geometry] 访问,或按下/按ä½ä¸€ä¸ªæŒ‰é’®æ¥é‡æ–°å®š" +"ä½ä»–们的ä½ç½®ã€‚\n" +"è¯¦æƒ…è§ [url=https://developer.mozilla.org/en-US/docs/Web/API/" +"XRReferenceSpace/reset_event]WebXR çš„ XRReferenceSpace é‡ç½®äº‹ä»¶[/url]。" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "" @@ -94275,7 +94457,7 @@ msgstr "从 [code]path[/code] è·¯å¾„åŠ è½½è¯ä¹¦ï¼ˆâ€œ*.crtâ€æ–‡ä»¶ï¼‰ã€‚" msgid "" "Saves a certificate to the given [code]path[/code] (should be a \"*.crt\" " "file)." -msgstr "将一个è¯ä¹¦ä¿å˜åˆ°ç»™å®šçš„ [code]path[/code],应是一个“*.crtâ€æ–‡ä»¶ã€‚" +msgstr "å°†è¯ä¹¦ä¿å˜åˆ°ç»™å®šçš„ [code]path[/code](应是“*.crtâ€æ–‡ä»¶ï¼‰ã€‚" #: doc/classes/XMLParser.xml msgid "" @@ -94291,8 +94473,8 @@ msgid "" "flexible standard, this interface is low-level so it can be applied to any " "possible schema." msgstr "" -"这个类å¯ä»¥ä½œä¸ºåˆ¶ä½œè‡ªå®šä¹‰ XML è§£æžå™¨çš„基础。由于 XML 是一个éžå¸¸çµæ´»çš„æ ‡å‡†ï¼Œè¿™" -"个接å£ä¹Ÿæ˜¯åº•层的,å¯è¢«åº”用于任何å¯èƒ½çš„æ¨¡å¼ã€‚" +"这个类å¯ä»¥ä½œä¸ºåˆ¶ä½œè‡ªå®šä¹‰ XML è§£æžå™¨çš„基础。由于 XML 是éžå¸¸çµæ´»çš„æ ‡å‡†ï¼Œè¿™ä¸ªæŽ¥" +"å£ä¹Ÿæ˜¯åº•层的,å¯è¢«åº”用于任何å¯èƒ½çš„æ¨¡å¼ã€‚" #: doc/classes/XMLParser.xml msgid "Gets the amount of attributes in the current element." @@ -94398,7 +94580,7 @@ msgstr "没有节点,未打开文件或缓冲区。" #: doc/classes/XMLParser.xml msgid "Element (tag)." -msgstr "å…ƒç´ ï¼Œå³æ ‡ç¾ã€‚" +msgstr "å…ƒç´ ï¼ˆæ ‡ç¾ï¼‰ã€‚" #: doc/classes/XMLParser.xml msgid "End of element." @@ -94437,7 +94619,7 @@ msgstr "" "æ ¹æ®å节点的 Y åæ ‡å¯¹æ‰€æœ‰å节点进行排åºã€‚å节点必须继承自 [CanvasItem],æ‰èƒ½" "进行排åºã€‚Y åæ ‡è¾ƒé«˜çš„节点将åŽç»˜åˆ¶ï¼Œå› æ¤å®ƒä»¬å°†å‡ºçŽ°åœ¨ Y åæ ‡è¾ƒä½Žçš„节点之上。\n" "YSort 节点å¯ä»¥åµŒå¥—。å节点将与父节点在相åŒçš„空间内进行排åºï¼Œè¿™æ ·å¯ä»¥æ›´å¥½åœ°ç»„" -"织一个场景或将其分为多个场景,但åˆèƒ½ä¿æŒå”¯ä¸€çš„æŽ’åºã€‚" +"织场景或将其分为多个场景,但åˆèƒ½ä¿æŒå”¯ä¸€çš„æŽ’åºã€‚" #: doc/classes/YSort.xml msgid "" diff --git a/doc/translations/zh_TW.po b/doc/translations/zh_TW.po index 59cd8b199b..fd6f0ff27c 100644 --- a/doc/translations/zh_TW.po +++ b/doc/translations/zh_TW.po @@ -14,12 +14,13 @@ # 曹æ©é€¢ <nelson22768384@gmail.com>, 2022. # Otis Kao <momoslim@gmail.com>, 2022. # YuChiang Chang <chiang.c.tw@gmail.com>, 2022. +# Hugel <qihu@nfschina.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-05-31 22:35+0000\n" -"Last-Translator: YuChiang Chang <chiang.c.tw@gmail.com>\n" +"PO-Revision-Date: 2022-08-25 13:04+0000\n" +"Last-Translator: Hugel <qihu@nfschina.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hant/>\n" "Language: zh_TW\n" @@ -27,7 +28,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -87,7 +88,7 @@ msgstr "" #: doc/tools/make_rst.py msgid "Default" -msgstr "" +msgstr "默èª" #: doc/tools/make_rst.py msgid "Setter" @@ -119,7 +120,7 @@ msgstr "" #: doc/tools/make_rst.py msgid "This method is used to construct a type." -msgstr "" +msgstr "æ¤æ–¹æ³•ç”¨æ–¼æ§‹é€ é¡žåž‹ã€‚" #: doc/tools/make_rst.py msgid "" @@ -634,8 +635,9 @@ msgid "" "[code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between " "[code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is " "located outside this range, then an extrapolation factor will be returned " -"(return value lower than [code]0.0[/code] or greater than [code]1.0[/" -"code]).\n" +"(return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). " +"Use [method clamp] on the result of [method inverse_lerp] if this is not " +"desired.\n" "[codeblock]\n" "# The interpolation ratio in the `lerp()` call below is 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" @@ -645,7 +647,8 @@ msgid "" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` is now 0.75.\n" "[/codeblock]\n" -"See also [method lerp] which performs the reverse of this operation." +"See also [method lerp] which performs the reverse of this operation, and " +"[method range_lerp] to map a continuous series of values to another." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -700,7 +703,8 @@ msgid "" "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " "between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values " "outside this range are allowed and can be used to perform [i]extrapolation[/" -"i].\n" +"i]. Use [method clamp] on the result of [method lerp] if this is not " +"desired.\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 " @@ -712,7 +716,8 @@ msgid "" "[/codeblock]\n" "See also [method inverse_lerp] which performs the reverse of this operation. " "To perform eased interpolation with [method lerp], combine it with [method " -"ease] or [method smoothstep]." +"ease] or [method smoothstep]. See also [method range_lerp] to map a " +"continuous series of values to another." msgstr "**fdffffffffffffffwsfsdfsdfsfdsdf**" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1134,10 +1139,15 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" -"[ostart, ostop][/code].\n" +"[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " +"[code]value[/code] is outside [code][istart, istop][/code], then the " +"resulting value will also be outside [code][ostart, ostop][/code]. Use " +"[method clamp] on the result of [method range_lerp] if this is not desired.\n" "[codeblock]\n" "range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" -"[/codeblock]" +"[/codeblock]\n" +"For complex use cases where you need multiple ranges, consider using [Curve] " +"or [Gradient] instead." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4956,19 +4966,21 @@ msgid "" msgstr "" #: doc/classes/AnimationNode.xml -msgid "Gets the text caption for this node (used by some editors)." +msgid "" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"override the text caption for this node." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets a child node by index (used by editors inheriting from " -"[AnimationRootNode])." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a child node by its [code]name[/code]." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets all children nodes in order as a [code]name: node[/code] dictionary. " -"Only useful when inheriting [AnimationRootNode]." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" #: doc/classes/AnimationNode.xml @@ -4989,21 +5001,25 @@ msgstr "" #: doc/classes/AnimationNode.xml 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." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return the default value of parameter \"[code]name[/code]\". Parameters are " +"custom local memory used for your nodes, given a resource can be reused in " +"multiple trees." msgstr "" #: doc/classes/AnimationNode.xml msgid "" -"Gets the property information for parameter. Parameters are custom local " +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return a list of the properties on this node. 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 msgid "" -"Returns [code]true[/code] whether you want the blend tree editor to display " -"filter editing on this node." +"When inheriting from [AnimationRootNode], implement this virtual method to " +"return whether the blend tree editor should display filter editing on this " +"node." msgstr "" #: doc/classes/AnimationNode.xml @@ -5013,9 +5029,10 @@ msgstr "å›žå‚³åƒæ•¸çš„æ£åˆ‡å€¼ã€‚" #: doc/classes/AnimationNode.xml 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" +"When inheriting from [AnimationRootNode], implement this virtual method to " +"run some code when this 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" @@ -5667,9 +5684,9 @@ 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=$DOCS_URL/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" +"html#controlling-from-code]Using AnimationTree[/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" @@ -5843,8 +5860,8 @@ msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" -"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " -"not found." +"Returns the [Animation] with the key [code]name[/code]. If the animation " +"does not exist, [code]null[/code] is returned and an error is logged." msgstr "" #: doc/classes/AnimationPlayer.xml @@ -8849,8 +8866,9 @@ msgid "" "resource is applied on." msgstr "" -#: doc/classes/AudioEffect.xml doc/classes/AudioEffectRecord.xml -#: doc/classes/AudioServer.xml doc/classes/AudioStream.xml +#: doc/classes/AudioEffect.xml doc/classes/AudioEffectCapture.xml +#: doc/classes/AudioEffectRecord.xml doc/classes/AudioServer.xml +#: doc/classes/AudioStream.xml doc/classes/AudioStreamMicrophone.xml #: doc/classes/AudioStreamPlayer.xml msgid "Audio Mic Record Demo" msgstr "" @@ -8901,10 +8919,20 @@ msgid "" "attached audio effect bus into its internal ring buffer.\n" "Application code should consume these audio frames from this ring buffer " "using [method get_buffer] and process it as needed, for example to capture " -"data from a microphone, implement application defined effects, or to " -"transmit audio over the network. When capturing audio data from a " +"data from an [AudioStreamMicrophone], implement application-defined effects, " +"or to transmit audio over the network. When capturing audio data from a " "microphone, the format of the samples will be stereo 32-bit floating point " -"PCM." +"PCM.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + +#: doc/classes/AudioEffectCapture.xml doc/classes/AudioEffectDistortion.xml +#: doc/classes/AudioEffectFilter.xml doc/classes/AudioEffectHighShelfFilter.xml +#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml +msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml @@ -9147,12 +9175,6 @@ msgid "" "coming from some saturated device or speaker very efficiently." msgstr "" -#: doc/classes/AudioEffectDistortion.xml doc/classes/AudioEffectFilter.xml -#: doc/classes/AudioEffectHighShelfFilter.xml -#: doc/classes/AudioEffectLowShelfFilter.xml doc/classes/AudioServer.xml -msgid "Audio buses" -msgstr "" - #: doc/classes/AudioEffectDistortion.xml msgid "Distortion power. Value can range from 0 to 1." msgstr "" @@ -9698,7 +9720,12 @@ msgid "" msgstr "" #: doc/classes/AudioServer.xml -msgid "Returns the names of all audio input devices detected on the system." +msgid "" +"Returns the names of all audio input devices detected on the system.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -9859,12 +9886,16 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" -"Name of the current device for audio input (see [method get_device_list]). " -"On systems with multiple audio inputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio input device. The value " -"[code]\"Default\"[/code] will record audio on the system-wide default audio " -"input. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." +"Name of the current device for audio input (see [method " +"capture_get_device_list]). On systems with multiple audio inputs (such as " +"analog, USB and HDMI audio), this can be used to select the audio input " +"device. The value [code]\"Default\"[/code] will record audio on the system-" +"wide default audio input. If an invalid device name is set, the value will " +"be reverted back to [code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." msgstr "" #: doc/classes/AudioServer.xml @@ -10012,6 +10043,21 @@ msgid "" "GDNative, but [method push_frame] may be [i]more[/i] efficient in GDScript." msgstr "" +#: doc/classes/AudioStreamMicrophone.xml +msgid "Plays real-time audio input data." +msgstr "" + +#: doc/classes/AudioStreamMicrophone.xml +msgid "" +"When used directly in an [AudioStreamPlayer] node, [AudioStreamMicrophone] " +"plays back microphone input in real-time. This can be used in conjunction " +"with [AudioEffectCapture] to process the data or save it.\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] must be " +"[code]true[/code] for audio input to work. See also that setting's " +"description for caveats related to permissions and operating system privacy " +"settings." +msgstr "" + #: modules/minimp3/doc_classes/AudioStreamMP3.xml msgid "MP3 audio stream driver." msgstr "" @@ -10152,7 +10198,10 @@ msgstr "" #: doc/classes/AudioStreamPlayer2D.xml msgid "" -"Plays audio that dampens with distance from screen center.\n" +"Plays audio that dampens with distance from a given position.\n" +"By default, audio is heard from the screen center. This can be changed by " +"adding a [Listener2D] node to the scene and enabling it by calling [method " +"Listener2D.make_current] on it.\n" "See also [AudioStreamPlayer] to play a sound non-positionally.\n" "[b]Note:[/b] Hiding an [AudioStreamPlayer2D] node does not disable its audio " "output. To temporarily disable an [AudioStreamPlayer2D]'s audio output, set " @@ -11833,7 +11882,7 @@ 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." +"world space units. See also [member frustum_offset]." msgstr "" #: doc/classes/Camera.xml @@ -11926,7 +11975,9 @@ msgstr "" 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]." +"shearing[/url].\n" +"[b]Note:[/b] Only effective if [member projection] is [constant " +"PROJECTION_FRUSTUM]." msgstr "" #: doc/classes/Camera.xml @@ -11954,9 +12005,9 @@ msgstr "" #: doc/classes/Camera.xml msgid "" -"The camera's size measured as 1/2 the width or height. Only applicable in " -"orthogonal and frustum modes. Since [member keep_aspect] locks on axis, " -"[code]size[/code] sets the other axis' size length." +"The camera's size in meters measured as the diameter of the width or height, " +"depending on [member keep_aspect]. Only applicable in orthogonal and frustum " +"modes." msgstr "" #: doc/classes/Camera.xml @@ -12458,13 +12509,14 @@ msgid "" "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 " +"Any [CanvasItem] can draw. For this, [method update] is called by the " +"engine, 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" +"functions). However, they can only be used inside [method _draw], its " +"corresponding [method Object._notification] or methods connected to the " +"[signal draw] signal.\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" @@ -12490,8 +12542,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Overridable function called by the engine (if defined) to draw the canvas " -"item." +"Called when [CanvasItem] has been requested to redraw (when [method update] " +"is called, either manually or by the engine).\n" +"Corresponds to the [constant NOTIFICATION_DRAW] notification in [method " +"Object._notification]." msgstr "" #: doc/classes/CanvasItem.xml @@ -12804,12 +12858,12 @@ msgid "" "to children." msgstr "" -#: doc/classes/CanvasItem.xml doc/classes/Spatial.xml +#: doc/classes/CanvasItem.xml msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and all its antecedents are " "also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." +"the scene tree, and is consequently not drawn (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -12854,8 +12908,10 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " -"called on idle time to request redraw." +"Queues the [CanvasItem] to redraw. During idle time, if [CanvasItem] is " +"visible, [constant NOTIFICATION_DRAW] is sent and [method _draw] is called. " +"This only occurs [b]once[/b] per frame, even if this method has been called " +"multiple times." msgstr "" #: doc/classes/CanvasItem.xml @@ -12903,8 +12959,11 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "" -"Emitted when the [CanvasItem] must redraw. This can only be connected " -"realtime, as deferred will not allow drawing." +"Emitted when the [CanvasItem] must redraw, [i]after[/i] the related " +"[constant NOTIFICATION_DRAW] notification, and [i]before[/i] [method _draw] " +"is called.\n" +"[b]Note:[/b] Deferred connections do not allow drawing through the " +"[code]draw_*[/code] methods." msgstr "" #: doc/classes/CanvasItem.xml @@ -12966,7 +13025,7 @@ msgid "" msgstr "" #: doc/classes/CanvasItem.xml -msgid "The [CanvasItem] is requested to draw." +msgid "The [CanvasItem] is requested to draw (see [method _draw])." msgstr "" #: doc/classes/CanvasItem.xml @@ -13091,7 +13150,10 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "" -"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"If enabled, the [CanvasLayer] will use the viewport's transform, so it will " +"move when camera moves instead of being anchored in a fixed position on the " +"screen.\n" +"Together with [member follow_viewport_scale] it can be used for a pseudo 3D " "effect." msgstr "" @@ -16088,7 +16150,9 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Steal the focus from another control and become the focused control (see " -"[member focus_mode])." +"[member focus_mode]).\n" +"[b]Note[/b]: Using this method together with [method Object.call_deferred] " +"makes it more reliable, especially when called inside [method Node._ready]." msgstr "" #: doc/classes/Control.xml @@ -18819,7 +18883,9 @@ msgstr "" 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." +"points relative to the [code]0.5[/code] Y position.\n" +"See also [Gradient] which is designed for color interpolation. See also " +"[Curve2D] and [Curve3D]." msgstr "" #: doc/classes/Curve.xml @@ -18968,16 +19034,17 @@ msgid "" "further calculations." msgstr "" -#: doc/classes/Curve2D.xml +#: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve2D]'s " -"position, 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." +"Adds a point with the specified [code]position[/code] relative to the " +"curve's own position, with control points [code]in[/code] and [code]out[/" +"code]. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -19123,18 +19190,6 @@ msgid "" msgstr "" #: doc/classes/Curve3D.xml -msgid "" -"Adds a point to a curve at [code]position[/code] relative to the [Curve3D]'s " -"position, 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/Curve3D.xml #, fuzzy msgid "Returns the cache of points as a [PoolVector3Array]." msgstr "å›žå‚³åƒæ•¸çš„åæ£å¼¦å€¼ã€‚" @@ -24049,8 +24104,12 @@ msgstr "" #: doc/classes/File.xml msgid "" -"Returns the whole file as a [String].\n" -"Text is interpreted as being UTF-8 encoded." +"Returns the whole file as a [String]. Text is interpreted as being UTF-8 " +"encoded.\n" +"If [code]skip_cr[/code] is [code]true[/code], carriage return characters " +"([code]\\r[/code], CR) will be ignored when parsing the UTF-8, so that only " +"line feed characters ([code]\\n[/code], LF) represent a new line (Unix " +"convention)." msgstr "" #: doc/classes/File.xml @@ -24671,7 +24730,9 @@ msgid "" "[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." +"making this function useful for drawing strings character by character.\n" +"If [code]outline[/code] is [code]true[/code], the outline of the character " +"is drawn instead of the character itself." msgstr "" #: doc/classes/Font.xml @@ -26259,10 +26320,13 @@ msgstr "" #: doc/classes/Gradient.xml 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." +"means that if you have color 1, color 2 and color 3, the gradient will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The " +"gradient will initially have 2 colors (black and white), one (black) at " +"gradient lower offset 0 and the other (white) at the gradient higher offset " +"1.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." msgstr "" #: doc/classes/Gradient.xml @@ -27678,8 +27742,8 @@ msgstr "" 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. [b]See the " -"[HTTPRequest] node for a higher-level alternative.[/b]\n" +"or to communicate with various services, among other use cases.\n" +"See the [HTTPRequest] node for a 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, " @@ -29981,11 +30045,14 @@ msgstr "" #: doc/classes/Input.xml msgid "" -"Vibrate Android and iOS devices.\n" +"Vibrate handheld devices.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, and HTML5.\n" "[b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] " "permission in the export preset.\n" "[b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and " -"later." +"later.\n" +"[b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not " +"support this method." msgstr "" #: doc/classes/Input.xml @@ -30831,7 +30898,11 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" -"Not thread-safe. Use [method Object.call_deferred] if calling from a thread." +"Call this method to actually load in the node. The created node will be " +"placed as a sibling [i]above[/i] the [InstancePlaceholder] in the scene " +"tree. The [Node]'s reference is also returned for convenience.\n" +"[b]Note:[/b] [method create_instance] is not thread-safe. Use [method Object." +"call_deferred] if calling from a thread." msgstr "" #: doc/classes/InstancePlaceholder.xml @@ -30843,6 +30914,16 @@ msgstr "" #: doc/classes/InstancePlaceholder.xml msgid "" +"Returns the list of properties that will be applied to the node when [method " +"create_instance] is called.\n" +"If [code]with_order[/code] is [code]true[/code], a key named [code].order[/" +"code] (note the leading period) is added to the dictionary. This [code]." +"order[/code] key is an [Array] of [String] property names specifying the " +"order in which properties will be applied (with index 0 being the first)." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml +msgid "" "Replaces this placeholder by the scene handed as an argument, or the " "original scene if no argument is given. As for all resources, the scene is " "loaded only if it's not loaded already. By manually loading the scene " @@ -33204,14 +33285,14 @@ msgstr "" #: doc/classes/Line2D.xml 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." +"Adds a point with the specified [code]position[/code] relative to the line's " +"own position. Appends the new point at the end of the point list.\n" +"If [code]index[/code] is given, the new point is inserted before the " +"existing point identified by index [code]index[/code]. Every existing point " +"starting from [code]index[/code] is shifted further down the list of points. " +"The index must be greater than or equal to [code]0[/code] and must not " +"exceed the number of existing points in the line. See [method " +"get_point_count]." msgstr "" #: doc/classes/Line2D.xml @@ -33219,22 +33300,26 @@ msgid "Removes all points from the line." msgstr "" #: doc/classes/Line2D.xml -msgid "Returns the Line2D's amount of points." -msgstr "" +#, fuzzy +msgid "Returns the amount of points in the line." +msgstr "å›žå‚³åƒæ•¸çš„æ£å¼¦å€¼ã€‚" #: doc/classes/Line2D.xml -msgid "Returns point [code]i[/code]'s position." -msgstr "" +#, fuzzy +msgid "Returns the position of the point at index [code]index[/code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Line2D.xml -msgid "Removes the point at index [code]i[/code] from the line." -msgstr "" +#, fuzzy +msgid "Removes the point at index [code]index[/code] from the line." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Line2D.xml +#, fuzzy msgid "" -"Overwrites the position in point [code]i[/code] with the supplied " -"[code]position[/code]." -msgstr "" +"Overwrites the position of the point at index [code]index[/code] with the " +"supplied [code]position[/code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Line2D.xml msgid "" @@ -34811,9 +34896,9 @@ 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." +"in many places. This allows reusing 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 [MultiMeshInstance] instead." msgstr "" #: doc/classes/MeshInstance.xml @@ -35274,7 +35359,9 @@ msgid "" "existing vertex colors.\n" "For the color to take effect, ensure that [member color_format] is non-" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." -"vertex_color_use_as_albedo] is [code]true[/code] on the material." +"vertex_color_use_as_albedo] is [code]true[/code] on the material. If the " +"color doesn't look as expected, make sure the material's albedo color is set " +"to pure white ([code]Color(1, 1, 1)[/code])." msgstr "" #: doc/classes/MultiMesh.xml @@ -36412,7 +36499,7 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" "Notifies when the collision avoidance velocity is calculated after a call to " -"[method set_velocity]." +"[method set_velocity]. Only emitted when [member avoidance_enabled] is true." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37238,13 +37325,25 @@ msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " -"and 2147483647)." +"and 2147483647).\n" +"Can only be called if the connection status is [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTING]. See [method " +"set_connection_status]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." -"ConnectionStatus]." +"ConnectionStatus].\n" +"This will emit the [signal NetworkedMultiplayerPeer.connection_succeeded], " +"[signal NetworkedMultiplayerPeer.connection_failed] or [signal " +"NetworkedMultiplayerPeer.server_disconnected] signals depending on the " +"status and if the peer has the unique network id of [code]1[/code].\n" +"You can only change to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING] from [constant NetworkedMultiplayerPeer." +"CONNECTION_DISCONNECTED] and to [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTED] from [constant NetworkedMultiplayerPeer." +"CONNECTION_CONNECTING]." msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml @@ -40914,7 +41013,9 @@ msgid "" "are also subject to automatic adjustments by the operating system. [b]Always " "use[/b] [method get_ticks_usec] or [method get_ticks_msec] for precise time " "calculation instead, since they are guaranteed to be monotonic (i.e. never " -"decrease)." +"decrease).\n" +"[b]Note:[/b] To get a floating point timestamp with sub-second precision, " +"use [method Time.get_unix_time_from_system]." msgstr "" #: doc/classes/OS.xml @@ -46300,7 +46401,9 @@ msgstr "" #: doc/classes/PopupMenu.xml #, fuzzy -msgid "Sets the currently focused item as the given [code]index[/code]." +msgid "" +"Sets the currently focused item as the given [code]index[/code].\n" +"Passing [code]-1[/code] as the index makes so that no item is focused." msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/PopupMenu.xml @@ -46539,7 +46642,9 @@ 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 [WindowDialog].\n" +"If any [Control] node is added as a child of this [PopupPanel], it will be " +"stretched to fit the panel's size (similar to how [PanelContainer] works)." msgstr "" #: doc/classes/PopupPanel.xml @@ -47269,7 +47374,11 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], microphone input will be allowed. This requires " -"appropriate permissions to be set when exporting to Android or iOS." +"appropriate permissions to be set when exporting to Android or iOS.\n" +"[b]Note:[/b] If the operating system blocks access to audio input devices " +"(due to the user's privacy settings), audio capture will only return " +"silence. On Windows 10 and later, make sure that apps are allowed to access " +"the microphone in the OS' privacy settings." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49950,8 +50059,19 @@ msgstr "" msgid "" "Maximum anisotropic filter level used for textures with anisotropy enabled. " "Higher values will result in sharper textures when viewed from oblique " -"angles, at the cost of performance. Only power-of-two values are valid (2, " -"4, 8, 16)." +"angles, at the cost of performance. With the exception of [code]1[/code], " +"only power-of-two values are valid ([code]2[/code], [code]4[/code], [code]8[/" +"code], [code]16[/code]). A value of [code]1[/code] forcibly disables " +"anisotropic filtering, even on textures where it is enabled.\n" +"[b]Note:[/b] For performance reasons, anisotropic filtering [i]is not " +"enabled by default[/i] on textures. For this setting to have an effect, " +"anisotropic texture filtering can be enabled by selecting a texture in the " +"FileSystem dock, going to the Import dock, checking the [b]Anisotropic[/b] " +"checkbox then clicking [b]Reimport[/b]. However, anisotropic filtering is " +"rarely useful in 2D, so only enable it for textures in 2D if it makes a " +"meaningful visual difference.\n" +"[b]Note:[/b] This property is only read when the project starts. There is " +"currently no way to change this setting at run-time." msgstr "" #: doc/classes/ProjectSettings.xml @@ -53970,7 +54090,9 @@ msgid "" "cannot be instantiated.\n" "[b]Note:[/b] The scene change is deferred, which means that the new scene " "node is added on the next idle frame. You won't be able to access it " -"immediately after the [method change_scene_to] call." +"immediately after the [method change_scene_to] call.\n" +"[b]Note:[/b] Passing a value of [code]null[/code] into the method will " +"unload the current scene without loading a new one." msgstr "" #: doc/classes/SceneTree.xml @@ -54114,13 +54236,19 @@ msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], collision shapes will be visible when running the game " -"from the editor for debugging purposes." +"from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_collisions_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " -"game from the editor for debugging purposes." +"game from the editor for debugging purposes.\n" +"[b]Note:[/b] This property is not designed to be changed at run-time. " +"Changing the value of [member debug_navigation_hint] while the project is " +"running will not have the desired effect." msgstr "" #: doc/classes/SceneTree.xml @@ -55310,7 +55438,10 @@ msgid "" msgstr "" #: doc/classes/Shape2D.xml -msgid "The shape's custom solver bias." +msgid "" +"The shape's custom solver bias. Defines how much bodies react to enforce " +"contact separation when this shape is involved.\n" +"When set to [code]0.0[/code], the default value of [code]0.3[/code] is used." msgstr "" #: doc/classes/ShortCut.xml @@ -55930,6 +56061,14 @@ msgstr "" #: doc/classes/Spatial.xml msgid "" +"Returns [code]true[/code] if the node is present in the [SceneTree], its " +"[member visible] property is [code]true[/code] and all its antecedents are " +"also visible. If any antecedent is hidden, this node will not be visible in " +"the scene tree." +msgstr "" + +#: doc/classes/Spatial.xml +msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[code]target[/code] position.\n" "The local up axis (+Y) points as close to the [code]up[/code] vector as " @@ -56264,7 +56403,9 @@ msgid "" "[b]Note:[/b] Material anisotropy should not to be confused with anisotropic " "texture filtering. Anisotropic texture filtering can be enabled by selecting " "a texture in the FileSystem dock, going to the Import dock, checking the " -"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]." +"[b]Anisotropic[/b] checkbox then clicking [b]Reimport[/b]. The anisotropic " +"filtering level can be changed by adjusting [member ProjectSettings." +"rendering/quality/filters/anisotropic_filter_level]." msgstr "" #: doc/classes/SpatialMaterial.xml @@ -57698,7 +57839,7 @@ msgstr "" #: doc/classes/Sprite3D.xml msgid "" "[Texture] object to draw. If [member GeometryInstance.material_override] is " -"used, this will be overridden." +"used, this will be overridden. The size information is still used." msgstr "" #: doc/classes/SpriteBase3D.xml @@ -58965,6 +59106,9 @@ msgid "" "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]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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" @@ -59026,6 +59170,9 @@ msgstr "" msgid "" "Splits the string by a [code]delimiter[/code] string and returns an array of " "the substrings. The [code]delimiter[/code] can be of any length.\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position.\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 [code]0[/" "code] means that all items are split.\n" @@ -59048,7 +59195,10 @@ 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]." +"split by [code]\",\"[/code].\n" +"If [code]allow_empty[/code] is [code]true[/code], and there are two adjacent " +"delimiters in the string, it will add an empty string to the array of " +"substrings at this position." msgstr "" #: doc/classes/String.xml @@ -60185,6 +60335,11 @@ msgid "Returns [code]true[/code] if select with right mouse button is enabled." msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Returns the button icon from the tab at index [code]tab_idx[/code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" + +#: doc/classes/Tabs.xml msgid "Returns the number of hidden tabs offsetted to the left." msgstr "" @@ -60215,6 +60370,11 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml +#, fuzzy +msgid "Sets the button icon from the tab at index [code]tab_idx[/code]." +msgstr "計算兩個å‘é‡çš„外ç©ã€‚" + +#: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." msgstr "" @@ -60256,7 +60416,9 @@ msgid "" msgstr "" #: doc/classes/Tabs.xml -msgid "Emitted when a tab is right-clicked." +msgid "" +"Emitted when a tab's right button is pressed. See [method " +"set_tab_button_icon]." msgstr "" #: doc/classes/Tabs.xml @@ -65140,21 +65302,25 @@ msgid "Makes subsequent actions with the same name be merged into one." msgstr "" #: modules/upnp/doc_classes/UPNP.xml -msgid "UPNP network functions." +msgid "" +"Universal Plug and Play (UPnP) functions for network device discovery, " +"querying and port forwarding." msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"This class can be used to discover compatible [UPNPDevice]s on the local " +"network and execute commands on them, like managing port mappings (for port " +"forwarding/NAT traversal) 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 (here [code]7777[/code], note both [method " +"discover] and [method add_port_mapping] can return errors that should be " +"checked):\n" "[codeblock]\n" -"const PORT = 7777\n" "var upnp = UPNP.new()\n" -"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" -"upnp.add_port_mapping(port)\n" +"upnp.discover()\n" +"upnp.add_port_mapping(7777)\n" "[/codeblock]\n" "To close a specific port (e.g. after you have finished using it):\n" "[codeblock]\n" @@ -65167,7 +65333,7 @@ msgid "" "or failure).\n" "signal upnp_completed(error)\n" "\n" -"# Replace this with your own server port number between 1025 and 65535.\n" +"# Replace this with your own server port number between 1024 and 65535.\n" "const SERVER_PORT = 3928\n" "var thread = null\n" "\n" @@ -65196,7 +65362,39 @@ msgid "" " # Wait for thread finish here to handle game exit while the thread is " "running.\n" " thread.wait_to_finish()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Terminology:[/b] In the context of UPnP networking, \"gateway\" (or " +"\"internet gateway device\", short IGD) refers to network devices that allow " +"computers in the local network to access the internet (\"wide area " +"network\", WAN). These gateways are often also called \"routers\".\n" +"[b]Pitfalls:[/b]\n" +"- As explained above, these calls are blocking and shouldn't be run on the " +"main thread, especially as they can block for multiple seconds at a time. " +"Use threading!\n" +"- Networking is physical and messy. Packets get lost in transit or get " +"filtered, addresses, free ports and assigned mappings change, and devices " +"may leave or join the network at any time. Be mindful of this, be diligent " +"when checking and handling errors, and handle these gracefully if you can: " +"add clear error UI, timeouts and re-try handling.\n" +"- Port mappings may change (and be removed) at any time, and the remote/" +"external IP address of the gateway can change likewise. You should consider " +"re-querying the external IP and try to update/refresh the port mapping " +"periodically (for example, every 5 minutes and on networking failures).\n" +"- Not all devices support UPnP, and some users disable UPnP support. You " +"need to handle this (e.g. documenting and requiring the user to manually " +"forward ports, or adding alternative methods of NAT traversal, like a relay/" +"mirror server, or NAT hole punching, STUN/TURN, etc.).\n" +"- Consider what happens on mapping conflicts. Maybe multiple users on the " +"same network would like to play your game at the same time, or maybe another " +"application uses the same port. Make the port configurable, and optimally " +"choose a port automatically (re-trying with a different port on failure).\n" +"[b]Further reading:[/b] If you want to know more about UPnP (and the " +"Internet Gateway Device (IGD) and Port Control Protocol (PCP) specifically), " +"[url=https://en.wikipedia.org/wiki/Universal_Plug_and_Play]Wikipedia[/url] " +"is a good first stop, the specification can be found at the [url=https://" +"openconnectivity.org/developer/specifications/upnp-resources/upnp/]Open " +"Connectivity Foundation[/url] and Godot's implementation is based on the " +"[url=https://github.com/miniupnp/miniupnp]MiniUPnP client[/url]." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65206,22 +65404,35 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml 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" +"65535, although recommended to use port 1024 or above) 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. Note that forwarding a well-known port " +"(below 1024) with UPnP may fail depending on the device.\n" +"Depending on the gateway device, if a mapping for that port already exists, " +"it will either be updated or it will refuse this command due to that " +"conflict, especially if the existing mapping for that port wasn't created " +"via UPnP or points to a different network address (or device) than this " +"one.\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" +"The description ([code]desc[/code]) is shown in some routers management UIs " +"and can be used to point out which application added the mapping.\n" +"The mapping's lease [code]duration[/code] can be limited by specifying a " +"duration in seconds. The default of [code]0[/code] means no duration, i.e. a " +"permanent lease and notably some devices only support these permanent " +"leases. Note that whether permanent or not, this is only a request and the " +"gateway may still decide at any point to remove the mapping (which usually " +"happens on a reboot of the gateway, when its external IP address changes, or " +"on some models when it detects a port mapping has become inactive, i.e. had " +"no traffic for multiple minutes). If not [code]0[/code] (permanent), the " +"allowed range according to spec is between [code]120[/code] (2 minutes) and " +"[code]86400[/code] seconds (24 hours).\n" "See [enum UPNPResult] for possible return values." msgstr "" @@ -65234,8 +65445,10 @@ 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." +"[code]TCP[/code] or [code]UDP[/code]. May be refused for mappings pointing " +"to addresses other than this one, for well-known ports (below 1024), or for " +"mappings not added via UPnP. See [enum UPNPResult] for possible return " +"values." msgstr "" #: modules/upnp/doc_classes/UPNP.xml @@ -65433,16 +65646,16 @@ msgid "Unknown error." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml -msgid "UPNP device." +msgid "Universal Plug and Play (UPnP) device." msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml 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." +"Universal Plug and Play (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 @@ -74101,7 +74314,9 @@ msgid "" msgstr "" #: doc/classes/WeakRef.xml -msgid "Returns the [Object] this weakref is referring to." +msgid "" +"Returns the [Object] this weakref is referring to. Returns [code]null[/code] " +"if that object no longer exists." msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index 8d4954136e..0ffede0992 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -198,7 +198,8 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ int item_count = 0; bool backbuffer_cleared = false; bool time_used = false; - bool material_screen_texture_found = false; + bool material_screen_texture_cached = false; + bool material_screen_texture_mipmaps_cached = false; Rect2 back_buffer_rect; bool backbuffer_copy = false; bool backbuffer_gen_mipmaps = false; @@ -223,10 +224,12 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ GLES3::CanvasMaterialData *md = static_cast<GLES3::CanvasMaterialData *>(material_storage->material_get_data(material, RS::SHADER_CANVAS_ITEM)); if (md && md->shader_data->valid) { if (md->shader_data->uses_screen_texture && canvas_group_owner == nullptr) { - if (!material_screen_texture_found) { + if (!material_screen_texture_cached) { backbuffer_copy = true; back_buffer_rect = Rect2(); backbuffer_gen_mipmaps = md->shader_data->uses_screen_texture_mipmaps; + } else if (!material_screen_texture_mipmaps_cached) { + backbuffer_gen_mipmaps = md->shader_data->uses_screen_texture_mipmaps; } } @@ -287,7 +290,16 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps); backbuffer_copy = false; - material_screen_texture_found = true; //after a backbuffer copy, screen texture makes no further copies + backbuffer_gen_mipmaps = false; + material_screen_texture_cached = true; // After a backbuffer copy, screen texture makes no further copies. + material_screen_texture_mipmaps_cached = backbuffer_gen_mipmaps; + } + + if (backbuffer_gen_mipmaps) { + texture_storage->render_target_gen_back_buffer_mipmaps(p_to_render_target, back_buffer_rect); + + backbuffer_gen_mipmaps = false; + material_screen_texture_mipmaps_cached = true; } // just add all items for now diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp index cc96294ca5..3575837794 100644 --- a/drivers/gles3/rasterizer_gles3.cpp +++ b/drivers/gles3/rasterizer_gles3.cpp @@ -280,11 +280,6 @@ void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, Display GLES3::RenderTarget *rt = texture_storage->get_render_target(p_render_target); ERR_FAIL_COND(!rt); - // TODO: do we need a keep 3d linear option? - - // Make sure we are drawing to the right context. - DisplayServer::get_singleton()->gl_window_make_current(p_screen); - if (rt->external.fbo != 0) { glBindFramebuffer(GL_READ_FRAMEBUFFER, rt->external.fbo); } else { @@ -298,9 +293,6 @@ void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, Display // is this p_screen useless in a multi window environment? void RasterizerGLES3::blit_render_targets_to_screen(DisplayServer::WindowID p_screen, const BlitToScreen *p_render_targets, int p_amount) { - // All blits are going to the system framebuffer, so just bind once. - glBindFramebuffer(GL_FRAMEBUFFER, GLES3::TextureStorage::system_fbo); - for (int i = 0; i < p_amount; i++) { const BlitToScreen &blit = p_render_targets[i]; diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index dae26b1e5f..85b35639ec 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -683,6 +683,7 @@ void RasterizerSceneGLES3::_setup_sky(const RenderDataGLES3 *p_render_data, cons light_data_dirty = true; for (uint32_t i = sky_globals.directional_light_count; i < sky_globals.max_directional_lights; i++) { sky_globals.directional_lights[i].enabled = false; + sky_globals.last_frame_directional_lights[i].enabled = false; } } @@ -1718,7 +1719,7 @@ void RasterizerSceneGLES3::_setup_lights(const RenderDataGLES3 *p_render_data, b glBindBuffer(GL_UNIFORM_BUFFER, 0); } -void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data, RendererScene::RenderInfo *r_render_info) { +void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data, RenderingMethod::RenderInfo *r_render_info) { GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton(); GLES3::Config *config = GLES3::Config::get_singleton(); RENDER_TIMESTAMP("Setup 3D Scene"); @@ -2480,7 +2481,7 @@ RasterizerSceneGLES3::RasterizerSceneGLES3() { scene_globals.default_shader = material_storage->shader_allocate(); material_storage->shader_initialize(scene_globals.default_shader); material_storage->shader_set_code(scene_globals.default_shader, R"( -// Default 3D material shader (clustered). +// Default 3D material shader. shader_type spatial; diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index 881fc5615c..f0dc972678 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -124,7 +124,7 @@ struct RenderDataGLES3 { uint32_t spot_light_count = 0; uint32_t omni_light_count = 0; - RendererScene::RenderInfo *render_info = nullptr; + RenderingMethod::RenderInfo *render_info = nullptr; }; class RasterizerCanvasGLES3; @@ -304,12 +304,13 @@ private: }; enum { - INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 5, - INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 6, - INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 8, - INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 9, - INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 10, - INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 11, + INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 4, + INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 5, + INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 7, + INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 8, + INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 9, + INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 10, + INSTANCE_DATA_FLAG_PARTICLES = 1 << 11, INSTANCE_DATA_FLAG_MULTIMESH = 1 << 12, INSTANCE_DATA_FLAG_MULTIMESH_FORMAT_2D = 1 << 13, INSTANCE_DATA_FLAG_MULTIMESH_HAS_COLOR = 1 << 14, @@ -711,7 +712,7 @@ public: void voxel_gi_set_quality(RS::VoxelGIQuality) override; - void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RendererScene::RenderInfo *r_render_info = nullptr) override; + void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RenderingMethod::RenderInfo *r_render_info = nullptr) override; void render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) override; void render_particle_collider_heightfield(RID p_collider, const Transform3D &p_transform, const PagedArray<RenderGeometryInstance *> &p_instances) override; diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl index c7fdd6ebd8..efd6036ba9 100644 --- a/drivers/gles3/shaders/scene.glsl +++ b/drivers/gles3/shaders/scene.glsl @@ -629,11 +629,12 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte float diffuse_brdf_NL; // BRDF times N.L for calculating diffuse radiance #if defined(DIFFUSE_LAMBERT_WRAP) - // energy conserving lambert wrap shader - diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness))); + // Energy conserving lambert wrap shader. + // https://web.archive.org/web/20210228210901/http://blog.stevemcauley.com/2011/12/03/energy-conserving-wrapped-diffuse/ + diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness))) * (1.0 / M_PI); #elif defined(DIFFUSE_TOON) - diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL); + diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL) * (1.0 / M_PI); #elif defined(DIFFUSE_BURLEY) diff --git a/drivers/gles3/shaders/sky.glsl b/drivers/gles3/shaders/sky.glsl index 21f01d2a8f..4c0fe47f6b 100644 --- a/drivers/gles3/shaders/sky.glsl +++ b/drivers/gles3/shaders/sky.glsl @@ -104,6 +104,15 @@ uniform uint directional_light_count; layout(location = 0) out vec4 frag_color; +#ifdef USE_DEBANDING +// https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare +vec3 interleaved_gradient_noise(vec2 pos) { + const vec3 magic = vec3(0.06711056f, 0.00583715f, 52.9829189f); + float res = fract(magic.z * fract(dot(pos, magic.xy))) * 2.0 - 1.0; + return vec3(res, -res, res) / 255.0; +} +#endif + void main() { vec3 cube_normal; cube_normal.z = -1.0; @@ -168,4 +177,8 @@ void main() { frag_color.rgb = color; frag_color.a = alpha; + +#ifdef USE_DEBANDING + frag_color.rgb += interleaved_gradient_noise(gl_FragCoord.xy); +#endif } diff --git a/drivers/gles3/storage/light_storage.h b/drivers/gles3/storage/light_storage.h index f054f0fdc6..8b708116ac 100644 --- a/drivers/gles3/storage/light_storage.h +++ b/drivers/gles3/storage/light_storage.h @@ -36,6 +36,7 @@ #include "core/templates/local_vector.h" #include "core/templates/rid_owner.h" #include "core/templates/self_list.h" +#include "drivers/gles3/storage/texture_storage.h" #include "servers/rendering/renderer_compositor.h" #include "servers/rendering/storage/light_storage.h" #include "servers/rendering/storage/utilities.h" @@ -246,7 +247,7 @@ public: const Light *light = light_owner.get_or_null(p_light); ERR_FAIL_COND_V(!light, RS::LIGHT_DIRECTIONAL); - return light_owner.owns(light->projector); + return TextureStorage::get_singleton()->owns_texture(light->projector); } _FORCE_INLINE_ bool light_is_negative(RID p_light) const { diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 3dbc75392c..687e98ba58 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -1379,9 +1379,9 @@ MaterialStorage::MaterialStorage() { actions.renames["POINT_SIZE"] = "gl_PointSize"; actions.renames["MODEL_MATRIX"] = "model_matrix"; - actions.renames["CANVAS_MATRIX"] = "canvas_data.canvas_transform"; - actions.renames["SCREEN_MATRIX"] = "canvas_data.screen_transform"; - actions.renames["TIME"] = "canvas_data.time"; + actions.renames["CANVAS_MATRIX"] = "canvas_transform"; + actions.renames["SCREEN_MATRIX"] = "screen_transform"; + actions.renames["TIME"] = "time"; actions.renames["PI"] = _MKSTR(Math_PI); actions.renames["TAU"] = _MKSTR(Math_TAU); actions.renames["E"] = _MKSTR(Math_E); @@ -1399,7 +1399,7 @@ MaterialStorage::MaterialStorage() { actions.renames["SPECULAR_SHININESS"] = "specular_shininess"; actions.renames["SCREEN_UV"] = "screen_uv"; actions.renames["SCREEN_TEXTURE"] = "screen_texture"; - actions.renames["SCREEN_PIXEL_SIZE"] = "canvas_data.screen_pixel_size"; + actions.renames["SCREEN_PIXEL_SIZE"] = "screen_pixel_size"; actions.renames["FRAGCOORD"] = "gl_FragCoord"; actions.renames["POINT_COORD"] = "gl_PointCoord"; actions.renames["INSTANCE_ID"] = "gl_InstanceIndex"; @@ -1715,6 +1715,7 @@ ShaderCompiler::DefaultIdentifierActions actions; actions.usage_defines["HALF_RES_COLOR"] = "\n#define USES_HALF_RES_COLOR\n"; actions.usage_defines["QUARTER_RES_COLOR"] = "\n#define USES_QUARTER_RES_COLOR\n"; actions.render_mode_defines["disable_fog"] = "#define DISABLE_FOG\n"; + actions.render_mode_defines["use_debanding"] = "#define USE_DEBANDING\n"; actions.default_filter = ShaderLanguage::FILTER_LINEAR_MIPMAP; actions.default_repeat = ShaderLanguage::REPEAT_ENABLE; diff --git a/drivers/gles3/storage/mesh_storage.cpp b/drivers/gles3/storage/mesh_storage.cpp index 5fcb7706f4..22d84eba93 100644 --- a/drivers/gles3/storage/mesh_storage.cpp +++ b/drivers/gles3/storage/mesh_storage.cpp @@ -352,6 +352,10 @@ RS::SurfaceData MeshStorage::mesh_get_surface(RID p_mesh, int p_surface) const { sd.attribute_data = Utilities::buffer_get_data(GL_ARRAY_BUFFER, s.attribute_buffer, s.attribute_buffer_size); } + if (s.skin_buffer != 0) { + sd.skin_data = Utilities::buffer_get_data(GL_ARRAY_BUFFER, s.skin_buffer, s.skin_buffer_size); + } + sd.vertex_count = s.vertex_count; sd.index_count = s.index_count; sd.primitive = s.primitive; @@ -550,6 +554,21 @@ void MeshStorage::mesh_clear(RID p_mesh) { glDeleteBuffers(1, &s.index_buffer); s.index_buffer = 0; } + + if (s.versions) { + memfree(s.versions); //reallocs, so free with memfree. + } + + if (s.lod_count) { + for (uint32_t j = 0; j < s.lod_count; j++) { + if (s.lods[j].index_buffer != 0) { + glDeleteBuffers(1, &s.lods[j].index_buffer); + s.lods[j].index_buffer = 0; + } + } + memdelete_arr(s.lods); + } + memdelete(mesh->surfaces[i]); } if (mesh->surfaces) { diff --git a/drivers/gles3/storage/texture_storage.cpp b/drivers/gles3/storage/texture_storage.cpp index b8ab4d6839..a801b3285a 100644 --- a/drivers/gles3/storage/texture_storage.cpp +++ b/drivers/gles3/storage/texture_storage.cpp @@ -1199,7 +1199,7 @@ void TextureStorage::_update_render_target(RenderTarget *rt) { rt->color_internal_format = rt->is_transparent ? GL_RGBA8 : GL_RGB10_A2; rt->color_format = GL_RGBA; - rt->color_type = rt->is_transparent ? GL_BYTE : GL_UNSIGNED_INT_2_10_10_10_REV; + rt->color_type = rt->is_transparent ? GL_UNSIGNED_BYTE : GL_UNSIGNED_INT_2_10_10_10_REV; rt->image_format = Image::FORMAT_RGBA8; glDisable(GL_SCISSOR_TEST); diff --git a/drivers/png/image_loader_png.cpp b/drivers/png/image_loader_png.cpp index 8d2f8a7ed6..165de34c71 100644 --- a/drivers/png/image_loader_png.cpp +++ b/drivers/png/image_loader_png.cpp @@ -36,7 +36,7 @@ #include <string.h> -Error ImageLoaderPNG::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderPNG::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { const uint64_t buffer_size = f->get_length(); Vector<uint8_t> file_buffer; Error err = file_buffer.resize(buffer_size); diff --git a/drivers/png/image_loader_png.h b/drivers/png/image_loader_png.h index 91c3c8925f..a247d77310 100644 --- a/drivers/png/image_loader_png.h +++ b/drivers/png/image_loader_png.h @@ -40,7 +40,7 @@ private: static Ref<Image> load_mem_png(const uint8_t *p_png, int p_size); public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderPNG(); }; diff --git a/drivers/register_driver_types.cpp b/drivers/register_driver_types.cpp index 504ef9843a..53a7f7aa4f 100644 --- a/drivers/register_driver_types.cpp +++ b/drivers/register_driver_types.cpp @@ -34,11 +34,11 @@ #include "drivers/png/image_loader_png.h" #include "drivers/png/resource_saver_png.h" -static ImageLoaderPNG *image_loader_png; +static Ref<ImageLoaderPNG> image_loader_png; static Ref<ResourceSaverPNG> resource_saver_png; void register_core_driver_types() { - image_loader_png = memnew(ImageLoaderPNG); + image_loader_png.instantiate(); ImageLoader::add_image_format_loader(image_loader_png); resource_saver_png.instantiate(); @@ -46,9 +46,8 @@ void register_core_driver_types() { } void unregister_core_driver_types() { - if (image_loader_png) { - memdelete(image_loader_png); - } + ImageLoader::remove_image_format_loader(image_loader_png); + image_loader_png.unref(); ResourceSaver::remove_resource_format_saver(resource_saver_png); resource_saver_png.unref(); diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp index 388ad479b9..300fbcdcfd 100644 --- a/drivers/unix/file_access_unix.cpp +++ b/drivers/unix/file_access_unix.cpp @@ -70,7 +70,7 @@ void FileAccessUnix::check_errors() const { } } -Error FileAccessUnix::_open(const String &p_path, int p_mode_flags) { +Error FileAccessUnix::open_internal(const String &p_path, int p_mode_flags) { _close(); path_src = p_path; diff --git a/drivers/unix/file_access_unix.h b/drivers/unix/file_access_unix.h index 297c34e454..e1311a80f8 100644 --- a/drivers/unix/file_access_unix.h +++ b/drivers/unix/file_access_unix.h @@ -54,7 +54,7 @@ class FileAccessUnix : public FileAccess { public: static CloseNotificationFunc close_notification_func; - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual String get_path() const override; /// returns the path for the current open file diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp index 384f46c8df..ab298a0e49 100644 --- a/drivers/unix/os_unix.cpp +++ b/drivers/unix/os_unix.cpp @@ -194,13 +194,21 @@ String OS_Unix::get_name() const { return "Unix"; } +String OS_Unix::get_distribution_name() const { + return ""; +} + +String OS_Unix::get_version() const { + return ""; +} + double OS_Unix::get_unix_time() const { struct timeval tv_now; gettimeofday(&tv_now, nullptr); return (double)tv_now.tv_sec + double(tv_now.tv_usec) / 1000000; } -OS::Date OS_Unix::get_date(bool p_utc) const { +OS::DateTime OS_Unix::get_datetime(bool p_utc) const { time_t t = time(nullptr); struct tm lt; if (p_utc) { @@ -208,7 +216,7 @@ OS::Date OS_Unix::get_date(bool p_utc) const { } else { localtime_r(&t, <); } - Date ret; + DateTime ret; ret.year = 1900 + lt.tm_year; // Index starting at 1 to match OS_Unix::get_date // and Windows SYSTEMTIME and tm_mon follows the typical structure @@ -216,24 +224,11 @@ OS::Date OS_Unix::get_date(bool p_utc) const { ret.month = (Month)(lt.tm_mon + 1); ret.day = lt.tm_mday; ret.weekday = (Weekday)lt.tm_wday; - ret.dst = lt.tm_isdst; - - return ret; -} - -OS::Time OS_Unix::get_time(bool p_utc) const { - time_t t = time(nullptr); - struct tm lt; - if (p_utc) { - gmtime_r(&t, <); - } else { - localtime_r(&t, <); - } - Time ret; ret.hour = lt.tm_hour; ret.minute = lt.tm_min; ret.second = lt.tm_sec; - get_time_zone_info(); + ret.dst = lt.tm_isdst; + return ret; } diff --git a/drivers/unix/os_unix.h b/drivers/unix/os_unix.h index f4609a565b..8ef650f28b 100644 --- a/drivers/unix/os_unix.h +++ b/drivers/unix/os_unix.h @@ -62,9 +62,10 @@ public: virtual Error set_cwd(const String &p_cwd) override; virtual String get_name() const override; + virtual String get_distribution_name() const override; + virtual String get_version() const override; - virtual Date get_date(bool p_utc) const override; - virtual Time get_time(bool p_utc) const override; + virtual DateTime get_datetime(bool p_utc) const override; virtual TimeZoneInfo get_time_zone_info() const override; virtual double get_unix_time() const override; diff --git a/drivers/vulkan/rendering_device_vulkan.cpp b/drivers/vulkan/rendering_device_vulkan.cpp index 73ae108961..53e9146f85 100644 --- a/drivers/vulkan/rendering_device_vulkan.cpp +++ b/drivers/vulkan/rendering_device_vulkan.cpp @@ -9367,10 +9367,10 @@ void RenderingDeviceVulkan::initialize(VulkanContext *p_context, bool p_local_de // NOTE: If adding new project settings here, also duplicate their definition in // rendering_server.cpp for headless doctool. - staging_buffer_block_size = GLOBAL_DEF("rendering/vulkan/staging_buffer/block_size_kb", 256); + staging_buffer_block_size = GLOBAL_DEF("rendering/rendering_device/staging_buffer/block_size_kb", 256); staging_buffer_block_size = MAX(4u, staging_buffer_block_size); staging_buffer_block_size *= 1024; // Kb -> bytes. - staging_buffer_max_size = GLOBAL_DEF("rendering/vulkan/staging_buffer/max_size_mb", 128); + staging_buffer_max_size = GLOBAL_DEF("rendering/rendering_device/staging_buffer/max_size_mb", 128); staging_buffer_max_size = MAX(1u, staging_buffer_max_size); staging_buffer_max_size *= 1024 * 1024; @@ -9378,7 +9378,7 @@ void RenderingDeviceVulkan::initialize(VulkanContext *p_context, bool p_local_de // Validate enough blocks. staging_buffer_max_size = staging_buffer_block_size * 4; } - texture_upload_region_size_px = GLOBAL_DEF("rendering/vulkan/staging_buffer/texture_upload_region_size_px", 64); + texture_upload_region_size_px = GLOBAL_DEF("rendering/rendering_device/staging_buffer/texture_upload_region_size_px", 64); texture_upload_region_size_px = nearest_power_of_2_templated(texture_upload_region_size_px); frames_drawn = frame_count; // Start from frame count, so everything else is immediately old. @@ -9393,7 +9393,7 @@ void RenderingDeviceVulkan::initialize(VulkanContext *p_context, bool p_local_de ERR_CONTINUE(err != OK); } - max_descriptors_per_pool = GLOBAL_DEF("rendering/vulkan/descriptor_pools/max_descriptors_per_pool", 64); + max_descriptors_per_pool = GLOBAL_DEF("rendering/rendering_device/descriptor_pools/max_descriptors_per_pool", 64); // Check to make sure DescriptorPoolKey is good. static_assert(sizeof(uint64_t) * 3 >= UNIFORM_TYPE_MAX * sizeof(uint16_t)); diff --git a/drivers/windows/file_access_windows.cpp b/drivers/windows/file_access_windows.cpp index 1a66d19373..095d936c78 100644 --- a/drivers/windows/file_access_windows.cpp +++ b/drivers/windows/file_access_windows.cpp @@ -58,7 +58,7 @@ void FileAccessWindows::check_errors() const { } } -Error FileAccessWindows::_open(const String &p_path, int p_mode_flags) { +Error FileAccessWindows::open_internal(const String &p_path, int p_mode_flags) { _close(); path_src = p_path; diff --git a/drivers/windows/file_access_windows.h b/drivers/windows/file_access_windows.h index 8629bb936b..d84c400775 100644 --- a/drivers/windows/file_access_windows.h +++ b/drivers/windows/file_access_windows.h @@ -51,7 +51,7 @@ class FileAccessWindows : public FileAccess { void _close(); public: - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open virtual String get_path() const override; /// returns the path for the current open file diff --git a/editor/action_map_editor.cpp b/editor/action_map_editor.cpp index 7cfedffcbf..b6348c5952 100644 --- a/editor/action_map_editor.cpp +++ b/editor/action_map_editor.cpp @@ -66,6 +66,14 @@ String InputEventConfigurationDialog::get_event_text(const Ref<InputEvent> &p_ev String text = p_event->as_text(); + Ref<InputEventKey> key = p_event; + if (key.is_valid() && key->is_command_or_control_autoremap()) { +#ifdef MACOS_ENABLED + text = text.replace("Command", "Command/Ctrl"); +#else + text = text.replace("Ctrl", "Command/Ctrl"); +#endif + } Ref<InputEventMouse> mouse = p_event; Ref<InputEventJoypadMotion> jp_motion = p_event; Ref<InputEventJoypadButton> jp_button = p_event; @@ -108,11 +116,10 @@ void InputEventConfigurationDialog::_set_event(const Ref<InputEvent> &p_event, b show_mods = true; mod_checkboxes[MOD_ALT]->set_pressed(mod->is_alt_pressed()); mod_checkboxes[MOD_SHIFT]->set_pressed(mod->is_shift_pressed()); - mod_checkboxes[MOD_COMMAND]->set_pressed(mod->is_command_pressed()); mod_checkboxes[MOD_CTRL]->set_pressed(mod->is_ctrl_pressed()); mod_checkboxes[MOD_META]->set_pressed(mod->is_meta_pressed()); - store_command_checkbox->set_pressed(mod->is_storing_command()); + autoremap_command_or_control_checkbox->set_pressed(mod->is_command_or_control_autoremap()); } if (k.is_valid()) { @@ -287,8 +294,6 @@ void InputEventConfigurationDialog::_listen_window_input(const Ref<InputEvent> & Ref<InputEventWithModifiers> mod = received_event; if (mod.is_valid()) { - // Maintain store command option state - mod->set_store_command(store_command_checkbox->is_pressed()); mod->set_window_id(0); } @@ -419,41 +424,31 @@ void InputEventConfigurationDialog::_mod_toggled(bool p_checked, int p_index) { } else if (p_index == 1) { ie->set_shift_pressed(p_checked); } else if (p_index == 2) { - ie->set_command_pressed(p_checked); + if (!autoremap_command_or_control_checkbox->is_pressed()) { + ie->set_ctrl_pressed(p_checked); + } } else if (p_index == 3) { - ie->set_ctrl_pressed(p_checked); - } else if (p_index == 4) { - ie->set_meta_pressed(p_checked); + if (!autoremap_command_or_control_checkbox->is_pressed()) { + ie->set_meta_pressed(p_checked); + } } _set_event(ie); } -void InputEventConfigurationDialog::_store_command_toggled(bool p_checked) { +void InputEventConfigurationDialog::_autoremap_command_or_control_toggled(bool p_checked) { Ref<InputEventWithModifiers> ie = event; if (ie.is_valid()) { - ie->set_store_command(p_checked); + ie->set_command_or_control_autoremap(p_checked); _set_event(ie); } if (p_checked) { - // If storing Command, show it's checkbox and hide Control (Win/Lin) or Meta (Mac) -#ifdef APPLE_STYLE_KEYS mod_checkboxes[MOD_META]->hide(); - - mod_checkboxes[MOD_COMMAND]->show(); - mod_checkboxes[MOD_COMMAND]->set_text("Meta (Command)"); -#else mod_checkboxes[MOD_CTRL]->hide(); - - mod_checkboxes[MOD_COMMAND]->show(); - mod_checkboxes[MOD_COMMAND]->set_text("Control (Command)"); -#endif } else { - // If not, hide Command, show Control and Meta. - mod_checkboxes[MOD_COMMAND]->hide(); - mod_checkboxes[MOD_CTRL]->show(); mod_checkboxes[MOD_META]->show(); + mod_checkboxes[MOD_CTRL]->show(); } } @@ -502,10 +497,12 @@ void InputEventConfigurationDialog::_input_list_item_selected() { // Maintain modifier state from checkboxes k->set_alt_pressed(mod_checkboxes[MOD_ALT]->is_pressed()); k->set_shift_pressed(mod_checkboxes[MOD_SHIFT]->is_pressed()); - k->set_command_pressed(mod_checkboxes[MOD_COMMAND]->is_pressed()); - k->set_ctrl_pressed(mod_checkboxes[MOD_CTRL]->is_pressed()); - k->set_meta_pressed(mod_checkboxes[MOD_META]->is_pressed()); - k->set_store_command(store_command_checkbox->is_pressed()); + if (autoremap_command_or_control_checkbox->is_pressed()) { + k->set_command_or_control_autoremap(true); + } else { + k->set_ctrl_pressed(mod_checkboxes[MOD_CTRL]->is_pressed()); + k->set_meta_pressed(mod_checkboxes[MOD_META]->is_pressed()); + } _set_event(k, false); } break; @@ -517,10 +514,12 @@ void InputEventConfigurationDialog::_input_list_item_selected() { // Maintain modifier state from checkboxes mb->set_alt_pressed(mod_checkboxes[MOD_ALT]->is_pressed()); mb->set_shift_pressed(mod_checkboxes[MOD_SHIFT]->is_pressed()); - mb->set_command_pressed(mod_checkboxes[MOD_COMMAND]->is_pressed()); - mb->set_ctrl_pressed(mod_checkboxes[MOD_CTRL]->is_pressed()); - mb->set_meta_pressed(mod_checkboxes[MOD_META]->is_pressed()); - mb->set_store_command(store_command_checkbox->is_pressed()); + if (autoremap_command_or_control_checkbox->is_pressed()) { + mb->set_command_or_control_autoremap(true); + } else { + mb->set_ctrl_pressed(mod_checkboxes[MOD_CTRL]->is_pressed()); + mb->set_meta_pressed(mod_checkboxes[MOD_META]->is_pressed()); + } // Maintain selected device mb->set_device(_get_current_device()); @@ -611,7 +610,7 @@ void InputEventConfigurationDialog::popup_and_configure(const Ref<InputEvent> &p // This is especially important for WASD movement layouts. physical_key_checkbox->set_pressed(true); - store_command_checkbox->set_pressed(true); + autoremap_command_or_control_checkbox->set_pressed(false); _set_current_device(0); // Switch to "Listen" tab @@ -722,21 +721,18 @@ InputEventConfigurationDialog::InputEventConfigurationDialog() { mod_checkboxes[i] = memnew(CheckBox); mod_checkboxes[i]->connect("toggled", callable_mp(this, &InputEventConfigurationDialog::_mod_toggled).bind(i)); mod_checkboxes[i]->set_text(name); + mod_checkboxes[i]->set_tooltip_text(TTR(mods_tip[i])); mod_container->add_child(mod_checkboxes[i]); } mod_container->add_child(memnew(VSeparator)); - store_command_checkbox = memnew(CheckBox); - store_command_checkbox->connect("toggled", callable_mp(this, &InputEventConfigurationDialog::_store_command_toggled)); - store_command_checkbox->set_pressed(true); - store_command_checkbox->set_text(TTR("Store Command")); -#ifdef APPLE_STYLE_KEYS - store_command_checkbox->set_tooltip_text(TTR("Toggles between serializing 'command' and 'meta'. Used for compatibility with Windows/Linux style keyboard.")); -#else - store_command_checkbox->set_tooltip_text(TTR("Toggles between serializing 'command' and 'control'. Used for compatibility with Apple Style keyboards.")); -#endif - mod_container->add_child(store_command_checkbox); + autoremap_command_or_control_checkbox = memnew(CheckBox); + autoremap_command_or_control_checkbox->connect("toggled", callable_mp(this, &InputEventConfigurationDialog::_autoremap_command_or_control_toggled)); + autoremap_command_or_control_checkbox->set_pressed(false); + autoremap_command_or_control_checkbox->set_text(TTR("Command / Control (auto)")); + autoremap_command_or_control_checkbox->set_tooltip_text(TTR("Automatically remaps between 'Meta' ('Command') and 'Control' depending on current platform.")); + mod_container->add_child(autoremap_command_or_control_checkbox); mod_container->hide(); additional_options_container->add_child(mod_container); diff --git a/editor/action_map_editor.h b/editor/action_map_editor.h index 1ca3c5bac0..36d21fe258 100644 --- a/editor/action_map_editor.h +++ b/editor/action_map_editor.h @@ -85,15 +85,21 @@ private: enum ModCheckbox { MOD_ALT, MOD_SHIFT, - MOD_COMMAND, MOD_CTRL, MOD_META, MOD_MAX }; - String mods[MOD_MAX] = { "Alt", "Shift", "Command", "Ctrl", "Metakey" }; +#if defined(MACOS_ENABLED) + String mods[MOD_MAX] = { "Option", "Shift", "Ctrl", "Command" }; +#elif defined(WINDOWS_ENABLED) + String mods[MOD_MAX] = { "Alt", "Shift", "Ctrl", "Windows" }; +#else + String mods[MOD_MAX] = { "Alt", "Shift", "Ctrl", "Meta" }; +#endif + String mods_tip[MOD_MAX] = { "Alt or Option key", "Shift key", "Control key", "Meta/Windows or Command key" }; CheckBox *mod_checkboxes[MOD_MAX]; - CheckBox *store_command_checkbox = nullptr; + CheckBox *autoremap_command_or_control_checkbox = nullptr; CheckBox *physical_key_checkbox = nullptr; @@ -107,7 +113,7 @@ private: void _input_list_item_selected(); void _mod_toggled(bool p_checked, int p_index); - void _store_command_toggled(bool p_checked); + void _autoremap_command_or_control_toggled(bool p_checked); void _physical_keycode_toggled(bool p_checked); void _device_selection_changed(int p_option_button_index); diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp index 0183d08733..3b87b3e65e 100644 --- a/editor/animation_bezier_editor.cpp +++ b/editor/animation_bezier_editor.cpp @@ -667,8 +667,8 @@ void AnimationBezierTrackEdit::set_timeline(AnimationTimelineEdit *p_timeline) { void AnimationBezierTrackEdit::set_editor(AnimationTrackEditor *p_editor) { editor = p_editor; - connect("clear_selection", Callable(editor, "_clear_selection").bind(false)); - connect("select_key", Callable(editor, "_key_selected"), CONNECT_DEFERRED); + connect("clear_selection", callable_mp(editor, &AnimationTrackEditor::_clear_selection).bind(false)); + connect("select_key", callable_mp(editor, &AnimationTrackEditor::_key_selected), CONNECT_DEFERRED); } void AnimationBezierTrackEdit::_play_position_draw() { @@ -1088,7 +1088,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { //first check point //command makes it ignore the main point, so control point editors can be force-edited //path 2D editing in the 3D and 2D editors works the same way - if (!mb->is_command_pressed()) { + if (!mb->is_command_or_control_pressed()) { if (edit_points[i].point_rect.has_point(mb->get_position())) { IntPair pair = IntPair(edit_points[i].track, edit_points[i].key); if (mb->is_shift_pressed()) { @@ -1152,7 +1152,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } //insert new point - if (mb->get_position().x >= limit && mb->get_position().x < get_size().width && mb->is_command_pressed()) { + if (mb->get_position().x >= limit && mb->get_position().x < get_size().width && mb->is_command_or_control_pressed()) { Array new_point; new_point.resize(5); @@ -1684,8 +1684,8 @@ AnimationBezierTrackEdit::AnimationBezierTrackEdit() { set_clip_contents(true); ED_SHORTCUT("animation_bezier_editor/focus", TTR("Focus"), Key::F); - ED_SHORTCUT("animation_bezier_editor/select_all_keys", TTR("Select All Keys"), KeyModifierMask::CMD | Key::A); - ED_SHORTCUT("animation_bezier_editor/deselect_all_keys", TTR("Deselect All Keys"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::A); + ED_SHORTCUT("animation_bezier_editor/select_all_keys", TTR("Select All Keys"), KeyModifierMask::CMD_OR_CTRL | Key::A); + ED_SHORTCUT("animation_bezier_editor/deselect_all_keys", TTR("Deselect All Keys"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::A); menu = memnew(PopupMenu); add_child(menu); diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index e3b1288e9f..9529460ab1 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -1445,7 +1445,9 @@ void AnimationTimelineEdit::_anim_loop_pressed() { default: break; } + undo_redo->add_do_method(this, "update_values"); undo_redo->add_undo_method(animation.ptr(), "set_loop_mode", animation->get_loop_mode()); + undo_redo->add_undo_method(this, "update_values"); undo_redo->commit_action(); } else { String base_path = animation->get_path(); @@ -1913,6 +1915,8 @@ void AnimationTimelineEdit::_bind_methods() { ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag"), PropertyInfo(Variant::BOOL, "timeline_only"))); ADD_SIGNAL(MethodInfo("track_added", PropertyInfo(Variant::INT, "track"))); ADD_SIGNAL(MethodInfo("length_changed", PropertyInfo(Variant::FLOAT, "size"))); + + ClassDB::bind_method(D_METHOD("update_values"), &AnimationTimelineEdit::update_values); } AnimationTimelineEdit::AnimationTimelineEdit() { @@ -2930,7 +2934,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) { } if (key_idx != -1) { - if (mb->is_command_pressed() || mb->is_shift_pressed()) { + if (mb->is_command_or_control_pressed() || mb->is_shift_pressed()) { if (editor->is_key_selected(track, key_idx)) { emit_signal(SNAME("deselect_key"), key_idx); } else { @@ -3420,9 +3424,6 @@ void AnimationTrackEditGroup::_zoom_changed() { queue_redraw(); } -void AnimationTrackEditGroup::_bind_methods() { -} - AnimationTrackEditGroup::AnimationTrackEditGroup() { set_mouse_filter(MOUSE_FILTER_PASS); } @@ -5468,7 +5469,7 @@ void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) { for (int i = 0; i < track_edits.size(); i++) { Rect2 local_rect = box_select_rect; local_rect.position -= track_edits[i]->get_global_position(); - track_edits[i]->append_to_selection(local_rect, mb->is_command_pressed()); + track_edits[i]->append_to_selection(local_rect, mb->is_command_or_control_pressed()); } if (_get_track_selected() == -1 && track_edits.size() > 0) { // Minimal hack to make shortcuts work. @@ -5494,7 +5495,7 @@ void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) { } if (!box_selection->is_visible_in_tree()) { - if (!mm->is_command_pressed() && !mm->is_shift_pressed()) { + if (!mm->is_command_or_control_pressed() && !mm->is_shift_pressed()) { _clear_selection(true); } box_selection->show(); @@ -6050,10 +6051,9 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) { real_t to_diff = fmod(b - a, Math_TAU); to_v = a + fmod(2.0 * to_diff, Math_TAU) - to_diff; } - Variant delta_v; - Variant::sub(to_v, from_v, delta_v); + Variant delta_v = Animation::subtract_variant(to_v, from_v); double duration = to_t - from_t; - double fixed_duration = duration - 0.01; // Prevent to overwrap keys... + double fixed_duration = duration - UNIT_EPSILON; // Prevent to overwrap keys... for (double delta_t = dur_step; delta_t < fixed_duration; delta_t += dur_step) { Pair<real_t, Variant> keydata; keydata.first = from_t + delta_t; @@ -6458,16 +6458,11 @@ void AnimationTrackEditor::_select_all_tracks_for_copy() { } void AnimationTrackEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_animation_update"), &AnimationTrackEditor::_animation_update); - ClassDB::bind_method(D_METHOD("_track_grab_focus"), &AnimationTrackEditor::_track_grab_focus); - ClassDB::bind_method(D_METHOD("_update_tracks"), &AnimationTrackEditor::_update_tracks); - ClassDB::bind_method(D_METHOD("_redraw_tracks"), &AnimationTrackEditor::_redraw_tracks); - ClassDB::bind_method(D_METHOD("_clear_selection_for_anim"), &AnimationTrackEditor::_clear_selection_for_anim); - ClassDB::bind_method(D_METHOD("_select_at_anim"), &AnimationTrackEditor::_select_at_anim); - - ClassDB::bind_method(D_METHOD("_key_selected"), &AnimationTrackEditor::_key_selected); // Still used by some connect_compat. - ClassDB::bind_method(D_METHOD("_key_deselected"), &AnimationTrackEditor::_key_deselected); // Still used by some connect_compat. - ClassDB::bind_method(D_METHOD("_clear_selection"), &AnimationTrackEditor::_clear_selection); // Still used by some connect_compat. + ClassDB::bind_method("_animation_update", &AnimationTrackEditor::_animation_update); + ClassDB::bind_method("_track_grab_focus", &AnimationTrackEditor::_track_grab_focus); + ClassDB::bind_method("_clear_selection_for_anim", &AnimationTrackEditor::_clear_selection_for_anim); + ClassDB::bind_method("_select_at_anim", &AnimationTrackEditor::_select_at_anim); + ClassDB::bind_method("_clear_selection", &AnimationTrackEditor::_clear_selection); ClassDB::bind_method(D_METHOD("_bezier_track_set_key_handle_mode", "animation", "track_idx", "key_idx", "key_handle_mode", "key_handle_set_mode"), &AnimationTrackEditor::_bezier_track_set_key_handle_mode, DEFVAL(Animation::HANDLE_SET_MODE_NONE)); @@ -6708,15 +6703,15 @@ AnimationTrackEditor::AnimationTrackEditor() { edit->get_popup()->add_separator(); edit->get_popup()->add_item(TTR("Make Easing Selection"), EDIT_EASE_SELECTION); edit->get_popup()->add_separator(); - edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/duplicate_selection", TTR("Duplicate Selection"), KeyModifierMask::CMD | Key::D), EDIT_DUPLICATE_SELECTION); - edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/duplicate_selection_transposed", TTR("Duplicate Transposed"), KeyModifierMask::SHIFT | KeyModifierMask::CMD | Key::D), EDIT_DUPLICATE_TRANSPOSED); + edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/duplicate_selection", TTR("Duplicate Selection"), KeyModifierMask::CMD_OR_CTRL | Key::D), EDIT_DUPLICATE_SELECTION); + edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/duplicate_selection_transposed", TTR("Duplicate Transposed"), KeyModifierMask::SHIFT | KeyModifierMask::CMD_OR_CTRL | Key::D), EDIT_DUPLICATE_TRANSPOSED); edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/add_reset_value", TTR("Add RESET Value(s)"))); edit->get_popup()->add_separator(); edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/delete_selection", TTR("Delete Selection"), Key::KEY_DELETE), EDIT_DELETE_SELECTION); edit->get_popup()->add_separator(); - edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/goto_next_step", TTR("Go to Next Step"), KeyModifierMask::CMD | Key::RIGHT), EDIT_GOTO_NEXT_STEP); - edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/goto_prev_step", TTR("Go to Previous Step"), KeyModifierMask::CMD | Key::LEFT), EDIT_GOTO_PREV_STEP); + edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/goto_next_step", TTR("Go to Next Step"), KeyModifierMask::CMD_OR_CTRL | Key::RIGHT), EDIT_GOTO_NEXT_STEP); + edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/goto_prev_step", TTR("Go to Previous Step"), KeyModifierMask::CMD_OR_CTRL | Key::LEFT), EDIT_GOTO_PREV_STEP); edit->get_popup()->add_separator(); edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/apply_reset", TTR("Apply Reset")), EDIT_APPLY_RESET); edit->get_popup()->add_separator(); diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index ac69b88e99..5c51921d93 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -280,7 +280,6 @@ class AnimationTrackEditGroup : public Control { void _zoom_changed(); protected: - static void _bind_methods(); void _notification(int p_what); public: @@ -407,7 +406,6 @@ class AnimationTrackEditor : public VBoxContainer { void _insert_key_from_track(float p_ofs, int p_track); void _add_method_key(const String &p_method); - void _clear_selection(bool p_update = false); void _clear_selection_for_anim(const Ref<Animation> &p_anim); void _select_at_anim(const Ref<Animation> &p_anim, int p_track, float p_pos); @@ -425,9 +423,6 @@ class AnimationTrackEditor : public VBoxContainer { RBMap<SelectedKey, KeyInfo> selection; - void _key_selected(int p_key, bool p_single, int p_track); - void _key_deselected(int p_key, int p_track); - bool moving_selection = false; float moving_selection_offset = 0.0f; void _move_selection_begin(); @@ -531,6 +526,11 @@ protected: void _notification(int p_what); public: + // Public for use with callable_mp. + void _clear_selection(bool p_update = false); + void _key_selected(int p_key, bool p_single, int p_track); + void _key_deselected(int p_key, int p_track); + enum { EDIT_COPY_TRACKS, EDIT_COPY_TRACKS_CONFIRM, diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index 9aa913a892..11a6912aa5 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -800,7 +800,7 @@ void CodeTextEditor::_text_editor_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->is_pressed() && mb->is_command_pressed()) { + if (mb->is_pressed() && mb->is_command_or_control_pressed()) { if (mb->get_button_index() == MouseButton::WHEEL_UP) { _zoom_in(); } else if (mb->get_button_index() == MouseButton::WHEEL_DOWN) { @@ -1867,10 +1867,10 @@ void CodeTextEditor::update_toggle_scripts_button() { CodeTextEditor::CodeTextEditor() { code_complete_func = nullptr; - ED_SHORTCUT("script_editor/zoom_in", TTR("Zoom In"), KeyModifierMask::CMD | Key::EQUAL); - ED_SHORTCUT("script_editor/zoom_out", TTR("Zoom Out"), KeyModifierMask::CMD | Key::MINUS); + ED_SHORTCUT("script_editor/zoom_in", TTR("Zoom In"), KeyModifierMask::CMD_OR_CTRL | Key::EQUAL); + ED_SHORTCUT("script_editor/zoom_out", TTR("Zoom Out"), KeyModifierMask::CMD_OR_CTRL | Key::MINUS); ED_SHORTCUT_ARRAY("script_editor/reset_zoom", TTR("Reset Zoom"), - { int32_t(KeyModifierMask::CMD | Key::KEY_0), int32_t(KeyModifierMask::CMD | Key::KP_0) }); + { int32_t(KeyModifierMask::CMD_OR_CTRL | Key::KEY_0), int32_t(KeyModifierMask::CMD_OR_CTRL | Key::KP_0) }); text_editor = memnew(CodeEdit); add_child(text_editor); diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index 861d05f17a..236f3d7b08 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -238,6 +238,12 @@ void ConnectDialog::_notification(int p_what) { String type_name = Variant::get_type_name((Variant::Type)type_list->get_item_id(i)); type_list->set_item_icon(i, get_theme_icon(type_name, SNAME("EditorIcons"))); } + + Ref<StyleBox> style = get_theme_stylebox("normal", "LineEdit")->duplicate(); + if (style.is_valid()) { + style->set_default_margin(SIDE_TOP, style->get_default_margin(SIDE_TOP) + 1.0); + from_signal->add_theme_style_override("normal", style); + } } break; } } @@ -465,30 +471,31 @@ ConnectDialog::ConnectDialog() { vbc_right->add_margin_child(TTR("Unbind Signal Arguments:"), unbind_count); - HBoxContainer *dstm_hb = memnew(HBoxContainer); - vbc_left->add_margin_child(TTR("Receiver Method:"), dstm_hb); - dst_method = memnew(LineEdit); dst_method->set_h_size_flags(Control::SIZE_EXPAND_FILL); dst_method->connect("text_submitted", callable_mp(this, &ConnectDialog::_text_submitted)); - dstm_hb->add_child(dst_method); + vbc_left->add_margin_child(TTR("Receiver Method:"), dst_method); advanced = memnew(CheckButton); - dstm_hb->add_child(advanced); + vbc_left->add_child(advanced); advanced->set_text(TTR("Advanced")); + advanced->set_h_size_flags(Control::SIZE_SHRINK_BEGIN | Control::SIZE_EXPAND); advanced->connect("pressed", callable_mp(this, &ConnectDialog::_advanced_pressed)); + HBoxContainer *hbox = memnew(HBoxContainer); + vbc_right->add_child(hbox); + deferred = memnew(CheckBox); deferred->set_h_size_flags(0); deferred->set_text(TTR("Deferred")); deferred->set_tooltip_text(TTR("Defers the signal, storing it in a queue and only firing it at idle time.")); - vbc_right->add_child(deferred); + hbox->add_child(deferred); one_shot = memnew(CheckBox); one_shot->set_h_size_flags(0); - one_shot->set_text(TTR("Oneshot")); + one_shot->set_text(TTR("One Shot")); one_shot->set_tooltip_text(TTR("Disconnects the signal after its first emission.")); - vbc_right->add_child(one_shot); + hbox->add_child(one_shot); cdbinds = memnew(ConnectDialogBinds); @@ -810,7 +817,7 @@ void ConnectionsDock::_go_to_script(TreeItem &p_item) { } if (script.is_valid() && ScriptEditor::get_singleton()->script_goto_method(script, cd.method)) { - EditorNode::get_singleton()->call("_editor_select", EditorNode::EDITOR_SCRIPT); + EditorNode::get_singleton()->editor_select(EditorNode::EDITOR_SCRIPT); } } diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp index 2d70934c9c..3e72c6211d 100644 --- a/editor/create_dialog.cpp +++ b/editor/create_dialog.cpp @@ -38,7 +38,7 @@ #include "editor/editor_scale.h" #include "editor/editor_settings.h" -void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode, const String &p_select_type, const String &p_select_name) { +void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode, const String &p_current_type, const String &p_current_name) { _fill_type_list(); icon_fallback = search_options->has_theme_icon(base_type, SNAME("EditorIcons")) ? base_type : "Object"; @@ -50,18 +50,14 @@ void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode, const St } if (p_replace_mode) { - search_box->set_text(p_select_type); + search_box->set_text(p_current_type); } search_box->grab_focus(); _update_search(); if (p_replace_mode) { - if (!p_select_name.is_empty()) { - set_title(vformat(TTR("Convert %s from %s"), p_select_name, p_select_type)); - } else { - set_title(vformat(TTR("Convert %s"), p_select_type)); - } + set_title(vformat(TTR("Change Type of \"%s\""), p_current_name)); set_ok_button_text(TTR("Change")); } else { set_title(vformat(TTR("Create New %s"), base_type)); @@ -300,6 +296,15 @@ void CreateDialog::_configure_search_option_item(TreeItem *r_item, const String r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, icon_fallback)); } + bool is_deprecated = EditorHelp::get_doc_data()->class_list[p_type].is_deprecated; + bool is_experimental = EditorHelp::get_doc_data()->class_list[p_type].is_experimental; + + if (is_deprecated) { + r_item->add_button(0, get_theme_icon("StatusError", SNAME("EditorIcons")), 0, false, TTR("This class is marked as deprecated.")); + } else if (is_experimental) { + r_item->add_button(0, get_theme_icon("NodeWarning", SNAME("EditorIcons")), 0, false, TTR("This class is marked as experimental.")); + } + if (!search_box->get_text().is_empty()) { r_item->set_collapsed(false); } else { diff --git a/editor/create_dialog.h b/editor/create_dialog.h index f7731d2726..f2e741624f 100644 --- a/editor/create_dialog.h +++ b/editor/create_dialog.h @@ -120,7 +120,7 @@ public: void set_preferred_search_result_type(const String &p_preferred_type) { preferred_search_result_type = p_preferred_type; } String get_preferred_search_result_type() { return preferred_search_result_type; } - void popup_create(bool p_dont_clear, bool p_replace_mode = false, const String &p_select_type = "Node", const String &p_select_name = ""); + void popup_create(bool p_dont_clear, bool p_replace_mode = false, const String &p_current_type = "", const String &p_current_name = ""); CreateDialog(); }; diff --git a/editor/debugger/editor_debugger_inspector.cpp b/editor/debugger/editor_debugger_inspector.cpp index 6c0ba55ec8..7ea6cedd2b 100644 --- a/editor/debugger/editor_debugger_inspector.cpp +++ b/editor/debugger/editor_debugger_inspector.cpp @@ -36,7 +36,7 @@ #include "scene/debugger/scene_debugger.h" bool EditorDebuggerRemoteObject::_set(const StringName &p_name, const Variant &p_value) { - if (!editable || !prop_values.has(p_name) || String(p_name).begins_with("Constants/")) { + if (!prop_values.has(p_name) || String(p_name).begins_with("Constants/")) { return false; } @@ -85,14 +85,12 @@ void EditorDebuggerRemoteObject::_bind_methods() { ClassDB::bind_method(D_METHOD("get_variant"), &EditorDebuggerRemoteObject::get_variant); ClassDB::bind_method(D_METHOD("clear"), &EditorDebuggerRemoteObject::clear); ClassDB::bind_method(D_METHOD("get_remote_object_id"), &EditorDebuggerRemoteObject::get_remote_object_id); - ClassDB::bind_method(D_METHOD("_is_read_only"), &EditorDebuggerRemoteObject::_is_read_only); ADD_SIGNAL(MethodInfo("value_edited", PropertyInfo(Variant::INT, "object_id"), PropertyInfo(Variant::STRING, "property"), PropertyInfo("value"))); } EditorDebuggerInspector::EditorDebuggerInspector() { variables = memnew(EditorDebuggerRemoteObject); - variables->editable = false; } EditorDebuggerInspector::~EditorDebuggerInspector() { diff --git a/editor/debugger/editor_debugger_inspector.h b/editor/debugger/editor_debugger_inspector.h index c595e0acaa..d835f5fa42 100644 --- a/editor/debugger/editor_debugger_inspector.h +++ b/editor/debugger/editor_debugger_inspector.h @@ -43,14 +43,12 @@ protected: static void _bind_methods(); public: - bool editable = false; ObjectID remote_object_id; String type_name; List<PropertyInfo> prop_list; HashMap<StringName, Variant> prop_values; ObjectID get_remote_object_id() { return remote_object_id; }; - bool _is_read_only() { return true; }; String get_title(); Variant get_variant(const StringName &p_name); diff --git a/editor/debugger/editor_profiler.cpp b/editor/debugger/editor_profiler.cpp index cf48366bd3..a882275375 100644 --- a/editor/debugger/editor_profiler.cpp +++ b/editor/debugger/editor_profiler.cpp @@ -104,6 +104,10 @@ void EditorProfiler::clear() { updating_frame = false; hover_metric = -1; seeking = false; + + // Ensure button text (start, stop) is correct + _set_button_text(); + emit_signal(SNAME("enable_profiling"), activate->is_pressed()); } static String _get_percent_txt(float p_value, float p_total) { @@ -374,15 +378,23 @@ void EditorProfiler::_update_frame() { updating_frame = false; } -void EditorProfiler::_activate_pressed() { +void EditorProfiler::_set_button_text() { if (activate->is_pressed()) { activate->set_icon(get_theme_icon(SNAME("Stop"), SNAME("EditorIcons"))); activate->set_text(TTR("Stop")); - _clear_pressed(); } else { activate->set_icon(get_theme_icon(SNAME("Play"), SNAME("EditorIcons"))); activate->set_text(TTR("Start")); } +} + +void EditorProfiler::_activate_pressed() { + _set_button_text(); + + if (activate->is_pressed()) { + _clear_pressed(); + } + emit_signal(SNAME("enable_profiling"), activate->is_pressed()); } @@ -499,8 +511,12 @@ void EditorProfiler::_bind_methods() { ADD_SIGNAL(MethodInfo("break_request")); } -void EditorProfiler::set_enabled(bool p_enable) { +void EditorProfiler::set_enabled(bool p_enable, bool p_clear) { + activate->set_pressed(false); activate->set_disabled(!p_enable); + if (p_clear) { + clear(); + } } bool EditorProfiler::is_profiling() { diff --git a/editor/debugger/editor_profiler.h b/editor/debugger/editor_profiler.h index df92125258..e9ecc285ed 100644 --- a/editor/debugger/editor_profiler.h +++ b/editor/debugger/editor_profiler.h @@ -122,6 +122,7 @@ private: Timer *frame_delay = nullptr; Timer *plot_delay = nullptr; + void _set_button_text(); void _update_frame(); void _activate_pressed(); @@ -153,7 +154,7 @@ protected: public: void add_frame_metric(const Metric &p_metric, bool p_final = false); - void set_enabled(bool p_enable); + void set_enabled(bool p_enable, bool p_clear = true); bool is_profiling(); bool is_seeking() { return seeking; } void disable_seeking(); diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index 5baa9970af..6bc1536cb9 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -52,7 +52,6 @@ #include "editor/plugins/node_3d_editor_plugin.h" #include "main/performance.h" #include "scene/3d/camera_3d.h" -#include "scene/debugger/scene_debugger.h" #include "scene/gui/dialogs.h" #include "scene/gui/label.h" #include "scene/gui/line_edit.h" @@ -317,7 +316,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da if (!error.is_empty()) { tabs->set_current_tab(0); } - profiler->set_enabled(false); + profiler->set_enabled(false, false); inspector->clear_cache(); // Take a chance to force remote objects update. } else if (p_msg == "debug_exit") { @@ -327,7 +326,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da _update_buttons_state(); _set_reason_text(TTR("Execution resumed."), MESSAGE_SUCCESS); emit_signal(SNAME("breaked"), false, false, "", false); - profiler->set_enabled(true); + profiler->set_enabled(true, false); profiler->disable_seeking(); } else if (p_msg == "set_pid") { ERR_FAIL_COND(p_data.size() < 1); @@ -916,6 +915,8 @@ void ScriptEditorDebugger::start(Ref<RemoteDebuggerPeer> p_peer) { _clear_errors_list(); stop(); + profiler->set_enabled(true, true); + peer = p_peer; ERR_FAIL_COND(p_peer.is_null()); @@ -971,6 +972,8 @@ void ScriptEditorDebugger::stop() { res_path_cache.clear(); profiler_signature.clear(); + profiler->set_enabled(true, false); + inspector->edit(nullptr); _update_buttons_state(); } diff --git a/editor/doc_tools.cpp b/editor/doc_tools.cpp index ec9a744e57..7d6eb186dc 100644 --- a/editor/doc_tools.cpp +++ b/editor/doc_tools.cpp @@ -85,6 +85,9 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::ClassDoc &cf = p_data.class_list[c.name]; + c.is_deprecated = cf.is_deprecated; + c.is_experimental = cf.is_experimental; + c.description = cf.description; c.brief_description = cf.brief_description; c.tutorials = cf.tutorials; @@ -133,6 +136,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::MethodDoc &mf = cf.constructors[j]; m.description = mf.description; + m.is_deprecated = mf.is_deprecated; + m.is_experimental = mf.is_experimental; break; } } @@ -148,6 +153,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::MethodDoc &mf = cf.methods[j]; m.description = mf.description; + m.is_deprecated = mf.is_deprecated; + m.is_experimental = mf.is_experimental; break; } } @@ -162,6 +169,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::MethodDoc &mf = cf.signals[j]; m.description = mf.description; + m.is_deprecated = mf.is_deprecated; + m.is_experimental = mf.is_experimental; break; } } @@ -176,6 +185,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::ConstantDoc &mf = cf.constants[j]; m.description = mf.description; + m.is_deprecated = mf.is_deprecated; + m.is_experimental = mf.is_experimental; break; } } @@ -190,6 +201,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::MethodDoc &mf = cf.annotations[j]; m.description = mf.description; + m.is_deprecated = mf.is_deprecated; + m.is_experimental = mf.is_experimental; break; } } @@ -204,6 +217,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::PropertyDoc &pf = cf.properties[j]; p.description = pf.description; + p.is_deprecated = pf.is_deprecated; + p.is_experimental = pf.is_experimental; break; } } @@ -266,6 +281,8 @@ void DocTools::merge_from(const DocTools &p_data) { const DocData::MethodDoc &mf = cf.operators[j]; m.description = mf.description; + m.is_deprecated = mf.is_deprecated; + m.is_experimental = mf.is_experimental; break; } } @@ -1007,6 +1024,12 @@ static Error _parse_methods(Ref<XMLParser> &parser, Vector<DocData::MethodDoc> & if (parser->has_attribute("qualifiers")) { method.qualifiers = parser->get_attribute_value("qualifiers"); } + if (parser->has_attribute("is_deprecated")) { + method.is_deprecated = parser->get_attribute_value("is_deprecated").to_lower() == "true"; + } + if (parser->has_attribute("is_experimental")) { + method.is_experimental = parser->get_attribute_value("is_experimental").to_lower() == "true"; + } while (parser->read() == OK) { if (parser->get_node_type() == XMLParser::NODE_ELEMENT) { @@ -1138,6 +1161,14 @@ Error DocTools::_load(Ref<XMLParser> parser) { c.inherits = parser->get_attribute_value("inherits"); } + if (parser->has_attribute("is_deprecated")) { + c.is_deprecated = parser->get_attribute_value("is_deprecated").to_lower() == "true"; + } + + if (parser->has_attribute("is_experimental")) { + c.is_experimental = parser->get_attribute_value("is_experimental").to_lower() == "true"; + } + while (parser->read() == OK) { if (parser->get_node_type() == XMLParser::NODE_ELEMENT) { String name2 = parser->get_node_name(); @@ -1211,6 +1242,12 @@ Error DocTools::_load(Ref<XMLParser> parser) { if (parser->has_attribute("enum")) { prop2.enumeration = parser->get_attribute_value("enum"); } + if (parser->has_attribute("is_deprecated")) { + prop2.is_deprecated = parser->get_attribute_value("is_deprecated").to_lower() == "true"; + } + if (parser->has_attribute("is_experimental")) { + prop2.is_experimental = parser->get_attribute_value("is_experimental").to_lower() == "true"; + } if (!parser->is_empty()) { parser->read(); if (parser->get_node_type() == XMLParser::NODE_TEXT) { @@ -1275,6 +1312,12 @@ Error DocTools::_load(Ref<XMLParser> parser) { if (parser->has_attribute("is_bitfield")) { constant2.is_bitfield = parser->get_attribute_value("is_bitfield").to_lower() == "true"; } + if (parser->has_attribute("is_deprecated")) { + constant2.is_deprecated = parser->get_attribute_value("is_deprecated").to_lower() == "true"; + } + if (parser->has_attribute("is_experimental")) { + constant2.is_experimental = parser->get_attribute_value("is_experimental").to_lower() == "true"; + } if (!parser->is_empty()) { parser->read(); if (parser->get_node_type() == XMLParser::NODE_TEXT) { @@ -1327,7 +1370,15 @@ static void _write_method_doc(Ref<FileAccess> f, const String &p_name, Vector<Do qualifiers += " qualifiers=\"" + m.qualifiers.xml_escape() + "\""; } - _write_string(f, 2, "<" + p_name + " name=\"" + m.name.xml_escape() + "\"" + qualifiers + ">"); + String additional_attributes; + if (m.is_deprecated) { + additional_attributes += " is_deprecated=\"true\""; + } + if (m.is_experimental) { + additional_attributes += " is_experimental=\"true\""; + } + + _write_string(f, 2, "<" + p_name + " name=\"" + m.name.xml_escape() + "\"" + qualifiers + additional_attributes + ">"); if (!m.return_type.is_empty()) { String enum_text; @@ -1390,6 +1441,12 @@ Error DocTools::save_classes(const String &p_default_path, const HashMap<String, String header = "<class name=\"" + c.name + "\""; if (!c.inherits.is_empty()) { header += " inherits=\"" + c.inherits + "\""; + if (c.is_deprecated) { + header += " is_deprecated=\"true\""; + } + if (c.is_experimental) { + header += " is_experimental=\"true\""; + } } header += String(" version=\"") + VERSION_BRANCH + "\""; // Reference the XML schema so editors can provide error checking. @@ -1433,6 +1490,12 @@ Error DocTools::save_classes(const String &p_default_path, const HashMap<String, if (!c.properties[i].default_value.is_empty()) { additional_attributes += " default=\"" + c.properties[i].default_value.xml_escape(true) + "\""; } + if (c.properties[i].is_deprecated) { + additional_attributes += " is_deprecated=\"true\""; + } + if (c.properties[i].is_experimental) { + additional_attributes += " is_experimental=\"true\""; + } const DocData::PropertyDoc &p = c.properties[i]; @@ -1453,21 +1516,30 @@ Error DocTools::save_classes(const String &p_default_path, const HashMap<String, _write_string(f, 1, "<constants>"); for (int i = 0; i < c.constants.size(); i++) { const DocData::ConstantDoc &k = c.constants[i]; + + String additional_attributes; + if (c.constants[i].is_deprecated) { + additional_attributes += " is_deprecated=\"true\""; + } + if (c.constants[i].is_experimental) { + additional_attributes += " is_experimental=\"true\""; + } + if (k.is_value_valid) { if (!k.enumeration.is_empty()) { if (k.is_bitfield) { - _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\" enum=\"" + k.enumeration + "\" is_bitfield=\"true\">"); + _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\" enum=\"" + k.enumeration + "\" is_bitfield=\"true\"" + additional_attributes + ">"); } else { - _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\" enum=\"" + k.enumeration + "\">"); + _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\" enum=\"" + k.enumeration + "\"" + additional_attributes + ">"); } } else { - _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\">"); + _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\"" + additional_attributes + ">"); } } else { if (!k.enumeration.is_empty()) { - _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"platform-dependent\" enum=\"" + k.enumeration + "\">"); + _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"platform-dependent\" enum=\"" + k.enumeration + "\"" + additional_attributes + ">"); } else { - _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"platform-dependent\">"); + _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"platform-dependent\"" + additional_attributes + ">"); } } _write_string(f, 3, _translate_doc_string(k.description).strip_edges().xml_escape()); diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index 99821d8983..09dce869c9 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -940,7 +940,7 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) { hbc->add_child(bus_options); bus_popup = bus_options->get_popup(); - bus_popup->add_shortcut(ED_SHORTCUT("audio_bus_editor/duplicate_selected_bus", TTR("Duplicate Bus"), KeyModifierMask::CMD | Key::D)); + bus_popup->add_shortcut(ED_SHORTCUT("audio_bus_editor/duplicate_selected_bus", TTR("Duplicate Bus"), KeyModifierMask::CMD_OR_CTRL | Key::D)); bus_popup->add_shortcut(ED_SHORTCUT("audio_bus_editor/delete_selected_bus", TTR("Delete Bus"), Key::KEY_DELETE)); bus_popup->set_item_disabled(1, is_master); bus_popup->add_item(TTR("Reset Volume")); diff --git a/editor/editor_command_palette.cpp b/editor/editor_command_palette.cpp index ba1f2fd6af..a0913265eb 100644 --- a/editor/editor_command_palette.cpp +++ b/editor/editor_command_palette.cpp @@ -130,7 +130,7 @@ void EditorCommandPalette::_update_command_search(const String &search_text) { ti->set_metadata(0, entries[i].key_name); ti->set_text_alignment(1, HORIZONTAL_ALIGNMENT_RIGHT); ti->set_text(1, shortcut_text); - Color c = Color(1, 1, 1, 0.5); + Color c = get_theme_color(SNAME("font_color"), SNAME("Editor")) * Color(1, 1, 1, 0.5); ti->set_custom_color(1, c); } diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index 629f72b974..9fa08a0adb 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -649,7 +649,7 @@ void EditorFileDialog::_item_list_empty_clicked(const Vector2 &p_pos, MouseButto item_menu->reset_size(); if (can_create_dir) { - item_menu->add_icon_item(theme_cache.folder, TTR("New Folder..."), ITEM_MENU_NEW_FOLDER, KeyModifierMask::CMD | Key::N); + item_menu->add_icon_item(theme_cache.folder, TTR("New Folder..."), ITEM_MENU_NEW_FOLDER, KeyModifierMask::CMD_OR_CTRL | Key::N); } item_menu->add_icon_item(theme_cache.reload, TTR("Refresh"), ITEM_MENU_REFRESH, Key::F5); item_menu->add_separator(); @@ -1664,14 +1664,14 @@ EditorFileDialog::EditorFileDialog() { ED_SHORTCUT("file_dialog/go_forward", TTR("Go Forward"), KeyModifierMask::ALT | Key::RIGHT); ED_SHORTCUT("file_dialog/go_up", TTR("Go Up"), KeyModifierMask::ALT | Key::UP); ED_SHORTCUT("file_dialog/refresh", TTR("Refresh"), Key::F5); - ED_SHORTCUT("file_dialog/toggle_hidden_files", TTR("Toggle Hidden Files"), KeyModifierMask::CMD | Key::H); + ED_SHORTCUT("file_dialog/toggle_hidden_files", TTR("Toggle Hidden Files"), KeyModifierMask::CMD_OR_CTRL | Key::H); ED_SHORTCUT("file_dialog/toggle_favorite", TTR("Toggle Favorite"), KeyModifierMask::ALT | Key::F); ED_SHORTCUT("file_dialog/toggle_mode", TTR("Toggle Mode"), KeyModifierMask::ALT | Key::V); - ED_SHORTCUT("file_dialog/create_folder", TTR("Create Folder"), KeyModifierMask::CMD | Key::N); + ED_SHORTCUT("file_dialog/create_folder", TTR("Create Folder"), KeyModifierMask::CMD_OR_CTRL | Key::N); ED_SHORTCUT("file_dialog/delete", TTR("Delete"), Key::KEY_DELETE); - ED_SHORTCUT("file_dialog/focus_path", TTR("Focus Path"), KeyModifierMask::CMD | Key::D); - ED_SHORTCUT("file_dialog/move_favorite_up", TTR("Move Favorite Up"), KeyModifierMask::CMD | Key::UP); - ED_SHORTCUT("file_dialog/move_favorite_down", TTR("Move Favorite Down"), KeyModifierMask::CMD | Key::DOWN); + ED_SHORTCUT("file_dialog/focus_path", TTR("Focus Path"), KeyModifierMask::CMD_OR_CTRL | Key::D); + ED_SHORTCUT("file_dialog/move_favorite_up", TTR("Move Favorite Up"), KeyModifierMask::CMD_OR_CTRL | Key::UP); + ED_SHORTCUT("file_dialog/move_favorite_down", TTR("Move Favorite Down"), KeyModifierMask::CMD_OR_CTRL | Key::DOWN); HBoxContainer *pathhb = memnew(HBoxContainer); diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h index 6d11cb10ed..2e7302aaf9 100644 --- a/editor/editor_file_dialog.h +++ b/editor/editor_file_dialog.h @@ -202,7 +202,6 @@ private: void _select_drive(int p_idx); void _dir_submitted(String p_dir); - void _file_submitted(const String &p_file); void _action_pressed(); void _save_confirm_pressed(); void _cancel_pressed(); @@ -240,6 +239,9 @@ protected: static void _bind_methods(); public: + // Public for use with callable_mp. + void _file_submitted(const String &p_file); + void popup_file_dialog(); void clear_filters(); void add_filter(const String &p_filter, const String &p_description = ""); diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index 177bc6d2b2..b89bd23859 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -690,7 +690,6 @@ void EditorFileSystem::scan() { _update_extensions(); - abort_scan = false; if (!use_threads) { scanning = true; scan_total = 0; @@ -1162,8 +1161,6 @@ void EditorFileSystem::scan_changes() { scanning_changes = true; scanning_changes_done = false; - abort_scan = false; - if (!use_threads) { if (filesystem) { EditorProgressBG pr("sources", TTR("ScanSources"), 1000); @@ -1195,8 +1192,6 @@ void EditorFileSystem::_notification(int p_what) { case NOTIFICATION_EXIT_TREE: { Thread &active_thread = thread.is_started() ? thread : thread_sources; if (use_threads && active_thread.is_started()) { - //abort thread if in progress - abort_scan = true; while (scanning) { OS::get_singleton()->delay_usec(1000); } diff --git a/editor/editor_file_system.h b/editor/editor_file_system.h index f4e69b95e7..e06c6e4593 100644 --- a/editor/editor_file_system.h +++ b/editor/editor_file_system.h @@ -168,7 +168,6 @@ class EditorFileSystem : public Node { EditorFileSystemDirectory *new_filesystem = nullptr; - bool abort_scan = false; bool scanning = false; bool importing = false; bool first_scan = true; diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp index fffe77f1c4..c31d13d122 100644 --- a/editor/editor_fonts.cpp +++ b/editor/editor_fonts.cpp @@ -96,6 +96,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { TextServer::SubpixelPositioning font_subpixel_positioning = (TextServer::SubpixelPositioning)(int)EditorSettings::get_singleton()->get("interface/editor/font_subpixel_positioning"); TextServer::Hinting font_hinting; + TextServer::Hinting font_mono_hinting; switch (font_hinting_setting) { case 0: // The "Auto" setting uses the setting that best matches the OS' font rendering: @@ -104,18 +105,23 @@ void editor_register_fonts(Ref<Theme> p_theme) { // - Linux has configurable font hinting, but most distributions including Ubuntu default to "Light". #ifdef MACOS_ENABLED font_hinting = TextServer::HINTING_NONE; + font_mono_hinting = TextServer::HINTING_NONE; #else font_hinting = TextServer::HINTING_LIGHT; + font_mono_hinting = TextServer::HINTING_LIGHT; #endif break; case 1: font_hinting = TextServer::HINTING_NONE; + font_mono_hinting = TextServer::HINTING_NONE; break; case 2: font_hinting = TextServer::HINTING_LIGHT; + font_mono_hinting = TextServer::HINTING_LIGHT; break; default: font_hinting = TextServer::HINTING_NORMAL; + font_mono_hinting = TextServer::HINTING_LIGHT; break; } @@ -163,7 +169,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { default_font_bold->set_fallbacks(fallbacks_bold); default_font_bold_msdf->set_fallbacks(fallbacks_bold); - Ref<FontFile> default_font_mono = load_internal_font(_font_JetBrainsMono_Regular, _font_JetBrainsMono_Regular_size, font_hinting, font_antialiasing, true, font_subpixel_positioning); + Ref<FontFile> default_font_mono = load_internal_font(_font_JetBrainsMono_Regular, _font_JetBrainsMono_Regular_size, font_mono_hinting, font_antialiasing, true, font_subpixel_positioning); default_font_mono->set_fallbacks(fallbacks); // Init base font configs and load custom fonts. @@ -260,7 +266,7 @@ void editor_register_fonts(Ref<Theme> p_theme) { Ref<FontVariation> mono_fc; mono_fc.instantiate(); if (custom_font_path_source.length() > 0 && dir->file_exists(custom_font_path_source)) { - Ref<FontFile> custom_font = load_external_font(custom_font_path_source, font_hinting, font_antialiasing, true, font_subpixel_positioning); + Ref<FontFile> custom_font = load_external_font(custom_font_path_source, font_mono_hinting, font_antialiasing, true, font_subpixel_positioning); { TypedArray<Font> fallback_custom; fallback_custom.push_back(default_font_mono); diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index b8f115e82e..745dcdd04c 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -276,6 +276,23 @@ String EditorHelp::_fix_constant(const String &p_constant) const { return p_constant; } +// Macros for assigning the deprecation/experimental information to class members +#define DEPRECATED_DOC_TAG \ + class_desc->push_color(get_theme_color(SNAME("error_color"), SNAME("Editor"))); \ + Ref<Texture2D> error_icon = get_theme_icon(SNAME("StatusError"), SNAME("EditorIcons")); \ + class_desc->add_text(" "); \ + class_desc->add_image(error_icon, error_icon->get_width(), error_icon->get_height()); \ + class_desc->add_text(" (" + TTR("Deprecated") + ")"); \ + class_desc->pop(); + +#define EXPERIMENTAL_DOC_TAG \ + class_desc->push_color(get_theme_color(SNAME("warning_color"), SNAME("Editor"))); \ + Ref<Texture2D> warning_icon = get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons")); \ + class_desc->add_text(" "); \ + class_desc->add_image(warning_icon, warning_icon->get_width(), warning_icon->get_height()); \ + class_desc->add_text(" (" + TTR("Experimental") + ")"); \ + class_desc->pop(); + void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview) { method_line[p_method.name] = class_desc->get_paragraph_count() - 2; //gets overridden if description @@ -356,6 +373,14 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview class_desc->pop(); } + if (p_method.is_deprecated) { + DEPRECATED_DOC_TAG; + } + + if (p_method.is_experimental) { + EXPERIMENTAL_DOC_TAG; + } + if (p_overview) { class_desc->pop(); //cell } @@ -565,6 +590,17 @@ void EditorHelp::_update_doc() { class_desc->pop(); // color class_desc->pop(); // font size class_desc->pop(); // font + + if (cd.is_deprecated) { + class_desc->add_text(" "); + Ref<Texture2D> error_icon = get_theme_icon(SNAME("StatusError"), SNAME("EditorIcons")); + class_desc->add_image(error_icon, error_icon->get_width(), error_icon->get_height()); + } + if (cd.is_experimental) { + class_desc->add_text(" "); + Ref<Texture2D> warning_icon = get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons")); + class_desc->add_image(warning_icon, warning_icon->get_width(), warning_icon->get_height()); + } class_desc->add_newline(); const String non_breaking_space = String::chr(160); @@ -627,6 +663,26 @@ void EditorHelp::_update_doc() { } } + // Note if deprecated. + if (cd.is_deprecated) { + Ref<Texture2D> error_icon = get_theme_icon(SNAME("StatusError"), SNAME("EditorIcons")); + class_desc->push_color(get_theme_color(SNAME("error_color"), SNAME("Editor"))); + class_desc->add_image(error_icon, error_icon->get_width(), error_icon->get_height()); + class_desc->add_text(String(" ") + TTR("This class is marked as deprecated. It will be removed in future versions.")); + class_desc->pop(); + class_desc->add_newline(); + } + + // Note if experimental. + if (cd.is_experimental) { + Ref<Texture2D> warning_icon = get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons")); + class_desc->push_color(get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + class_desc->add_image(warning_icon, warning_icon->get_width(), warning_icon->get_height()); + class_desc->add_text(String(" ") + TTR("This class is marked as experimental. It is subject to likely change or possible removal in future versions. Use at your own discretion.")); + class_desc->pop(); + class_desc->add_newline(); + } + class_desc->add_newline(); class_desc->add_newline(); @@ -817,6 +873,13 @@ void EditorHelp::_update_doc() { class_desc->pop(); } + if (cd.properties[i].is_deprecated) { + DEPRECATED_DOC_TAG; + } + if (cd.properties[i].is_experimental) { + EXPERIMENTAL_DOC_TAG; + } + class_desc->pop(); class_desc->pop(); // cell @@ -1066,6 +1129,14 @@ void EditorHelp::_update_doc() { class_desc->push_color(symbol_color); class_desc->add_text(")"); + + if (cd.signals[i].is_deprecated) { + DEPRECATED_DOC_TAG; + } + if (cd.signals[i].is_experimental) { + EXPERIMENTAL_DOC_TAG; + } + class_desc->pop(); class_desc->pop(); // end monofont if (!cd.signals[i].description.strip_edges().is_empty()) { @@ -1187,6 +1258,14 @@ void EditorHelp::_update_doc() { class_desc->pop(); class_desc->pop(); + if (enum_list[i].is_deprecated) { + DEPRECATED_DOC_TAG; + } + + if (enum_list[i].is_experimental) { + EXPERIMENTAL_DOC_TAG; + } + class_desc->add_newline(); if (!enum_list[i].description.strip_edges().is_empty()) { @@ -1258,6 +1337,14 @@ void EditorHelp::_update_doc() { class_desc->pop(); + if (constants[i].is_deprecated) { + DEPRECATED_DOC_TAG; + } + + if (constants[i].is_experimental) { + EXPERIMENTAL_DOC_TAG; + } + class_desc->add_newline(); if (!constants[i].description.strip_edges().is_empty()) { @@ -1438,6 +1525,13 @@ void EditorHelp::_update_doc() { class_desc->pop(); // color } + if (cd.properties[i].is_deprecated) { + DEPRECATED_DOC_TAG; + } + if (cd.properties[i].is_experimental) { + EXPERIMENTAL_DOC_TAG; + } + if (cd.is_script_doc && (!cd.properties[i].setter.is_empty() || !cd.properties[i].getter.is_empty())) { class_desc->push_color(symbol_color); class_desc->add_text(" [" + TTR("property:") + " "); diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp index af0cff9ad6..1b8146a0f0 100644 --- a/editor/editor_help_search.cpp +++ b/editor/editor_help_search.cpp @@ -324,10 +324,16 @@ bool EditorHelpSearch::Runner::_phase_match_classes_init() { } bool EditorHelpSearch::Runner::_phase_match_classes() { + if (!iterator_doc) { + return true; + } + DocData::ClassDoc &class_doc = iterator_doc->value; if (class_doc.name.is_empty()) { + ++iterator_doc; return false; } + if (!_is_class_disabled_by_feature_profile(class_doc.name)) { ClassMatch match; match.doc = &class_doc; @@ -432,7 +438,7 @@ bool EditorHelpSearch::Runner::_phase_class_items_init() { bool EditorHelpSearch::Runner::_phase_class_items() { if (!iterator_match) { - return false; + return true; } ClassMatch &match = iterator_match->value; @@ -459,10 +465,8 @@ bool EditorHelpSearch::Runner::_phase_member_items_init() { bool EditorHelpSearch::Runner::_phase_member_items() { ClassMatch &match = iterator_match->value; - if (!match.doc) { - return false; - } - if (match.doc->name.is_empty()) { + if (!match.doc || match.doc->name.is_empty()) { + ++iterator_match; return false; } @@ -599,6 +603,14 @@ TreeItem *EditorHelpSearch::Runner::_create_class_item(TreeItem *p_parent, const item->set_custom_color(1, disabled_color); } + if (p_doc->is_deprecated) { + Ref<Texture2D> error_icon = ui_service->get_theme_icon("StatusError", SNAME("EditorIcons")); + item->add_button(0, error_icon, 0, false, TTR("This class is marked as deprecated.")); + } else if (p_doc->is_experimental) { + Ref<Texture2D> warning_icon = ui_service->get_theme_icon("NodeWarning", SNAME("EditorIcons")); + item->add_button(0, warning_icon, 0, false, TTR("This class is marked as experimental.")); + } + _match_item(item, p_doc->name); return item; @@ -606,37 +618,37 @@ TreeItem *EditorHelpSearch::Runner::_create_class_item(TreeItem *p_parent, const TreeItem *EditorHelpSearch::Runner::_create_method_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const String &p_text, const DocData::MethodDoc *p_doc) { String tooltip = _build_method_tooltip(p_class_doc, p_doc); - return _create_member_item(p_parent, p_class_doc->name, "MemberMethod", p_doc->name, p_text, TTRC("Method"), "method", tooltip); + return _create_member_item(p_parent, p_class_doc->name, "MemberMethod", p_doc->name, p_text, TTRC("Method"), "method", tooltip, p_doc->is_deprecated, p_doc->is_experimental); } TreeItem *EditorHelpSearch::Runner::_create_signal_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::MethodDoc *p_doc) { String tooltip = _build_method_tooltip(p_class_doc, p_doc); - return _create_member_item(p_parent, p_class_doc->name, "MemberSignal", p_doc->name, p_doc->name, TTRC("Signal"), "signal", tooltip); + return _create_member_item(p_parent, p_class_doc->name, "MemberSignal", p_doc->name, p_doc->name, TTRC("Signal"), "signal", tooltip, p_doc->is_deprecated, p_doc->is_experimental); } TreeItem *EditorHelpSearch::Runner::_create_annotation_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const String &p_text, const DocData::MethodDoc *p_doc) { String tooltip = _build_method_tooltip(p_class_doc, p_doc); - return _create_member_item(p_parent, p_class_doc->name, "MemberAnnotation", p_doc->name, p_text, TTRC("Annotation"), "annotation", tooltip); + return _create_member_item(p_parent, p_class_doc->name, "MemberAnnotation", p_doc->name, p_text, TTRC("Annotation"), "annotation", tooltip, p_doc->is_deprecated, p_doc->is_experimental); } TreeItem *EditorHelpSearch::Runner::_create_constant_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::ConstantDoc *p_doc) { String tooltip = p_class_doc->name + "." + p_doc->name; - return _create_member_item(p_parent, p_class_doc->name, "MemberConstant", p_doc->name, p_doc->name, TTRC("Constant"), "constant", tooltip); + return _create_member_item(p_parent, p_class_doc->name, "MemberConstant", p_doc->name, p_doc->name, TTRC("Constant"), "constant", tooltip, p_doc->is_deprecated, p_doc->is_experimental); } TreeItem *EditorHelpSearch::Runner::_create_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::PropertyDoc *p_doc) { String tooltip = p_doc->type + " " + p_class_doc->name + "." + p_doc->name; tooltip += "\n " + p_class_doc->name + "." + p_doc->setter + "(value) setter"; tooltip += "\n " + p_class_doc->name + "." + p_doc->getter + "() getter"; - return _create_member_item(p_parent, p_class_doc->name, "MemberProperty", p_doc->name, p_doc->name, TTRC("Property"), "property", tooltip); + return _create_member_item(p_parent, p_class_doc->name, "MemberProperty", p_doc->name, p_doc->name, TTRC("Property"), "property", tooltip, p_doc->is_deprecated, p_doc->is_experimental); } TreeItem *EditorHelpSearch::Runner::_create_theme_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::ThemeItemDoc *p_doc) { String tooltip = p_doc->type + " " + p_class_doc->name + "." + p_doc->name; - return _create_member_item(p_parent, p_class_doc->name, "MemberTheme", p_doc->name, p_doc->name, TTRC("Theme Property"), "theme_item", tooltip); + return _create_member_item(p_parent, p_class_doc->name, "MemberTheme", p_doc->name, p_doc->name, TTRC("Theme Property"), "theme_item", tooltip, false, false); } -TreeItem *EditorHelpSearch::Runner::_create_member_item(TreeItem *p_parent, const String &p_class_name, const String &p_icon, const String &p_name, const String &p_text, const String &p_type, const String &p_metatype, const String &p_tooltip) { +TreeItem *EditorHelpSearch::Runner::_create_member_item(TreeItem *p_parent, const String &p_class_name, const String &p_icon, const String &p_name, const String &p_text, const String &p_type, const String &p_metatype, const String &p_tooltip, bool is_deprecated, bool is_experimental) { Ref<Texture2D> icon; String text; if (search_flags & SEARCH_SHOW_HIERARCHY) { @@ -655,6 +667,14 @@ TreeItem *EditorHelpSearch::Runner::_create_member_item(TreeItem *p_parent, cons item->set_tooltip_text(1, p_tooltip); item->set_metadata(0, "class_" + p_metatype + ":" + p_class_name + ":" + p_name); + if (is_deprecated) { + Ref<Texture2D> error_icon = ui_service->get_theme_icon("StatusError", SNAME("EditorIcons")); + item->add_button(0, error_icon, 0, false, TTR("This member is marked as deprecated.")); + } else if (is_experimental) { + Ref<Texture2D> warning_icon = ui_service->get_theme_icon("NodeWarning", SNAME("EditorIcons")); + item->add_button(0, warning_icon, 0, false, TTR("This member is marked as experimental.")); + } + _match_item(item, p_name); return item; diff --git a/editor/editor_help_search.h b/editor/editor_help_search.h index 26abaec6e6..efd8645cd7 100644 --- a/editor/editor_help_search.h +++ b/editor/editor_help_search.h @@ -155,7 +155,7 @@ class EditorHelpSearch::Runner : public RefCounted { TreeItem *_create_constant_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::ConstantDoc *p_doc); TreeItem *_create_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::PropertyDoc *p_doc); TreeItem *_create_theme_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::ThemeItemDoc *p_doc); - TreeItem *_create_member_item(TreeItem *p_parent, const String &p_class_name, const String &p_icon, const String &p_name, const String &p_text, const String &p_type, const String &p_metatype, const String &p_tooltip); + TreeItem *_create_member_item(TreeItem *p_parent, const String &p_class_name, const String &p_icon, const String &p_name, const String &p_text, const String &p_type, const String &p_metatype, const String &p_tooltip, bool is_deprecated, bool is_experimental); public: bool work(uint64_t slot = 100000); diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index b01d7bc8a7..e786461722 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -426,6 +426,9 @@ void EditorProperty::_set_read_only(bool p_read_only) { void EditorProperty::set_read_only(bool p_read_only) { read_only = p_read_only; + if (GDVIRTUAL_CALL(_set_read_only, p_read_only)) { + return; + } _set_read_only(p_read_only); } @@ -458,7 +461,7 @@ StringName EditorProperty::_get_revert_property() const { return property; } -void EditorProperty::update_revert_and_pin_status() { +void EditorProperty::update_editor_property_status() { if (property == StringName()) { return; //no property, so nothing to do } @@ -469,15 +472,26 @@ void EditorProperty::update_revert_and_pin_status() { CRASH_COND(!node); new_pinned = node->is_property_pinned(property); } + Variant current = object->get(_get_revert_property()); bool new_can_revert = EditorPropertyRevert::can_property_revert(object, property, ¤t) && !is_read_only(); - if (new_can_revert != can_revert || new_pinned != pinned) { + bool new_checked = checked; + if (checkable) { // for properties like theme overrides. + bool valid = false; + Variant value = object->get(property, &valid); + if (valid) { + new_checked = value.get_type() != Variant::NIL; + } + } + + if (new_can_revert != can_revert || new_pinned != pinned || new_checked != checked) { if (new_can_revert != can_revert) { emit_signal(SNAME("property_can_revert_changed"), property, new_can_revert); } can_revert = new_can_revert; pinned = new_pinned; + checked = new_checked; queue_redraw(); } } @@ -974,7 +988,9 @@ void EditorProperty::_bind_methods() { ADD_SIGNAL(MethodInfo("selected", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::INT, "focusable_idx"))); GDVIRTUAL_BIND(_update_property) - ClassDB::bind_method(D_METHOD("_update_revert_and_pin_status"), &EditorProperty::update_revert_and_pin_status); + GDVIRTUAL_BIND(_set_read_only, "read_only") + + ClassDB::bind_method(D_METHOD("_update_editor_property_status"), &EditorProperty::update_editor_property_status); } EditorProperty::EditorProperty() { @@ -1602,7 +1618,7 @@ void EditorInspectorArray::_rmb_popup_id_pressed(int p_id) { case OPTION_RESIZE_ARRAY: new_size_spin_box->set_value(count); resize_dialog->get_ok_button()->set_disabled(true); - resize_dialog->popup_centered(Size2i(250, 0) * EDSCALE); + resize_dialog->popup_centered(Size2(250, 0) * EDSCALE); new_size_spin_box->get_line_edit()->grab_focus(); new_size_spin_box->get_line_edit()->select_all(); break; @@ -1651,6 +1667,10 @@ void EditorInspectorArray::_panel_draw(int p_index) { void EditorInspectorArray::_panel_gui_input(Ref<InputEvent> p_event, int p_index) { ERR_FAIL_INDEX(p_index, (int)array_elements.size()); + if (read_only) { + return; + } + Ref<InputEventKey> key_ref = p_event; if (key_ref.is_valid()) { const InputEventKey &key = **key_ref; @@ -2151,7 +2171,7 @@ void EditorInspectorArray::drop_data_fw(const Point2 &p_point, const Variant &p_ } bool EditorInspectorArray::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { - if (!movable) { + if (!movable || read_only) { return false; } // First, update drawing. @@ -2271,7 +2291,9 @@ VBoxContainer *EditorInspectorArray::get_vbox(int p_index) { } } -EditorInspectorArray::EditorInspectorArray() { +EditorInspectorArray::EditorInspectorArray(bool p_read_only) { + read_only = p_read_only; + set_mouse_filter(Control::MOUSE_FILTER_STOP); odd_style.instantiate(); @@ -2297,6 +2319,7 @@ EditorInspectorArray::EditorInspectorArray() { add_button = EditorInspector::create_inspector_action_button(TTR("Add Element")); add_button->connect("pressed", callable_mp(this, &EditorInspectorArray::_add_button_pressed)); + add_button->set_disabled(read_only); vbox->add_child(add_button); control_dropping = memnew(Control); @@ -2317,6 +2340,7 @@ EditorInspectorArray::EditorInspectorArray() { new_size_spin_box->set_max(16384); new_size_spin_box->connect("value_changed", callable_mp(this, &EditorInspectorArray::_new_size_spin_box_value_changed)); new_size_spin_box->get_line_edit()->connect("text_submitted", callable_mp(this, &EditorInspectorArray::_new_size_spin_box_text_submitted)); + new_size_spin_box->set_editable(!read_only); resize_dialog_vbox->add_margin_child(TTRC("New Size:"), new_size_spin_box); vbox->connect("visibility_changed", callable_mp(this, &EditorInspectorArray::_vbox_visibility_changed)); @@ -2544,7 +2568,7 @@ void EditorInspector::_parse_added_editors(VBoxContainer *current_vbox, EditorIn ep->set_read_only(read_only); ep->update_property(); ep->_update_pin_flags(); - ep->update_revert_and_pin_status(); + ep->update_editor_property_status(); ep->set_deletable(deletable_properties); ep->update_cache(); } @@ -3030,7 +3054,7 @@ void EditorInspector::update_tree() { bool movable = true; bool numbered = false; bool foldable = use_folding; - String add_button_text; + String add_button_text = TTR("Add Element"); String swap_method; for (int i = (p.type == Variant::NIL ? 1 : 2); i < class_name_components.size(); i++) { if (class_name_components[i].begins_with("page_size") && class_name_components[i].get_slice_count("=") == 2) { @@ -3051,7 +3075,7 @@ void EditorInspector::update_tree() { if (p.type == Variant::NIL) { // Setup the array to use a method to create/move/delete elements. array_element_prefix = class_name_components[0]; - editor_inspector_array = memnew(EditorInspectorArray); + editor_inspector_array = memnew(EditorInspectorArray(all_read_only)); String array_label = path.contains("/") ? path.substr(path.rfind("/") + 1) : path; array_label = EditorPropertyNameProcessor::get_singleton()->process_name(property_label_string, property_name_style); @@ -3063,7 +3087,7 @@ void EditorInspector::update_tree() { // Setup the array to use the count property and built-in functions to create/move/delete elements. if (class_name_components.size() >= 2) { array_element_prefix = class_name_components[1]; - editor_inspector_array = memnew(EditorInspectorArray); + editor_inspector_array = memnew(EditorInspectorArray(all_read_only)); int page = per_array_page.has(array_element_prefix) ? per_array_page[array_element_prefix] : 0; editor_inspector_array->setup_with_count_property(object, class_name_components[0], p.name, array_element_prefix, page, c, foldable, movable, numbered, page_size, add_button_text, swap_method); @@ -3203,6 +3227,7 @@ void EditorInspector::update_tree() { // Use the existing one. ep->set_label(property_label_string); } + for (int j = 0; j < properties.size(); j++) { String prop = properties[j]; @@ -3250,7 +3275,7 @@ void EditorInspector::update_tree() { ep->set_doc_path(doc_info.path); ep->update_property(); ep->_update_pin_flags(); - ep->update_revert_and_pin_status(); + ep->update_editor_property_status(); ep->update_cache(); if (current_selected && ep->property == current_selected) { @@ -3289,7 +3314,7 @@ void EditorInspector::update_property(const String &p_prop) { for (EditorProperty *E : editor_property_map[p_prop]) { E->update_property(); - E->update_revert_and_pin_status(); + E->update_editor_property_status(); E->update_cache(); } } @@ -3632,7 +3657,7 @@ void EditorInspector::_edit_set(const String &p_name, const Variant &p_value, bo if (editor_property_map.has(p_name)) { for (EditorProperty *E : editor_property_map[p_name]) { - E->update_revert_and_pin_status(); + E->update_editor_property_status(); } } } @@ -3746,7 +3771,7 @@ void EditorInspector::_property_checked(const String &p_path, bool p_checked) { for (EditorProperty *E : editor_property_map[p_path]) { E->set_checked(p_checked); E->update_property(); - E->update_revert_and_pin_status(); + E->update_editor_property_status(); E->update_cache(); } } @@ -3770,8 +3795,8 @@ void EditorInspector::_property_pinned(const String &p_path, bool p_pinned) { undo_redo->add_undo_method(node, "_set_property_pinned", p_path, !p_pinned); if (editor_property_map.has(p_path)) { for (List<EditorProperty *>::Element *E = editor_property_map[p_path].front(); E; E = E->next()) { - undo_redo->add_do_method(E->get(), "_update_revert_and_pin_status"); - undo_redo->add_undo_method(E->get(), "_update_revert_and_pin_status"); + undo_redo->add_do_method(E->get(), "_update_editor_property_status"); + undo_redo->add_undo_method(E->get(), "_update_editor_property_status"); } } undo_redo->commit_action(); @@ -3779,7 +3804,7 @@ void EditorInspector::_property_pinned(const String &p_path, bool p_pinned) { node->set_property_pinned(p_path, p_pinned); if (editor_property_map.has(p_path)) { for (List<EditorProperty *>::Element *E = editor_property_map[p_path].front(); E; E = E->next()) { - E->get()->update_revert_and_pin_status(); + E->get()->update_editor_property_status(); } } } @@ -3860,7 +3885,7 @@ void EditorInspector::_notification(int p_what) { for (EditorProperty *E : F.value) { if (E && !E->is_cache_valid()) { E->update_property(); - E->update_revert_and_pin_status(); + E->update_editor_property_status(); E->update_cache(); } } @@ -3882,7 +3907,7 @@ void EditorInspector::_notification(int p_what) { if (editor_property_map.has(prop)) { for (EditorProperty *E : editor_property_map[prop]) { E->update_property(); - E->update_revert_and_pin_status(); + E->update_editor_property_status(); E->update_cache(); } } @@ -3975,13 +4000,7 @@ void EditorInspector::_check_meta_name(const String &p_name) { } else if (!p_name.is_valid_identifier()) { error = TTR("Metadata name must be a valid identifier."); } else if (object->has_meta(p_name)) { - Node *node = Object::cast_to<Node>(object); - if (node) { - error = vformat(TTR("Metadata with name \"%s\" already exists on \"%s\"."), p_name, node->get_name()); - } else { - // This should normally never be reached, but the error is set just in case. - error = vformat(TTR("Metadata with name \"%s\" already exists."), p_name, node->get_name()); - } + error = vformat(TTR("Metadata with name \"%s\" already exists."), p_name); } else if (p_name[0] == '_') { error = TTR("Names starting with _ are reserved for editor-only metadata."); } @@ -4001,14 +4020,6 @@ void EditorInspector::_show_add_meta_dialog() { if (!add_meta_dialog) { add_meta_dialog = memnew(ConfirmationDialog); - Node *node = Object::cast_to<Node>(object); - if (node) { - add_meta_dialog->set_title(vformat(TTR("Add Metadata Property for \"%s\""), node->get_name())); - } else { - // This should normally never be reached, but the title is set just in case. - add_meta_dialog->set_title(vformat(TTR("Add Metadata Property"), node->get_name())); - } - VBoxContainer *vbc = memnew(VBoxContainer); add_meta_dialog->add_child(vbc); HBoxContainer *hbc = memnew(HBoxContainer); @@ -4038,6 +4049,14 @@ void EditorInspector::_show_add_meta_dialog() { add_meta_name->connect("text_changed", callable_mp(this, &EditorInspector::_check_meta_name)); } + Node *node = Object::cast_to<Node>(object); + if (node) { + add_meta_dialog->set_title(vformat(TTR("Add Metadata Property for \"%s\""), node->get_name())); + } else { + // This should normally be reached when the object is derived from Resource. + add_meta_dialog->set_title(vformat(TTR("Add Metadata Property for \"%s\""), object->get_class())); + } + add_meta_dialog->popup_centered(); add_meta_name->set_text(""); _check_meta_name(""); @@ -4046,6 +4065,7 @@ void EditorInspector::_show_add_meta_dialog() { void EditorInspector::_bind_methods() { ClassDB::bind_method("_edit_request_change", &EditorInspector::_edit_request_change); + ClassDB::bind_method("get_selected_path", &EditorInspector::get_selected_path); ADD_SIGNAL(MethodInfo("property_selected", PropertyInfo(Variant::STRING, "property"))); ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT), PropertyInfo(Variant::BOOL, "advance"))); @@ -4082,7 +4102,7 @@ EditorInspector::EditorInspector() { refresh_countdown = 0.33; } - ED_SHORTCUT("property_editor/copy_property", TTR("Copy Property"), KeyModifierMask::CMD | Key::C); - ED_SHORTCUT("property_editor/paste_property", TTR("Paste Property"), KeyModifierMask::CMD | Key::V); - ED_SHORTCUT("property_editor/copy_property_path", TTR("Copy Property Path"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::C); + ED_SHORTCUT("property_editor/copy_property", TTR("Copy Property"), KeyModifierMask::CMD_OR_CTRL | Key::C); + ED_SHORTCUT("property_editor/paste_property", TTR("Paste Property"), KeyModifierMask::CMD_OR_CTRL | Key::V); + ED_SHORTCUT("property_editor/copy_property_path", TTR("Copy Property Path"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::C); } diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index d634eae23f..872007e637 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -120,6 +120,8 @@ private: HashMap<StringName, Variant> cache; GDVIRTUAL0(_update_property) + GDVIRTUAL1(_set_read_only, bool) + void _update_pin_flags(); protected: @@ -151,7 +153,7 @@ public: void set_doc_path(const String &p_doc_path); virtual void update_property(); - void update_revert_and_pin_status(); + void update_editor_property_status(); virtual bool use_keying_next() const; @@ -333,6 +335,7 @@ class EditorInspectorArray : public EditorInspectorSection { int begin_array_index = 0; int end_array_index = 0; + bool read_only = false; bool movable = true; bool numbered = false; @@ -404,7 +407,7 @@ public: void setup_with_count_property(Object *p_object, String p_label, const StringName &p_count_property, const StringName &p_array_element_prefix, int p_page, const Color &p_bg_color, bool p_foldable, bool p_movable = true, bool p_numbered = false, int p_page_length = 5, const String &p_add_item_text = "", const String &p_swap_method = ""); VBoxContainer *get_vbox(int p_index); - EditorInspectorArray(); + EditorInspectorArray(bool p_read_only); }; class EditorPaginator : public HBoxContainer { diff --git a/editor/editor_log.cpp b/editor/editor_log.cpp index a3d4296edb..6e6a898757 100644 --- a/editor/editor_log.cpp +++ b/editor/editor_log.cpp @@ -396,7 +396,7 @@ EditorLog::EditorLog() { clear_button = memnew(Button); clear_button->set_flat(true); clear_button->set_focus_mode(FOCUS_NONE); - clear_button->set_shortcut(ED_SHORTCUT("editor/clear_output", TTR("Clear Output"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::K)); + clear_button->set_shortcut(ED_SHORTCUT("editor/clear_output", TTR("Clear Output"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::K)); clear_button->set_shortcut_context(this); clear_button->connect("pressed", callable_mp(this, &EditorLog::_clear_request)); hb_tools->add_child(clear_button); @@ -405,7 +405,7 @@ EditorLog::EditorLog() { copy_button = memnew(Button); copy_button->set_flat(true); copy_button->set_focus_mode(FOCUS_NONE); - copy_button->set_shortcut(ED_SHORTCUT("editor/copy_output", TTR("Copy Selection"), KeyModifierMask::CMD | Key::C)); + copy_button->set_shortcut(ED_SHORTCUT("editor/copy_output", TTR("Copy Selection"), KeyModifierMask::CMD_OR_CTRL | Key::C)); copy_button->set_shortcut_context(this); copy_button->connect("pressed", callable_mp(this, &EditorLog::_copy_request)); hb_tools->add_child(copy_button); @@ -431,7 +431,7 @@ EditorLog::EditorLog() { show_search_button->set_focus_mode(FOCUS_NONE); show_search_button->set_toggle_mode(true); show_search_button->set_pressed(true); - show_search_button->set_shortcut(ED_SHORTCUT("editor/open_search", TTR("Focus Search/Filter Bar"), KeyModifierMask::CMD | Key::F)); + show_search_button->set_shortcut(ED_SHORTCUT("editor/open_search", TTR("Focus Search/Filter Bar"), KeyModifierMask::CMD_OR_CTRL | Key::F)); show_search_button->set_shortcut_context(this); show_search_button->connect("toggled", callable_mp(this, &EditorLog::_set_search_visible)); hb_tools2->add_child(show_search_button); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index a2231f4601..9ac6fd66ef 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -465,15 +465,15 @@ void EditorNode::shortcut_input(const Ref<InputEvent> &p_event) { } if (ED_IS_SHORTCUT("editor/editor_2d", p_event)) { - _editor_select(EDITOR_2D); + editor_select(EDITOR_2D); } else if (ED_IS_SHORTCUT("editor/editor_3d", p_event)) { - _editor_select(EDITOR_3D); + editor_select(EDITOR_3D); } else if (ED_IS_SHORTCUT("editor/editor_script", p_event)) { - _editor_select(EDITOR_SCRIPT); + editor_select(EDITOR_SCRIPT); } else if (ED_IS_SHORTCUT("editor/editor_help", p_event)) { emit_signal(SNAME("request_help_search"), ""); } else if (ED_IS_SHORTCUT("editor/editor_assetlib", p_event) && AssetLibraryEditorPlugin::is_available()) { - _editor_select(EDITOR_ASSETLIB); + editor_select(EDITOR_ASSETLIB); } else if (ED_IS_SHORTCUT("editor/editor_next", p_event)) { _editor_select_next(); } else if (ED_IS_SHORTCUT("editor/editor_prev", p_event)) { @@ -566,8 +566,6 @@ void EditorNode::_update_from_settings() { SceneTree *tree = get_tree(); tree->set_debug_collisions_color(GLOBAL_GET("debug/shapes/collision/shape_color")); tree->set_debug_collision_contact_color(GLOBAL_GET("debug/shapes/collision/contact_color")); - tree->set_debug_navigation_color(GLOBAL_GET("debug/shapes/navigation/geometry_color")); - tree->set_debug_navigation_disabled_color(GLOBAL_GET("debug/shapes/navigation/disabled_geometry_color")); #ifdef DEBUG_ENABLED NavigationServer3D::get_singleton_mut()->set_debug_navigation_edge_connection_color(GLOBAL_GET("debug/shapes/navigation/edge_connection_color")); @@ -586,7 +584,7 @@ void EditorNode::_update_from_settings() { void EditorNode::_select_default_main_screen_plugin() { if (EDITOR_3D < main_editor_buttons.size() && main_editor_buttons[EDITOR_3D]->is_visible()) { // If the 3D editor is enabled, use this as the default. - _editor_select(EDITOR_3D); + editor_select(EDITOR_3D); return; } @@ -595,12 +593,12 @@ void EditorNode::_select_default_main_screen_plugin() { for (int i = 0; i < main_editor_buttons.size(); i++) { Button *editor_button = main_editor_buttons[i]; if (editor_button->is_visible()) { - _editor_select(i); + editor_select(i); return; } } - _editor_select(-1); + editor_select(-1); } void EditorNode::_notification(int p_what) { @@ -1192,7 +1190,7 @@ void EditorNode::_editor_select_next() { } } while (!main_editor_buttons[editor]->is_visible()); - _editor_select(editor); + editor_select(editor); } void EditorNode::_open_command_palette() { @@ -1210,7 +1208,7 @@ void EditorNode::_editor_select_prev() { } } while (!main_editor_buttons[editor]->is_visible()); - _editor_select(editor); + editor_select(editor); } Error EditorNode::load_resource(const String &p_resource, bool p_ignore_broken_deps) { @@ -2323,10 +2321,7 @@ void EditorNode::_edit_current(bool p_skip_foreign) { } else { Node *selected_node = nullptr; - if (current_obj->is_class("EditorDebuggerRemoteObject")) { - editable_info = TTR("This is a remote object, so it's not editable.\nPlease read the documentation relevant to debugging to better understand this workflow."); - disable_folding = true; - } else if (current_obj->is_class("MultiNodeEdit")) { + if (current_obj->is_class("MultiNodeEdit")) { Node *scene = get_edited_scene(); if (scene) { MultiNodeEdit *multi_node_edit = Object::cast_to<MultiNodeEdit>(current_obj); @@ -2395,7 +2390,7 @@ void EditorNode::_edit_current(bool p_skip_foreign) { else if (main_plugin != editor_plugin_screen && (!ScriptEditor::get_singleton() || !ScriptEditor::get_singleton()->is_visible_in_tree() || ScriptEditor::get_singleton()->can_take_away_focus())) { // Update screen main_plugin. - _editor_select(plugin_index); + editor_select(plugin_index); main_plugin->edit(current_obj); } else { editor_plugin_screen->edit(current_obj); @@ -2455,7 +2450,7 @@ void EditorNode::_run(bool p_current, const String &p_custom) { write_movie_file = GLOBAL_GET("editor/movie_writer/movie_file"); } if (write_movie_file == String()) { - show_accept(TTR("Movie Maker mode is enabled, but no movie file path has been specified.\nA default movie file path can be specified in the project settings under the 'Editor/Movie Writer' category.\nAlternatively, for running single scenes, a 'movie_path' metadata can be added to the root node,\nspecifying the path to a movie file that will be used when recording that scene."), TTR("OK")); + show_accept(TTR("Movie Maker mode is enabled, but no movie file path has been specified.\nA default movie file path can be specified in the project settings under the Editor > Movie Writer category.\nAlternatively, for running single scenes, a `movie_file` string metadata can be added to the root node,\nspecifying the path to a movie file that will be used when recording that scene."), TTR("OK")); return; } } @@ -2657,22 +2652,36 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { case FILE_CLOSE_ALL_AND_RELOAD_CURRENT_PROJECT: { if (!p_confirmed) { tab_closing_idx = _next_unsaved_scene(false); - _scene_tab_changed(tab_closing_idx); + if (tab_closing_idx == -1) { + tab_closing_idx = -2; // Only external resources are unsaved. + } else { + _scene_tab_changed(tab_closing_idx); + } if (unsaved_cache || p_option == FILE_CLOSE_ALL_AND_QUIT || p_option == FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER || p_option == FILE_CLOSE_ALL_AND_RELOAD_CURRENT_PROJECT) { - Node *scene_root = editor_data.get_edited_scene_root(tab_closing_idx); - if (scene_root) { - String scene_filename = scene_root->get_scene_file_path(); + if (tab_closing_idx == -2) { if (p_option == FILE_CLOSE_ALL_AND_RELOAD_CURRENT_PROJECT) { save_confirmation->set_ok_button_text(TTR("Save & Reload")); - save_confirmation->set_text(vformat(TTR("Save changes to '%s' before reloading?"), !scene_filename.is_empty() ? scene_filename : "unsaved scene")); + save_confirmation->set_text(TTR("Save modified resources before reloading?")); } else { save_confirmation->set_ok_button_text(TTR("Save & Quit")); - save_confirmation->set_text(vformat(TTR("Save changes to '%s' before closing?"), !scene_filename.is_empty() ? scene_filename : "unsaved scene")); + save_confirmation->set_text(TTR("Save modified resources before closing?")); + } + } else { + Node *scene_root = editor_data.get_edited_scene_root(tab_closing_idx); + if (scene_root) { + String scene_filename = scene_root->get_scene_file_path(); + if (p_option == FILE_CLOSE_ALL_AND_RELOAD_CURRENT_PROJECT) { + save_confirmation->set_ok_button_text(TTR("Save & Reload")); + save_confirmation->set_text(vformat(TTR("Save changes to '%s' before reloading?"), !scene_filename.is_empty() ? scene_filename : "unsaved scene")); + } else { + save_confirmation->set_ok_button_text(TTR("Save & Quit")); + save_confirmation->set_text(vformat(TTR("Save changes to '%s' before closing?"), !scene_filename.is_empty() ? scene_filename : "unsaved scene")); + } } - save_confirmation->popup_centered(); - break; } + save_confirmation->popup_centered(); + break; } } if (!editor_data.get_edited_scene_root(tab_closing_idx)) { @@ -2754,18 +2763,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } } else if (extensions.size()) { String root_name = scene->get_name(); - // Very similar to node naming logic. - switch (ProjectSettings::get_singleton()->get("editor/scene/scene_naming").operator int()) { - case SCENE_NAME_CASING_AUTO: - // Use casing of the root node. - break; - case SCENE_NAME_CASING_PASCAL_CASE: { - root_name = root_name.to_pascal_case(); - } break; - case SCENE_NAME_CASING_SNAKE_CASE: - root_name = root_name.replace("-", "_").to_snake_case(); - break; - } + root_name = EditorNode::adjust_scene_name_casing(root_name); file->set_current_path(root_name + "." + extensions.front()->get().to_lower()); } file->popup_file_dialog(); @@ -2945,7 +2943,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { case RELOAD_CURRENT_PROJECT: { if (!p_confirmed) { bool save_each = EDITOR_GET("interface/editor/save_each_scene_on_quit"); - if (_next_unsaved_scene(!save_each) == -1) { + if (_next_unsaved_scene(!save_each) == -1 && !get_undo_redo()->is_history_unsaved(EditorUndoRedoManager::GLOBAL_HISTORY)) { _discard_changes(); break; } else { @@ -3071,8 +3069,8 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { case HELP_SUPPORT_GODOT_DEVELOPMENT: { OS::get_singleton()->shell_open("https://godotengine.org/donate"); } break; - case SET_RENDERING_DRIVER_SAVE_AND_RESTART: { - ProjectSettings::get_singleton()->set("rendering/driver/driver_name", rendering_driver_request); + case SET_RENDERER_NAME_SAVE_AND_RESTART: { + ProjectSettings::get_singleton()->set("rendering/renderer/rendering_method", renderer_request); ProjectSettings::get_singleton()->save(); save_all_scenes(); @@ -3081,6 +3079,19 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } } +String EditorNode::adjust_scene_name_casing(const String &root_name) { + switch (ProjectSettings::get_singleton()->get("editor/scene/scene_naming").operator int()) { + case SCENE_NAME_CASING_AUTO: + // Use casing of the root node. + break; + case SCENE_NAME_CASING_PASCAL_CASE: + return root_name.to_pascal_case(); + case SCENE_NAME_CASING_SNAKE_CASE: + return root_name.replace("-", "_").to_snake_case(); + } + return root_name; +} + void EditorNode::_request_screenshot() { _screenshot(); } @@ -3256,8 +3267,12 @@ void EditorNode::_discard_changes(const String &p_str) { for (const String &a : Main::get_forwardable_cli_arguments(Main::CLI_SCOPE_TOOL)) { args.push_back(a); } - args.push_back("--path"); - args.push_back(exec.get_base_dir()); + + String exec_base_dir = exec.get_base_dir(); + if (!exec_base_dir.is_empty()) { + args.push_back("--path"); + args.push_back(exec_base_dir); + } args.push_back("--project-manager"); Error err = OS::get_singleton()->create_instance(args); @@ -3290,7 +3305,7 @@ VBoxContainer *EditorNode::get_main_screen_control() { return main_screen_vbox; } -void EditorNode::_editor_select(int p_which) { +void EditorNode::editor_select(int p_which) { static bool selecting = false; if (selecting || changing_scene) { return; @@ -3344,7 +3359,7 @@ void EditorNode::select_editor_by_name(const String &p_name) { for (int i = 0; i < main_editor_buttons.size(); i++) { if (main_editor_buttons[i]->get_text() == p_name) { - _editor_select(i); + editor_select(i); return; } } @@ -3357,13 +3372,15 @@ void EditorNode::add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed Button *tb = memnew(Button); tb->set_flat(true); tb->set_toggle_mode(true); - tb->connect("pressed", callable_mp(singleton, &EditorNode::_editor_select).bind(singleton->main_editor_buttons.size())); + tb->connect("pressed", callable_mp(singleton, &EditorNode::editor_select).bind(singleton->main_editor_buttons.size())); tb->set_name(p_editor->get_name()); tb->set_text(p_editor->get_name()); Ref<Texture2D> icon = p_editor->get_icon(); if (icon.is_valid()) { tb->set_icon(icon); + // Make sure the control is updated if the icon is reimported. + icon->connect("changed", callable_mp((Control *)tb, &Control::update_minimum_size)); } else if (singleton->gui_base->has_theme_icon(p_editor->get_name(), SNAME("EditorIcons"))) { tb->set_icon(singleton->gui_base->get_theme_icon(p_editor->get_name(), SNAME("EditorIcons"))); } @@ -3375,7 +3392,7 @@ void EditorNode::add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed singleton->main_editor_button_vb->add_child(tb); singleton->editor_table.push_back(p_editor); - singleton->distraction_free->raise(); + singleton->distraction_free->move_to_front(); } singleton->editor_data.add_editor_plugin(p_editor); singleton->add_child(p_editor); @@ -3389,7 +3406,7 @@ void EditorNode::remove_editor_plugin(EditorPlugin *p_editor, bool p_config_chan for (int i = 0; i < singleton->main_editor_buttons.size(); i++) { if (p_editor->get_name() == singleton->main_editor_buttons[i]->get_text()) { if (singleton->main_editor_buttons[i]->is_pressed()) { - singleton->_editor_select(EDITOR_SCRIPT); + singleton->editor_select(EDITOR_SCRIPT); } memdelete(singleton->main_editor_buttons[i]); @@ -3613,7 +3630,7 @@ void EditorNode::_set_main_scene_state(Dictionary p_state, Node *p_for_scene) { int index = p_state["editor_index"]; if (current < 2) { // If currently in spatial/2d, only switch to spatial/2d. If currently in script, stay there. if (index < 2 || !get_edited_scene()) { - _editor_select(index); + editor_select(index); } } } @@ -3624,9 +3641,9 @@ void EditorNode::_set_main_scene_state(Dictionary p_state, Node *p_for_scene) { int n2d = 0, n3d = 0; _find_node_types(get_edited_scene(), n2d, n3d); if (n2d > n3d) { - _editor_select(EDITOR_2D); + editor_select(EDITOR_2D); } else if (n3d > n2d) { - _editor_select(EDITOR_3D); + editor_select(EDITOR_3D); } } } @@ -3653,10 +3670,6 @@ bool EditorNode::is_changing_scene() const { return changing_scene; } -void EditorNode::_clear_undo_history() { - get_undo_redo()->clear_history(false); -} - void EditorNode::set_current_scene(int p_idx) { // Save the folding in case the scene gets reloaded. if (editor_data.get_scene_path(p_idx) != "" && editor_data.get_edited_scene_root(p_idx)) { @@ -3917,7 +3930,7 @@ void EditorNode::edit_foreign_resource(Ref<Resource> p_resource) { InspectorDock::get_singleton()->call_deferred("edit_resource", p_resource); } -bool EditorNode::is_resource_read_only(Ref<Resource> p_resource) { +bool EditorNode::is_resource_read_only(Ref<Resource> p_resource, bool p_foreign_resources_are_writable) { ERR_FAIL_COND_V(p_resource.is_null(), false); String path = p_resource->get_path(); @@ -3929,7 +3942,11 @@ bool EditorNode::is_resource_read_only(Ref<Resource> p_resource) { // If the base resource is a packed scene, we treat it as read-only if it is not the currently edited scene. if (ResourceLoader::get_resource_type(base) == "PackedScene") { if (!get_tree()->get_edited_scene_root() || get_tree()->get_edited_scene_root()->get_scene_file_path() != base) { - return true; + // If we have not flagged foreign resources as writable or the base scene the resource is + // part was imported, it can be considered read-only. + if (!p_foreign_resources_are_writable || FileAccess::exists(base + ".import")) { + return true; + } } } else { // If a corresponding .import file exists for the base file, we assume it to be imported and should therefore treated as read-only. @@ -4957,7 +4974,7 @@ void EditorNode::_load_docks_from_config(Ref<ConfigFile> p_layout, const String } if (atidx == i) { - node->raise(); + node->move_to_front(); continue; } @@ -5382,7 +5399,7 @@ Button *EditorNode::add_bottom_panel_item(String p_text, Control *p_item) { tb->set_toggle_mode(true); tb->set_focus_mode(Control::FOCUS_NONE); bottom_panel_vb->add_child(p_item); - bottom_panel_hb->raise(); + bottom_panel_hb->move_to_front(); bottom_panel_hb_editors->add_child(tb); p_item->set_v_size_flags(Control::SIZE_EXPAND_FILL); p_item->hide(); @@ -5416,7 +5433,7 @@ void EditorNode::make_bottom_panel_item_visible(Control *p_item) { void EditorNode::raise_bottom_panel_item(Control *p_item) { for (int i = 0; i < bottom_panel_items.size(); i++) { if (bottom_panel_items[i].control == p_item) { - bottom_panel_items[i].button->raise(); + bottom_panel_items[i].button->move_to_front(); SWAP(bottom_panel_items.write[i], bottom_panel_items.write[bottom_panel_items.size() - 1]); break; } @@ -5863,27 +5880,27 @@ void EditorNode::_bottom_panel_raise_toggled(bool p_pressed) { top_split->set_visible(!p_pressed); } -void EditorNode::_update_rendering_driver_color() { - if (rendering_driver->get_text() == "opengl3") { - rendering_driver->add_theme_color_override("font_color", Color::hex(0x5586a4ff)); - } else if (rendering_driver->get_text() == "vulkan") { - rendering_driver->add_theme_color_override("font_color", theme_base->get_theme_color(SNAME("vulkan_color"), SNAME("Editor"))); +void EditorNode::_update_renderer_color() { + if (renderer->get_text() == "gl_compatibility") { + renderer->add_theme_color_override("font_color", Color::hex(0x5586a4ff)); + } else if (renderer->get_text() == "forward_plus" || renderer->get_text() == "mobile") { + renderer->add_theme_color_override("font_color", theme_base->get_theme_color(SNAME("vulkan_color"), SNAME("Editor"))); } } -void EditorNode::_rendering_driver_selected(int p_which) { - String driver = rendering_driver->get_item_metadata(p_which); +void EditorNode::_renderer_selected(int p_which) { + String rendering_method = renderer->get_item_metadata(p_which); - String current_driver = OS::get_singleton()->get_current_rendering_driver_name(); + String current_renderer = GLOBAL_GET("rendering/renderer/rendering_method"); - if (driver == current_driver) { + if (rendering_method == current_renderer) { return; } - rendering_driver_request = driver; + renderer_request = rendering_method; video_restart_dialog->popup_centered(); - rendering_driver->select(rendering_driver_current); - _update_rendering_driver_color(); + renderer->select(renderer_current); + _update_renderer_color(); } void EditorNode::_resource_saved(Ref<Resource> p_resource, const String &p_path) { @@ -5918,7 +5935,7 @@ void EditorNode::_feature_profile_changed() { if ((profile->is_feature_disabled(EditorFeatureProfile::FEATURE_3D) && singleton->main_editor_buttons[EDITOR_3D]->is_pressed()) || (profile->is_feature_disabled(EditorFeatureProfile::FEATURE_SCRIPT) && singleton->main_editor_buttons[EDITOR_SCRIPT]->is_pressed()) || (AssetLibraryEditorPlugin::is_available() && profile->is_feature_disabled(EditorFeatureProfile::FEATURE_ASSET_LIB) && singleton->main_editor_buttons[EDITOR_ASSETLIB]->is_pressed())) { - _editor_select(EDITOR_2D); + editor_select(EDITOR_2D); } } else { import_tabs->set_tab_hidden(import_tabs->get_tab_idx_from_control(ImportDock::get_singleton()), false); @@ -5941,19 +5958,14 @@ void EditorNode::_bind_methods() { GLOBAL_DEF("editor/scene/scene_naming", SCENE_NAME_CASING_SNAKE_CASE); ProjectSettings::get_singleton()->set_custom_property_info("editor/scene/scene_naming", PropertyInfo(Variant::INT, "editor/scene/scene_naming", PROPERTY_HINT_ENUM, "Auto,PascalCase,snake_case")); ClassDB::bind_method("edit_current", &EditorNode::edit_current); - ClassDB::bind_method("_editor_select", &EditorNode::_editor_select); - ClassDB::bind_method("_node_renamed", &EditorNode::_node_renamed); ClassDB::bind_method("edit_node", &EditorNode::edit_node); ClassDB::bind_method(D_METHOD("push_item", "object", "property", "inspector_only"), &EditorNode::push_item, DEFVAL(""), DEFVAL(false)); - ClassDB::bind_method("_get_scene_metadata", &EditorNode::_get_scene_metadata); ClassDB::bind_method("set_edited_scene", &EditorNode::set_edited_scene); ClassDB::bind_method("open_request", &EditorNode::open_request); ClassDB::bind_method("edit_foreign_resource", &EditorNode::edit_foreign_resource); ClassDB::bind_method("is_resource_read_only", &EditorNode::is_resource_read_only); - ClassDB::bind_method("_close_messages", &EditorNode::_close_messages); - ClassDB::bind_method("_show_messages", &EditorNode::_show_messages); ClassDB::bind_method("stop_child_process", &EditorNode::stop_child_process); @@ -5962,19 +5974,10 @@ void EditorNode::_bind_methods() { ClassDB::bind_method("_set_main_scene_state", &EditorNode::_set_main_scene_state); ClassDB::bind_method("_update_recent_scenes", &EditorNode::_update_recent_scenes); - ClassDB::bind_method("_clear_undo_history", &EditorNode::_clear_undo_history); - ClassDB::bind_method("edit_item_resource", &EditorNode::edit_item_resource); ClassDB::bind_method(D_METHOD("get_gui_base"), &EditorNode::get_gui_base); - ClassDB::bind_method(D_METHOD("_on_plugin_ready"), &EditorNode::_on_plugin_ready); // Still used by some connect_compat. - - ClassDB::bind_method("_screenshot", &EditorNode::_screenshot); - ClassDB::bind_method("_save_screenshot", &EditorNode::_save_screenshot); - - ClassDB::bind_method("_version_button_pressed", &EditorNode::_version_button_pressed); - ADD_SIGNAL(MethodInfo("play_pressed")); ADD_SIGNAL(MethodInfo("pause_pressed")); ADD_SIGNAL(MethodInfo("stop_pressed")); @@ -6552,8 +6555,8 @@ EditorNode::EditorNode() { distraction_free = memnew(Button); distraction_free->set_flat(true); - ED_SHORTCUT_AND_COMMAND("editor/distraction_free_mode", TTR("Distraction Free Mode"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F11); - ED_SHORTCUT_OVERRIDE("editor/distraction_free_mode", "macos", KeyModifierMask::CMD | KeyModifierMask::CTRL | Key::D); + ED_SHORTCUT_AND_COMMAND("editor/distraction_free_mode", TTR("Distraction Free Mode"), KeyModifierMask::CTRL | KeyModifierMask::SHIFT | Key::F11); + ED_SHORTCUT_OVERRIDE("editor/distraction_free_mode", "macos", KeyModifierMask::META | KeyModifierMask::CTRL | Key::D); distraction_free->set_shortcut(ED_GET_SHORTCUT("editor/distraction_free_mode")); distraction_free->set_tooltip_text(TTR("Toggle distraction-free mode.")); distraction_free->connect("pressed", callable_mp(this, &EditorNode::_toggle_distraction_free_mode)); @@ -6665,30 +6668,30 @@ EditorNode::EditorNode() { gui_base->add_child(warning); warning->connect("custom_action", callable_mp(this, &EditorNode::_copy_warning)); - ED_SHORTCUT("editor/next_tab", TTR("Next Scene Tab"), KeyModifierMask::CMD + Key::TAB); - ED_SHORTCUT("editor/prev_tab", TTR("Previous Scene Tab"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::TAB); - ED_SHORTCUT("editor/filter_files", TTR("Focus FileSystem Filter"), KeyModifierMask::CMD + KeyModifierMask::ALT + Key::P); + ED_SHORTCUT("editor/next_tab", TTR("Next Scene Tab"), KeyModifierMask::CMD_OR_CTRL + Key::TAB); + ED_SHORTCUT("editor/prev_tab", TTR("Previous Scene Tab"), KeyModifierMask::CMD_OR_CTRL + KeyModifierMask::SHIFT + Key::TAB); + ED_SHORTCUT("editor/filter_files", TTR("Focus FileSystem Filter"), KeyModifierMask::CMD_OR_CTRL + KeyModifierMask::ALT + Key::P); command_palette = EditorCommandPalette::get_singleton(); command_palette->set_title(TTR("Command Palette")); gui_base->add_child(command_palette); - file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/new_scene", TTR("New Scene"), KeyModifierMask::CMD + Key::N), FILE_NEW_SCENE); - file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/new_inherited_scene", TTR("New Inherited Scene..."), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::N), FILE_NEW_INHERITED_SCENE); - file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/open_scene", TTR("Open Scene..."), KeyModifierMask::CMD + Key::O), FILE_OPEN_SCENE); - file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/reopen_closed_scene", TTR("Reopen Closed Scene"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::T), FILE_OPEN_PREV); + file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/new_scene", TTR("New Scene"), KeyModifierMask::CMD_OR_CTRL + Key::N), FILE_NEW_SCENE); + file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/new_inherited_scene", TTR("New Inherited Scene..."), KeyModifierMask::CMD_OR_CTRL + KeyModifierMask::SHIFT + Key::N), FILE_NEW_INHERITED_SCENE); + file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/open_scene", TTR("Open Scene..."), KeyModifierMask::CMD_OR_CTRL + Key::O), FILE_OPEN_SCENE); + file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/reopen_closed_scene", TTR("Reopen Closed Scene"), KeyModifierMask::CMD_OR_CTRL + KeyModifierMask::SHIFT + Key::T), FILE_OPEN_PREV); file_menu->add_submenu_item(TTR("Open Recent"), "RecentScenes", FILE_OPEN_RECENT); file_menu->add_separator(); - file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene", TTR("Save Scene"), KeyModifierMask::CMD + Key::S), FILE_SAVE_SCENE); - file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene_as", TTR("Save Scene As..."), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::S), FILE_SAVE_AS_SCENE); - file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_all_scenes", TTR("Save All Scenes"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + KeyModifierMask::ALT + Key::S), FILE_SAVE_ALL_SCENES); + file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene", TTR("Save Scene"), KeyModifierMask::CMD_OR_CTRL + Key::S), FILE_SAVE_SCENE); + file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene_as", TTR("Save Scene As..."), KeyModifierMask::CMD_OR_CTRL + KeyModifierMask::SHIFT + Key::S), FILE_SAVE_AS_SCENE); + file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_all_scenes", TTR("Save All Scenes"), KeyModifierMask::CMD_OR_CTRL + KeyModifierMask::SHIFT + KeyModifierMask::ALT + Key::S), FILE_SAVE_ALL_SCENES); file_menu->add_separator(); file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open", TTR("Quick Open..."), KeyModifierMask::SHIFT + KeyModifierMask::ALT + Key::O), FILE_QUICK_OPEN); - file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open_scene", TTR("Quick Open Scene..."), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::O), FILE_QUICK_OPEN_SCENE); - file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open_script", TTR("Quick Open Script..."), KeyModifierMask::CMD + KeyModifierMask::ALT + Key::O), FILE_QUICK_OPEN_SCRIPT); + file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open_scene", TTR("Quick Open Scene..."), KeyModifierMask::CMD_OR_CTRL + KeyModifierMask::SHIFT + Key::O), FILE_QUICK_OPEN_SCENE); + file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open_script", TTR("Quick Open Script..."), KeyModifierMask::CMD_OR_CTRL + KeyModifierMask::ALT + Key::O), FILE_QUICK_OPEN_SCRIPT); file_menu->add_separator(); export_as_menu = memnew(PopupMenu); @@ -6704,7 +6707,7 @@ EditorNode::EditorNode() { file_menu->add_separator(); file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/reload_saved_scene", TTR("Reload Saved Scene")), EDIT_RELOAD_SAVED_SCENE); - file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/close_scene", TTR("Close Scene"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::W), FILE_CLOSE); + file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/close_scene", TTR("Close Scene"), KeyModifierMask::CMD_OR_CTRL + KeyModifierMask::SHIFT + Key::W), FILE_CLOSE); recent_scenes = memnew(PopupMenu); recent_scenes->set_name("RecentScenes"); @@ -6714,7 +6717,7 @@ EditorNode::EditorNode() { if (!global_menu || !OS::get_singleton()->has_feature("macos")) { // On macOS "Quit" and "About" options are in the "app" menu. file_menu->add_separator(); - file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/file_quit", TTR("Quit"), KeyModifierMask::CMD + Key::Q), FILE_QUIT, true); + file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/file_quit", TTR("Quit"), KeyModifierMask::CMD_OR_CTRL + Key::Q), FILE_QUIT, true); } project_menu = memnew(PopupMenu); @@ -6735,8 +6738,10 @@ EditorNode::EditorNode() { project_menu->add_separator(); project_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/export", TTR("Export..."), Key::NONE, TTR("Export")), FILE_EXPORT_PROJECT); +#ifndef ANDROID_ENABLED project_menu->add_item(TTR("Install Android Build Template..."), FILE_INSTALL_ANDROID_SOURCE); project_menu->add_item(TTR("Open User Data Folder"), RUN_USER_DATA_FOLDER); +#endif project_menu->add_separator(); project_menu->add_item(TTR("Customize Engine Build Configuration..."), TOOLS_BUILD_PROFILE_MANAGER); @@ -6755,7 +6760,7 @@ EditorNode::EditorNode() { project_menu->add_separator(); project_menu->add_shortcut(ED_SHORTCUT("editor/reload_current_project", TTR("Reload Current Project")), RELOAD_CURRENT_PROJECT); - ED_SHORTCUT_AND_COMMAND("editor/quit_to_project_list", TTR("Quit to Project List"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::Q); + ED_SHORTCUT_AND_COMMAND("editor/quit_to_project_list", TTR("Quit to Project List"), KeyModifierMask::CTRL + KeyModifierMask::SHIFT + Key::Q); ED_SHORTCUT_OVERRIDE("editor/quit_to_project_list", "macos", KeyModifierMask::SHIFT + KeyModifierMask::ALT + Key::Q); project_menu->add_shortcut(ED_GET_SHORTCUT("editor/quit_to_project_list"), RUN_PROJECT_MANAGER, true); @@ -6781,9 +6786,9 @@ EditorNode::EditorNode() { main_menu->add_child(settings_menu); ED_SHORTCUT_AND_COMMAND("editor/editor_settings", TTR("Editor Settings...")); - ED_SHORTCUT_OVERRIDE("editor/editor_settings", "macos", KeyModifierMask::CMD + Key::COMMA); + ED_SHORTCUT_OVERRIDE("editor/editor_settings", "macos", KeyModifierMask::META + Key::COMMA); settings_menu->add_shortcut(ED_GET_SHORTCUT("editor/editor_settings"), SETTINGS_PREFERENCES); - settings_menu->add_shortcut(ED_SHORTCUT("editor/command_palette", TTR("Command Palette..."), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::P), HELP_COMMAND_PALETTE); + settings_menu->add_shortcut(ED_SHORTCUT("editor/command_palette", TTR("Command Palette..."), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::P), HELP_COMMAND_PALETTE); settings_menu->add_separator(); editor_layouts = memnew(PopupMenu); @@ -6794,17 +6799,19 @@ EditorNode::EditorNode() { settings_menu->add_separator(); ED_SHORTCUT_AND_COMMAND("editor/take_screenshot", TTR("Take Screenshot"), KeyModifierMask::CTRL | Key::F12); - ED_SHORTCUT_OVERRIDE("editor/take_screenshot", "macos", KeyModifierMask::CMD | Key::F12); + ED_SHORTCUT_OVERRIDE("editor/take_screenshot", "macos", KeyModifierMask::META | Key::F12); settings_menu->add_shortcut(ED_GET_SHORTCUT("editor/take_screenshot"), EDITOR_SCREENSHOT); settings_menu->set_item_tooltip(-1, TTR("Screenshots are stored in the Editor Data/Settings Folder.")); +#ifndef ANDROID_ENABLED ED_SHORTCUT_AND_COMMAND("editor/fullscreen_mode", TTR("Toggle Fullscreen"), KeyModifierMask::SHIFT | Key::F11); - ED_SHORTCUT_OVERRIDE("editor/fullscreen_mode", "macos", KeyModifierMask::CMD | KeyModifierMask::CTRL | Key::F); + ED_SHORTCUT_OVERRIDE("editor/fullscreen_mode", "macos", KeyModifierMask::META | KeyModifierMask::CTRL | Key::F); settings_menu->add_shortcut(ED_GET_SHORTCUT("editor/fullscreen_mode"), SETTINGS_TOGGLE_FULLSCREEN); - +#endif settings_menu->add_separator(); +#ifndef ANDROID_ENABLED if (OS::get_singleton()->get_data_path() == OS::get_singleton()->get_config_path()) { // Configuration and data folders are located in the same place (Windows/MacOS). settings_menu->add_item(TTR("Open Editor Data/Settings Folder"), SETTINGS_EDITOR_DATA_FOLDER); @@ -6814,9 +6821,12 @@ EditorNode::EditorNode() { settings_menu->add_item(TTR("Open Editor Settings Folder"), SETTINGS_EDITOR_CONFIG_FOLDER); } settings_menu->add_separator(); +#endif settings_menu->add_item(TTR("Manage Editor Features..."), SETTINGS_MANAGE_FEATURE_PROFILES); +#ifndef ANDROID_ENABLED settings_menu->add_item(TTR("Manage Export Templates..."), SETTINGS_MANAGE_EXPORT_TEMPLATES); +#endif help_menu = memnew(PopupMenu); help_menu->set_name(TTR("Help")); @@ -6861,7 +6871,7 @@ EditorNode::EditorNode() { play_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option).bind(RUN_PLAY)); ED_SHORTCUT_AND_COMMAND("editor/play", TTR("Play"), Key::F5); - ED_SHORTCUT_OVERRIDE("editor/play", "macos", KeyModifierMask::CMD | Key::B); + ED_SHORTCUT_OVERRIDE("editor/play", "macos", KeyModifierMask::META | Key::B); play_button->set_shortcut(ED_GET_SHORTCUT("editor/play")); pause_button = memnew(Button); @@ -6874,7 +6884,7 @@ EditorNode::EditorNode() { launch_pad_hb->add_child(pause_button); ED_SHORTCUT("editor/pause_scene", TTR("Pause Scene"), Key::F7); - ED_SHORTCUT_OVERRIDE("editor/pause_scene", "macos", KeyModifierMask::CMD | KeyModifierMask::CTRL | Key::Y); + ED_SHORTCUT_OVERRIDE("editor/pause_scene", "macos", KeyModifierMask::META | KeyModifierMask::CTRL | Key::Y); pause_button->set_shortcut(ED_GET_SHORTCUT("editor/pause_scene")); stop_button = memnew(Button); @@ -6887,7 +6897,7 @@ EditorNode::EditorNode() { stop_button->set_disabled(true); ED_SHORTCUT("editor/stop", TTR("Stop"), Key::F8); - ED_SHORTCUT_OVERRIDE("editor/stop", "macos", KeyModifierMask::CMD | Key::PERIOD); + ED_SHORTCUT_OVERRIDE("editor/stop", "macos", KeyModifierMask::META | Key::PERIOD); stop_button->set_shortcut(ED_GET_SHORTCUT("editor/stop")); run_native = memnew(EditorRunNative); @@ -6902,7 +6912,7 @@ EditorNode::EditorNode() { play_scene_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option).bind(RUN_PLAY_SCENE)); ED_SHORTCUT_AND_COMMAND("editor/play_scene", TTR("Play Scene"), Key::F6); - ED_SHORTCUT_OVERRIDE("editor/play_scene", "macos", KeyModifierMask::CMD | Key::R); + ED_SHORTCUT_OVERRIDE("editor/play_scene", "macos", KeyModifierMask::META | Key::R); play_scene_button->set_shortcut(ED_GET_SHORTCUT("editor/play_scene")); play_custom_scene_button = memnew(Button); @@ -6914,8 +6924,8 @@ EditorNode::EditorNode() { _reset_play_buttons(); - ED_SHORTCUT_AND_COMMAND("editor/play_custom_scene", TTR("Play Custom Scene"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F5); - ED_SHORTCUT_OVERRIDE("editor/play_custom_scene", "macos", KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::R); + ED_SHORTCUT_AND_COMMAND("editor/play_custom_scene", TTR("Play Custom Scene"), KeyModifierMask::CTRL | KeyModifierMask::SHIFT | Key::F5); + ED_SHORTCUT_OVERRIDE("editor/play_custom_scene", "macos", KeyModifierMask::META | KeyModifierMask::SHIFT | Key::R); play_custom_scene_button->set_shortcut(ED_GET_SHORTCUT("editor/play_custom_scene")); write_movie_panel = memnew(PanelContainer); @@ -6940,19 +6950,17 @@ EditorNode::EditorNode() { HBoxContainer *right_menu_hb = memnew(HBoxContainer); menu_hb->add_child(right_menu_hb); - rendering_driver = memnew(OptionButton); - + renderer = memnew(OptionButton); // Hide the renderer selection dropdown until OpenGL support is more mature. // The renderer can still be changed in the project settings or using `--rendering-driver opengl3`. - rendering_driver->set_visible(false); + renderer->set_visible(false); + renderer->set_flat(true); + renderer->set_focus_mode(Control::FOCUS_NONE); + renderer->connect("item_selected", callable_mp(this, &EditorNode::_renderer_selected)); + renderer->add_theme_font_override("font", gui_base->get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); + renderer->add_theme_font_size_override("font_size", gui_base->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts"))); - rendering_driver->set_flat(true); - rendering_driver->set_focus_mode(Control::FOCUS_NONE); - rendering_driver->connect("item_selected", callable_mp(this, &EditorNode::_rendering_driver_selected)); - rendering_driver->add_theme_font_override("font", gui_base->get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); - rendering_driver->add_theme_font_size_override("font_size", gui_base->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts"))); - - right_menu_hb->add_child(rendering_driver); + right_menu_hb->add_child(renderer); if (can_expand) { // Add spacer to avoid other controls under the window minimize/maximize/close buttons (right side). @@ -6962,36 +6970,35 @@ EditorNode::EditorNode() { menu_hb->add_child(menu_spacer); } - // Only display the render drivers that are available for this display driver. - int display_driver_idx = OS::get_singleton()->get_display_driver_id(); - Vector<String> render_drivers = DisplayServer::get_create_function_rendering_drivers(display_driver_idx); - String current_rendering_driver = OS::get_singleton()->get_current_rendering_driver_name(); + String current_renderer = GLOBAL_GET("rendering/renderer/rendering_method"); + + PackedStringArray renderers = ProjectSettings::get_singleton()->get_custom_property_info().get(StringName("rendering/renderer/rendering_method")).hint_string.split(",", false); // As we are doing string comparisons, keep in standard case to prevent problems with capitals // "vulkan" in particular uses lowercase "v" in the code, and uppercase in the UI. - current_rendering_driver = current_rendering_driver.to_lower(); + current_renderer = current_renderer.to_lower(); - for (int i = 0; i < render_drivers.size(); i++) { - String driver = render_drivers[i]; + for (int i = 0; i < renderers.size(); i++) { + String rendering_method = renderers[i]; - // Add the driver to the UI. - rendering_driver->add_item(driver); - rendering_driver->set_item_metadata(i, driver); + // Add the renderers name to the UI. + renderer->add_item(rendering_method); + renderer->set_item_metadata(i, rendering_method); // Lowercase for standard comparison. - driver = driver.to_lower(); + rendering_method = rendering_method.to_lower(); - if (current_rendering_driver == driver) { - rendering_driver->select(i); - rendering_driver_current = i; + if (current_renderer == rendering_method) { + renderer->select(i); + renderer_current = i; } } - _update_rendering_driver_color(); + _update_renderer_color(); video_restart_dialog = memnew(ConfirmationDialog); - video_restart_dialog->set_text(TTR("Changing the video driver requires restarting the editor.")); + video_restart_dialog->set_text(TTR("Changing the renderer requires restarting the editor.")); video_restart_dialog->set_ok_button_text(TTR("Save & Restart")); - video_restart_dialog->connect("confirmed", callable_mp(this, &EditorNode::_menu_option).bind(SET_RENDERING_DRIVER_SAVE_AND_RESTART)); + video_restart_dialog->connect("confirmed", callable_mp(this, &EditorNode::_menu_option).bind(SET_RENDERER_NAME_SAVE_AND_RESTART)); gui_base->add_child(video_restart_dialog); progress_hb = memnew(BackgroundProgress); @@ -7521,6 +7528,7 @@ EditorNode::EditorNode() { // Extend menu bar to window title. if (can_expand) { + DisplayServer::get_singleton()->window_set_window_buttons_offset(Vector2i(menu_hb->get_minimum_size().y / 2, menu_hb->get_minimum_size().y / 2), DisplayServer::MAIN_WINDOW_ID); DisplayServer::get_singleton()->window_set_flag(DisplayServer::WINDOW_FLAG_EXTEND_TO_TITLE, true, DisplayServer::MAIN_WINDOW_ID); menu_hb->set_can_move_window(true); } @@ -7586,8 +7594,8 @@ EditorPlugin::AfterGUIInput EditorPluginList::forward_spatial_gui_input(Camera3D if (current_after == EditorPlugin::AFTER_GUI_INPUT_STOP) { after = EditorPlugin::AFTER_GUI_INPUT_STOP; } - if (after != EditorPlugin::AFTER_GUI_INPUT_STOP && current_after == EditorPlugin::AFTER_GUI_INPUT_DESELECT) { - after = EditorPlugin::AFTER_GUI_INPUT_DESELECT; + if (after != EditorPlugin::AFTER_GUI_INPUT_STOP && current_after == EditorPlugin::AFTER_GUI_INPUT_CUSTOM) { + after = EditorPlugin::AFTER_GUI_INPUT_CUSTOM; } } diff --git a/editor/editor_node.h b/editor/editor_node.h index df3d2ae0f8..14dab11358 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -125,6 +125,12 @@ public: EDITOR_ASSETLIB }; + enum SceneNameCasing { + SCENE_NAME_CASING_AUTO, + SCENE_NAME_CASING_PASCAL_CASE, + SCENE_NAME_CASING_SNAKE_CASE + }; + struct ExecuteThreadArgs { String path; List<String> args; @@ -218,7 +224,7 @@ private: HELP_ABOUT, HELP_SUPPORT_GODOT_DEVELOPMENT, - SET_RENDERING_DRIVER_SAVE_AND_RESTART, + SET_RENDERER_NAME_SAVE_AND_RESTART, GLOBAL_NEW_WINDOW, GLOBAL_SCENE, @@ -233,12 +239,6 @@ private: MAX_BUILD_CALLBACKS = 128 }; - enum ScriptNameCasing { - SCENE_NAME_CASING_AUTO, - SCENE_NAME_CASING_PASCAL_CASE, - SCENE_NAME_CASING_SNAKE_CASE - }; - struct BottomPanelItem { String name; Control *control = nullptr; @@ -286,12 +286,12 @@ private: Control *theme_base = nullptr; Control *gui_base = nullptr; VBoxContainer *main_vbox = nullptr; - OptionButton *rendering_driver = nullptr; + OptionButton *renderer = nullptr; ConfirmationDialog *video_restart_dialog = nullptr; - int rendering_driver_current = 0; - String rendering_driver_request; + int renderer_current = 0; + String renderer_request; // Split containers. HSplitContainer *left_l_hsplit = nullptr; @@ -543,7 +543,6 @@ private: void _update_file_menu_opened(); void _update_file_menu_closed(); - void _on_plugin_ready(Object *p_script, const String &p_activate_name); void _remove_plugin_from_enabled(const String &p_name); void _fs_changed(); @@ -553,7 +552,6 @@ private: void _node_renamed(); void _editor_select_next(); void _editor_select_prev(); - void _editor_select(int p_which); void _set_scene_metadata(const String &p_file, int p_idx = -1); void _get_scene_metadata(const String &p_file); void _update_title(); @@ -599,8 +597,8 @@ private: void _update_from_settings(); - void _rendering_driver_selected(int); - void _update_rendering_driver_color(); + void _renderer_selected(int); + void _update_renderer_color(); void _exit_editor(int p_exit_code); @@ -658,8 +656,6 @@ private: void _update_layouts_menu(); void _layout_menu_option(int p_id); - void _clear_undo_history(); - void _update_addon_config(); void _toggle_distraction_free_mode(); @@ -703,7 +699,11 @@ protected: void set_current_tab(int p_tab); public: - void set_visible_editor(EditorTable p_table) { _editor_select(p_table); } + // Public for use with callable_mp. + void _on_plugin_ready(Object *p_script, const String &p_activate_name); + + void editor_select(int p_which); + void set_visible_editor(EditorTable p_table) { editor_select(p_table); } bool call_build(); @@ -720,6 +720,8 @@ public: static HBoxContainer *get_menu_hb() { return singleton->menu_hb; } static VSplitContainer *get_top_split() { return singleton->top_split; } + static String adjust_scene_name_casing(const String &root_name); + static bool has_unsaved_changes() { return singleton->unsaved_cache; } static void disambiguate_filenames(const Vector<String> p_full_paths, Vector<String> &r_filenames); static void add_io_error(const String &p_error); @@ -784,7 +786,7 @@ public: void open_request(const String &p_path); void edit_foreign_resource(Ref<Resource> p_resource); - bool is_resource_read_only(Ref<Resource> p_resource); + bool is_resource_read_only(Ref<Resource> p_resource, bool p_foreign_resources_are_writable = false); bool is_changing_scene() const; diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp index f3ac8f4ba0..981dad2d2a 100644 --- a/editor/editor_plugin.cpp +++ b/editor/editor_plugin.cpp @@ -972,6 +972,10 @@ void EditorPlugin::_bind_methods() { BIND_ENUM_CONSTANT(DOCK_SLOT_RIGHT_UR); BIND_ENUM_CONSTANT(DOCK_SLOT_RIGHT_BR); BIND_ENUM_CONSTANT(DOCK_SLOT_MAX); + + BIND_ENUM_CONSTANT(AFTER_GUI_INPUT_PASS); + BIND_ENUM_CONSTANT(AFTER_GUI_INPUT_STOP); + BIND_ENUM_CONSTANT(AFTER_GUI_INPUT_CUSTOM); } Ref<EditorUndoRedoManager> EditorPlugin::get_undo_redo() { diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h index fe01524bea..a048b174e4 100644 --- a/editor/editor_plugin.h +++ b/editor/editor_plugin.h @@ -204,7 +204,7 @@ public: enum AfterGUIInput { AFTER_GUI_INPUT_PASS, AFTER_GUI_INPUT_STOP, - AFTER_GUI_INPUT_DESELECT + AFTER_GUI_INPUT_CUSTOM }; //TODO: send a resource for editing to the editor node? @@ -312,6 +312,7 @@ public: VARIANT_ENUM_CAST(EditorPlugin::CustomControlContainer); VARIANT_ENUM_CAST(EditorPlugin::DockSlot); +VARIANT_ENUM_CAST(EditorPlugin::AfterGUIInput); typedef EditorPlugin *(*EditorPluginCreateFunc)(); diff --git a/editor/editor_plugin_settings.cpp b/editor/editor_plugin_settings.cpp index a8df486381..bd19df41fe 100644 --- a/editor/editor_plugin_settings.cpp +++ b/editor/editor_plugin_settings.cpp @@ -46,7 +46,7 @@ void EditorPluginSettings::_notification(int p_what) { } break; case Node::NOTIFICATION_READY: { - plugin_config_dialog->connect("plugin_ready", Callable(EditorNode::get_singleton(), "_on_plugin_ready")); + plugin_config_dialog->connect("plugin_ready", callable_mp(EditorNode::get_singleton(), &EditorNode::_on_plugin_ready)); plugin_list->connect("button_clicked", callable_mp(this, &EditorPluginSettings::_cell_button_pressed)); } break; } diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 7364258a07..3b99962435 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -1758,7 +1758,7 @@ void EditorPropertyVector2::_value_changed(double val, const String &p_name) { Vector2 v2; v2.x = spin[0]->get_value(); v2.y = spin[1]->get_value(); - emit_changed(get_edited_property(), v2, p_name); + emit_changed(get_edited_property(), v2, linked->is_pressed() ? "" : p_name); } void EditorPropertyVector2::update_property() { @@ -2005,7 +2005,7 @@ void EditorPropertyVector3::_value_changed(double val, const String &p_name) { v3.y = Math::deg_to_rad(v3.y); v3.z = Math::deg_to_rad(v3.z); } - emit_changed(get_edited_property(), v3, p_name); + emit_changed(get_edited_property(), v3, linked->is_pressed() ? "" : p_name); } void EditorPropertyVector3::update_property() { @@ -2171,7 +2171,7 @@ void EditorPropertyVector2i::_value_changed(double val, const String &p_name) { Vector2i v2; v2.x = spin[0]->get_value(); v2.y = spin[1]->get_value(); - emit_changed(get_edited_property(), v2, p_name); + emit_changed(get_edited_property(), v2, linked->is_pressed() ? "" : p_name); } void EditorPropertyVector2i::update_property() { @@ -2413,7 +2413,7 @@ void EditorPropertyVector3i::_value_changed(double val, const String &p_name) { 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); + emit_changed(get_edited_property(), v3, linked->is_pressed() ? "" : p_name); } void EditorPropertyVector3i::update_property() { diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index ad84b30689..728a3b0f80 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -268,6 +268,7 @@ void EditorPropertyArray::update_property() { size_slider->set_step(1); size_slider->set_max(1000000); size_slider->set_h_size_flags(SIZE_EXPAND_FILL); + size_slider->set_read_only(is_read_only()); size_slider->connect("value_changed", callable_mp(this, &EditorPropertyArray::_length_changed)); hbox->add_child(size_slider); @@ -278,6 +279,7 @@ void EditorPropertyArray::update_property() { button_add_item = EditorInspector::create_inspector_action_button(TTR("Add Element")); button_add_item->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); button_add_item->connect(SNAME("pressed"), callable_mp(this, &EditorPropertyArray::_add_element)); + button_add_item->set_disabled(is_read_only()); vbox->add_child(button_add_item); paginator = memnew(EditorPaginator); @@ -328,6 +330,7 @@ void EditorPropertyArray::update_property() { Button *reorder_button = memnew(Button); reorder_button->set_icon(get_theme_icon(SNAME("TripleBar"), SNAME("EditorIcons"))); reorder_button->set_default_cursor_shape(Control::CURSOR_MOVE); + reorder_button->set_disabled(is_read_only()); reorder_button->connect("gui_input", callable_mp(this, &EditorPropertyArray::_reorder_button_gui_input)); reorder_button->connect("button_down", callable_mp(this, &EditorPropertyArray::_reorder_button_down).bind(i + offset)); reorder_button->connect("button_up", callable_mp(this, &EditorPropertyArray::_reorder_button_up)); @@ -358,6 +361,7 @@ void EditorPropertyArray::update_property() { prop->connect("property_changed", callable_mp(this, &EditorPropertyArray::_property_changed)); prop->connect("object_id_selected", callable_mp(this, &EditorPropertyArray::_object_id_selected)); prop->set_h_size_flags(SIZE_EXPAND_FILL); + prop->set_read_only(is_read_only()); hbox->add_child(prop); bool is_untyped_array = array.get_type() == Variant::ARRAY && subtype == Variant::NIL; @@ -366,10 +370,12 @@ void EditorPropertyArray::update_property() { Button *edit = memnew(Button); edit->set_icon(get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); hbox->add_child(edit); + edit->set_disabled(is_read_only()); edit->connect("pressed", callable_mp(this, &EditorPropertyArray::_change_type).bind(edit, i + offset)); } else { Button *remove = memnew(Button); remove->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); + remove->set_disabled(is_read_only()); remove->connect("pressed", callable_mp(this, &EditorPropertyArray::_remove_pressed).bind(i + offset)); hbox->add_child(remove); } @@ -409,6 +415,10 @@ void EditorPropertyArray::_button_draw() { } bool EditorPropertyArray::_is_drop_valid(const Dictionary &p_drag_data) const { + if (is_read_only()) { + return false; + } + String allowed_type = Variant::get_type_name(subtype); // When the subtype is of type Object, an additional subtype may be specified in the hint string @@ -609,7 +619,7 @@ void EditorPropertyArray::setup(Variant::Type p_array_type, const String &p_hint } void EditorPropertyArray::_reorder_button_gui_input(const Ref<InputEvent> &p_event) { - if (reorder_from_index < 0) { + if (reorder_from_index < 0 || is_read_only()) { return; } @@ -646,6 +656,10 @@ void EditorPropertyArray::_reorder_button_gui_input(const Ref<InputEvent> &p_eve } void EditorPropertyArray::_reorder_button_down(int p_index) { + if (is_read_only()) { + return; + } + reorder_from_index = p_index; reorder_to_index = p_index; reorder_selected_element_hbox = Object::cast_to<HBoxContainer>(property_vbox->get_child(p_index % page_length)); @@ -656,6 +670,10 @@ void EditorPropertyArray::_reorder_button_down(int p_index) { } void EditorPropertyArray::_reorder_button_up() { + if (is_read_only()) { + return; + } + if (reorder_from_index != reorder_to_index) { // Move the element. Variant array = object->get_array(); @@ -1097,6 +1115,10 @@ void EditorPropertyDictionary::update_property() { } } + ERR_FAIL_COND(!prop); + + prop->set_read_only(is_read_only()); + if (i == amount) { PanelContainer *pc = memnew(PanelContainer); property_vbox->add_child(pc); @@ -1135,6 +1157,7 @@ void EditorPropertyDictionary::update_property() { prop->set_h_size_flags(SIZE_EXPAND_FILL); Button *edit = memnew(Button); edit->set_icon(get_theme_icon(SNAME("Edit"), SNAME("EditorIcons"))); + edit->set_disabled(is_read_only()); hbox->add_child(edit); edit->connect("pressed", callable_mp(this, &EditorPropertyDictionary::_change_type).bind(edit, change_index)); @@ -1143,6 +1166,7 @@ void EditorPropertyDictionary::update_property() { if (i == amount + 1) { button_add_item = EditorInspector::create_inspector_action_button(TTR("Add Key/Value Pair")); button_add_item->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); + button_add_item->set_disabled(is_read_only()); button_add_item->connect("pressed", callable_mp(this, &EditorPropertyDictionary::_add_key_value)); add_vbox->add_child(button_add_item); } diff --git a/editor/editor_quick_open.cpp b/editor/editor_quick_open.cpp index 539cb7cd8a..b4ec3bca15 100644 --- a/editor/editor_quick_open.cpp +++ b/editor/editor_quick_open.cpp @@ -31,6 +31,7 @@ #include "editor_quick_open.h" #include "core/os/keyboard.h" +#include "editor/editor_node.h" void EditorQuickOpen::popup_dialog(const StringName &p_base, bool p_enable_multi, bool p_dontclear) { base_type = p_base; @@ -57,17 +58,29 @@ void EditorQuickOpen::_build_search_cache(EditorFileSystemDirectory *p_efsd) { Vector<String> base_types = String(base_type).split(String(",")); for (int i = 0; i < p_efsd->get_file_count(); i++) { - String file_type = p_efsd->get_file_type(i); + String file = p_efsd->get_file_path(i); + String engine_type = p_efsd->get_file_type(i); + // TODO: Fix lack of caching for resource's script's global class name (if applicable). + String script_type; + if (_load_resources) { + Ref<Resource> res = ResourceLoader::load(file); + if (res.is_valid()) { + Ref<Script> scr = res->get_script(); + if (scr.is_valid()) { + script_type = scr->get_language()->get_global_class_name(file); + } + } + } + String actual_type = script_type.is_empty() ? engine_type : script_type; // Iterate all possible base types. for (String &parent_type : base_types) { - if (ClassDB::is_parent_class(file_type, parent_type)) { - String file = p_efsd->get_file_path(i); + if (ClassDB::is_parent_class(engine_type, parent_type) || EditorNode::get_editor_data().script_class_is_parent(script_type, parent_type)) { files.push_back(file.substr(6, file.length())); // Store refs to used icons. String ext = file.get_extension(); if (!icons.has(ext)) { - icons.insert(ext, get_theme_icon((has_theme_icon(file_type, SNAME("EditorIcons")) ? file_type : String("Object")), SNAME("EditorIcons"))); + icons.insert(ext, get_theme_icon((has_theme_icon(actual_type, SNAME("EditorIcons")) ? actual_type : String("Object")), SNAME("EditorIcons"))); } // Stop testing base types as soon as we got a match. diff --git a/editor/editor_quick_open.h b/editor/editor_quick_open.h index e41a8c7e75..86a419b538 100644 --- a/editor/editor_quick_open.h +++ b/editor/editor_quick_open.h @@ -43,6 +43,7 @@ class EditorQuickOpen : public ConfirmationDialog { Tree *search_options = nullptr; StringName base_type; bool allow_multi_select = false; + bool _load_resources = true; Vector<String> files; OAHashMap<String, Ref<Texture2D>> icons; diff --git a/editor/editor_resource_picker.cpp b/editor/editor_resource_picker.cpp index 5346052f4d..de8259c25c 100644 --- a/editor/editor_resource_picker.cpp +++ b/editor/editor_resource_picker.cpp @@ -53,6 +53,7 @@ void EditorResourcePicker::_update_resource() { if (edited_resource.is_valid() && edited_resource->get_path().is_resource_file()) { resource_path = edited_resource->get_path() + "\n"; } + String class_name = _get_resource_type(edited_resource); if (preview_rect) { preview_rect->set_texture(Ref<Texture2D>()); @@ -64,16 +65,20 @@ void EditorResourcePicker::_update_resource() { assign_button->set_text(TTR("<empty>")); assign_button->set_tooltip_text(""); } else { - assign_button->set_icon(EditorNode::get_singleton()->get_object_icon(edited_resource.operator->(), "Object")); + assign_button->set_icon(EditorNode::get_singleton()->get_object_icon(edited_resource.operator->(), SNAME("Object"))); if (!edited_resource->get_name().is_empty()) { assign_button->set_text(edited_resource->get_name()); } else if (edited_resource->get_path().is_resource_file()) { assign_button->set_text(edited_resource->get_path().get_file()); } else { - assign_button->set_text(edited_resource->get_class()); + assign_button->set_text(class_name); } - assign_button->set_tooltip_text(resource_path + TTR("Type:") + " " + edited_resource->get_class()); + + if (edited_resource->get_path().is_resource_file()) { + resource_path = edited_resource->get_path() + "\n"; + } + assign_button->set_tooltip_text(resource_path + TTR("Type:") + " " + class_name); // Preview will override the above, so called at the end. EditorResourcePreview::get_singleton()->queue_edited_resource_preview(edited_resource, this, "_update_resource_preview", edited_resource->get_instance_id()); @@ -134,16 +139,29 @@ void EditorResourcePicker::_file_selected(const String &p_path) { if (!base_type.is_empty()) { bool any_type_matches = false; + String res_type = loaded_resource->get_class(); + Ref<Script> res_script = loaded_resource->get_script(); + bool is_global_class = false; + if (res_script.is_valid()) { + String script_type = EditorNode::get_editor_data().script_class_get_name(res_script->get_path()); + if (!script_type.is_empty()) { + is_global_class = true; + res_type = script_type; + } + } + for (int i = 0; i < base_type.get_slice_count(","); i++) { String base = base_type.get_slice(",", i); - if (loaded_resource->is_class(base)) { - any_type_matches = true; + + any_type_matches = is_global_class ? EditorNode::get_editor_data().script_class_is_parent(res_type, base) : loaded_resource->is_class(base); + + if (!any_type_matches) { break; } } if (!any_type_matches) { - EditorNode::get_singleton()->show_warning(vformat(TTR("The selected resource (%s) does not match any type expected for this property (%s)."), loaded_resource->get_class(), base_type)); + EditorNode::get_singleton()->show_warning(vformat(TTR("The selected resource (%s) does not match any type expected for this property (%s)."), res_type, base_type)); return; } } @@ -186,7 +204,7 @@ void EditorResourcePicker::_update_menu_items() { // Add options for changing existing value of the resource. if (edited_resource.is_valid()) { // Determine if the edited resource is part of another scene (foreign) which was imported - bool is_edited_resource_foreign_import = EditorNode::get_singleton()->is_resource_read_only(edited_resource); + bool is_edited_resource_foreign_import = EditorNode::get_singleton()->is_resource_read_only(edited_resource, true); // If the resource is determined to be foreign and imported, change the menu entry's description to 'inspect' rather than 'edit' // since will only be able to view its properties in read-only mode. @@ -227,16 +245,19 @@ void EditorResourcePicker::_update_menu_items() { // Add options to copy/paste resource. Ref<Resource> cb = EditorSettings::get_singleton()->get_resource_clipboard(); bool paste_valid = false; - if (is_editable()) { - if (cb.is_valid()) { - if (base_type.is_empty()) { - paste_valid = true; - } else { - for (int i = 0; i < base_type.get_slice_count(","); i++) { - if (ClassDB::is_parent_class(cb->get_class(), base_type.get_slice(",", i))) { - paste_valid = true; - break; - } + if (is_editable() && cb.is_valid()) { + if (base_type.is_empty()) { + paste_valid = true; + } else { + String res_type = _get_resource_type(cb); + + for (int i = 0; i < base_type.get_slice_count(","); i++) { + String base = base_type.get_slice(",", i); + + paste_valid = ClassDB::is_parent_class(res_type, base) || EditorNode::get_editor_data().script_class_is_parent(res_type, base); + + if (!paste_valid) { + break; } } } @@ -281,6 +302,9 @@ void EditorResourcePicker::_edit_menu_cbk(int p_which) { for (int i = 0; i < base_type.get_slice_count(","); i++) { String base = base_type.get_slice(",", i); ResourceLoader::get_recognized_extensions_for_type(base, &extensions); + if (ScriptServer::is_global_class(base)) { + ResourceLoader::get_recognized_extensions_for_type(ScriptServer::get_global_class_native_base(base), &extensions); + } } HashSet<String> valid_extensions; @@ -408,13 +432,7 @@ void EditorResourcePicker::_edit_menu_cbk(int p_which) { Variant obj; if (ScriptServer::is_global_class(intype)) { - obj = ClassDB::instantiate(ScriptServer::get_global_class_native_base(intype)); - if (obj) { - Ref<Script> script = ResourceLoader::load(ScriptServer::get_global_class_path(intype)); - if (script.is_valid()) { - ((Object *)obj)->set_script(script); - } - } + obj = EditorNode::get_editor_data().script_class_instance(intype); } else { obj = ClassDB::instantiate(intype); } @@ -512,23 +530,40 @@ void EditorResourcePicker::_button_draw() { void EditorResourcePicker::_button_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) { - // Only attempt to update and show the menu if we have - // a valid resource or the Picker is editable, as - // there will otherwise be nothing to display. - if (edited_resource.is_valid() || is_editable()) { - _update_menu_items(); - - Vector2 pos = get_screen_position() + mb->get_position(); - edit_menu->reset_size(); - edit_menu->set_position(pos); - edit_menu->popup(); - } + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) { + // Only attempt to update and show the menu if we have + // a valid resource or the Picker is editable, as + // there will otherwise be nothing to display. + if (edited_resource.is_valid() || is_editable()) { + _update_menu_items(); + + Vector2 pos = get_screen_position() + mb->get_position(); + edit_menu->reset_size(); + edit_menu->set_position(pos); + edit_menu->popup(); } } } +String EditorResourcePicker::_get_resource_type(const Ref<Resource> &p_resource) const { + if (p_resource.is_null()) { + return String(); + } + String res_type = p_resource->get_class(); + + Ref<Script> res_script = p_resource->get_script(); + if (res_script.is_null()) { + return res_type; + } + + // TODO: Replace with EditorFileSystem when PR #60606 is merged to use cached resource type. + String script_type = EditorNode::get_editor_data().script_class_get_name(res_script->get_path()); + if (!script_type.is_empty()) { + res_type = script_type; + } + return res_type; +} + void EditorResourcePicker::_get_allowed_types(bool p_with_convert, HashSet<String> *p_vector) const { Vector<String> allowed_types = base_type.split(","); int size = allowed_types.size(); @@ -550,7 +585,9 @@ void EditorResourcePicker::_get_allowed_types(bool p_with_convert, HashSet<Strin List<StringName> allowed_subtypes; List<StringName> inheriters; - ClassDB::get_inheriters_from_class(base, &inheriters); + if (!ScriptServer::is_global_class(base)) { + ClassDB::get_inheriters_from_class(base, &inheriters); + } for (const StringName &subtype_name : inheriters) { p_vector->insert(subtype_name); allowed_subtypes.push_back(subtype_name); @@ -602,32 +639,29 @@ bool EditorResourcePicker::_is_drop_valid(const Dictionary &p_drag_data) const { } } else if (drag_data.has("type") && String(drag_data["type"]) == "resource") { res = drag_data["resource"]; + } else if (drag_data.has("type") && String(drag_data["type"]) == "files") { + Vector<String> files = drag_data["files"]; + + // TODO: Extract the typename of the dropped filepath's resource in a more performant way, without fully loading it. + if (files.size() == 1) { + String file = files[0]; + res = ResourceLoader::load(file); + } } HashSet<String> allowed_types; _get_allowed_types(true, &allowed_types); - if (res.is_valid() && _is_type_valid(res->get_class(), allowed_types)) { - return true; - } + if (res.is_valid()) { + String res_type = _get_resource_type(res); - if (res.is_valid() && res->get_script()) { - StringName custom_class = EditorNode::get_singleton()->get_object_custom_type_name(res->get_script()); - if (_is_type_valid(custom_class, allowed_types)) { + if (_is_type_valid(res_type, allowed_types)) { return true; } - } - - if (drag_data.has("type") && String(drag_data["type"]) == "files") { - Vector<String> files = drag_data["files"]; - - if (files.size() == 1) { - String file = files[0]; - String file_type = EditorFileSystem::get_singleton()->get_file_type(file); - if (!file_type.is_empty() && _is_type_valid(file_type, allowed_types)) { - return true; - } + StringName custom_class = EditorNode::get_singleton()->get_object_custom_type_name(res.ptr()); + if (_is_type_valid(custom_class, allowed_types)) { + return true; } } @@ -685,8 +719,10 @@ void EditorResourcePicker::drop_data_fw(const Point2 &p_point, const Variant &p_ HashSet<String> allowed_types; _get_allowed_types(false, &allowed_types); + String res_type = _get_resource_type(dropped_resource); + // If the accepted dropped resource is from the extended list, it requires conversion. - if (!_is_type_valid(dropped_resource->get_class(), allowed_types)) { + if (!_is_type_valid(res_type, allowed_types)) { for (const String &E : allowed_types) { String at = E.strip_edges(); diff --git a/editor/editor_resource_picker.h b/editor/editor_resource_picker.h index 3d6127e656..d1a20f04b7 100644 --- a/editor/editor_resource_picker.h +++ b/editor/editor_resource_picker.h @@ -91,6 +91,7 @@ class EditorResourcePicker : public HBoxContainer { void _button_draw(); void _button_input(const Ref<InputEvent> &p_event); + String _get_resource_type(const Ref<Resource> &p_resource) const; void _get_allowed_types(bool p_with_convert, HashSet<String> *p_vector) const; bool _is_drop_valid(const Dictionary &p_drag_data) const; bool _is_type_valid(const String p_type_name, HashSet<String> p_allowed_types) const; diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 5dd0a1052a..74445e6caa 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -717,7 +717,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "network/debug/remote_port", 6007, "1,65535,1") // SSL - EDITOR_SETTING_USAGE(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "network/ssl/editor_ssl_certificates", _SYSTEM_CERTS_PATH, "*.crt,*.pem", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED); + EDITOR_SETTING_USAGE(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "network/tls/editor_tls_certificates", _SYSTEM_CERTS_PATH, "*.crt,*.pem", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED); // Profiler EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "debugger/profiler_frame_history_size", 3600, "60,10000,1") @@ -1467,9 +1467,10 @@ void ED_SHORTCUT_OVERRIDE_ARRAY(const String &p_path, const String &p_feature, c #ifdef MACOS_ENABLED // Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS if (keycode == Key::KEY_DELETE) { - keycode = KeyModifierMask::CMD | Key::BACKSPACE; + keycode = KeyModifierMask::META | Key::BACKSPACE; } #endif + Ref<InputEventKey> ie; if (keycode != Key::NONE) { ie = InputEventKey::create_reference(keycode); @@ -1500,7 +1501,7 @@ Ref<Shortcut> ED_SHORTCUT_ARRAY(const String &p_path, const String &p_name, cons #ifdef MACOS_ENABLED // Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS if (keycode == Key::KEY_DELETE) { - keycode = KeyModifierMask::CMD | Key::BACKSPACE; + keycode = KeyModifierMask::META | Key::BACKSPACE; } #endif diff --git a/editor/editor_settings_dialog.cpp b/editor/editor_settings_dialog.cpp index 9b8d46a923..48e746ac36 100644 --- a/editor/editor_settings_dialog.cpp +++ b/editor/editor_settings_dialog.cpp @@ -175,7 +175,7 @@ void EditorSettingsDialog::shortcut_input(const Ref<InputEvent> &p_event) { handled = true; } - if (k->get_keycode_with_modifiers() == (KeyModifierMask::CMD | Key::F)) { + if (k->is_match(InputEventKey::create_reference(KeyModifierMask::CMD_OR_CTRL | Key::F))) { _focus_current_search_box(); handled = true; } @@ -416,45 +416,50 @@ void EditorSettingsDialog::_update_shortcuts() { List<String> slist; EditorSettings::get_singleton()->get_shortcut_list(&slist); + slist.sort(); // Sort alphabetically. const EditorPropertyNameProcessor::Style name_style = EditorPropertyNameProcessor::get_settings_style(); const EditorPropertyNameProcessor::Style tooltip_style = EditorPropertyNameProcessor::get_tooltip_style(name_style); + // Create all sections first. for (const String &E : slist) { Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(E); - if (!sc->has_meta("original")) { + String section_name = E.get_slice("/", 0); + + if (sections.has(section_name)) { continue; } - // Shortcut Section + TreeItem *section = shortcuts->create_item(root); - TreeItem *section; - String section_name = E.get_slice("/", 0); + const String item_name = EditorPropertyNameProcessor::get_singleton()->process_name(section_name, name_style); + const String tooltip = EditorPropertyNameProcessor::get_singleton()->process_name(section_name, tooltip_style); - if (sections.has(section_name)) { - section = sections[section_name]; - } else { - section = shortcuts->create_item(root); - - const String item_name = EditorPropertyNameProcessor::get_singleton()->process_name(section_name, name_style); - const String tooltip = EditorPropertyNameProcessor::get_singleton()->process_name(section_name, tooltip_style); - - section->set_text(0, item_name); - section->set_tooltip_text(0, tooltip); - section->set_selectable(0, false); - section->set_selectable(1, false); - section->set_custom_bg_color(0, shortcuts->get_theme_color(SNAME("prop_subsection"), SNAME("Editor"))); - section->set_custom_bg_color(1, shortcuts->get_theme_color(SNAME("prop_subsection"), SNAME("Editor"))); - - if (collapsed.has(item_name)) { - section->set_collapsed(collapsed[item_name]); - } + section->set_text(0, item_name); + section->set_tooltip_text(0, tooltip); + section->set_selectable(0, false); + section->set_selectable(1, false); + section->set_custom_bg_color(0, shortcuts->get_theme_color(SNAME("prop_subsection"), SNAME("Editor"))); + section->set_custom_bg_color(1, shortcuts->get_theme_color(SNAME("prop_subsection"), SNAME("Editor"))); - sections[section_name] = section; + if (collapsed.has(item_name)) { + section->set_collapsed(collapsed[item_name]); } - // Shortcut Item + sections[section_name] = section; + } + // Add shortcuts to sections. + for (const String &E : slist) { + Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(E); + if (!sc->has_meta("original")) { + continue; + } + + String section_name = E.get_slice("/", 0); + TreeItem *section = sections[section_name]; + + // Shortcut Item if (!shortcut_filter.is_subsequence_ofn(sc->get_name())) { continue; } @@ -552,6 +557,10 @@ void EditorSettingsDialog::_shortcut_cell_double_clicked() { const ShortcutButton edit_btn_id = EditorSettingsDialog::SHORTCUT_EDIT; const int edit_btn_col = 1; TreeItem *ti = shortcuts->get_selected(); + if (ti == nullptr) { + return; + } + String type = ti->get_meta("type"); int col = shortcuts->get_selected_column(); if (type == "shortcut" && col == 0) { diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp index 58020cf682..4cd046e811 100644 --- a/editor/editor_spin_slider.cpp +++ b/editor/editor_spin_slider.cpp @@ -121,7 +121,7 @@ void EditorSpinSlider::gui_input(const Ref<InputEvent> &p_event) { pre_grab_value = get_max(); } - if (mm->is_command_pressed()) { + if (mm->is_command_or_control_pressed()) { // If control was just pressed, don't make the value do a huge jump in magnitude. if (grabbing_spinner_dist_cache != 0) { pre_grab_value += grabbing_spinner_dist_cache * get_step(); diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 9e983839f9..edbd2dd62f 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -191,25 +191,6 @@ static Ref<StyleBoxLine> make_line_stylebox(Color p_color, int p_thickness = 1, return style; } -static Ref<Texture2D> flip_icon(Ref<Texture2D> p_texture, bool p_flip_y = false, bool p_flip_x = false) { - if (!p_flip_y && !p_flip_x) { - return p_texture; - } - - Ref<Image> img = p_texture->get_image(); - ERR_FAIL_NULL_V(img, Ref<Texture2D>()); - img = img->duplicate(); - - if (p_flip_y) { - img->flip_y(); - } - if (p_flip_x) { - img->flip_x(); - } - - return ImageTexture::create_from_image(img); -} - #ifdef MODULE_SVG_ENABLED // See also `generate_icon()` in `scene/resources/default_theme.cpp`. static Ref<ImageTexture> editor_generate_icon(int p_index, float p_scale, float p_saturation, const HashMap<Color, Color> &p_convert_colors = HashMap<Color, Color>()) { @@ -447,6 +428,14 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // Colors bool dark_theme = EditorSettings::get_singleton()->is_dark_theme(); +#ifdef MODULE_SVG_ENABLED + if (dark_theme) { + ImageLoaderSVG::set_forced_color_map(HashMap<Color, Color>()); + } else { + ImageLoaderSVG::set_forced_color_map(EditorColorMap::get()); + } +#endif + // Ensure base colors are in the 0..1 luminance range to avoid 8-bit integer overflow or text rendering issues. // Some places in the editor use 8-bit integer colors. const Color dark_color_1 = base_color.lerp(Color(0, 0, 0, 1), contrast).clamp(); @@ -1559,14 +1548,13 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("camera", "GraphEditMinimap", style_minimap_camera); theme->set_stylebox("node", "GraphEditMinimap", style_minimap_node); - Ref<Texture2D> minimap_resizer_icon = theme->get_icon(SNAME("GuiResizer"), SNAME("EditorIcons")); Color minimap_resizer_color; if (dark_theme) { minimap_resizer_color = Color(1, 1, 1, 0.65); } else { minimap_resizer_color = Color(0, 0, 0, 0.65); } - theme->set_icon("resizer", "GraphEditMinimap", flip_icon(minimap_resizer_icon, true, true)); + theme->set_icon("resizer", "GraphEditMinimap", theme->get_icon(SNAME("GuiResizerTopLeft"), SNAME("EditorIcons"))); theme->set_color("resizer_color", "GraphEditMinimap", minimap_resizer_color); // GraphNode diff --git a/editor/editor_undo_redo_manager.cpp b/editor/editor_undo_redo_manager.cpp index eca2b3143b..064448fd96 100644 --- a/editor/editor_undo_redo_manager.cpp +++ b/editor/editor_undo_redo_manager.cpp @@ -124,19 +124,19 @@ void EditorUndoRedoManager::create_action(const String &p_name, UndoRedo::MergeM create_action_for_history(p_name, INVALID_HISTORY, p_mode); if (p_custom_context) { - // This assigns context to pending action. + // This assigns history to pending action. get_history_for_object(p_custom_context); } } void EditorUndoRedoManager::add_do_methodp(Object *p_object, const StringName &p_method, const Variant **p_args, int p_argcount) { UndoRedo *undo_redo = get_history_for_object(p_object).undo_redo; - undo_redo->add_do_methodp(p_object, p_method, p_args, p_argcount); + undo_redo->add_do_method(Callable(p_object, p_method).bindp(p_args, p_argcount)); } void EditorUndoRedoManager::add_undo_methodp(Object *p_object, const StringName &p_method, const Variant **p_args, int p_argcount) { UndoRedo *undo_redo = get_history_for_object(p_object).undo_redo; - undo_redo->add_undo_methodp(p_object, p_method, p_args, p_argcount); + undo_redo->add_undo_method(Callable(p_object, p_method).bindp(p_args, p_argcount)); } void EditorUndoRedoManager::_add_do_method(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { @@ -218,7 +218,10 @@ void EditorUndoRedoManager::add_undo_reference(Object *p_object) { } void EditorUndoRedoManager::commit_action(bool p_execute) { - ERR_FAIL_COND(pending_action.history_id == INVALID_HISTORY); + if (pending_action.history_id == INVALID_HISTORY) { + return; // Empty action, do nothing. + } + is_committing = true; History &history = get_or_create_history(pending_action.history_id); diff --git a/editor/editor_zoom_widget.cpp b/editor/editor_zoom_widget.cpp index e4beea5e5f..88e99d9b30 100644 --- a/editor/editor_zoom_widget.cpp +++ b/editor/editor_zoom_widget.cpp @@ -167,7 +167,7 @@ EditorZoomWidget::EditorZoomWidget() { zoom_minus->set_flat(true); add_child(zoom_minus); zoom_minus->connect("pressed", callable_mp(this, &EditorZoomWidget::_button_zoom_minus)); - zoom_minus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", TTR("Zoom Out"), KeyModifierMask::CMD | Key::MINUS)); + zoom_minus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", TTR("Zoom Out"), KeyModifierMask::CMD_OR_CTRL | Key::MINUS)); zoom_minus->set_shortcut_context(this); zoom_minus->set_focus_mode(FOCUS_NONE); @@ -189,7 +189,7 @@ EditorZoomWidget::EditorZoomWidget() { zoom_plus->set_flat(true); add_child(zoom_plus); zoom_plus->connect("pressed", callable_mp(this, &EditorZoomWidget::_button_zoom_plus)); - zoom_plus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", TTR("Zoom In"), KeyModifierMask::CMD | Key::EQUAL)); // Usually direct access key for PLUS + zoom_plus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", TTR("Zoom In"), KeyModifierMask::CMD_OR_CTRL | Key::EQUAL)); // Usually direct access key for PLUS zoom_plus->set_shortcut_context(this); zoom_plus->set_focus_mode(FOCUS_NONE); diff --git a/editor/export/editor_export_platform.cpp b/editor/export/editor_export_platform.cpp index 2a444bb04f..bcc85570ed 100644 --- a/editor/export/editor_export_platform.cpp +++ b/editor/export/editor_export_platform.cpp @@ -1619,21 +1619,24 @@ void EditorExportPlatform::gen_export_flags(Vector<String> &r_flags, int p_flags } bool EditorExportPlatform::can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const { + bool valid = true; +#ifndef ANDROID_ENABLED String templates_error; - bool valid_export_configuration = has_valid_export_configuration(p_preset, templates_error, r_missing_templates); - - String project_configuration_error; - bool valid_project_configuration = has_valid_project_configuration(p_preset, project_configuration_error); + valid = valid && has_valid_export_configuration(p_preset, templates_error, r_missing_templates); if (!templates_error.is_empty()) { r_error += templates_error; } +#endif + + String project_configuration_error; + valid = valid && has_valid_project_configuration(p_preset, project_configuration_error); if (!project_configuration_error.is_empty()) { r_error += project_configuration_error; } - return valid_export_configuration && valid_project_configuration; + return valid; } EditorExportPlatform::EditorExportPlatform() { diff --git a/editor/export/export_template_manager.cpp b/editor/export/export_template_manager.cpp index 0ecbc9a8a3..ceb5b63293 100644 --- a/editor/export/export_template_manager.cpp +++ b/editor/export/export_template_manager.cpp @@ -172,7 +172,7 @@ void ExportTemplateManager::_download_template_completed(int p_status, int p_cod case HTTPRequest::RESULT_BODY_SIZE_LIMIT_EXCEEDED: case HTTPRequest::RESULT_CONNECTION_ERROR: case HTTPRequest::RESULT_CHUNKED_BODY_SIZE_MISMATCH: - case HTTPRequest::RESULT_SSL_HANDSHAKE_ERROR: + case HTTPRequest::RESULT_TLS_HANDSHAKE_ERROR: case HTTPRequest::RESULT_CANT_CONNECT: { _set_current_progress_status(TTR("Can't connect to the mirror."), true); } break; @@ -345,8 +345,8 @@ bool ExportTemplateManager::_humanize_http_status(HTTPRequest *p_request, String *r_status = TTR("Connection Error"); success = false; break; - case HTTPClient::STATUS_SSL_HANDSHAKE_ERROR: - *r_status = TTR("SSL Handshake Error"); + case HTTPClient::STATUS_TLS_HANDSHAKE_ERROR: + *r_status = TTR("TLS Handshake Error"); success = false; break; } diff --git a/editor/export/project_export.cpp b/editor/export/project_export.cpp index 00a0e08d3a..43aac5e981 100644 --- a/editor/export/project_export.cpp +++ b/editor/export/project_export.cpp @@ -865,10 +865,10 @@ void ProjectExportDialog::_validate_export_path(const String &p_path) { if (invalid_path) { export_project->get_ok_button()->set_disabled(true); - export_project->get_line_edit()->disconnect("text_submitted", Callable(export_project, "_file_submitted")); + export_project->get_line_edit()->disconnect("text_submitted", callable_mp(export_project, &EditorFileDialog::_file_submitted)); } else { export_project->get_ok_button()->set_disabled(false); - export_project->get_line_edit()->connect("text_submitted", Callable(export_project, "_file_submitted")); + export_project->get_line_edit()->connect("text_submitted", callable_mp(export_project, &EditorFileDialog::_file_submitted)); } } @@ -901,9 +901,9 @@ void ProjectExportDialog::_export_project() { // with _validate_export_path. // FIXME: This is a hack, we should instead change EditorFileDialog to allow // disabling validation by the "text_submitted" signal. - if (!export_project->get_line_edit()->is_connected("text_submitted", Callable(export_project, "_file_submitted"))) { + if (!export_project->get_line_edit()->is_connected("text_submitted", callable_mp(export_project, &EditorFileDialog::_file_submitted))) { export_project->get_ok_button()->set_disabled(false); - export_project->get_line_edit()->connect("text_submitted", Callable(export_project, "_file_submitted")); + export_project->get_line_edit()->connect("text_submitted", callable_mp(export_project, &EditorFileDialog::_file_submitted)); } export_project->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); @@ -932,8 +932,10 @@ void ProjectExportDialog::_export_project_to_path(const String &p_path) { } void ProjectExportDialog::_export_all_dialog() { +#ifndef ANDROID_ENABLED export_all_dialog->show(); export_all_dialog->popup_centered(Size2(300, 80)); +#endif } void ProjectExportDialog::_export_all_dialog_action(const String &p_str) { @@ -1194,11 +1196,16 @@ ProjectExportDialog::ProjectExportDialog() { set_cancel_button_text(TTR("Close")); set_ok_button_text(TTR("Export PCK/ZIP...")); + get_ok_button()->set_disabled(true); +#ifdef ANDROID_ENABLED + export_button = memnew(Button); + export_button->hide(); +#else export_button = add_button(TTR("Export Project..."), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "export"); +#endif export_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_project)); // Disable initially before we select a valid preset export_button->set_disabled(true); - get_ok_button()->set_disabled(true); export_all_dialog = memnew(ConfirmationDialog); add_child(export_all_dialog); @@ -1208,8 +1215,14 @@ ProjectExportDialog::ProjectExportDialog() { export_all_dialog->add_button(TTR("Debug"), true, "debug"); export_all_dialog->add_button(TTR("Release"), true, "release"); export_all_dialog->connect("custom_action", callable_mp(this, &ProjectExportDialog::_export_all_dialog_action)); +#ifdef ANDROID_ENABLED + export_all_dialog->hide(); + export_all_button = memnew(Button); + export_all_button->hide(); +#else export_all_button = add_button(TTR("Export All..."), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "export"); +#endif export_all_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_all_dialog)); export_all_button->set_disabled(true); diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index ef8173eae4..19b4932d3d 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -3021,10 +3021,10 @@ FileSystemDock::FileSystemDock() { set_name("FileSystem"); path = "res://"; - // `KeyModifierMask::CMD | Key::C` conflicts with other editor shortcuts. - ED_SHORTCUT("filesystem_dock/copy_path", TTR("Copy Path"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::C); + // `KeyModifierMask::CMD_OR_CTRL | Key::C` conflicts with other editor shortcuts. + ED_SHORTCUT("filesystem_dock/copy_path", TTR("Copy Path"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::C); ED_SHORTCUT("filesystem_dock/copy_uid", TTR("Copy UID")); - ED_SHORTCUT("filesystem_dock/duplicate", TTR("Duplicate..."), KeyModifierMask::CMD | Key::D); + ED_SHORTCUT("filesystem_dock/duplicate", TTR("Duplicate..."), KeyModifierMask::CMD_OR_CTRL | Key::D); ED_SHORTCUT("filesystem_dock/delete", TTR("Delete"), Key::KEY_DELETE); ED_SHORTCUT("filesystem_dock/rename", TTR("Rename..."), Key::F2); ED_SHORTCUT_OVERRIDE("filesystem_dock/rename", "macos", Key::ENTER); diff --git a/editor/icons/GuiResizerTopLeft.svg b/editor/icons/GuiResizerTopLeft.svg new file mode 100644 index 0000000000..a67c2c0722 --- /dev/null +++ b/editor/icons/GuiResizerTopLeft.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 12c.55228 0 1-.44772 1-1v-6h6c.55228 0 1-.44772 1-1s-.44772-1-1-1h-7c-.55226.000055-.99994.44774-1 1v7c0 .55228.44772 1 1 1z" fill="#fff" fill-opacity=".58824"/></svg> diff --git a/editor/icons/PreviewEnvironment.svg b/editor/icons/PreviewEnvironment.svg new file mode 100644 index 0000000000..e0b0257daf --- /dev/null +++ b/editor/icons/PreviewEnvironment.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="m8 1a7 7 0 0 0 -7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0 -7-7zm-1.7305 2.3125c-.83125 1.5372-1.2685 3.1037-1.2695 4.6816-.64057-.11251-1.3005-.27158-1.9766-.47266a5 5 0 0 1 3.2461-4.209zm3.4629.00391a5 5 0 0 1 3.2383 4.1875c-.65187.17448-1.3077.32867-1.9727.44922-.0084-1.5627-.44294-3.1141-1.2656-4.6367zm-1.7324.0078088c1.0126 1.593 1.5 3.1425 1.5 4.6758 0 .054042-.00662.10803-.00781.16211-.96392.096801-1.9566.1103-2.9844.027344-.00163-.063192-.00781-.12632-.00781-.18945 0-1.5333.48744-3.0828 1.5-4.6758zm4.8789 5.7578a5 5 0 0 1 -3.1484 3.6055002c.57106-1.0564.95277-2.1268 1.1367-3.2051002.68204-.10905 1.3556-.23789 2.0117-.40039zm-9.7461.033203c.68377.18153 1.3555.33345 2.0098.43164.18781 1.0551002.56647 2.1026002 1.125 3.1367002a5 5 0 0 1 -3.1348-3.5684002zm6.168.55469c-.22615.9886602-.65424 1.9884002-1.3008 3.0059002-.63811-1.0042-1.0645-1.9908-1.293-2.9668002.89027.054126 1.7517.029377 2.5938-.039062z"/><path d="m8 1v2.3242c1.0126 1.593 1.5 3.1425 1.5 4.6758 0 .054042-.00662.10803-.00781.16211-.4894.049148-.98713.077552-1.4922.082031v1.4922c.43915-.0076.87287-.031628 1.3008-.066406-.22615.98866-.65424 1.9884-1.3008 3.0059v2.3242a7 7 0 0 0 7.000001-7 7 7 0 0 0 -7.000001-7zm1.7324 2.3164a5 5 0 0 1 3.2383 4.1875c-.65187.17448-1.3077.32867-1.9727.44922-.00845-1.5627-.44294-3.1141-1.2656-4.6367zm3.1465 5.7656a5 5 0 0 1 -3.1484 3.6055c.57106-1.0564.95277-2.1268 1.1367-3.2051.68204-.10905 1.3556-.23789 2.0117-.40039z"/></g></svg> diff --git a/editor/icons/PreviewSun.svg b/editor/icons/PreviewSun.svg new file mode 100644 index 0000000000..a8c652be65 --- /dev/null +++ b/editor/icons/PreviewSun.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v3h2v-3zm-2.5352 2.0508-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm7.0703 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-3.5352 1.9492c-1.6569 0-3 1.3432-3 3s1.3431 3 3 3 3-1.3432 3-3-1.3431-3-3-3zm-7 2v2h3v-2zm11 0v2h3v-2zm-7.5352 3.1211-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm7.0703 0-1.4141 1.4141 1.4141 1.4141 1.4141-1.4141zm-4.5352 1.8789v3h2v-3z" fill="#e0e0e0"/></svg> diff --git a/editor/icons/VisualScriptComment.svg b/editor/icons/VisualScriptComment.svg deleted file mode 100644 index 3887853b58..0000000000 --- a/editor/icons/VisualScriptComment.svg +++ /dev/null @@ -1 +0,0 @@ -<svg height="14" viewBox="0 0 14 14" width="14" xmlns="http://www.w3.org/2000/svg"><path d="m3 1v2h-2v2h2v4h-2v2h2v2h2v-2h4v2h2v-2h2v-2h-2v-4h2v-2h-2v-2h-2v2h-4v-2zm2 4h4v4h-4z" fill="#e0e0e0"/></svg> diff --git a/editor/icons/VisualScriptExpression.svg b/editor/icons/VisualScriptExpression.svg deleted file mode 100644 index d6a3c2d9a8..0000000000 --- a/editor/icons/VisualScriptExpression.svg +++ /dev/null @@ -1 +0,0 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m4.859536 3.0412379c-2.0539867 0-3.7190721 1.6650852-3.7190721 3.719072v6.1984521h2.4793814v-2.479381h2.4793814v-2.4793803h-2.4793814v-1.2396908c0-.6846622.5550285-1.2396907 1.2396907-1.2396907h1.2396907v-2.4793813z"/><path d="m7.5889175 3.0000003 2.5000005 4.9999997-2.5000005 5h2.5000005l1.135249-2.727 1.36475 2.727h2.499999l-2.499999-5 2.499999-4.9999997h-2.499999l-1.13525 2.7269998-1.364749-2.7269998zm7.4999985 9.9999997v-6.25z"/></g></svg> diff --git a/editor/import/dynamic_font_import_settings.cpp b/editor/import/dynamic_font_import_settings.cpp index d1f37179f3..c1761339b2 100644 --- a/editor/import/dynamic_font_import_settings.cpp +++ b/editor/import/dynamic_font_import_settings.cpp @@ -302,6 +302,7 @@ static UniRange unicode_ranges[] = { { 0x10D00, 0x10D3F, U"Hanifi Rohingya" }, { 0x10E60, 0x10E7F, U"Rumi Numeral Symbols" }, { 0x10E80, 0x10EBF, U"Yezidi" }, + { 0x10EC0, 0x10EFF, U"Arabic Extended-C" }, { 0x10F00, 0x10F2F, U"Old Sogdian" }, { 0x10F30, 0x10F6F, U"Sogdian" }, { 0x10F70, 0x10FAF, U"Old Uyghur" }, @@ -333,11 +334,13 @@ static UniRange unicode_ranges[] = { { 0x11A50, 0x11AAF, U"Soyombo" }, { 0x11AB0, 0x11ABF, U"Unified Canadian Aboriginal Syllabics Extended-A" }, { 0x11AC0, 0x11AFF, U"Pau Cin Hau" }, + { 0x11B00, 0x11B5F, U"Devanagari Extended-A" }, { 0x11C00, 0x11C6F, U"Bhaiksuki" }, { 0x11C70, 0x11CBF, U"Marchen" }, { 0x11D00, 0x11D5F, U"Masaram Gondi" }, { 0x11D60, 0x11DAF, U"Gunjala Gondi" }, { 0x11EE0, 0x11EFF, U"Makasar" }, + { 0x11F00, 0x11F5F, U"Kawi" }, { 0x11FB0, 0x11FBF, U"Lisu Supplement" }, { 0x11FC0, 0x11FFF, U"Tamil Supplement" }, { 0x12000, 0x123FF, U"Cuneiform" }, @@ -370,6 +373,7 @@ static UniRange unicode_ranges[] = { { 0x1D000, 0x1D0FF, U"Byzantine Musical Symbols" }, { 0x1D100, 0x1D1FF, U"Musical Symbols" }, { 0x1D200, 0x1D24F, U"Ancient Greek Musical Notation" }, + { 0x1D2C0, 0x1D2DF, U"Kaktovik Numerals" }, { 0x1D2E0, 0x1D2FF, U"Mayan Numerals" }, { 0x1D300, 0x1D35F, U"Tai Xuan Jing Symbols" }, { 0x1D360, 0x1D37F, U"Counting Rod Numerals" }, @@ -377,9 +381,11 @@ static UniRange unicode_ranges[] = { { 0x1D800, 0x1DAAF, U"Sutton SignWriting" }, { 0x1DF00, 0x1DFFF, U"Latin Extended-G" }, { 0x1E000, 0x1E02F, U"Glagolitic Supplement" }, + { 0x1E030, 0x1E08F, U"Cyrillic Extended-D" }, { 0x1E100, 0x1E14F, U"Nyiakeng Puachue Hmong" }, { 0x1E290, 0x1E2BF, U"Toto" }, { 0x1E2C0, 0x1E2FF, U"Wancho" }, + { 0x1E4D0, 0x1E4FF, U"Nag Mundari" }, { 0x1E7E0, 0x1E7FF, U"Ethiopic Extended-B" }, { 0x1E800, 0x1E8DF, U"Mende Kikakui" }, { 0x1E900, 0x1E95F, U"Adlam" }, @@ -409,6 +415,7 @@ static UniRange unicode_ranges[] = { { 0x2CEB0, 0x2EBEF, U"CJK Unified Ideographs Extension F" }, { 0x2F800, 0x2FA1F, U"CJK Compatibility Ideographs Supplement" }, { 0x30000, 0x3134F, U"CJK Unified Ideographs Extension G" }, + { 0x31350, 0x323AF, U"CJK Unified Ideographs Extension H" }, //{ 0xE0000, 0xE007F, U"Tags" }, //{ 0xE0100, 0xE01EF, U"Variation Selectors Supplement" }, { 0xF0000, 0xFFFFF, U"Supplementary Private Use Area-A" }, diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index 41061c3fc3..b5798a5784 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -1891,6 +1891,39 @@ void ResourceImporterScene::_replace_owner(Node *p_node, Node *p_scene, Node *p_ } } +Array ResourceImporterScene::_get_skinned_pose_transforms(ImporterMeshInstance3D *p_src_mesh_node) { + Array skin_pose_transform_array; + + const Ref<Skin> skin = p_src_mesh_node->get_skin(); + if (skin.is_valid()) { + NodePath skeleton_path = p_src_mesh_node->get_skeleton_path(); + const Node *node = p_src_mesh_node->get_node_or_null(skeleton_path); + const Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(node); + if (skeleton) { + int bind_count = skin->get_bind_count(); + + for (int i = 0; i < bind_count; i++) { + Transform3D bind_pose = skin->get_bind_pose(i); + String bind_name = skin->get_bind_name(i); + + int bone_idx = bind_name.is_empty() ? skin->get_bind_bone(i) : skeleton->find_bone(bind_name); + ERR_FAIL_COND_V(bone_idx >= skeleton->get_bone_count(), Array()); + + Transform3D bp_global_rest; + if (bone_idx >= 0) { + bp_global_rest = skeleton->get_bone_global_pose(bone_idx); + } else { + bp_global_rest = skeleton->get_bone_global_pose(i); + } + + skin_pose_transform_array.push_back(bp_global_rest * bind_pose); + } + } + } + + return skin_pose_transform_array; +} + void ResourceImporterScene::_generate_meshes(Node *p_node, const Dictionary &p_mesh_data, bool p_generate_lods, bool p_create_shadow_meshes, LightBakeMode p_light_bake_mode, float p_lightmap_texel_size, const Vector<uint8_t> &p_src_lightmap_cache, Vector<Vector<uint8_t>> &r_lightmap_caches) { ImporterMeshInstance3D *src_mesh_node = Object::cast_to<ImporterMeshInstance3D>(p_node); if (src_mesh_node) { @@ -2007,7 +2040,8 @@ void ResourceImporterScene::_generate_meshes(Node *p_node, const Dictionary &p_m } if (generate_lods) { - src_mesh_node->get_mesh()->generate_lods(merge_angle, split_angle); + Array skin_pose_transform_array = _get_skinned_pose_transforms(src_mesh_node); + src_mesh_node->get_mesh()->generate_lods(merge_angle, split_angle, skin_pose_transform_array); } if (create_shadow_meshes) { diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h index da37893cc5..77bc06533c 100644 --- a/editor/import/resource_importer_scene.h +++ b/editor/import/resource_importer_scene.h @@ -34,6 +34,7 @@ #include "core/error/error_macros.h" #include "core/io/resource_importer.h" #include "core/variant/dictionary.h" +#include "scene/3d/importer_mesh_instance_3d.h" #include "scene/3d/node_3d.h" #include "scene/resources/animation.h" #include "scene/resources/mesh.h" @@ -208,6 +209,7 @@ class ResourceImporterScene : public ResourceImporter { SHAPE_TYPE_CAPSULE, }; + Array _get_skinned_pose_transforms(ImporterMeshInstance3D *p_src_mesh_node); void _replace_owner(Node *p_node, Node *p_scene, Node *p_new_owner); void _generate_meshes(Node *p_node, const Dictionary &p_mesh_data, bool p_generate_lods, bool p_create_shadow_meshes, LightBakeMode p_light_bake_mode, float p_lightmap_texel_size, const Vector<uint8_t> &p_src_lightmap_cache, Vector<Vector<uint8_t>> &r_lightmap_caches); void _add_shapes(Node *p_node, const Vector<Ref<Shape3D>> &p_shapes); diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp index 17b94ec706..c06756ff0b 100644 --- a/editor/import/resource_importer_texture.cpp +++ b/editor/import/resource_importer_texture.cpp @@ -36,6 +36,8 @@ #include "core/version.h" #include "editor/editor_file_system.h" #include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" void ResourceImporterTexture::_texture_reimport_roughness(const Ref<CompressedTexture2D> &p_tex, const String &p_normal_path, RS::TextureDetectRoughnessChannel p_channel) { ERR_FAIL_COND(p_tex.is_null()); @@ -233,6 +235,10 @@ void ResourceImporterTexture::get_import_options(const String &p_path, List<Impo if (p_path.get_extension() == "svg") { r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "svg/scale", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 1.0)); + + // Editor use only, applies to SVG. + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "editor/scale_with_editor_scale"), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "editor/convert_colors_with_editor_theme"), false)); } } @@ -447,6 +453,14 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String scale = p_options["svg/scale"]; } + // Editor-specific options. + bool use_editor_scale = p_options.has("editor/scale_with_editor_scale") && p_options["editor/scale_with_editor_scale"]; + bool convert_editor_colors = p_options.has("editor/convert_colors_with_editor_theme") && p_options["editor/convert_colors_with_editor_theme"]; + + // Start importing images. + List<Ref<Image>> images_imported; + + // Load the normal image. Ref<Image> normal_image; Image::RoughnessChannel roughness_channel = Image::ROUGHNESS_CHANNEL_R; if (mipmaps && roughness > 1 && FileAccess::exists(normal_map)) { @@ -456,88 +470,117 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String } } + // Load the main image. Ref<Image> image; image.instantiate(); Error err = ImageLoader::load_image(p_source_file, image, nullptr, loader_flags, scale); if (err != OK) { return err; } + images_imported.push_back(image); - Array formats_imported; - - if (size_limit > 0 && (image->get_width() > size_limit || image->get_height() > size_limit)) { - //limit size - if (image->get_width() >= image->get_height()) { - int new_width = size_limit; - int new_height = image->get_height() * new_width / image->get_width(); - - image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC); - } else { - int new_height = size_limit; - int new_width = image->get_width() * new_height / image->get_height(); + // Load the editor-only image. + Ref<Image> editor_image; + bool import_editor_image = use_editor_scale || convert_editor_colors; + if (import_editor_image) { + float editor_scale = scale; + if (use_editor_scale) { + editor_scale = scale * EDSCALE; + } - image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC); + int32_t editor_loader_flags = loader_flags; + if (convert_editor_colors) { + editor_loader_flags |= ImageFormatLoader::FLAG_CONVERT_COLORS; } - if (normal == 1) { - image->normalize(); + editor_image.instantiate(); + err = ImageLoader::load_image(p_source_file, editor_image, nullptr, editor_loader_flags, editor_scale); + if (err != OK) { + WARN_PRINT("Failed to import an image resource for editor use from '" + p_source_file + "'"); + } else { + images_imported.push_back(editor_image); } } - if (fix_alpha_border) { - image->fix_alpha_edges(); - } + for (Ref<Image> &target_image : images_imported) { + // Apply the size limit. + if (size_limit > 0 && (target_image->get_width() > size_limit || target_image->get_height() > size_limit)) { + if (target_image->get_width() >= target_image->get_height()) { + int new_width = size_limit; + int new_height = target_image->get_height() * new_width / target_image->get_width(); - if (premult_alpha) { - image->premultiply_alpha(); - } + target_image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC); + } else { + int new_height = size_limit; + int new_width = target_image->get_width() * new_height / target_image->get_height(); - if (normal_map_invert_y) { - // Inverting the green channel can be used to flip a normal map's direction. - // There's no standard when it comes to normal map Y direction, so this is - // sometimes needed when using a normal map exported from another program. - // See <http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates>. - const int height = image->get_height(); - const int width = image->get_width(); + target_image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC); + } - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - const Color color = image->get_pixel(i, j); - image->set_pixel(i, j, Color(color.r, 1 - color.g, color.b)); + if (normal == 1) { + target_image->normalize(); } } - } - if (hdr_clamp_exposure) { - // Clamp HDR exposure following Filament's tonemapping formula. - // This can be used to reduce fireflies in environment maps or reduce the influence - // of the sun from an HDRI panorama on environment lighting (when a DirectionalLight3D is used instead). - const int height = image->get_height(); - const int width = image->get_width(); - - // These values are chosen arbitrarily and seem to produce good results with 4,096 samples. - const float linear = 4096.0; - const float compressed = 16384.0; + // Fix alpha border. + if (fix_alpha_border) { + target_image->fix_alpha_edges(); + } - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - const Color color = image->get_pixel(i, j); - const float luma = color.get_luminance(); + // Premultiply the alpha. + if (premult_alpha) { + target_image->premultiply_alpha(); + } - Color clamped_color; - if (luma <= linear) { - clamped_color = color; - } else { - clamped_color = (color / luma) * ((linear * linear - compressed * luma) / (2 * linear - compressed - luma)); + // Invert the green channel of the image to flip the normal map it contains. + if (normal_map_invert_y) { + // Inverting the green channel can be used to flip a normal map's direction. + // There's no standard when it comes to normal map Y direction, so this is + // sometimes needed when using a normal map exported from another program. + // See <http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates>. + const int height = target_image->get_height(); + const int width = target_image->get_width(); + + for (int i = 0; i < width; i++) { + for (int j = 0; j < height; j++) { + const Color color = target_image->get_pixel(i, j); + target_image->set_pixel(i, j, Color(color.r, 1 - color.g, color.b)); } + } + } - image->set_pixel(i, j, clamped_color); + // Clamp HDR exposure. + if (hdr_clamp_exposure) { + // Clamp HDR exposure following Filament's tonemapping formula. + // This can be used to reduce fireflies in environment maps or reduce the influence + // of the sun from an HDRI panorama on environment lighting (when a DirectionalLight3D is used instead). + const int height = target_image->get_height(); + const int width = target_image->get_width(); + + // These values are chosen arbitrarily and seem to produce good results with 4,096 samples. + const float linear = 4096.0; + const float compressed = 16384.0; + + for (int i = 0; i < width; i++) { + for (int j = 0; j < height; j++) { + const Color color = target_image->get_pixel(i, j); + const float luma = color.get_luminance(); + + Color clamped_color; + if (luma <= linear) { + clamped_color = color; + } else { + clamped_color = (color / luma) * ((linear * linear - compressed * luma) / (2 * linear - compressed - luma)); + } + + target_image->set_pixel(i, j, clamped_color); + } } } } if (compress_mode == COMPRESS_BASIS_UNIVERSAL && image->get_format() >= Image::FORMAT_RF) { - //basis universal does not support float formats, fall back + // Basis universal does not support float formats, fallback. compress_mode = COMPRESS_VRAM_COMPRESSED; } @@ -547,9 +590,11 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String bool force_normal = normal == 1; bool srgb_friendly_pack = pack_channels == 0; + Array formats_imported; + if (compress_mode == COMPRESS_VRAM_COMPRESSED) { - //must import in all formats, in order of priority (so platform choses the best supported one. IE, etc2 over etc). - //Android, GLES 2.x + // Must import in all formats, in order of priority (so platform choses the best supported one. IE, etc2 over etc). + // Android, GLES 2.x const bool is_hdr = (image->get_format() >= Image::FORMAT_RF && image->get_format() <= Image::FORMAT_RGBE9995); bool is_ldr = (image->get_format() >= Image::FORMAT_L8 && image->get_format() <= Image::FORMAT_RGB565); @@ -557,7 +602,7 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String const bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_s3tc"); if (can_bptc) { - //add to the list anyway + // Add to the list anyway. formats_imported.push_back("bptc"); } @@ -566,9 +611,9 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String if (is_hdr && can_compress_hdr) { if (has_alpha) { - //can compress hdr, but hdr with alpha is not compressible + // Can compress HDR, but HDR with alpha is not compressible. if (hdr_compression == 2) { - //but user selected to compress hdr anyway, so force an alpha-less format. + // But user selected to compress HDR anyway, so force an alpha-less format. if (image->get_format() == Image::FORMAT_RGBAF) { image->convert(Image::FORMAT_RGBF); } else if (image->get_format() == Image::FORMAT_RGBAH) { @@ -580,7 +625,7 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String } if (!can_compress_hdr) { - //fallback to RGBE99995 + // Fallback to RGBE99995. if (image->get_format() != Image::FORMAT_RGBE9995) { image->convert(Image::FORMAT_RGBE9995); } @@ -615,16 +660,31 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String EditorNode::add_io_error(vformat(TTR("%s: No suitable desktop VRAM compression algorithm enabled in Project Settings (S3TC or BPTC). This texture may not display correctly on desktop platforms."), p_source_file)); } } else { - //import normally + // Import normally. _save_ctex(image, p_save_path + ".ctex", compress_mode, lossy, Image::COMPRESS_S3TC /*this is ignored */, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel); } + if (editor_image.is_valid()) { + _save_ctex(editor_image, p_save_path + ".editor.ctex", compress_mode, lossy, Image::COMPRESS_S3TC /*this is ignored */, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, false, mipmap_limit, normal_image, roughness_channel); + } + if (r_metadata) { Dictionary metadata; metadata["vram_texture"] = compress_mode == COMPRESS_VRAM_COMPRESSED; if (formats_imported.size()) { metadata["imported_formats"] = formats_imported; } + + if (editor_image.is_valid()) { + metadata["has_editor_variant"] = true; + if (use_editor_scale) { + metadata["editor_scale"] = EDSCALE; + } + if (convert_editor_colors) { + metadata["editor_dark_theme"] = EditorSettings::get_singleton()->is_dark_theme(); + } + } + *r_metadata = metadata; } return OK; @@ -657,13 +717,22 @@ bool ResourceImporterTexture::are_import_settings_valid(const String &p_path) co //will become invalid if formats are missing to import Dictionary metadata = ResourceFormatImporter::get_singleton()->get_resource_metadata(p_path); + if (metadata.has("has_editor_variant")) { + if (metadata.has("editor_scale") && (float)metadata["editor_scale"] != EDSCALE) { + return false; + } + if (metadata.has("editor_dark_theme") && (bool)metadata["editor_dark_theme"] != EditorSettings::get_singleton()->is_dark_theme()) { + return false; + } + } + if (!metadata.has("vram_texture")) { return false; } bool vram = metadata["vram_texture"]; if (!vram) { - return true; //do not care about non vram + return true; // Do not care about non-VRAM. } Vector<String> formats_imported; diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp index f1e6c70549..ca7b2d0015 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.cpp +++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp @@ -101,13 +101,13 @@ void AnimationNodeBlendTreeEditor::_property_changed(const StringName &p_propert undo_redo->create_action(TTR("Parameter Changed:") + " " + String(p_property), UndoRedo::MERGE_ENDS); undo_redo->add_do_property(tree, p_property, p_value); undo_redo->add_undo_property(tree, p_property, tree->get(p_property)); - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); updating = false; } -void AnimationNodeBlendTreeEditor::_update_graph() { +void AnimationNodeBlendTreeEditor::update_graph() { if (updating || blend_tree.is_null()) { return; } @@ -364,8 +364,8 @@ void AnimationNodeBlendTreeEditor::_add_node(int p_idx) { to_slot = -1; } - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); } @@ -416,8 +416,8 @@ void AnimationNodeBlendTreeEditor::_node_dragged(const Vector2 &p_from, const Ve undo_redo->create_action(TTR("Node Moved")); undo_redo->add_do_method(blend_tree.ptr(), "set_node_position", p_which, p_to / EDSCALE); undo_redo->add_undo_method(blend_tree.ptr(), "set_node_position", p_which, p_from / EDSCALE); - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); updating = false; } @@ -437,8 +437,8 @@ void AnimationNodeBlendTreeEditor::_connection_request(const String &p_from, int undo_redo->create_action(TTR("Nodes Connected")); undo_redo->add_do_method(blend_tree.ptr(), "connect_node", p_to, p_to_index, p_from); undo_redo->add_undo_method(blend_tree.ptr(), "disconnect_node", p_to, p_to_index); - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); } @@ -453,8 +453,8 @@ void AnimationNodeBlendTreeEditor::_disconnection_request(const String &p_from, undo_redo->create_action(TTR("Nodes Disconnected")); undo_redo->add_do_method(blend_tree.ptr(), "disconnect_node", p_to, p_to_index); undo_redo->add_undo_method(blend_tree.ptr(), "connect_node", p_to, p_to_index, p_from); - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); updating = false; } @@ -468,8 +468,8 @@ void AnimationNodeBlendTreeEditor::_anim_selected(int p_index, Array p_options, undo_redo->create_action(TTR("Set Animation")); undo_redo->add_do_method(anim.ptr(), "set_animation", option); undo_redo->add_undo_method(anim.ptr(), "set_animation", anim->get_animation()); - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); } @@ -491,8 +491,8 @@ void AnimationNodeBlendTreeEditor::_delete_request(const String &p_which) { } } - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); } @@ -819,7 +819,7 @@ void AnimationNodeBlendTreeEditor::_notification(int p_what) { _update_theme(); if (is_visible_in_tree()) { - _update_graph(); + update_graph(); } } break; @@ -900,13 +900,28 @@ void AnimationNodeBlendTreeEditor::_scroll_changed(const Vector2 &p_scroll) { } void AnimationNodeBlendTreeEditor::_bind_methods() { - ClassDB::bind_method("_update_graph", &AnimationNodeBlendTreeEditor::_update_graph); + ClassDB::bind_method("update_graph", &AnimationNodeBlendTreeEditor::update_graph); ClassDB::bind_method("_update_filters", &AnimationNodeBlendTreeEditor::_update_filters); } AnimationNodeBlendTreeEditor *AnimationNodeBlendTreeEditor::singleton = nullptr; +// AnimationNode's "node_changed" signal means almost update_input. +void AnimationNodeBlendTreeEditor::_node_changed(const StringName &p_node_name) { + // TODO: + // Here is executed during the commit of EditorNode::undo_redo, it is not possible to create an undo_redo action here. + // The disconnect when the number of enabled inputs decreases is done in AnimationNodeBlendTree and update_graph(). + // This means that there is no place to register undo_redo actions. + // In order to implement undo_redo correctly, we may need to implement AnimationNodeEdit such as AnimationTrackKeyEdit + // and add it to _node_selected() with EditorNode::get_singleton()->push_item(AnimationNodeEdit). + update_graph(); +} + void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<AnimationNode> p_node) { + if (blend_tree.is_null()) { + return; + } + String prev_name = blend_tree->get_node_name(p_node); ERR_FAIL_COND(prev_name.is_empty()); GraphNode *gn = Object::cast_to<GraphNode>(graph->get_node(prev_name)); @@ -936,8 +951,8 @@ void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<Anima undo_redo->add_undo_method(blend_tree.ptr(), "rename_node", name, prev_name); undo_redo->add_do_method(AnimationTreeEditor::get_singleton()->get_tree(), "rename_parameter", base_path + prev_name, base_path + name); undo_redo->add_undo_method(AnimationTreeEditor::get_singleton()->get_tree(), "rename_parameter", base_path + name, base_path + prev_name); - undo_redo->add_do_method(this, "_update_graph"); - undo_redo->add_undo_method(this, "_update_graph"); + undo_redo->add_do_method(this, "update_graph"); + undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); updating = false; gn->set_name(new_name); @@ -975,7 +990,7 @@ void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<Anima } } - _update_graph(); // Needed to update the signal connections with the new name. + update_graph(); // Needed to update the signal connections with the new name. } void AnimationNodeBlendTreeEditor::_node_renamed_focus_out(Node *le, Ref<AnimationNode> p_node) { @@ -992,6 +1007,7 @@ bool AnimationNodeBlendTreeEditor::can_edit(const Ref<AnimationNode> &p_node) { void AnimationNodeBlendTreeEditor::edit(const Ref<AnimationNode> &p_node) { if (blend_tree.is_valid()) { + blend_tree->disconnect("node_changed", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_changed)); blend_tree->disconnect("removed_from_graph", callable_mp(this, &AnimationNodeBlendTreeEditor::_removed_from_graph)); } @@ -1004,9 +1020,10 @@ void AnimationNodeBlendTreeEditor::edit(const Ref<AnimationNode> &p_node) { } else { read_only = EditorNode::get_singleton()->is_resource_read_only(blend_tree); + blend_tree->connect("node_changed", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_changed)); blend_tree->connect("removed_from_graph", callable_mp(this, &AnimationNodeBlendTreeEditor::_removed_from_graph)); - _update_graph(); + update_graph(); } add_node->set_disabled(read_only); diff --git a/editor/plugins/animation_blend_tree_editor_plugin.h b/editor/plugins/animation_blend_tree_editor_plugin.h index 30a54930a2..46e0d18c69 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.h +++ b/editor/plugins/animation_blend_tree_editor_plugin.h @@ -71,8 +71,6 @@ class AnimationNodeBlendTreeEditor : public AnimationTreeNodeEditorPlugin { int to_slot = -1; String from_node = ""; - void _update_graph(); - struct AddOption { String name; String type; @@ -95,6 +93,7 @@ class AnimationNodeBlendTreeEditor : public AnimationTreeNodeEditorPlugin { void _node_dragged(const Vector2 &p_from, const Vector2 &p_to, const StringName &p_which); void _node_renamed(const String &p_text, Ref<AnimationNode> p_node); void _node_renamed_focus_out(Node *le, Ref<AnimationNode> p_node); + void _node_changed(const StringName &p_node_name); bool updating; @@ -150,6 +149,8 @@ public: virtual bool can_edit(const Ref<AnimationNode> &p_node) override; virtual void edit(const Ref<AnimationNode> &p_node) override; + void update_graph(); + AnimationNodeBlendTreeEditor(); }; diff --git a/editor/plugins/animation_library_editor.cpp b/editor/plugins/animation_library_editor.cpp index 50ba1a71c0..2d20c0cca7 100644 --- a/editor/plugins/animation_library_editor.cpp +++ b/editor/plugins/animation_library_editor.cpp @@ -198,11 +198,17 @@ void AnimationLibraryEditor::_file_popup_selected(int p_id) { } break; case FILE_MENU_MAKE_LIBRARY_UNIQUE: { StringName lib_name = file_dialog_library; - - Ref<AnimationLibrary> ald = al->duplicate(); - - // TODO: should probably make all foreign animations assigned to this library - // unique too. + List<StringName> animation_list; + + Ref<AnimationLibrary> ald = memnew(AnimationLibrary); + al->get_animation_list(&animation_list); + for (const StringName &animation_name : animation_list) { + Ref<Animation> animation = al->get_animation(animation_name); + if (EditorNode::get_singleton()->is_resource_read_only(animation)) { + animation = animation->duplicate(); + } + ald->add_animation(animation_name, animation); + } Ref<EditorUndoRedoManager> undo_redo = EditorNode::get_singleton()->get_undo_redo(); undo_redo->create_action(vformat(TTR("Make Animation Library Unique: %s"), lib_name)); diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index 5ac63ce4db..5406aada09 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -283,26 +283,7 @@ void AnimationPlayerEditor::_animation_selected(int p_which) { Ref<Animation> anim = player->get_animation(current); { - bool animation_library_is_foreign = false; - if (!anim->get_path().is_resource_file()) { - int srpos = anim->get_path().find("::"); - if (srpos != -1) { - String base = anim->get_path().substr(0, srpos); - if (ResourceLoader::get_resource_type(base) == "PackedScene") { - if (!get_tree()->get_edited_scene_root() || get_tree()->get_edited_scene_root()->get_scene_file_path() != base) { - animation_library_is_foreign = true; - } - } else { - if (FileAccess::exists(base + ".import")) { - animation_library_is_foreign = true; - } - } - } - } else { - if (FileAccess::exists(anim->get_path() + ".import")) { - animation_library_is_foreign = true; - } - } + bool animation_library_is_foreign = EditorNode::get_singleton()->is_resource_read_only(anim); track_editor->set_animation(anim, animation_library_is_foreign); Node *root = player->get_node(player->get_root()); @@ -773,26 +754,7 @@ void AnimationPlayerEditor::_animation_edit() { if (current != String()) { Ref<Animation> anim = player->get_animation(current); - bool animation_library_is_foreign = false; - if (!anim->get_path().is_resource_file()) { - int srpos = anim->get_path().find("::"); - if (srpos != -1) { - String base = anim->get_path().substr(0, srpos); - if (ResourceLoader::get_resource_type(base) == "PackedScene") { - if (!get_tree()->get_edited_scene_root() || get_tree()->get_edited_scene_root()->get_scene_file_path() != base) { - animation_library_is_foreign = true; - } - } else { - if (FileAccess::exists(base + ".import")) { - animation_library_is_foreign = true; - } - } - } - } else { - if (FileAccess::exists(anim->get_path() + ".import")) { - animation_library_is_foreign = true; - } - } + bool animation_library_is_foreign = EditorNode::get_singleton()->is_resource_read_only(anim); track_editor->set_animation(anim, animation_library_is_foreign); @@ -866,25 +828,7 @@ void AnimationPlayerEditor::_update_player() { // Check if the global library is foreign since we want to disable options for adding/remove/renaming animations if it is. Ref<AnimationLibrary> library = player->get_animation_library(K); if (K == "") { - if (!library->get_path().is_resource_file()) { - int srpos = library->get_path().find("::"); - if (srpos != -1) { - String base = library->get_path().substr(0, srpos); - if (ResourceLoader::get_resource_type(base) == "PackedScene") { - if (!get_tree()->get_edited_scene_root() || get_tree()->get_edited_scene_root()->get_scene_file_path() != base) { - foreign_global_anim_lib = true; - } - } else { - if (FileAccess::exists(base + ".import")) { - foreign_global_anim_lib = true; - } - } - } - } else { - if (FileAccess::exists(library->get_path() + ".import")) { - foreign_global_anim_lib = true; - } - } + foreign_global_anim_lib = EditorNode::get_singleton()->is_resource_read_only(library); } List<StringName> animlist; @@ -950,26 +894,7 @@ void AnimationPlayerEditor::_update_player() { String current = animation->get_item_text(animation->get_selected()); Ref<Animation> anim = player->get_animation(current); - bool animation_library_is_foreign = false; - if (!anim->get_path().is_resource_file()) { - int srpos = anim->get_path().find("::"); - if (srpos != -1) { - String base = anim->get_path().substr(0, srpos); - if (ResourceLoader::get_resource_type(base) == "PackedScene") { - if (!get_tree()->get_edited_scene_root() || get_tree()->get_edited_scene_root()->get_scene_file_path() != base) { - animation_library_is_foreign = true; - } - } else { - if (FileAccess::exists(base + ".import")) { - animation_library_is_foreign = true; - } - } - } - } else { - if (FileAccess::exists(anim->get_path() + ".import")) { - animation_library_is_foreign = true; - } - } + bool animation_library_is_foreign = EditorNode::get_singleton()->is_resource_read_only(anim); track_editor->set_animation(anim, animation_library_is_foreign); Node *root = player->get_node(player->get_root()); diff --git a/editor/plugins/animation_tree_editor_plugin.cpp b/editor/plugins/animation_tree_editor_plugin.cpp index ed231c446b..1de4fbaabc 100644 --- a/editor/plugins/animation_tree_editor_plugin.cpp +++ b/editor/plugins/animation_tree_editor_plugin.cpp @@ -50,10 +50,18 @@ #include "scene/scene_string_names.h" void AnimationTreeEditor::edit(AnimationTree *p_tree) { + if (p_tree && !p_tree->is_connected("animation_player_changed", callable_mp(this, &AnimationTreeEditor::_animation_list_changed))) { + p_tree->connect("animation_player_changed", callable_mp(this, &AnimationTreeEditor::_animation_list_changed), CONNECT_DEFERRED); + } + if (tree == p_tree) { return; } + if (tree && tree->is_connected("animation_player_changed", callable_mp(this, &AnimationTreeEditor::_animation_list_changed))) { + tree->disconnect("animation_player_changed", callable_mp(this, &AnimationTreeEditor::_animation_list_changed)); + } + tree = p_tree; Vector<String> path; @@ -73,6 +81,13 @@ void AnimationTreeEditor::_path_button_pressed(int p_path) { } } +void AnimationTreeEditor::_animation_list_changed() { + AnimationNodeBlendTreeEditor *bte = AnimationNodeBlendTreeEditor::get_singleton(); + if (bte) { + bte->update_graph(); + } +} + void AnimationTreeEditor::_update_path() { while (path_hb->get_child_count() > 1) { memdelete(path_hb->get_child(1)); diff --git a/editor/plugins/animation_tree_editor_plugin.h b/editor/plugins/animation_tree_editor_plugin.h index a33d97f62f..9ef9fff8cd 100644 --- a/editor/plugins/animation_tree_editor_plugin.h +++ b/editor/plugins/animation_tree_editor_plugin.h @@ -65,6 +65,7 @@ class AnimationTreeEditor : public VBoxContainer { ObjectID current_root; void _path_button_pressed(int p_path); + void _animation_list_changed(); static Vector<String> get_animation_list(); diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index c79b43de09..3c9486cdaa 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -321,7 +321,7 @@ void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int status->set_text(TTR("Can't connect.")); } break; case HTTPRequest::RESULT_CANT_CONNECT: - case HTTPRequest::RESULT_SSL_HANDSHAKE_ERROR: { + case HTTPRequest::RESULT_TLS_HANDSHAKE_ERROR: { error_text = TTR("Can't connect to host:") + " " + host; status->set_text(TTR("Can't connect.")); } break; @@ -574,7 +574,7 @@ void EditorAssetLibrary::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: { add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("AssetLib"))); - error_label->raise(); + error_label->move_to_front(); } break; case NOTIFICATION_ENTER_TREE: @@ -648,7 +648,7 @@ void EditorAssetLibrary::shortcut_input(const Ref<InputEvent> &p_event) { const Ref<InputEventKey> key = p_event; if (key.is_valid() && key->is_pressed()) { - if (key->get_keycode_with_modifiers() == (KeyModifierMask::CMD | Key::F) && is_visible_in_tree()) { + if (key->is_match(InputEventKey::create_reference(KeyModifierMask::CMD_OR_CTRL | Key::F)) && is_visible_in_tree()) { filter->grab_focus(); filter->select_all(); accept_event(); @@ -1099,7 +1099,7 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const case HTTPRequest::RESULT_CHUNKED_BODY_SIZE_MISMATCH: { error_label->set_text(TTR("Connection error, please try again.")); } break; - case HTTPRequest::RESULT_SSL_HANDSHAKE_ERROR: + case HTTPRequest::RESULT_TLS_HANDSHAKE_ERROR: case HTTPRequest::RESULT_CANT_CONNECT: { error_label->set_text(TTR("Can't connect to host:") + " " + host); } break; diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index c87da34143..8dc08e3a93 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -1394,7 +1394,7 @@ bool CanvasItemEditor::_gui_input_rotate(const Ref<InputEvent> &p_event) { // Start rotation if (drag_type == DRAG_NONE) { if (b.is_valid() && b->get_button_index() == MouseButton::LEFT && b->is_pressed()) { - if ((b->is_command_pressed() && !b->is_alt_pressed() && tool == TOOL_SELECT) || tool == TOOL_ROTATE) { + if ((b->is_command_or_control_pressed() && !b->is_alt_pressed() && tool == TOOL_SELECT) || tool == TOOL_ROTATE) { List<CanvasItem *> selection = _get_edited_canvas_items(); // Remove not movable nodes @@ -4715,12 +4715,10 @@ void CanvasItemEditor::_reset_drag() { } void CanvasItemEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_update_override_camera_button", "game_running"), &CanvasItemEditor::_update_override_camera_button); ClassDB::bind_method("_get_editor_data", &CanvasItemEditor::_get_editor_data); ClassDB::bind_method(D_METHOD("set_state"), &CanvasItemEditor::set_state); ClassDB::bind_method(D_METHOD("update_viewport"), &CanvasItemEditor::update_viewport); - ClassDB::bind_method(D_METHOD("_zoom_on_position"), &CanvasItemEditor::_zoom_on_position); ClassDB::bind_method("_set_owner_for_node_and_children", &CanvasItemEditor::_set_owner_for_node_and_children); @@ -4984,8 +4982,8 @@ CanvasItemEditor::CanvasItemEditor() { SceneTreeDock::get_singleton()->connect("node_created", callable_mp(this, &CanvasItemEditor::_node_created)); SceneTreeDock::get_singleton()->connect("add_node_used", callable_mp(this, &CanvasItemEditor::_reset_create_position)); - EditorNode::get_singleton()->call_deferred(SNAME("connect"), "play_pressed", Callable(this, "_update_override_camera_button").bind(true)); - EditorNode::get_singleton()->call_deferred(SNAME("connect"), "stop_pressed", Callable(this, "_update_override_camera_button").bind(false)); + EditorNode::get_singleton()->call_deferred(SNAME("connect"), callable_mp(this, &CanvasItemEditor::_update_override_camera_button).bind(true)); + EditorNode::get_singleton()->call_deferred(SNAME("connect"), "stop_pressed", callable_mp(this, &CanvasItemEditor::_update_override_camera_button).bind(false)); // A fluid container for all toolbars. HFlowContainer *main_flow = memnew(HFlowContainer); @@ -5043,7 +5041,7 @@ CanvasItemEditor::CanvasItemEditor() { { int32_t(KeyModifierMask::SHIFT | Key::KEY_1), int32_t(KeyModifierMask::SHIFT | Key::KP_1) }); ED_SHORTCUT_ARRAY("canvas_item_editor/zoom_100_percent", TTR("Zoom to 100%"), - { int32_t(Key::KEY_1), int32_t(KeyModifierMask::CMD | Key::KEY_0), int32_t(Key::KP_1), int32_t(KeyModifierMask::CMD | Key::KP_0) }); + { int32_t(Key::KEY_1), int32_t(KeyModifierMask::CMD_OR_CTRL | Key::KEY_0), int32_t(Key::KP_1), int32_t(KeyModifierMask::CMD_OR_CTRL | Key::KP_0) }); ED_SHORTCUT_ARRAY("canvas_item_editor/zoom_200_percent", TTR("Zoom to 200%"), { int32_t(Key::KEY_2), int32_t(Key::KP_2) }); @@ -5102,7 +5100,7 @@ CanvasItemEditor::CanvasItemEditor() { select_button->set_pressed(true); select_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/select_mode", TTR("Select Mode"), Key::Q)); select_button->set_shortcut_context(this); - select_button->set_tooltip_text(keycode_get_string((Key)KeyModifierMask::CMD) + TTR("Drag: Rotate selected node around pivot.") + "\n" + TTR("Alt+Drag: Move selected node.") + "\n" + keycode_get_string((Key)KeyModifierMask::CMD) + TTR("Alt+Drag: Scale selected node.") + "\n" + TTR("V: Set selected node's pivot position.") + "\n" + TTR("Alt+RMB: Show list of all nodes at position clicked, including locked.") + "\n" + keycode_get_string((Key)KeyModifierMask::CMD) + TTR("RMB: Add node at position clicked.")); + select_button->set_tooltip_text(keycode_get_string((Key)KeyModifierMask::CMD_OR_CTRL) + TTR("Drag: Rotate selected node around pivot.") + "\n" + TTR("Alt+Drag: Move selected node.") + "\n" + keycode_get_string((Key)KeyModifierMask::CMD_OR_CTRL) + TTR("Alt+Drag: Scale selected node.") + "\n" + TTR("V: Set selected node's pivot position.") + "\n" + TTR("Alt+RMB: Show list of all nodes at position clicked, including locked.") + "\n" + keycode_get_string((Key)KeyModifierMask::CMD_OR_CTRL) + TTR("RMB: Add node at position clicked.")); main_menu_hbox->add_child(memnew(VSeparator)); @@ -5227,7 +5225,7 @@ CanvasItemEditor::CanvasItemEditor() { lock_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback).bind(LOCK_SELECTED)); lock_button->set_tooltip_text(TTR("Lock selected node, preventing selection and movement.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - lock_button->set_shortcut(ED_SHORTCUT("editor/lock_selected_nodes", TTR("Lock Selected Node(s)"), KeyModifierMask::CMD | Key::L)); + lock_button->set_shortcut(ED_SHORTCUT("editor/lock_selected_nodes", TTR("Lock Selected Node(s)"), KeyModifierMask::CMD_OR_CTRL | Key::L)); unlock_button = memnew(Button); unlock_button->set_flat(true); @@ -5235,7 +5233,7 @@ CanvasItemEditor::CanvasItemEditor() { unlock_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback).bind(UNLOCK_SELECTED)); unlock_button->set_tooltip_text(TTR("Unlock selected node, allowing selection and movement.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - unlock_button->set_shortcut(ED_SHORTCUT("editor/unlock_selected_nodes", TTR("Unlock Selected Node(s)"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::L)); + unlock_button->set_shortcut(ED_SHORTCUT("editor/unlock_selected_nodes", TTR("Unlock Selected Node(s)"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::L)); group_button = memnew(Button); group_button->set_flat(true); @@ -5243,7 +5241,7 @@ CanvasItemEditor::CanvasItemEditor() { group_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback).bind(GROUP_SELECTED)); group_button->set_tooltip_text(TTR("Make selected node's children not selectable.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - group_button->set_shortcut(ED_SHORTCUT("editor/group_selected_nodes", TTR("Group Selected Node(s)"), KeyModifierMask::CMD | Key::G)); + group_button->set_shortcut(ED_SHORTCUT("editor/group_selected_nodes", TTR("Group Selected Node(s)"), KeyModifierMask::CMD_OR_CTRL | Key::G)); ungroup_button = memnew(Button); ungroup_button->set_flat(true); @@ -5251,7 +5249,7 @@ CanvasItemEditor::CanvasItemEditor() { ungroup_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback).bind(UNGROUP_SELECTED)); ungroup_button->set_tooltip_text(TTR("Make selected node's children selectable.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - ungroup_button->set_shortcut(ED_SHORTCUT("editor/ungroup_selected_nodes", TTR("Ungroup Selected Node(s)"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::G)); + ungroup_button->set_shortcut(ED_SHORTCUT("editor/ungroup_selected_nodes", TTR("Ungroup Selected Node(s)"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::G)); main_menu_hbox->add_child(memnew(VSeparator)); @@ -5265,7 +5263,7 @@ CanvasItemEditor::CanvasItemEditor() { p->set_hide_on_checkable_item_selection(false); p->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_show_bones", TTR("Show Bones")), SKELETON_SHOW_BONES); p->add_separator(); - p->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_make_bones", TTR("Make Bone2D Node(s) from Node(s)"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::B), SKELETON_MAKE_BONES); + p->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_make_bones", TTR("Make Bone2D Node(s) from Node(s)"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::B), SKELETON_MAKE_BONES); p->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback)); main_menu_hbox->add_child(memnew(VSeparator)); @@ -5299,7 +5297,7 @@ CanvasItemEditor::CanvasItemEditor() { grid_menu->add_radio_check_item(TTR("Show When Snapping"), GRID_VISIBILITY_SHOW_WHEN_SNAPPING); grid_menu->add_radio_check_item(TTR("Hide"), GRID_VISIBILITY_HIDE); grid_menu->add_separator(); - grid_menu->add_shortcut(ED_SHORTCUT("canvas_item_editor/toggle_grid", TTR("Toggle Grid"), KeyModifierMask::CMD | Key::APOSTROPHE)); + grid_menu->add_shortcut(ED_SHORTCUT("canvas_item_editor/toggle_grid", TTR("Toggle Grid"), KeyModifierMask::CMD_OR_CTRL | Key::APOSTROPHE)); p->add_child(grid_menu); p->add_submenu_item(TTR("Grid"), "GridMenu"); @@ -5316,7 +5314,7 @@ CanvasItemEditor::CanvasItemEditor() { p->add_shortcut(ED_SHORTCUT("canvas_item_editor/frame_selection", TTR("Frame Selection"), KeyModifierMask::SHIFT | Key::F), VIEW_FRAME_TO_SELECTION); p->add_shortcut(ED_SHORTCUT("canvas_item_editor/clear_guides", TTR("Clear Guides")), CLEAR_GUIDES); p->add_separator(); - p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/preview_canvas_scale", TTR("Preview Canvas Scale"), KeyModifierMask::SHIFT | KeyModifierMask::CMD | Key::P), PREVIEW_CANVAS_SCALE); + p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/preview_canvas_scale", TTR("Preview Canvas Scale"), KeyModifierMask::SHIFT | KeyModifierMask::CMD_OR_CTRL | Key::P), PREVIEW_CANVAS_SCALE); main_menu_hbox->add_child(memnew(VSeparator)); @@ -5386,7 +5384,7 @@ CanvasItemEditor::CanvasItemEditor() { p = animation_menu->get_popup(); p->add_shortcut(ED_GET_SHORTCUT("canvas_item_editor/anim_insert_key"), ANIM_INSERT_KEY); - p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_insert_key_existing_tracks", TTR("Insert Key (Existing Tracks)"), KeyModifierMask::CMD + Key::INSERT), ANIM_INSERT_KEY_EXISTING); + p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_insert_key_existing_tracks", TTR("Insert Key (Existing Tracks)"), KeyModifierMask::CMD_OR_CTRL + Key::INSERT), ANIM_INSERT_KEY_EXISTING); p->add_separator(); p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_copy_pose", TTR("Copy Pose")), ANIM_COPY_POSE); p->add_shortcut(ED_SHORTCUT("canvas_item_editor/anim_paste_pose", TTR("Paste Pose")), ANIM_PASTE_POSE); @@ -5883,9 +5881,6 @@ void CanvasItemEditorViewport::_notification(int p_what) { } } -void CanvasItemEditorViewport::_bind_methods() { -} - CanvasItemEditorViewport::CanvasItemEditorViewport(CanvasItemEditor *p_canvas_item_editor) { default_texture_node_type = "Sprite2D"; // Node2D diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 0a840d6fd6..b731d3cc7d 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -618,8 +618,6 @@ class CanvasItemEditorViewport : public Control { void _show_resource_type_selector(); void _update_theme(); - static void _bind_methods(); - protected: void _notification(int p_what); diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 13fd406e87..33aad0ac61 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -1360,8 +1360,8 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { if (discard == EditorPlugin::AFTER_GUI_INPUT_STOP) { return; } - if (discard == EditorPlugin::AFTER_GUI_INPUT_DESELECT) { - after = EditorPlugin::AFTER_GUI_INPUT_DESELECT; + if (discard == EditorPlugin::AFTER_GUI_INPUT_CUSTOM) { + after = EditorPlugin::AFTER_GUI_INPUT_CUSTOM; } } } @@ -1373,8 +1373,8 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { if (discard == EditorPlugin::AFTER_GUI_INPUT_STOP) { return; } - if (discard == EditorPlugin::AFTER_GUI_INPUT_DESELECT) { - after = EditorPlugin::AFTER_GUI_INPUT_DESELECT; + if (discard == EditorPlugin::AFTER_GUI_INPUT_CUSTOM) { + after = EditorPlugin::AFTER_GUI_INPUT_CUSTOM; } } } @@ -1586,7 +1586,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { clicked = ObjectID(); - if ((spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT && b->is_command_pressed()) || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE) { + if ((spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT && b->is_command_or_control_pressed()) || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE) { begin_transform(TRANSFORM_ROTATE, false); break; } @@ -1601,7 +1601,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { break; } - if (after != EditorPlugin::AFTER_GUI_INPUT_DESELECT) { + if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM) { //clicking is always deferred to either move or release clicked = _select_ray(b->get_position()); selection_in_progress = true; @@ -1622,7 +1622,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { break; } - if (after != EditorPlugin::AFTER_GUI_INPUT_DESELECT) { + if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM) { selection_in_progress = false; if (clicked.is_valid()) { @@ -4817,7 +4817,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p preview_camera = memnew(CheckBox); preview_camera->set_text(TTR("Preview")); - preview_camera->set_shortcut(ED_SHORTCUT("spatial_editor/toggle_camera_preview", TTR("Toggle Camera Preview"), KeyModifierMask::CMD | Key::P)); + preview_camera->set_shortcut(ED_SHORTCUT("spatial_editor/toggle_camera_preview", TTR("Toggle Camera Preview"), KeyModifierMask::CMD_OR_CTRL | Key::P)); vbox->add_child(preview_camera); preview_camera->set_h_size_flags(0); preview_camera->hide(); @@ -5516,8 +5516,8 @@ Dictionary Node3DEditor::get_state() const { pd["sun_color"] = sun_color->get_pick_color(); pd["sun_energy"] = sun_energy->get_value(); - pd["sun_disabled"] = sun_button->is_pressed(); - pd["environ_disabled"] = environ_button->is_pressed(); + pd["sun_enabled"] = sun_button->is_pressed(); + pd["environ_enabled"] = environ_button->is_pressed(); d["preview_sun_env"] = pd; } @@ -5648,8 +5648,8 @@ void Node3DEditor::set_state(const Dictionary &p_state) { sun_color->set_pick_color(pd["sun_color"]); sun_energy->set_value(pd["sun_energy"]); - sun_button->set_pressed(pd["sun_disabled"]); - environ_button->set_pressed(pd["environ_disabled"]); + sun_button->set_pressed(pd["sun_enabled"]); + environ_button->set_pressed(pd["environ_enabled"]); sun_environ_updating = false; @@ -5657,8 +5657,8 @@ void Node3DEditor::set_state(const Dictionary &p_state) { _update_preview_environment(); } else { _load_default_preview_settings(); - sun_button->set_pressed(false); - environ_button->set_pressed(false); + sun_button->set_pressed(true); + environ_button->set_pressed(true); _preview_settings_changed(); _update_preview_environment(); } @@ -7159,8 +7159,8 @@ void Node3DEditor::_update_theme() { view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), get_theme_icon(SNAME("Panels3Alt"), SNAME("EditorIcons"))); view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), get_theme_icon(SNAME("Panels4"), SNAME("EditorIcons"))); - sun_button->set_icon(get_theme_icon(SNAME("DirectionalLight3D"), SNAME("EditorIcons"))); - environ_button->set_icon(get_theme_icon(SNAME("WorldEnvironment"), SNAME("EditorIcons"))); + sun_button->set_icon(get_theme_icon(SNAME("PreviewSun"), SNAME("EditorIcons"))); + environ_button->set_icon(get_theme_icon(SNAME("PreviewEnvironment"), SNAME("EditorIcons"))); sun_environ_settings->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); sun_title->add_theme_font_override("font", get_theme_font(SNAME("title_font"), SNAME("Window"))); @@ -7636,7 +7636,7 @@ void Node3DEditor::_load_default_preview_settings() { } void Node3DEditor::_update_preview_environment() { - bool disable_light = directional_light_count > 0 || sun_button->is_pressed(); + bool disable_light = directional_light_count > 0 || !sun_button->is_pressed(); sun_button->set_disabled(directional_light_count > 0); @@ -7645,6 +7645,7 @@ void Node3DEditor::_update_preview_environment() { preview_sun->get_parent()->remove_child(preview_sun); sun_state->show(); sun_vb->hide(); + preview_sun_dangling = true; } if (directional_light_count > 0) { @@ -7658,13 +7659,14 @@ void Node3DEditor::_update_preview_environment() { add_child(preview_sun, true); sun_state->hide(); sun_vb->show(); + preview_sun_dangling = false; } } sun_angle_altitude->set_value(-Math::rad_to_deg(sun_rotation.x)); sun_angle_azimuth->set_value(180.0 - Math::rad_to_deg(sun_rotation.y)); - bool disable_env = world_env_count > 0 || environ_button->is_pressed(); + bool disable_env = world_env_count > 0 || !environ_button->is_pressed(); environ_button->set_disabled(world_env_count > 0); @@ -7673,6 +7675,7 @@ void Node3DEditor::_update_preview_environment() { preview_environment->get_parent()->remove_child(preview_environment); environ_state->show(); environ_vb->hide(); + preview_env_dangling = true; } if (world_env_count > 0) { environ_state->set_text(TTR("Scene contains\nWorldEnvironment.\nPreview disabled.")); @@ -7685,6 +7688,7 @@ void Node3DEditor::_update_preview_environment() { add_child(preview_environment); environ_state->hide(); environ_vb->show(); + preview_env_dangling = false; } } } @@ -7751,7 +7755,7 @@ Node3DEditor::Node3DEditor() { tool_button[TOOL_MODE_SELECT]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed).bind(MENU_TOOL_SELECT)); tool_button[TOOL_MODE_SELECT]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_select", TTR("Select Mode"), Key::Q)); tool_button[TOOL_MODE_SELECT]->set_shortcut_context(this); - tool_button[TOOL_MODE_SELECT]->set_tooltip_text(keycode_get_string((Key)KeyModifierMask::CMD) + TTR("Drag: Rotate selected node around pivot.") + "\n" + TTR("Alt+RMB: Show list of all nodes at position clicked, including locked.")); + tool_button[TOOL_MODE_SELECT]->set_tooltip_text(keycode_get_string((Key)KeyModifierMask::CMD_OR_CTRL) + TTR("Drag: Rotate selected node around pivot.") + "\n" + TTR("Alt+RMB: Show list of all nodes at position clicked, including locked.")); main_menu_hbox->add_child(memnew(VSeparator)); tool_button[TOOL_MODE_MOVE] = memnew(Button); @@ -7794,7 +7798,7 @@ Node3DEditor::Node3DEditor() { tool_button[TOOL_LOCK_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed).bind(MENU_LOCK_SELECTED)); tool_button[TOOL_LOCK_SELECTED]->set_tooltip_text(TTR("Lock selected node, preventing selection and movement.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - tool_button[TOOL_LOCK_SELECTED]->set_shortcut(ED_SHORTCUT("editor/lock_selected_nodes", TTR("Lock Selected Node(s)"), KeyModifierMask::CMD | Key::L)); + tool_button[TOOL_LOCK_SELECTED]->set_shortcut(ED_SHORTCUT("editor/lock_selected_nodes", TTR("Lock Selected Node(s)"), KeyModifierMask::CMD_OR_CTRL | Key::L)); tool_button[TOOL_UNLOCK_SELECTED] = memnew(Button); main_menu_hbox->add_child(tool_button[TOOL_UNLOCK_SELECTED]); @@ -7802,7 +7806,7 @@ Node3DEditor::Node3DEditor() { tool_button[TOOL_UNLOCK_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed).bind(MENU_UNLOCK_SELECTED)); tool_button[TOOL_UNLOCK_SELECTED]->set_tooltip_text(TTR("Unlock selected node, allowing selection and movement.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - tool_button[TOOL_UNLOCK_SELECTED]->set_shortcut(ED_SHORTCUT("editor/unlock_selected_nodes", TTR("Unlock Selected Node(s)"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::L)); + tool_button[TOOL_UNLOCK_SELECTED]->set_shortcut(ED_SHORTCUT("editor/unlock_selected_nodes", TTR("Unlock Selected Node(s)"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::L)); tool_button[TOOL_GROUP_SELECTED] = memnew(Button); main_menu_hbox->add_child(tool_button[TOOL_GROUP_SELECTED]); @@ -7810,7 +7814,7 @@ Node3DEditor::Node3DEditor() { tool_button[TOOL_GROUP_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed).bind(MENU_GROUP_SELECTED)); tool_button[TOOL_GROUP_SELECTED]->set_tooltip_text(TTR("Make selected node's children not selectable.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - tool_button[TOOL_GROUP_SELECTED]->set_shortcut(ED_SHORTCUT("editor/group_selected_nodes", TTR("Group Selected Node(s)"), KeyModifierMask::CMD | Key::G)); + tool_button[TOOL_GROUP_SELECTED]->set_shortcut(ED_SHORTCUT("editor/group_selected_nodes", TTR("Group Selected Node(s)"), KeyModifierMask::CMD_OR_CTRL | Key::G)); tool_button[TOOL_UNGROUP_SELECTED] = memnew(Button); main_menu_hbox->add_child(tool_button[TOOL_UNGROUP_SELECTED]); @@ -7818,7 +7822,7 @@ Node3DEditor::Node3DEditor() { tool_button[TOOL_UNGROUP_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed).bind(MENU_UNGROUP_SELECTED)); tool_button[TOOL_UNGROUP_SELECTED]->set_tooltip_text(TTR("Make selected node's children selectable.")); // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. - tool_button[TOOL_UNGROUP_SELECTED]->set_shortcut(ED_SHORTCUT("editor/ungroup_selected_nodes", TTR("Ungroup Selected Node(s)"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::G)); + tool_button[TOOL_UNGROUP_SELECTED]->set_shortcut(ED_SHORTCUT("editor/ungroup_selected_nodes", TTR("Ungroup Selected Node(s)"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::G)); main_menu_hbox->add_child(memnew(VSeparator)); @@ -7854,7 +7858,8 @@ Node3DEditor::Node3DEditor() { sun_button->set_toggle_mode(true); sun_button->set_flat(true); sun_button->connect("pressed", callable_mp(this, &Node3DEditor::_update_preview_environment), CONNECT_DEFERRED); - sun_button->set_disabled(true); + // Preview is enabled by default - ensure this applies on editor startup when there is no state yet. + sun_button->set_pressed(true); main_menu_hbox->add_child(sun_button); @@ -7863,7 +7868,8 @@ Node3DEditor::Node3DEditor() { environ_button->set_toggle_mode(true); environ_button->set_flat(true); environ_button->connect("pressed", callable_mp(this, &Node3DEditor::_update_preview_environment), CONNECT_DEFERRED); - environ_button->set_disabled(true); + // Preview is enabled by default - ensure this applies on editor startup when there is no state yet. + environ_button->set_pressed(true); main_menu_hbox->add_child(environ_button); @@ -7895,12 +7901,12 @@ Node3DEditor::Node3DEditor() { ED_SHORTCUT("spatial_editor/insert_anim_key", TTR("Insert Animation Key"), Key::K); ED_SHORTCUT("spatial_editor/focus_origin", TTR("Focus Origin"), Key::O); ED_SHORTCUT("spatial_editor/focus_selection", TTR("Focus Selection"), Key::F); - ED_SHORTCUT("spatial_editor/align_transform_with_view", TTR("Align Transform with View"), KeyModifierMask::ALT + KeyModifierMask::CMD + Key::M); - ED_SHORTCUT("spatial_editor/align_rotation_with_view", TTR("Align Rotation with View"), KeyModifierMask::ALT + KeyModifierMask::CMD + Key::F); + ED_SHORTCUT("spatial_editor/align_transform_with_view", TTR("Align Transform with View"), KeyModifierMask::ALT + KeyModifierMask::CMD_OR_CTRL + Key::M); + ED_SHORTCUT("spatial_editor/align_rotation_with_view", TTR("Align Rotation with View"), KeyModifierMask::ALT + KeyModifierMask::CMD_OR_CTRL + Key::F); ED_SHORTCUT("spatial_editor/freelook_toggle", TTR("Toggle Freelook"), KeyModifierMask::SHIFT + Key::F); - ED_SHORTCUT("spatial_editor/decrease_fov", TTR("Decrease Field of View"), KeyModifierMask::CMD + Key::EQUAL); // Usually direct access key for `KEY_PLUS`. - ED_SHORTCUT("spatial_editor/increase_fov", TTR("Increase Field of View"), KeyModifierMask::CMD + Key::MINUS); - ED_SHORTCUT("spatial_editor/reset_fov", TTR("Reset Field of View to Default"), KeyModifierMask::CMD + Key::KEY_0); + ED_SHORTCUT("spatial_editor/decrease_fov", TTR("Decrease Field of View"), KeyModifierMask::CMD_OR_CTRL + Key::EQUAL); // Usually direct access key for `KEY_PLUS`. + ED_SHORTCUT("spatial_editor/increase_fov", TTR("Increase Field of View"), KeyModifierMask::CMD_OR_CTRL + Key::MINUS); + ED_SHORTCUT("spatial_editor/reset_fov", TTR("Reset Field of View to Default"), KeyModifierMask::CMD_OR_CTRL + Key::KEY_0); PopupMenu *p; @@ -7940,12 +7946,12 @@ Node3DEditor::Node3DEditor() { accept = memnew(AcceptDialog); EditorNode::get_singleton()->get_gui_base()->add_child(accept); - p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/1_viewport", TTR("1 Viewport"), KeyModifierMask::CMD + Key::KEY_1), MENU_VIEW_USE_1_VIEWPORT); - p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports", TTR("2 Viewports"), KeyModifierMask::CMD + Key::KEY_2), MENU_VIEW_USE_2_VIEWPORTS); - p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports_alt", TTR("2 Viewports (Alt)"), KeyModifierMask::ALT + KeyModifierMask::CMD + Key::KEY_2), MENU_VIEW_USE_2_VIEWPORTS_ALT); - p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports", TTR("3 Viewports"), KeyModifierMask::CMD + Key::KEY_3), MENU_VIEW_USE_3_VIEWPORTS); - p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports_alt", TTR("3 Viewports (Alt)"), KeyModifierMask::ALT + KeyModifierMask::CMD + Key::KEY_3), MENU_VIEW_USE_3_VIEWPORTS_ALT); - p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/4_viewports", TTR("4 Viewports"), KeyModifierMask::CMD + Key::KEY_4), MENU_VIEW_USE_4_VIEWPORTS); + p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/1_viewport", TTR("1 Viewport"), KeyModifierMask::CMD_OR_CTRL + Key::KEY_1), MENU_VIEW_USE_1_VIEWPORT); + p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports", TTR("2 Viewports"), KeyModifierMask::CMD_OR_CTRL + Key::KEY_2), MENU_VIEW_USE_2_VIEWPORTS); + p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/2_viewports_alt", TTR("2 Viewports (Alt)"), KeyModifierMask::ALT + KeyModifierMask::CMD_OR_CTRL + Key::KEY_2), MENU_VIEW_USE_2_VIEWPORTS_ALT); + p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports", TTR("3 Viewports"), KeyModifierMask::CMD_OR_CTRL + Key::KEY_3), MENU_VIEW_USE_3_VIEWPORTS); + p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/3_viewports_alt", TTR("3 Viewports (Alt)"), KeyModifierMask::ALT + KeyModifierMask::CMD_OR_CTRL + Key::KEY_3), MENU_VIEW_USE_3_VIEWPORTS_ALT); + p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/4_viewports", TTR("4 Viewports"), KeyModifierMask::CMD_OR_CTRL + Key::KEY_4), MENU_VIEW_USE_4_VIEWPORTS); p->add_separator(); p->add_submenu_item(TTR("Gizmos"), "GizmosMenu"); @@ -8148,7 +8154,7 @@ Node3DEditor::Node3DEditor() { CenterContainer *sun_direction_center = memnew(CenterContainer); sun_direction = memnew(Control); - sun_direction->set_custom_minimum_size(Size2i(128, 128) * EDSCALE); + sun_direction->set_custom_minimum_size(Size2(128, 128) * EDSCALE); sun_direction_center->add_child(sun_direction); sun_vb->add_margin_child(TTR("Sun Direction"), sun_direction_center); sun_direction->connect("gui_input", callable_mp(this, &Node3DEditor::_sun_direction_input)); @@ -8329,6 +8335,12 @@ void fragment() { } Node3DEditor::~Node3DEditor() { memdelete(preview_node); + if (preview_sun_dangling && preview_sun) { + memdelete(preview_sun); + } + if (preview_env_dangling && preview_environment) { + memdelete(preview_environment); + } } void Node3DEditorPlugin::make_visible(bool p_visible) { diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index 580cb878ce..c76f534c22 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -763,7 +763,9 @@ private: Button *sun_environ_settings = nullptr; DirectionalLight3D *preview_sun = nullptr; + bool preview_sun_dangling = false; WorldEnvironment *preview_environment = nullptr; + bool preview_env_dangling = false; Ref<Environment> environment; Ref<CameraAttributesPhysical> camera_attributes; Ref<ProceduralSkyMaterial> sky_material; diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp index dc6dfd81c2..c8bd4c1d05 100644 --- a/editor/plugins/path_2d_editor_plugin.cpp +++ b/editor/plugins/path_2d_editor_plugin.cpp @@ -150,7 +150,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } // Check for point creation. - if (mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && ((mb->is_command_pressed() && mode == MODE_EDIT) || mode == MODE_CREATE)) { + if (mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && ((mb->is_command_or_control_pressed() && mode == MODE_EDIT) || mode == MODE_CREATE)) { Ref<Curve2D> curve = node->get_curve(); undo_redo->create_action(TTR("Add Point to Curve")); @@ -537,7 +537,7 @@ Path2DEditor::Path2DEditor() { curve_edit->set_flat(true); curve_edit->set_toggle_mode(true); curve_edit->set_focus_mode(Control::FOCUS_NONE); - curve_edit->set_tooltip_text(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string((Key)KeyModifierMask::CMD) + TTR("Click: Add Point") + "\n" + TTR("Left Click: Split Segment (in curve)") + "\n" + TTR("Right Click: Delete Point")); + curve_edit->set_tooltip_text(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string((Key)KeyModifierMask::CMD_OR_CTRL) + TTR("Click: Add Point") + "\n" + TTR("Left Click: Split Segment (in curve)") + "\n" + TTR("Right Click: Delete Point")); curve_edit->connect("pressed", callable_mp(this, &Path2DEditor::_mode_selected).bind(MODE_EDIT)); base_hb->add_child(curve_edit); diff --git a/editor/plugins/path_3d_editor_plugin.cpp b/editor/plugins/path_3d_editor_plugin.cpp index 1029b06638..adfaf11264 100644 --- a/editor/plugins/path_3d_editor_plugin.cpp +++ b/editor/plugins/path_3d_editor_plugin.cpp @@ -597,7 +597,7 @@ Path3DEditorPlugin::Path3DEditorPlugin() { curve_edit->set_toggle_mode(true); curve_edit->hide(); curve_edit->set_focus_mode(Control::FOCUS_NONE); - curve_edit->set_tooltip_text(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string((Key)KeyModifierMask::CMD) + TTR("Click: Add Point") + "\n" + TTR("Right Click: Delete Point")); + curve_edit->set_tooltip_text(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string((Key)KeyModifierMask::CMD_OR_CTRL) + TTR("Click: Add Point") + "\n" + TTR("Right Click: Delete Point")); Node3DEditor::get_singleton()->add_control_to_menu_panel(curve_edit); curve_create = memnew(Button); diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index 328ad0ccbc..58a3a07c43 100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp @@ -627,11 +627,11 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { } if (uv_move_current == UV_MODE_EDIT_POINT) { - if (mb->is_shift_pressed() && mb->is_command_pressed()) { + if (mb->is_shift_pressed() && mb->is_command_or_control_pressed()) { uv_move_current = UV_MODE_SCALE; } else if (mb->is_shift_pressed()) { uv_move_current = UV_MODE_MOVE; - } else if (mb->is_command_pressed()) { + } else if (mb->is_command_or_control_pressed()) { uv_move_current = UV_MODE_ROTATE; } } diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 953f72bd05..0a111aeb49 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -3363,15 +3363,15 @@ void ScriptEditor::_update_selected_editor_menu() { EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_current_tab_control()); script_search_menu->get_popup()->clear(); if (eh) { - script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find", TTR("Find..."), KeyModifierMask::CMD | Key::F), HELP_SEARCH_FIND); + script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find", TTR("Find..."), KeyModifierMask::CMD_OR_CTRL | Key::F), HELP_SEARCH_FIND); script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_next", TTR("Find Next"), Key::F3), HELP_SEARCH_FIND_NEXT); script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_previous", TTR("Find Previous"), KeyModifierMask::SHIFT | Key::F3), HELP_SEARCH_FIND_PREVIOUS); script_search_menu->get_popup()->add_separator(); - script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_in_files", TTR("Find in Files"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F), SEARCH_IN_FILES); + script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_in_files", TTR("Find in Files"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::F), SEARCH_IN_FILES); script_search_menu->show(); } else { if (tab_container->get_tab_count() == 0) { - script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_in_files", TTR("Find in Files"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F), SEARCH_IN_FILES); + script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_in_files", TTR("Find in Files"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::F), SEARCH_IN_FILES); script_search_menu->show(); } else { script_search_menu->hide(); @@ -3757,8 +3757,8 @@ ScriptEditor::ScriptEditor() { ED_SHORTCUT("script_editor/window_move_up", TTR("Move Up"), KeyModifierMask::SHIFT | KeyModifierMask::ALT | Key::UP); ED_SHORTCUT("script_editor/window_move_down", TTR("Move Down"), KeyModifierMask::SHIFT | KeyModifierMask::ALT | Key::DOWN); // FIXME: These should be `Key::GREATER` and `Key::LESS` but those don't work. - ED_SHORTCUT("script_editor/next_script", TTR("Next Script"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::PERIOD); - ED_SHORTCUT("script_editor/prev_script", TTR("Previous Script"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::COMMA); + ED_SHORTCUT("script_editor/next_script", TTR("Next Script"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::PERIOD); + ED_SHORTCUT("script_editor/prev_script", TTR("Previous Script"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::COMMA); set_process_input(true); set_process_shortcut_input(true); @@ -3768,10 +3768,10 @@ ScriptEditor::ScriptEditor() { file_menu->set_shortcut_context(this); menu_hb->add_child(file_menu); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New Script..."), KeyModifierMask::CMD | Key::N), FILE_NEW); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new_textfile", TTR("New Text File..."), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::N), FILE_NEW_TEXTFILE); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New Script..."), KeyModifierMask::CMD_OR_CTRL | Key::N), FILE_NEW); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new_textfile", TTR("New Text File..."), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::N), FILE_NEW_TEXTFILE); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/open", TTR("Open...")), FILE_OPEN); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reopen_closed_script", TTR("Reopen Closed Script"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::T), FILE_REOPEN_CLOSED); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reopen_closed_script", TTR("Reopen Closed Script"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::T), FILE_REOPEN_CLOSED); file_menu->get_popup()->add_submenu_item(TTR("Open Recent"), "RecentScripts", FILE_OPEN_RECENT); recent_scripts = memnew(PopupMenu); @@ -3781,11 +3781,11 @@ ScriptEditor::ScriptEditor() { _update_recent_scripts(); file_menu->get_popup()->add_separator(); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save", TTR("Save"), KeyModifierMask::ALT | KeyModifierMask::CMD | Key::S), FILE_SAVE); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save", TTR("Save"), KeyModifierMask::ALT | KeyModifierMask::CMD_OR_CTRL | Key::S), FILE_SAVE); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_as", TTR("Save As...")), FILE_SAVE_AS); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_all", TTR("Save All"), KeyModifierMask::SHIFT | KeyModifierMask::ALT | Key::S), FILE_SAVE_ALL); file_menu->get_popup()->add_separator(); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_script_soft", TTR("Soft Reload Tool Script"), KeyModifierMask::CMD | KeyModifierMask::ALT | Key::R), FILE_TOOL_RELOAD_SOFT); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_script_soft", TTR("Soft Reload Tool Script"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::ALT | Key::R), FILE_TOOL_RELOAD_SOFT); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/copy_path", TTR("Copy Script Path")), FILE_COPY_PATH); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/show_in_file_system", TTR("Show in FileSystem")), SHOW_IN_FILE_SYSTEM); file_menu->get_popup()->add_separator(); @@ -3808,16 +3808,16 @@ ScriptEditor::ScriptEditor() { theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/save_theme_as", TTR("Save Theme As...")), THEME_SAVE_AS); file_menu->get_popup()->add_separator(); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_file", TTR("Close"), KeyModifierMask::CMD | Key::W), FILE_CLOSE); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_file", TTR("Close"), KeyModifierMask::CMD_OR_CTRL | Key::W), FILE_CLOSE); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_all", TTR("Close All")), CLOSE_ALL); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_other_tabs", TTR("Close Other Tabs")), CLOSE_OTHER_TABS); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_docs", TTR("Close Docs")), CLOSE_DOCS); file_menu->get_popup()->add_separator(); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/run_file", TTR("Run"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::X), FILE_RUN); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/run_file", TTR("Run"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::X), FILE_RUN); file_menu->get_popup()->add_separator(); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/toggle_scripts_panel", TTR("Toggle Scripts Panel"), KeyModifierMask::CMD | Key::BACKSLASH), TOGGLE_SCRIPTS_PANEL); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/toggle_scripts_panel", TTR("Toggle Scripts Panel"), KeyModifierMask::CMD_OR_CTRL | Key::BACKSLASH), TOGGLE_SCRIPTS_PANEL); file_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptEditor::_menu_option)); file_menu->get_popup()->connect("about_to_popup", callable_mp(this, &ScriptEditor::_prepare_file_menu)); @@ -4070,7 +4070,7 @@ ScriptEditorPlugin::ScriptEditorPlugin() { EDITOR_DEF("text_editor/external/exec_flags", "{file}"); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "text_editor/external/exec_flags", PROPERTY_HINT_PLACEHOLDER_TEXT, "Call flags with placeholders: {project}, {file}, {col}, {line}.")); - ED_SHORTCUT("script_editor/reopen_closed_script", TTR("Reopen Closed Script"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::T); + ED_SHORTCUT("script_editor/reopen_closed_script", TTR("Reopen Closed Script"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::T); ED_SHORTCUT("script_editor/clear_recent", TTR("Clear Recent Scripts")); } diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index cc955eae76..42dcfb8b1f 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -2072,58 +2072,58 @@ static ScriptEditorBase *create_editor(const Ref<Resource> &p_resource) { void ScriptTextEditor::register_editor() { ED_SHORTCUT("script_text_editor/move_up", TTR("Move Up"), KeyModifierMask::ALT | Key::UP); ED_SHORTCUT("script_text_editor/move_down", TTR("Move Down"), KeyModifierMask::ALT | Key::DOWN); - ED_SHORTCUT("script_text_editor/delete_line", TTR("Delete Line"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::K); + ED_SHORTCUT("script_text_editor/delete_line", TTR("Delete Line"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::K); // Leave these at zero, same can be accomplished with tab/shift-tab, including selection. // The next/previous in history shortcut in this case makes a lot more sense. ED_SHORTCUT("script_text_editor/indent_left", TTR("Indent Left"), Key::NONE); ED_SHORTCUT("script_text_editor/indent_right", TTR("Indent Right"), Key::NONE); - ED_SHORTCUT("script_text_editor/toggle_comment", TTR("Toggle Comment"), KeyModifierMask::CMD | Key::K); + ED_SHORTCUT("script_text_editor/toggle_comment", TTR("Toggle Comment"), KeyModifierMask::CMD_OR_CTRL | Key::K); ED_SHORTCUT("script_text_editor/toggle_fold_line", TTR("Fold/Unfold Line"), KeyModifierMask::ALT | Key::F); ED_SHORTCUT("script_text_editor/fold_all_lines", TTR("Fold All Lines"), Key::NONE); ED_SHORTCUT("script_text_editor/unfold_all_lines", TTR("Unfold All Lines"), Key::NONE); - ED_SHORTCUT("script_text_editor/duplicate_selection", TTR("Duplicate Selection"), KeyModifierMask::SHIFT | KeyModifierMask::CMD | Key::D); - ED_SHORTCUT_OVERRIDE("script_text_editor/duplicate_selection", "macos", KeyModifierMask::SHIFT | KeyModifierMask::CMD | Key::C); - ED_SHORTCUT("script_text_editor/evaluate_selection", TTR("Evaluate Selection"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::E); - ED_SHORTCUT("script_text_editor/trim_trailing_whitespace", TTR("Trim Trailing Whitespace"), KeyModifierMask::CMD | KeyModifierMask::ALT | Key::T); - ED_SHORTCUT("script_text_editor/convert_indent_to_spaces", TTR("Convert Indent to Spaces"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::Y); - ED_SHORTCUT("script_text_editor/convert_indent_to_tabs", TTR("Convert Indent to Tabs"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::I); - ED_SHORTCUT("script_text_editor/auto_indent", TTR("Auto Indent"), KeyModifierMask::CMD | Key::I); + ED_SHORTCUT("script_text_editor/duplicate_selection", TTR("Duplicate Selection"), KeyModifierMask::SHIFT | KeyModifierMask::CTRL | Key::D); + ED_SHORTCUT_OVERRIDE("script_text_editor/duplicate_selection", "macos", KeyModifierMask::SHIFT | KeyModifierMask::META | Key::C); + ED_SHORTCUT("script_text_editor/evaluate_selection", TTR("Evaluate Selection"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::E); + ED_SHORTCUT("script_text_editor/trim_trailing_whitespace", TTR("Trim Trailing Whitespace"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::ALT | Key::T); + ED_SHORTCUT("script_text_editor/convert_indent_to_spaces", TTR("Convert Indent to Spaces"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::Y); + ED_SHORTCUT("script_text_editor/convert_indent_to_tabs", TTR("Convert Indent to Tabs"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::I); + ED_SHORTCUT("script_text_editor/auto_indent", TTR("Auto Indent"), KeyModifierMask::CMD_OR_CTRL | Key::I); - ED_SHORTCUT_AND_COMMAND("script_text_editor/find", TTR("Find..."), KeyModifierMask::CMD | Key::F); + ED_SHORTCUT_AND_COMMAND("script_text_editor/find", TTR("Find..."), KeyModifierMask::CMD_OR_CTRL | Key::F); ED_SHORTCUT("script_text_editor/find_next", TTR("Find Next"), Key::F3); - ED_SHORTCUT_OVERRIDE("script_text_editor/find_next", "macos", KeyModifierMask::CMD | Key::G); + ED_SHORTCUT_OVERRIDE("script_text_editor/find_next", "macos", KeyModifierMask::META | Key::G); ED_SHORTCUT("script_text_editor/find_previous", TTR("Find Previous"), KeyModifierMask::SHIFT | Key::F3); - ED_SHORTCUT_OVERRIDE("script_text_editor/find_previous", "macos", KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::G); + ED_SHORTCUT_OVERRIDE("script_text_editor/find_previous", "macos", KeyModifierMask::META | KeyModifierMask::SHIFT | Key::G); - ED_SHORTCUT_AND_COMMAND("script_text_editor/replace", TTR("Replace..."), KeyModifierMask::CMD | Key::R); - ED_SHORTCUT_OVERRIDE("script_text_editor/replace", "macos", KeyModifierMask::ALT | KeyModifierMask::CMD | Key::F); + ED_SHORTCUT_AND_COMMAND("script_text_editor/replace", TTR("Replace..."), KeyModifierMask::CTRL | Key::R); + ED_SHORTCUT_OVERRIDE("script_text_editor/replace", "macos", KeyModifierMask::ALT | KeyModifierMask::META | Key::F); - ED_SHORTCUT("script_text_editor/find_in_files", TTR("Find in Files..."), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F); - ED_SHORTCUT("script_text_editor/replace_in_files", TTR("Replace in Files..."), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::R); + ED_SHORTCUT("script_text_editor/find_in_files", TTR("Find in Files..."), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::F); + ED_SHORTCUT("script_text_editor/replace_in_files", TTR("Replace in Files..."), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::R); ED_SHORTCUT("script_text_editor/contextual_help", TTR("Contextual Help"), KeyModifierMask::ALT | Key::F1); ED_SHORTCUT_OVERRIDE("script_text_editor/contextual_help", "macos", KeyModifierMask::ALT | KeyModifierMask::SHIFT | Key::SPACE); - ED_SHORTCUT("script_text_editor/toggle_bookmark", TTR("Toggle Bookmark"), KeyModifierMask::CMD | KeyModifierMask::ALT | Key::B); - ED_SHORTCUT("script_text_editor/goto_next_bookmark", TTR("Go to Next Bookmark"), KeyModifierMask::CMD | Key::B); - ED_SHORTCUT("script_text_editor/goto_previous_bookmark", TTR("Go to Previous Bookmark"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::B); + ED_SHORTCUT("script_text_editor/toggle_bookmark", TTR("Toggle Bookmark"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::ALT | Key::B); + ED_SHORTCUT("script_text_editor/goto_next_bookmark", TTR("Go to Next Bookmark"), KeyModifierMask::CMD_OR_CTRL | Key::B); + ED_SHORTCUT("script_text_editor/goto_previous_bookmark", TTR("Go to Previous Bookmark"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::B); ED_SHORTCUT("script_text_editor/remove_all_bookmarks", TTR("Remove All Bookmarks"), Key::NONE); - ED_SHORTCUT("script_text_editor/goto_function", TTR("Go to Function..."), KeyModifierMask::ALT | KeyModifierMask::CMD | Key::F); - ED_SHORTCUT_OVERRIDE("script_text_editor/goto_function", "macos", KeyModifierMask::CTRL | KeyModifierMask::CMD | Key::J); + ED_SHORTCUT("script_text_editor/goto_function", TTR("Go to Function..."), KeyModifierMask::ALT | KeyModifierMask::CTRL | Key::F); + ED_SHORTCUT_OVERRIDE("script_text_editor/goto_function", "macos", KeyModifierMask::CTRL | KeyModifierMask::META | Key::J); - ED_SHORTCUT("script_text_editor/goto_line", TTR("Go to Line..."), KeyModifierMask::CMD | Key::L); + ED_SHORTCUT("script_text_editor/goto_line", TTR("Go to Line..."), KeyModifierMask::CMD_OR_CTRL | Key::L); ED_SHORTCUT("script_text_editor/toggle_breakpoint", TTR("Toggle Breakpoint"), Key::F9); - ED_SHORTCUT_OVERRIDE("script_text_editor/toggle_breakpoint", "macos", KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::B); + ED_SHORTCUT_OVERRIDE("script_text_editor/toggle_breakpoint", "macos", KeyModifierMask::META | KeyModifierMask::SHIFT | Key::B); - ED_SHORTCUT("script_text_editor/remove_all_breakpoints", TTR("Remove All Breakpoints"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F9); - ED_SHORTCUT("script_text_editor/goto_next_breakpoint", TTR("Go to Next Breakpoint"), KeyModifierMask::CMD | Key::PERIOD); - ED_SHORTCUT("script_text_editor/goto_previous_breakpoint", TTR("Go to Previous Breakpoint"), KeyModifierMask::CMD | Key::COMMA); + ED_SHORTCUT("script_text_editor/remove_all_breakpoints", TTR("Remove All Breakpoints"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::F9); + ED_SHORTCUT("script_text_editor/goto_next_breakpoint", TTR("Go to Next Breakpoint"), KeyModifierMask::CMD_OR_CTRL | Key::PERIOD); + ED_SHORTCUT("script_text_editor/goto_previous_breakpoint", TTR("Go to Previous Breakpoint"), KeyModifierMask::CMD_OR_CTRL | Key::COMMA); ScriptEditor::register_create_script_editor_function(create_editor); } diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 246bc4b183..ae3c578eaa 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -1366,6 +1366,7 @@ void ShaderEditorPlugin::_shader_selected(int p_index) { edited_shaders[p_index].shader_editor->validate_script(); } shader_tabs->set_current_tab(p_index); + shader_list->select(p_index); } void ShaderEditorPlugin::_shader_list_clicked(int p_item, Vector2 p_local_mouse_pos, MouseButton p_mouse_button_index) { @@ -1375,11 +1376,10 @@ void ShaderEditorPlugin::_shader_list_clicked(int p_item, Vector2 p_local_mouse_ } void ShaderEditorPlugin::_close_shader(int p_index) { - int index = shader_tabs->get_current_tab(); - ERR_FAIL_INDEX(index, shader_tabs->get_tab_count()); - Control *c = shader_tabs->get_tab_control(index); + ERR_FAIL_INDEX(p_index, shader_tabs->get_tab_count()); + Control *c = shader_tabs->get_tab_control(p_index); memdelete(c); - edited_shaders.remove_at(index); + edited_shaders.remove_at(p_index); _update_shader_list(); EditorNode::get_singleton()->get_undo_redo()->clear_history(); // To prevent undo on deleted graphs. } diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h index afd38ef71a..f48b2fc70e 100644 --- a/editor/plugins/shader_editor_plugin.h +++ b/editor/plugins/shader_editor_plugin.h @@ -115,8 +115,8 @@ public: ShaderTextEditor(); }; -class ShaderEditor : public PanelContainer { - GDCLASS(ShaderEditor, PanelContainer); +class ShaderEditor : public MarginContainer { + GDCLASS(ShaderEditor, MarginContainer); enum { EDIT_UNDO, diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index 37d05e5fa7..2478ac9514 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -785,7 +785,7 @@ void Skeleton3DEditor::create_editors() { key_insert_all_button->set_focus_mode(FOCUS_NONE); key_insert_all_button->connect("pressed", callable_mp(this, &Skeleton3DEditor::insert_keys).bind(true)); key_insert_all_button->set_tooltip_text(TTR("Insert key of all bone poses.")); - key_insert_all_button->set_shortcut(ED_SHORTCUT("skeleton_3d_editor/insert_key_of_all_bones", TTR("Insert Key (All Bones)"), KeyModifierMask::CMD + Key::INSERT)); + key_insert_all_button->set_shortcut(ED_SHORTCUT("skeleton_3d_editor/insert_key_of_all_bones", TTR("Insert Key (All Bones)"), KeyModifierMask::CMD_OR_CTRL + Key::INSERT)); animation_hb->add_child(key_insert_all_button); // Bone tree. @@ -1143,7 +1143,7 @@ EditorPlugin::AfterGUIInput Skeleton3DEditorPlugin::forward_spatial_gui_input(Ca se->update_bone_original(); } } - return EditorPlugin::AFTER_GUI_INPUT_DESELECT; + return EditorPlugin::AFTER_GUI_INPUT_CUSTOM; } return EditorPlugin::AFTER_GUI_INPUT_PASS; } diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index ae21aad337..d0a1ddafa1 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -984,11 +984,17 @@ void SpriteFramesEditor::_update_library(bool p_skip_selector) { } void SpriteFramesEditor::edit(SpriteFrames *p_frames) { - if (frames == p_frames) { + bool new_read_only_state = false; + if (p_frames) { + new_read_only_state = EditorNode::get_singleton()->is_resource_read_only(p_frames); + } + + if (frames == p_frames && new_read_only_state == read_only) { return; } frames = p_frames; + read_only = new_read_only_state; if (p_frames) { if (!p_frames->has_animation(edited_anim)) { @@ -1009,6 +1015,20 @@ void SpriteFramesEditor::edit(SpriteFrames *p_frames) { } else { hide(); } + + new_anim->set_disabled(read_only); + remove_anim->set_disabled(read_only); + anim_speed->set_editable(!read_only); + anim_loop->set_disabled(read_only); + load->set_disabled(read_only); + load_sheet->set_disabled(read_only); + copy->set_disabled(read_only); + paste->set_disabled(read_only); + empty->set_disabled(read_only); + empty2->set_disabled(read_only); + move_up->set_disabled(read_only); + move_down->set_disabled(read_only); + _delete->set_disabled(read_only); } void SpriteFramesEditor::set_undo_redo(Ref<EditorUndoRedoManager> p_undo_redo) { @@ -1016,6 +1036,10 @@ void SpriteFramesEditor::set_undo_redo(Ref<EditorUndoRedoManager> p_undo_redo) { } Variant SpriteFramesEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) { + if (read_only) { + return false; + } + if (!frames->has_animation(edited_anim)) { return false; } @@ -1038,6 +1062,10 @@ Variant SpriteFramesEditor::get_drag_data_fw(const Point2 &p_point, Control *p_f } bool SpriteFramesEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { + if (read_only) { + return false; + } + Dictionary d = p_data; if (!d.has("type")) { @@ -1169,6 +1197,7 @@ SpriteFramesEditor::SpriteFramesEditor() { remove_anim->set_flat(true); remove_anim->set_tooltip_text(TTR("Remove Animation")); hbc_animlist->add_child(remove_anim); + remove_anim->set_disabled(true); remove_anim->connect("pressed", callable_mp(this, &SpriteFramesEditor::_animation_remove)); anim_search_box = memnew(LineEdit); diff --git a/editor/plugins/sprite_frames_editor_plugin.h b/editor/plugins/sprite_frames_editor_plugin.h index f2530b732f..092f556c63 100644 --- a/editor/plugins/sprite_frames_editor_plugin.h +++ b/editor/plugins/sprite_frames_editor_plugin.h @@ -57,6 +57,8 @@ class SpriteFramesEditor : public HSplitContainer { }; int dominant_param = PARAM_FRAME_COUNT; + bool read_only = false; + Button *load = nullptr; Button *load_sheet = nullptr; Button *_delete = nullptr; diff --git a/editor/plugins/texture_3d_editor_plugin.cpp b/editor/plugins/texture_3d_editor_plugin.cpp index 3ea62184c6..4b2f28658a 100644 --- a/editor/plugins/texture_3d_editor_plugin.cpp +++ b/editor/plugins/texture_3d_editor_plugin.cpp @@ -138,10 +138,6 @@ void Texture3DEditor::edit(Ref<Texture3D> p_texture) { } } -void Texture3DEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_layer_changed"), &Texture3DEditor::_layer_changed); -} - Texture3DEditor::Texture3DEditor() { set_texture_repeat(TextureRepeat::TEXTURE_REPEAT_ENABLED); set_custom_minimum_size(Size2(1, 150)); @@ -173,7 +169,7 @@ Texture3DEditor::Texture3DEditor() { info->add_theme_constant_override("shadow_offset_y", 2); setting = false; - layer->connect("value_changed", Callable(this, "_layer_changed")); + layer->connect("value_changed", callable_mp(this, &Texture3DEditor::_layer_changed)); } Texture3DEditor::~Texture3DEditor() { diff --git a/editor/plugins/texture_3d_editor_plugin.h b/editor/plugins/texture_3d_editor_plugin.h index 357bdb0845..7795c83c8a 100644 --- a/editor/plugins/texture_3d_editor_plugin.h +++ b/editor/plugins/texture_3d_editor_plugin.h @@ -66,8 +66,6 @@ class Texture3DEditor : public Control { protected: void _notification(int p_what); - static void _bind_methods(); - public: void edit(Ref<Texture3D> p_texture); Texture3DEditor(); diff --git a/editor/plugins/texture_layered_editor_plugin.cpp b/editor/plugins/texture_layered_editor_plugin.cpp index dd8633360e..b0a174c1bc 100644 --- a/editor/plugins/texture_layered_editor_plugin.cpp +++ b/editor/plugins/texture_layered_editor_plugin.cpp @@ -214,10 +214,6 @@ void TextureLayeredEditor::edit(Ref<TextureLayered> p_texture) { } } -void TextureLayeredEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_layer_changed"), &TextureLayeredEditor::_layer_changed); -} - TextureLayeredEditor::TextureLayeredEditor() { set_texture_repeat(TextureRepeat::TEXTURE_REPEAT_ENABLED); set_custom_minimum_size(Size2(1, 150)); @@ -249,7 +245,7 @@ TextureLayeredEditor::TextureLayeredEditor() { info->add_theme_constant_override("shadow_offset_y", 2); setting = false; - layer->connect("value_changed", Callable(this, "_layer_changed")); + layer->connect("value_changed", callable_mp(this, &TextureLayeredEditor::_layer_changed)); } TextureLayeredEditor::~TextureLayeredEditor() { diff --git a/editor/plugins/texture_layered_editor_plugin.h b/editor/plugins/texture_layered_editor_plugin.h index f49aa83eb2..f4dbc104c8 100644 --- a/editor/plugins/texture_layered_editor_plugin.h +++ b/editor/plugins/texture_layered_editor_plugin.h @@ -68,7 +68,6 @@ class TextureLayeredEditor : public Control { protected: void _notification(int p_what); virtual void gui_input(const Ref<InputEvent> &p_event) override; - static void _bind_methods(); public: void edit(Ref<TextureLayered> p_texture); diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index f6acd8ceda..1fb9b42449 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -1186,7 +1186,7 @@ ThemeItemImportTree::ThemeItemImportTree() { void ThemeItemEditorDialog::ok_pressed() { if (import_default_theme_items->has_selected_items() || import_editor_theme_items->has_selected_items() || import_other_theme_items->has_selected_items()) { confirm_closing_dialog->set_text(TTR("Import Items tab has some items selected. Selection will be lost upon closing this window.\nClose anyway?")); - confirm_closing_dialog->popup_centered(Size2i(380, 120) * EDSCALE); + confirm_closing_dialog->popup_centered(Size2(380, 120) * EDSCALE); return; } diff --git a/editor/plugins/tiles/atlas_merging_dialog.cpp b/editor/plugins/tiles/atlas_merging_dialog.cpp index de4f3f7989..d7e08db954 100644 --- a/editor/plugins/tiles/atlas_merging_dialog.cpp +++ b/editor/plugins/tiles/atlas_merging_dialog.cpp @@ -269,7 +269,7 @@ AtlasMergingDialog::AtlasMergingDialog() { // Atlas sources item list. atlas_merging_atlases_list = memnew(ItemList); - atlas_merging_atlases_list->set_fixed_icon_size(Size2i(60, 60) * EDSCALE); + atlas_merging_atlases_list->set_fixed_icon_size(Size2(60, 60) * EDSCALE); atlas_merging_atlases_list->set_h_size_flags(Control::SIZE_EXPAND_FILL); atlas_merging_atlases_list->set_v_size_flags(Control::SIZE_EXPAND_FILL); atlas_merging_atlases_list->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); diff --git a/editor/plugins/tiles/tile_atlas_view.cpp b/editor/plugins/tiles/tile_atlas_view.cpp index d9291503cb..c823487279 100644 --- a/editor/plugins/tiles/tile_atlas_view.cpp +++ b/editor/plugins/tiles/tile_atlas_view.cpp @@ -403,6 +403,9 @@ void TileAtlasView::set_atlas_source(TileSet *p_tile_set, TileSetAtlasSource *p_ // Update everything. _update_zoom_and_panning(); + base_tiles_drawing_root->set_size(_compute_base_tiles_control_size()); + alternative_tiles_drawing_root->set_size(_compute_alternative_tiles_control_size()); + // Update. base_tiles_draw->queue_redraw(); base_tiles_texture_grid->queue_redraw(); @@ -601,7 +604,6 @@ TileAtlasView::TileAtlasView() { base_tiles_drawing_root = memnew(Control); base_tiles_drawing_root->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); - base_tiles_drawing_root->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT); base_tiles_drawing_root->set_texture_filter(TEXTURE_FILTER_NEAREST); base_tiles_root_control->add_child(base_tiles_drawing_root); @@ -645,7 +647,6 @@ TileAtlasView::TileAtlasView() { alternative_tiles_drawing_root = memnew(Control); alternative_tiles_drawing_root->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); - alternative_tiles_drawing_root->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT); alternative_tiles_drawing_root->set_texture_filter(TEXTURE_FILTER_NEAREST); alternative_tiles_root_control->add_child(alternative_tiles_drawing_root); diff --git a/editor/plugins/tiles/tile_data_editors.cpp b/editor/plugins/tiles/tile_data_editors.cpp index 1dce41e4c7..4d54001b94 100644 --- a/editor/plugins/tiles/tile_data_editors.cpp +++ b/editor/plugins/tiles/tile_data_editors.cpp @@ -40,6 +40,10 @@ #include "editor/editor_scale.h" #include "editor/editor_undo_redo_manager.h" +#ifdef DEBUG_ENABLED +#include "servers/navigation_server_3d.h" +#endif // DEBUG_ENABLED + void TileDataEditor::_tile_set_changed_plan_update() { _tile_set_changed_update_needed = true; call_deferred(SNAME("_tile_set_changed_deferred_update")); @@ -2674,7 +2678,9 @@ void TileDataNavigationEditor::_tile_set_changed() { void TileDataNavigationEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { - polygon_editor->set_polygons_color(get_tree()->get_debug_navigation_color()); +#ifdef DEBUG_ENABLED + polygon_editor->set_polygons_color(NavigationServer3D::get_singleton()->get_debug_navigation_geometry_face_color()); +#endif // DEBUG_ENABLED } break; } } @@ -2701,7 +2707,10 @@ void TileDataNavigationEditor::draw_over_tile(CanvasItem *p_canvas_item, Transfo return; } - Color color = p_canvas_item->get_tree()->get_debug_navigation_color(); + Color color = Color(0.5, 1.0, 1.0, 1.0); +#ifdef DEBUG_ENABLED + color = NavigationServer3D::get_singleton()->get_debug_navigation_geometry_face_color(); +#endif // DEBUG_ENABLED if (p_selected) { Color grid_color = EditorSettings::get_singleton()->get("editors/tiles_editor/grid_color"); Color selection_color = Color().from_hsv(Math::fposmod(grid_color.get_h() + 0.5, 1.0), grid_color.get_s(), grid_color.get_v(), 1.0); diff --git a/editor/plugins/tiles/tile_map_editor.cpp b/editor/plugins/tiles/tile_map_editor.cpp index 08f418c1f7..79230891f1 100644 --- a/editor/plugins/tiles/tile_map_editor.cpp +++ b/editor/plugins/tiles/tile_map_editor.cpp @@ -2020,9 +2020,9 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { ->connect("mouse_exited", callable_mp(this, &TileMapEditorTilesPlugin::_mouse_exited_viewport)); // --- Shortcuts --- - ED_SHORTCUT("tiles_editor/cut", TTR("Cut"), KeyModifierMask::CMD | Key::X); - ED_SHORTCUT("tiles_editor/copy", TTR("Copy"), KeyModifierMask::CMD | Key::C); - ED_SHORTCUT("tiles_editor/paste", TTR("Paste"), KeyModifierMask::CMD | Key::V); + ED_SHORTCUT("tiles_editor/cut", TTR("Cut"), KeyModifierMask::CMD_OR_CTRL | Key::X); + ED_SHORTCUT("tiles_editor/copy", TTR("Copy"), KeyModifierMask::CMD_OR_CTRL | Key::C); + ED_SHORTCUT("tiles_editor/paste", TTR("Paste"), KeyModifierMask::CMD_OR_CTRL | Key::V); ED_SHORTCUT("tiles_editor/cancel", TTR("Cancel"), Key::ESCAPE); ED_SHORTCUT("tiles_editor/delete", TTR("Delete"), Key::KEY_DELETE); @@ -2170,7 +2170,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { split_container_left_side->set_h_size_flags(Control::SIZE_EXPAND_FILL); split_container_left_side->set_v_size_flags(Control::SIZE_EXPAND_FILL); split_container_left_side->set_stretch_ratio(0.25); - split_container_left_side->set_custom_minimum_size(Size2i(70, 0) * EDSCALE); + split_container_left_side->set_custom_minimum_size(Size2(70, 0) * EDSCALE); atlas_sources_split_container->add_child(split_container_left_side); HBoxContainer *sources_bottom_actions = memnew(HBoxContainer); @@ -2190,11 +2190,11 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { sources_bottom_actions->add_child(source_sort_button); sources_list = memnew(ItemList); - sources_list->set_fixed_icon_size(Size2i(60, 60) * EDSCALE); + sources_list->set_fixed_icon_size(Size2(60, 60) * EDSCALE); sources_list->set_h_size_flags(Control::SIZE_EXPAND_FILL); sources_list->set_v_size_flags(Control::SIZE_EXPAND_FILL); sources_list->set_stretch_ratio(0.25); - sources_list->set_custom_minimum_size(Size2i(70, 0) * EDSCALE); + sources_list->set_custom_minimum_size(Size2(70, 0) * EDSCALE); sources_list->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); sources_list->connect("item_selected", callable_mp(this, &TileMapEditorTilesPlugin::_update_fix_selected_and_hovered).unbind(1)); sources_list->connect("item_selected", callable_mp(this, &TileMapEditorTilesPlugin::_update_source_display).unbind(1)); @@ -3323,7 +3323,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { terrains_tree = memnew(Tree); terrains_tree->set_h_size_flags(Control::SIZE_EXPAND_FILL); terrains_tree->set_stretch_ratio(0.25); - terrains_tree->set_custom_minimum_size(Size2i(70, 0) * EDSCALE); + terrains_tree->set_custom_minimum_size(Size2(70, 0) * EDSCALE); terrains_tree->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); terrains_tree->set_hide_root(true); terrains_tree->connect("item_selected", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_tiles_list)); @@ -3677,6 +3677,7 @@ void TileMapEditor::_update_layers_selection() { tile_map_layer = -1; } tile_map->set_selected_layer(toggle_highlight_selected_layer_button->is_pressed() ? tile_map_layer : -1); + tileset_changed_needs_update = false; // Update is not needed here and actually causes problems. layers_selection_button->clear(); if (tile_map->get_layers_count() > 0) { diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp index 2aea020902..45b2a5eb14 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp @@ -401,7 +401,7 @@ void TileSetAtlasSourceEditor::AtlasTileProxyObject::_get_property_list(List<Pro if (all_alternatve_id_zero) { p_list->push_back(PropertyInfo(Variant::NIL, "Animation", PROPERTY_HINT_NONE, "animation_", PROPERTY_USAGE_GROUP)); p_list->push_back(PropertyInfo(Variant::INT, "animation_columns", PROPERTY_HINT_NONE, "")); - p_list->push_back(PropertyInfo(Variant::VECTOR2I, "animation_separation", PROPERTY_HINT_NONE, "suffix:px")); + p_list->push_back(PropertyInfo(Variant::VECTOR2I, "animation_separation", PROPERTY_HINT_NONE, "")); p_list->push_back(PropertyInfo(Variant::FLOAT, "animation_speed", PROPERTY_HINT_NONE, "")); p_list->push_back(PropertyInfo(Variant::INT, "animation_frames_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_ARRAY, "Frames,animation_frame_")); // Not optimal, but returns value for the first tile. This is similar to what MultiNodeEdit does. @@ -2342,7 +2342,7 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { // Middle panel. ScrollContainer *middle_panel = memnew(ScrollContainer); middle_panel->set_horizontal_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); - middle_panel->set_custom_minimum_size(Size2i(200, 0) * EDSCALE); + middle_panel->set_custom_minimum_size(Size2(200, 0) * EDSCALE); split_container_right_side->add_child(middle_panel); VBoxContainer *middle_vbox_container = memnew(VBoxContainer); diff --git a/editor/plugins/tiles/tile_set_editor.cpp b/editor/plugins/tiles/tile_set_editor.cpp index dca17475e0..80a8318bbb 100644 --- a/editor/plugins/tiles/tile_set_editor.cpp +++ b/editor/plugins/tiles/tile_set_editor.cpp @@ -690,7 +690,7 @@ TileSetEditor::TileSetEditor() { split_container_left_side->set_h_size_flags(SIZE_EXPAND_FILL); split_container_left_side->set_v_size_flags(SIZE_EXPAND_FILL); split_container_left_side->set_stretch_ratio(0.25); - split_container_left_side->set_custom_minimum_size(Size2i(70, 0) * EDSCALE); + split_container_left_side->set_custom_minimum_size(Size2(70, 0) * EDSCALE); split_container->add_child(split_container_left_side); source_sort_button = memnew(MenuButton); @@ -706,7 +706,7 @@ TileSetEditor::TileSetEditor() { p->set_item_checked(TilesEditorPlugin::SOURCE_SORT_ID, true); sources_list = memnew(ItemList); - sources_list->set_fixed_icon_size(Size2i(60, 60) * EDSCALE); + sources_list->set_fixed_icon_size(Size2(60, 60) * EDSCALE); sources_list->set_h_size_flags(SIZE_EXPAND_FILL); sources_list->set_v_size_flags(SIZE_EXPAND_FILL); sources_list->connect("item_selected", callable_mp(this, &TileSetEditor::_source_selected)); diff --git a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp index 9a4b14616f..f7622e68ab 100644 --- a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp @@ -463,7 +463,7 @@ TileSetScenesCollectionSourceEditor::TileSetScenesCollectionSourceEditor() { // Middle panel. ScrollContainer *middle_panel = memnew(ScrollContainer); middle_panel->set_horizontal_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); - middle_panel->set_custom_minimum_size(Size2i(200, 0) * EDSCALE); + middle_panel->set_custom_minimum_size(Size2(200, 0) * EDSCALE); split_container_right_side->add_child(middle_panel); VBoxContainer *middle_vbox_container = memnew(VBoxContainer); diff --git a/editor/plugins/version_control_editor_plugin.cpp b/editor/plugins/version_control_editor_plugin.cpp index fba760d57f..336ce9e4c8 100644 --- a/editor/plugins/version_control_editor_plugin.cpp +++ b/editor/plugins/version_control_editor_plugin.cpp @@ -1124,6 +1124,8 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() { set_up_password->connect(SNAME("text_changed"), callable_mp(this, &VersionControlEditorPlugin::_update_set_up_warning)); set_up_password_input->add_child(set_up_password); + const String home_dir = OS::get_singleton()->has_environment("HOME") ? OS::get_singleton()->get_environment("HOME") : OS::get_singleton()->get_system_dir(OS::SYSTEM_DIR_DOCUMENTS); + HBoxContainer *set_up_ssh_public_key_input = memnew(HBoxContainer); set_up_ssh_public_key_input->set_h_size_flags(Control::SIZE_EXPAND_FILL); set_up_settings_vbc->add_child(set_up_ssh_public_key_input); @@ -1147,10 +1149,7 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() { set_up_ssh_public_key_file_dialog->set_access(FileDialog::ACCESS_FILESYSTEM); set_up_ssh_public_key_file_dialog->set_file_mode(FileDialog::FILE_MODE_OPEN_FILE); set_up_ssh_public_key_file_dialog->set_show_hidden_files(true); - // TODO: Make this start at the user's home folder - Ref<DirAccess> d = DirAccess::open(OS::get_singleton()->get_system_dir(OS::SYSTEM_DIR_DOCUMENTS)); - d->change_dir("../"); - set_up_ssh_public_key_file_dialog->set_current_dir(d->get_current_dir()); + set_up_ssh_public_key_file_dialog->set_current_dir(home_dir); set_up_ssh_public_key_file_dialog->connect(SNAME("file_selected"), callable_mp(this, &VersionControlEditorPlugin::_ssh_public_key_selected)); set_up_ssh_public_key_input_hbc->add_child(set_up_ssh_public_key_file_dialog); @@ -1183,8 +1182,7 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() { set_up_ssh_private_key_file_dialog->set_access(FileDialog::ACCESS_FILESYSTEM); set_up_ssh_private_key_file_dialog->set_file_mode(FileDialog::FILE_MODE_OPEN_FILE); set_up_ssh_private_key_file_dialog->set_show_hidden_files(true); - // TODO: Make this start at the user's home folder - set_up_ssh_private_key_file_dialog->set_current_dir(d->get_current_dir()); + set_up_ssh_private_key_file_dialog->set_current_dir(home_dir); set_up_ssh_private_key_file_dialog->connect("file_selected", callable_mp(this, &VersionControlEditorPlugin::_ssh_private_key_selected)); set_up_ssh_private_key_input_hbc->add_child(set_up_ssh_private_key_file_dialog); @@ -1319,7 +1317,7 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() { commit_message->connect(SNAME("gui_input"), callable_mp(this, &VersionControlEditorPlugin::_commit_message_gui_input)); commit_area->add_child(commit_message); - ED_SHORTCUT("version_control/commit", TTR("Commit"), KeyModifierMask::CMD | Key::ENTER); + ED_SHORTCUT("version_control/commit", TTR("Commit"), KeyModifierMask::CMD_OR_CTRL | Key::ENTER); commit_button = memnew(Button); commit_button->set_text(TTR("Commit Changes")); diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 804db726a2..7c4326cde1 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -1358,7 +1358,7 @@ void VisualShaderEditor::_update_options_menu() { Color unsupported_color = get_theme_color(SNAME("error_color"), SNAME("Editor")); Color supported_color = get_theme_color(SNAME("warning_color"), SNAME("Editor")); - static bool low_driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name") == "opengl3"; + static bool low_driver = ProjectSettings::get_singleton()->get("rendering/renderer/rendering_method") == "gl_compatibility"; HashMap<String, TreeItem *> folders; @@ -5058,56 +5058,56 @@ VisualShaderEditor::VisualShaderEditor() { // COLOR - add_options.push_back(AddOption("ColorFunc", "Color", "Common", "VisualShaderNodeColorFunc", TTR("Color function."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("ColorOp", "Color", "Common", "VisualShaderNodeColorOp", TTR("Color operator."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ColorFunc", "Color/Common", "VisualShaderNodeColorFunc", TTR("Color function."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ColorOp", "Color/Common", "VisualShaderNodeColorOp", TTR("Color operator."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Grayscale", "Color", "Functions", "VisualShaderNodeColorFunc", TTR("Grayscale function."), { VisualShaderNodeColorFunc::FUNC_GRAYSCALE }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("HSV2RGB", "Color", "Functions", "VisualShaderNodeColorFunc", TTR("Converts HSV vector to RGB equivalent."), { VisualShaderNodeColorFunc::FUNC_HSV2RGB, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("RGB2HSV", "Color", "Functions", "VisualShaderNodeColorFunc", TTR("Converts RGB vector to HSV equivalent."), { VisualShaderNodeColorFunc::FUNC_RGB2HSV, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Sepia", "Color", "Functions", "VisualShaderNodeColorFunc", TTR("Sepia function."), { VisualShaderNodeColorFunc::FUNC_SEPIA }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Grayscale", "Color/Functions", "VisualShaderNodeColorFunc", TTR("Grayscale function."), { VisualShaderNodeColorFunc::FUNC_GRAYSCALE }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("HSV2RGB", "Color/Functions", "VisualShaderNodeColorFunc", TTR("Converts HSV vector to RGB equivalent."), { VisualShaderNodeColorFunc::FUNC_HSV2RGB, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("RGB2HSV", "Color/Functions", "VisualShaderNodeColorFunc", TTR("Converts RGB vector to HSV equivalent."), { VisualShaderNodeColorFunc::FUNC_RGB2HSV, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Sepia", "Color/Functions", "VisualShaderNodeColorFunc", TTR("Sepia function."), { VisualShaderNodeColorFunc::FUNC_SEPIA }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Burn", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Burn operator."), { VisualShaderNodeColorOp::OP_BURN }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Darken", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Darken operator."), { VisualShaderNodeColorOp::OP_DARKEN }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Difference", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Difference operator."), { VisualShaderNodeColorOp::OP_DIFFERENCE }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Dodge", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Dodge operator."), { VisualShaderNodeColorOp::OP_DODGE }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("HardLight", "Color", "Operators", "VisualShaderNodeColorOp", TTR("HardLight operator."), { VisualShaderNodeColorOp::OP_HARD_LIGHT }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Lighten", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Lighten operator."), { VisualShaderNodeColorOp::OP_LIGHTEN }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Overlay", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Overlay operator."), { VisualShaderNodeColorOp::OP_OVERLAY }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Screen", "Color", "Operators", "VisualShaderNodeColorOp", TTR("Screen operator."), { VisualShaderNodeColorOp::OP_SCREEN }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("SoftLight", "Color", "Operators", "VisualShaderNodeColorOp", TTR("SoftLight operator."), { VisualShaderNodeColorOp::OP_SOFT_LIGHT }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Burn", "Color/Operators", "VisualShaderNodeColorOp", TTR("Burn operator."), { VisualShaderNodeColorOp::OP_BURN }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Darken", "Color/Operators", "VisualShaderNodeColorOp", TTR("Darken operator."), { VisualShaderNodeColorOp::OP_DARKEN }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Difference", "Color/Operators", "VisualShaderNodeColorOp", TTR("Difference operator."), { VisualShaderNodeColorOp::OP_DIFFERENCE }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Dodge", "Color/Operators", "VisualShaderNodeColorOp", TTR("Dodge operator."), { VisualShaderNodeColorOp::OP_DODGE }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("HardLight", "Color/Operators", "VisualShaderNodeColorOp", TTR("HardLight operator."), { VisualShaderNodeColorOp::OP_HARD_LIGHT }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Lighten", "Color/Operators", "VisualShaderNodeColorOp", TTR("Lighten operator."), { VisualShaderNodeColorOp::OP_LIGHTEN }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Overlay", "Color/Operators", "VisualShaderNodeColorOp", TTR("Overlay operator."), { VisualShaderNodeColorOp::OP_OVERLAY }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Screen", "Color/Operators", "VisualShaderNodeColorOp", TTR("Screen operator."), { VisualShaderNodeColorOp::OP_SCREEN }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("SoftLight", "Color/Operators", "VisualShaderNodeColorOp", TTR("SoftLight operator."), { VisualShaderNodeColorOp::OP_SOFT_LIGHT }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("ColorConstant", "Color", "Variables", "VisualShaderNodeColorConstant", TTR("Color constant."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("ColorParameter", "Color", "Variables", "VisualShaderNodeColorParameter", TTR("Color parameter."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("ColorConstant", "Color/Variables", "VisualShaderNodeColorConstant", TTR("Color constant."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("ColorParameter", "Color/Variables", "VisualShaderNodeColorParameter", TTR("Color parameter."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); // COMMON - add_options.push_back(AddOption("DerivativeFunc", "Common", "", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) Derivative function."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("DerivativeFunc", "Common", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) Derivative function."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); // CONDITIONAL const String &compare_func_desc = TTR("Returns the boolean result of the %s comparison between two parameters."); - add_options.push_back(AddOption("Equal", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Equal (==)")), { VisualShaderNodeCompare::FUNC_EQUAL }, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("GreaterThan", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Greater Than (>)")), { VisualShaderNodeCompare::FUNC_GREATER_THAN }, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("GreaterThanEqual", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Greater Than or Equal (>=)")), { VisualShaderNodeCompare::FUNC_GREATER_THAN_EQUAL }, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("If", "Conditional", "Functions", "VisualShaderNodeIf", TTR("Returns an associated vector if the provided scalars are equal, greater or less."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("IsInf", "Conditional", "Functions", "VisualShaderNodeIs", TTR("Returns the boolean result of the comparison between INF and a scalar parameter."), { VisualShaderNodeIs::FUNC_IS_INF }, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("IsNaN", "Conditional", "Functions", "VisualShaderNodeIs", TTR("Returns the boolean result of the comparison between NaN and a scalar parameter."), { VisualShaderNodeIs::FUNC_IS_NAN }, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("LessThan", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Less Than (<)")), { VisualShaderNodeCompare::FUNC_LESS_THAN }, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("LessThanEqual", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Less Than or Equal (<=)")), { VisualShaderNodeCompare::FUNC_LESS_THAN_EQUAL }, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("NotEqual", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Not Equal (!=)")), { VisualShaderNodeCompare::FUNC_NOT_EQUAL }, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("Switch", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated 3D vector if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Switch2D", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated 2D vector if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("SwitchBool", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated boolean if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_BOOLEAN }, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("SwitchFloat", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated floating-point scalar if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_FLOAT }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("SwitchInt", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated integer scalar if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_INT }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("SwitchTransform", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated transform if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_TRANSFORM }, VisualShaderNode::PORT_TYPE_TRANSFORM)); - - add_options.push_back(AddOption("Compare", "Conditional", "Common", "VisualShaderNodeCompare", TTR("Returns the boolean result of the comparison between two parameters."), {}, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("Is", "Conditional", "Common", "VisualShaderNodeIs", TTR("Returns the boolean result of the comparison between INF (or NaN) and a scalar parameter."), {}, VisualShaderNode::PORT_TYPE_BOOLEAN)); - - add_options.push_back(AddOption("BooleanConstant", "Conditional", "Variables", "VisualShaderNodeBooleanConstant", TTR("Boolean constant."), {}, VisualShaderNode::PORT_TYPE_BOOLEAN)); - add_options.push_back(AddOption("BooleanParameter", "Conditional", "Variables", "VisualShaderNodeBooleanParameter", TTR("Boolean parameter."), {}, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("Equal", "Conditional/Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Equal (==)")), { VisualShaderNodeCompare::FUNC_EQUAL }, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("GreaterThan", "Conditional/Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Greater Than (>)")), { VisualShaderNodeCompare::FUNC_GREATER_THAN }, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("GreaterThanEqual", "Conditional/Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Greater Than or Equal (>=)")), { VisualShaderNodeCompare::FUNC_GREATER_THAN_EQUAL }, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("If", "Conditional/Functions", "VisualShaderNodeIf", TTR("Returns an associated vector if the provided scalars are equal, greater or less."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("IsInf", "Conditional/Functions", "VisualShaderNodeIs", TTR("Returns the boolean result of the comparison between INF and a scalar parameter."), { VisualShaderNodeIs::FUNC_IS_INF }, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("IsNaN", "Conditional/Functions", "VisualShaderNodeIs", TTR("Returns the boolean result of the comparison between NaN and a scalar parameter."), { VisualShaderNodeIs::FUNC_IS_NAN }, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("LessThan", "Conditional/Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Less Than (<)")), { VisualShaderNodeCompare::FUNC_LESS_THAN }, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("LessThanEqual", "Conditional/Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Less Than or Equal (<=)")), { VisualShaderNodeCompare::FUNC_LESS_THAN_EQUAL }, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("NotEqual", "Conditional/Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Not Equal (!=)")), { VisualShaderNodeCompare::FUNC_NOT_EQUAL }, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("Switch", "Conditional/Functions", "VisualShaderNodeSwitch", TTR("Returns an associated 3D vector if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Switch2D", "Conditional/Functions", "VisualShaderNodeSwitch", TTR("Returns an associated 2D vector if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("SwitchBool", "Conditional/Functions", "VisualShaderNodeSwitch", TTR("Returns an associated boolean if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_BOOLEAN }, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("SwitchFloat", "Conditional/Functions", "VisualShaderNodeSwitch", TTR("Returns an associated floating-point scalar if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_FLOAT }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("SwitchInt", "Conditional/Functions", "VisualShaderNodeSwitch", TTR("Returns an associated integer scalar if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_INT }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("SwitchTransform", "Conditional/Functions", "VisualShaderNodeSwitch", TTR("Returns an associated transform if the provided boolean value is true or false."), { VisualShaderNodeSwitch::OP_TYPE_TRANSFORM }, VisualShaderNode::PORT_TYPE_TRANSFORM)); + + add_options.push_back(AddOption("Compare", "Conditional/Common", "VisualShaderNodeCompare", TTR("Returns the boolean result of the comparison between two parameters."), {}, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("Is", "Conditional/Common", "VisualShaderNodeIs", TTR("Returns the boolean result of the comparison between INF (or NaN) and a scalar parameter."), {}, VisualShaderNode::PORT_TYPE_BOOLEAN)); + + add_options.push_back(AddOption("BooleanConstant", "Conditional/Variables", "VisualShaderNodeBooleanConstant", TTR("Boolean constant."), {}, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("BooleanParameter", "Conditional/Variables", "VisualShaderNodeBooleanParameter", TTR("Boolean parameter."), {}, VisualShaderNode::PORT_TYPE_BOOLEAN)); // INPUT @@ -5116,43 +5116,43 @@ VisualShaderEditor::VisualShaderEditor() { // NODE3D-FOR-ALL - add_options.push_back(AddOption("InvProjectionMatrix", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "inv_projection_matrix", "INV_PROJECTION_MATRIX"), { "inv_projection_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("InvViewMatrix", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "inv_view_matrix", "INV_VIEW_MATRIX"), { "inv_view_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ModelMatrix", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "model_matrix", "MODEL_MATRIX"), { "model_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Normal", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "normal", "NORMAL"), { "normal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("OutputIsSRGB", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "output_is_srgb", "OUTPUT_IS_SRGB"), { "output_is_srgb" }, VisualShaderNode::PORT_TYPE_BOOLEAN, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ProjectionMatrix", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "projection_matrix", "PROJECTION_MATRIX"), { "projection_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Time", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "time", "TIME"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("UV", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "uv", "UV"), { "uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("UV2", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "uv2", "UV2"), { "uv2" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ViewMatrix", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "view_matrix", "VIEW_MATRIX"), { "view_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ViewportSize", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "viewport_size", "VIEWPORT_SIZE"), { "viewport_size" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("InvProjectionMatrix", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "inv_projection_matrix", "INV_PROJECTION_MATRIX"), { "inv_projection_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("InvViewMatrix", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "inv_view_matrix", "INV_VIEW_MATRIX"), { "inv_view_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ModelMatrix", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "model_matrix", "MODEL_MATRIX"), { "model_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Normal", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "normal", "NORMAL"), { "normal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("OutputIsSRGB", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "output_is_srgb", "OUTPUT_IS_SRGB"), { "output_is_srgb" }, VisualShaderNode::PORT_TYPE_BOOLEAN, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ProjectionMatrix", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "projection_matrix", "PROJECTION_MATRIX"), { "projection_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Time", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "time", "TIME"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("UV", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "uv", "UV"), { "uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("UV2", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "uv2", "UV2"), { "uv2" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ViewMatrix", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "view_matrix", "VIEW_MATRIX"), { "view_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ViewportSize", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "viewport_size", "VIEWPORT_SIZE"), { "viewport_size" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_SPATIAL)); // CANVASITEM-FOR-ALL - add_options.push_back(AddOption("Color", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "color", "COLOR"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, -1, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("TexturePixelSize", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "texture_pixel_size", "TEXTURE_PIXEL_SIZE"), { "texture_pixel_size" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Time", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "time", "TIME"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("UV", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "uv", "UV"), { "uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Color", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "color", "COLOR"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, -1, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("TexturePixelSize", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "texture_pixel_size", "TEXTURE_PIXEL_SIZE"), { "texture_pixel_size" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Time", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "time", "TIME"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("UV", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "uv", "UV"), { "uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, -1, Shader::MODE_CANVAS_ITEM)); // PARTICLES-FOR-ALL - add_options.push_back(AddOption("Active", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "active", "ACTIVE"), { "active" }, VisualShaderNode::PORT_TYPE_BOOLEAN, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("AttractorForce", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "attractor_force", "ATTRACTOR_FORCE"), { "attractor_force" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("Color", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "color", "COLOR"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("Custom", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "custom", "CUSTOM"), { "custom" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("Delta", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "delta", "DELTA"), { "delta" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("EmissionTransform", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "emission_transform", "EMISSION_TRANSFORM"), { "emission_transform" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("Index", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "index", "INDEX"), { "index" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("LifeTime", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "lifetime", "LIFETIME"), { "lifetime" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("Restart", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "restart", "RESTART"), { "restart" }, VisualShaderNode::PORT_TYPE_BOOLEAN, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("Time", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "time", "TIME"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("Transform", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "transform", "TRANSFORM"), { "transform" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("Velocity", "Input", "All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "velocity", "VELOCITY"), { "velocity" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("Active", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "active", "ACTIVE"), { "active" }, VisualShaderNode::PORT_TYPE_BOOLEAN, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("AttractorForce", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "attractor_force", "ATTRACTOR_FORCE"), { "attractor_force" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("Color", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "color", "COLOR"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("Custom", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "custom", "CUSTOM"), { "custom" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("Delta", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "delta", "DELTA"), { "delta" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("EmissionTransform", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "emission_transform", "EMISSION_TRANSFORM"), { "emission_transform" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("Index", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "index", "INDEX"), { "index" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("LifeTime", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "lifetime", "LIFETIME"), { "lifetime" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("Restart", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "restart", "RESTART"), { "restart" }, VisualShaderNode::PORT_TYPE_BOOLEAN, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("Time", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "time", "TIME"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("Transform", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "transform", "TRANSFORM"), { "transform" }, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("Velocity", "Input/All", "VisualShaderNodeInput", vformat(input_param_shader_modes, "velocity", "VELOCITY"), { "velocity" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, -1, Shader::MODE_PARTICLES)); ///////////////// - add_options.push_back(AddOption("Input", "Input", "Common", "VisualShaderNodeInput", TTR("Input parameter."))); + add_options.push_back(AddOption("Input", "Input/Common", "VisualShaderNodeInput", TTR("Input parameter."))); const String input_param_for_vertex_and_fragment_shader_modes = TTR("'%s' input parameter for vertex and fragment shader modes.") + translation_gdsl; const String input_param_for_fragment_and_light_shader_modes = TTR("'%s' input parameter for fragment and light shader modes.") + translation_gdsl; @@ -5170,511 +5170,511 @@ VisualShaderEditor::VisualShaderEditor() { // NODE3D INPUTS - add_options.push_back(AddOption("Binormal", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "binormal", "BINORMAL"), { "binormal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Color", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "color", "COLOR"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("InstanceId", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_id", "INSTANCE_ID"), { "instance_id" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("InstanceCustom", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_custom", "INSTANCE_CUSTOM"), { "instance_custom" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ModelViewMatrix", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "modelview_matrix", "MODELVIEW_MATRIX"), { "modelview_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("PointSize", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "point_size", "POINT_SIZE"), { "point_size" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Tangent", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "tangent", "TANGENT"), { "tangent" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Vertex", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex", "VERTEX"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("VertexId", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "vertex_id", "VERTEX_ID"), { "vertex_id" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ViewIndex", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_index", "VIEW_INDEX"), { "view_index" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ViewMonoLeft", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_mono_left", "VIEW_MONO_LEFT"), { "view_mono_left" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ViewRight", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_right", "VIEW_RIGHT"), { "view_right" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("NodePositionWorld", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "node_position_world", "NODE_POSITION_WORLD"), { "node_position_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("CameraPositionWorld", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "camera_position_world", "CAMERA_POSITION_WORLD"), { "camera_position_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("CameraDirectionWorld", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "camera_direction_world", "CAMERA_DIRECTION_WORLD"), { "camera_direction_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("NodePositionView", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "node_position_view", "NODE_POSITION_VIEW"), { "node_position_view" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - - add_options.push_back(AddOption("Binormal", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "binormal", "BINORMAL"), { "binormal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Color", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "color", "COLOR"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("DepthTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "depth_texture", "DEPTH_TEXTURE"), { "depth_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("FragCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord", "FRAGCOORD"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("FrontFacing", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "front_facing", "FRONT_FACING"), { "front_facing" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("PointCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "point_coord", "POINT_COORD"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ScreenTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_texture", "SCREEN_TEXTURE"), { "screen_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ScreenUV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_uv", "SCREEN_UV"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Tangent", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "tangent", "TANGENT"), { "tangent" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Vertex", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex", "VERTEX"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("View", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view", "VIEW"), { "view" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ViewIndex", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_index", "VIEW_INDEX"), { "view_index" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ViewMonoLeft", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_mono_left", "VIEW_MONO_LEFT"), { "view_mono_left" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ViewRight", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_right", "VIEW_RIGHT"), { "view_right" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("NodePositionWorld", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "node_position_world", "NODE_POSITION_WORLD"), { "node_position_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("CameraPositionWorld", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "camera_position_world", "CAMERA_POSITION_WORLD"), { "camera_position_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("CameraDirectionWorld", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "camera_direction_world", "CAMERA_DIRECTION_WORLD"), { "camera_direction_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("NodePositionView", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "node_position_view", "NODE_POSITION_VIEW"), { "node_position_view" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - - add_options.push_back(AddOption("Albedo", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "albedo", "ALBEDO"), { "albedo" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Attenuation", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "attenuation", "ATTENUATION"), { "attenuation" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Backlight", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "backlight", "BACKLIGHT"), { "backlight" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Diffuse", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "diffuse", "DIFFUSE_LIGHT"), { "diffuse" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("FragCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord", "FRAGCOORD"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Light", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light", "LIGHT"), { "light" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("LightColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color", "LIGHT_COLOR"), { "light_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Metallic", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "metallic", "METALLIC"), { "metallic" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Roughness", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "roughness", "ROUGHNESS"), { "roughness" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Specular", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "specular", "SPECULAR_LIGHT"), { "specular" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("View", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view", "VIEW"), { "view" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Binormal", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "binormal", "BINORMAL"), { "binormal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Color", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "color", "COLOR"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("InstanceId", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_id", "INSTANCE_ID"), { "instance_id" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("InstanceCustom", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_custom", "INSTANCE_CUSTOM"), { "instance_custom" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ModelViewMatrix", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "modelview_matrix", "MODELVIEW_MATRIX"), { "modelview_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("PointSize", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "point_size", "POINT_SIZE"), { "point_size" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Tangent", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "tangent", "TANGENT"), { "tangent" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Vertex", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex", "VERTEX"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("VertexId", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "vertex_id", "VERTEX_ID"), { "vertex_id" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ViewIndex", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_index", "VIEW_INDEX"), { "view_index" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ViewMonoLeft", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_mono_left", "VIEW_MONO_LEFT"), { "view_mono_left" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ViewRight", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_right", "VIEW_RIGHT"), { "view_right" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("NodePositionWorld", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "node_position_world", "NODE_POSITION_WORLD"), { "node_position_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("CameraPositionWorld", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "camera_position_world", "CAMERA_POSITION_WORLD"), { "camera_position_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("CameraDirectionWorld", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "camera_direction_world", "CAMERA_DIRECTION_WORLD"), { "camera_direction_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("NodePositionView", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "node_position_view", "NODE_POSITION_VIEW"), { "node_position_view" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + + add_options.push_back(AddOption("Binormal", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "binormal", "BINORMAL"), { "binormal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Color", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "color", "COLOR"), { "color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("DepthTexture", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "depth_texture", "DEPTH_TEXTURE"), { "depth_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("FragCoord", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord", "FRAGCOORD"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("FrontFacing", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "front_facing", "FRONT_FACING"), { "front_facing" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("PointCoord", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "point_coord", "POINT_COORD"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ScreenTexture", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_texture", "SCREEN_TEXTURE"), { "screen_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ScreenUV", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_uv", "SCREEN_UV"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Tangent", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "tangent", "TANGENT"), { "tangent" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Vertex", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "vertex", "VERTEX"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("View", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view", "VIEW"), { "view" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ViewIndex", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_index", "VIEW_INDEX"), { "view_index" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ViewMonoLeft", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_mono_left", "VIEW_MONO_LEFT"), { "view_mono_left" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ViewRight", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "view_right", "VIEW_RIGHT"), { "view_right" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("NodePositionWorld", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "node_position_world", "NODE_POSITION_WORLD"), { "node_position_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("CameraPositionWorld", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "camera_position_world", "CAMERA_POSITION_WORLD"), { "camera_position_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("CameraDirectionWorld", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "camera_direction_world", "CAMERA_DIRECTION_WORLD"), { "camera_direction_world" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("NodePositionView", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "node_position_view", "NODE_POSITION_VIEW"), { "node_position_view" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + + add_options.push_back(AddOption("Albedo", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "albedo", "ALBEDO"), { "albedo" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Attenuation", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "attenuation", "ATTENUATION"), { "attenuation" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Backlight", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "backlight", "BACKLIGHT"), { "backlight" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Diffuse", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "diffuse", "DIFFUSE_LIGHT"), { "diffuse" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("FragCoord", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord", "FRAGCOORD"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Light", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light", "LIGHT"), { "light" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("LightColor", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color", "LIGHT_COLOR"), { "light_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Metallic", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "metallic", "METALLIC"), { "metallic" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Roughness", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "roughness", "ROUGHNESS"), { "roughness" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Specular", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "specular", "SPECULAR_LIGHT"), { "specular" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("View", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "view", "VIEW"), { "view" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); // CANVASITEM INPUTS - add_options.push_back(AddOption("AtLightPass", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "at_light_pass", "AT_LIGHT_PASS"), { "at_light_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("CanvasMatrix", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "canvas_matrix", "CANVAS_MATRIX"), { "canvas_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("InstanceCustom", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_custom", "INSTANCE_CUSTOM"), { "instance_custom" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("InstanceId", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_id", "INSTANCE_ID"), { "instance_id" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("ModelMatrix", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "model_matrix", "MODEL_MATRIX"), { "model_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("PointSize", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "point_size", "POINT_SIZE"), { "point_size" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("ScreenMatrix", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "screen_matrix", "SCREEN_MATRIX"), { "screen_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Vertex", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "vertex", "VERTEX"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("VertexId", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "vertex_id", "VERTEX_ID"), { "vertex_id" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); - - add_options.push_back(AddOption("AtLightPass", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "at_light_pass", "AT_LIGHT_PASS"), { "at_light_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("FragCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord", "FRAGCOORD"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("NormalTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "normal_texture", "NORMAL_TEXTURE"), { "normal_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("PointCoord", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord", "POINT_COORD"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("ScreenPixelSize", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_pixel_size", "SCREEN_PIXEL_SIZE"), { "screen_pixel_size" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("ScreenTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_texture", "SCREEN_TEXTURE"), { "screen_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("ScreenUV", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv", "SCREEN_UV"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("SpecularShininess", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "specular_shininess", "SPECULAR_SHININESS"), { "specular_shininess" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("SpecularShininessTexture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "specular_shininess_texture", "SPECULAR_SHININESS_TEXTURE"), { "specular_shininess_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Texture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture", "TEXTURE"), { "texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Vertex", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "vertex", "VERTEX"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); - - add_options.push_back(AddOption("FragCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord", "FRAGCOORD"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Light", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light", "LIGHT"), { "light" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("LightColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color", "LIGHT_COLOR"), { "light_color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("LightPosition", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_position", "LIGHT_POSITION"), { "light_position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("LightVertex", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "light_vertex", "LIGHT_VERTEX"), { "light_vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Normal", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "normal", "NORMAL"), { "normal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("PointCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord", "POINT_COORD"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("ScreenUV", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv", "SCREEN_UV"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Shadow", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow", "SHADOW_MODULATE"), { "shadow" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("SpecularShininess", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "specular_shininess", "SPECULAR_SHININESS"), { "specular_shininess" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("Texture", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture", "TEXTURE"), { "texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("AtLightPass", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "at_light_pass", "AT_LIGHT_PASS"), { "at_light_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("CanvasMatrix", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "canvas_matrix", "CANVAS_MATRIX"), { "canvas_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("InstanceCustom", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_custom", "INSTANCE_CUSTOM"), { "instance_custom" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("InstanceId", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "instance_id", "INSTANCE_ID"), { "instance_id" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ModelMatrix", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "model_matrix", "MODEL_MATRIX"), { "model_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("PointSize", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "point_size", "POINT_SIZE"), { "point_size" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ScreenMatrix", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "screen_matrix", "SCREEN_MATRIX"), { "screen_matrix" }, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Vertex", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "vertex", "VERTEX"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("VertexId", "Input/Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "vertex_id", "VERTEX_ID"), { "vertex_id" }, VisualShaderNode::PORT_TYPE_SCALAR_INT, TYPE_FLAGS_VERTEX, Shader::MODE_CANVAS_ITEM)); + + add_options.push_back(AddOption("AtLightPass", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_modes, "at_light_pass", "AT_LIGHT_PASS"), { "at_light_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("FragCoord", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord", "FRAGCOORD"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("NormalTexture", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "normal_texture", "NORMAL_TEXTURE"), { "normal_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("PointCoord", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord", "POINT_COORD"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ScreenPixelSize", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_pixel_size", "SCREEN_PIXEL_SIZE"), { "screen_pixel_size" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ScreenTexture", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "screen_texture", "SCREEN_TEXTURE"), { "screen_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ScreenUV", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv", "SCREEN_UV"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("SpecularShininess", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "specular_shininess", "SPECULAR_SHININESS"), { "specular_shininess" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("SpecularShininessTexture", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_shader_mode, "specular_shininess_texture", "SPECULAR_SHININESS_TEXTURE"), { "specular_shininess_texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Texture", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture", "TEXTURE"), { "texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Vertex", "Input/Fragment", "VisualShaderNodeInput", vformat(input_param_for_vertex_and_fragment_shader_mode, "vertex", "VERTEX"), { "vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + + add_options.push_back(AddOption("FragCoord", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord", "FRAGCOORD"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Light", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light", "LIGHT"), { "light" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("LightColor", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color", "LIGHT_COLOR"), { "light_color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("LightPosition", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_position", "LIGHT_POSITION"), { "light_position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("LightVertex", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "light_vertex", "LIGHT_VERTEX"), { "light_vertex" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Normal", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "normal", "NORMAL"), { "normal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("PointCoord", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord", "POINT_COORD"), { "point_coord" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ScreenUV", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv", "SCREEN_UV"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Shadow", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow", "SHADOW_MODULATE"), { "shadow" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("SpecularShininess", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "specular_shininess", "SPECULAR_SHININESS"), { "specular_shininess" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Texture", "Input/Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture", "TEXTURE"), { "texture" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); // SKY INPUTS - add_options.push_back(AddOption("AtCubeMapPass", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "at_cubemap_pass", "AT_CUBEMAP_PASS"), { "at_cubemap_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("AtHalfResPass", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "at_half_res_pass", "AT_HALF_RES_PASS"), { "at_half_res_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("AtQuarterResPass", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "at_quarter_res_pass", "AT_QUARTER_RES_PASS"), { "at_quarter_res_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("EyeDir", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "eyedir", "EYEDIR"), { "eyedir" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("HalfResColor", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "half_res_color", "HALF_RES_COLOR"), { "half_res_color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light0Color", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_color", "LIGHT0_COLOR"), { "light0_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light0Direction", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_direction", "LIGHT0_DIRECTION"), { "light0_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light0Enabled", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_enabled", "LIGHT0_ENABLED"), { "light0_enabled" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light0Energy", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_energy", "LIGHT0_ENERGY"), { "light0_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light1Color", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_color", "LIGHT1_COLOR"), { "light1_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light1Direction", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_direction", "LIGHT1_DIRECTION"), { "light1_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light1Enabled", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_enabled", "LIGHT1_ENABLED"), { "light1_enabled" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light1Energy", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_energy", "LIGHT1_ENERGY"), { "light1_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light2Color", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_color", "LIGHT2_COLOR"), { "light2_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light2Direction", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_direction", "LIGHT2_DIRECTION"), { "light2_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light2Enabled", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_enabled", "LIGHT2_ENABLED"), { "light2_enabled" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light2Energy", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_energy", "LIGHT2_ENERGY"), { "light2_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light3Color", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_color", "LIGHT3_COLOR"), { "light3_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light3Direction", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_direction", "LIGHT3_DIRECTION"), { "light3_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light3Enabled", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_enabled", "LIGHT3_ENABLED"), { "light3_enabled" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Light3Energy", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_energy", "LIGHT3_ENERGY"), { "light3_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Position", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "position", "POSITION"), { "position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("QuarterResColor", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "quarter_res_color", "QUARTER_RES_COLOR"), { "quarter_res_color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Radiance", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "radiance", "RADIANCE"), { "radiance" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("ScreenUV", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "screen_uv", "SCREEN_UV"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("FragCoord", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "fragcoord", "FRAGCOORD"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - - add_options.push_back(AddOption("SkyCoords", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "sky_coords", "SKY_COORDS"), { "sky_coords" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); - add_options.push_back(AddOption("Time", "Input", "Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "time", "TIME"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("AtCubeMapPass", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "at_cubemap_pass", "AT_CUBEMAP_PASS"), { "at_cubemap_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("AtHalfResPass", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "at_half_res_pass", "AT_HALF_RES_PASS"), { "at_half_res_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("AtQuarterResPass", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "at_quarter_res_pass", "AT_QUARTER_RES_PASS"), { "at_quarter_res_pass" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("EyeDir", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "eyedir", "EYEDIR"), { "eyedir" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("HalfResColor", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "half_res_color", "HALF_RES_COLOR"), { "half_res_color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light0Color", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_color", "LIGHT0_COLOR"), { "light0_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light0Direction", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_direction", "LIGHT0_DIRECTION"), { "light0_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light0Enabled", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_enabled", "LIGHT0_ENABLED"), { "light0_enabled" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light0Energy", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light0_energy", "LIGHT0_ENERGY"), { "light0_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light1Color", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_color", "LIGHT1_COLOR"), { "light1_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light1Direction", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_direction", "LIGHT1_DIRECTION"), { "light1_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light1Enabled", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_enabled", "LIGHT1_ENABLED"), { "light1_enabled" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light1Energy", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light1_energy", "LIGHT1_ENERGY"), { "light1_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light2Color", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_color", "LIGHT2_COLOR"), { "light2_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light2Direction", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_direction", "LIGHT2_DIRECTION"), { "light2_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light2Enabled", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_enabled", "LIGHT2_ENABLED"), { "light2_enabled" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light2Energy", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light2_energy", "LIGHT2_ENERGY"), { "light2_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light3Color", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_color", "LIGHT3_COLOR"), { "light3_color" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light3Direction", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_direction", "LIGHT3_DIRECTION"), { "light3_direction" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light3Enabled", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_enabled", "LIGHT3_ENABLED"), { "light3_enabled" }, VisualShaderNode::PORT_TYPE_BOOLEAN, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Light3Energy", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "light3_energy", "LIGHT3_ENERGY"), { "light3_energy" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Position", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "position", "POSITION"), { "position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("QuarterResColor", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "quarter_res_color", "QUARTER_RES_COLOR"), { "quarter_res_color" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Radiance", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "radiance", "RADIANCE"), { "radiance" }, VisualShaderNode::PORT_TYPE_SAMPLER, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("ScreenUV", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "screen_uv", "SCREEN_UV"), { "screen_uv" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("FragCoord", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "fragcoord", "FRAGCOORD"), { "fragcoord" }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + + add_options.push_back(AddOption("SkyCoords", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "sky_coords", "SKY_COORDS"), { "sky_coords" }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_SKY, Shader::MODE_SKY)); + add_options.push_back(AddOption("Time", "Input/Sky", "VisualShaderNodeInput", vformat(input_param_for_sky_shader_mode, "time", "TIME"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_SKY, Shader::MODE_SKY)); // FOG INPUTS - add_options.push_back(AddOption("WorldPosition", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "world_position", "WORLD_POSITION"), { "world_position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FOG, Shader::MODE_FOG)); - add_options.push_back(AddOption("ObjectPosition", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "object_position", "OBJECT_POSITION"), { "object_position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FOG, Shader::MODE_FOG)); - add_options.push_back(AddOption("UVW", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "uvw", "UVW"), { "uvw" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FOG, Shader::MODE_FOG)); - add_options.push_back(AddOption("Extents", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "extents", "EXTENTS"), { "extents" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FOG, Shader::MODE_FOG)); - add_options.push_back(AddOption("SDF", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "sdf", "SDF"), { "sdf" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); - add_options.push_back(AddOption("Time", "Input", "Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "time", "TIME"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("WorldPosition", "Input/Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "world_position", "WORLD_POSITION"), { "world_position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("ObjectPosition", "Input/Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "object_position", "OBJECT_POSITION"), { "object_position" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("UVW", "Input/Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "uvw", "UVW"), { "uvw" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("Extents", "Input/Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "extents", "EXTENTS"), { "extents" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("SDF", "Input/Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "sdf", "SDF"), { "sdf" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); + add_options.push_back(AddOption("Time", "Input/Fog", "VisualShaderNodeInput", vformat(input_param_for_fog_shader_mode, "time", "TIME"), { "time" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FOG, Shader::MODE_FOG)); // PARTICLES INPUTS - add_options.push_back(AddOption("CollisionDepth", "Input", "Collide", "VisualShaderNodeInput", vformat(input_param_for_collide_shader_mode, "collision_depth", "COLLISION_DEPTH"), { "collision_depth" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("CollisionNormal", "Input", "Collide", "VisualShaderNodeInput", vformat(input_param_for_collide_shader_mode, "collision_normal", "COLLISION_NORMAL"), { "collision_normal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("CollisionDepth", "Input/Collide", "VisualShaderNodeInput", vformat(input_param_for_collide_shader_mode, "collision_depth", "COLLISION_DEPTH"), { "collision_depth" }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("CollisionNormal", "Input/Collide", "VisualShaderNodeInput", vformat(input_param_for_collide_shader_mode, "collision_normal", "COLLISION_NORMAL"), { "collision_normal" }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); // PARTICLES - add_options.push_back(AddOption("EmitParticle", "Particles", "", "VisualShaderNodeParticleEmit", "", {}, -1, TYPE_FLAGS_PROCESS | TYPE_FLAGS_PROCESS_CUSTOM | TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("ParticleAccelerator", "Particles", "", "VisualShaderNodeParticleAccelerator", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("ParticleRandomness", "Particles", "", "VisualShaderNodeParticleRandomness", "", {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_EMIT | TYPE_FLAGS_PROCESS | TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("MultiplyByAxisAngle", "Particles", "Transform", "VisualShaderNodeParticleMultiplyByAxisAngle", TTR("A node for help to multiply a position input vector by rotation using specific axis. Intended to work with emitters."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT | TYPE_FLAGS_PROCESS | TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("EmitParticle", "Particles", "VisualShaderNodeParticleEmit", "", {}, -1, TYPE_FLAGS_PROCESS | TYPE_FLAGS_PROCESS_CUSTOM | TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("ParticleAccelerator", "Particles", "VisualShaderNodeParticleAccelerator", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_PROCESS, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("ParticleRandomness", "Particles", "VisualShaderNodeParticleRandomness", "", {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_EMIT | TYPE_FLAGS_PROCESS | TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("MultiplyByAxisAngle", "Particles/Transform", "VisualShaderNodeParticleMultiplyByAxisAngle", TTR("A node for help to multiply a position input vector by rotation using specific axis. Intended to work with emitters."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT | TYPE_FLAGS_PROCESS | TYPE_FLAGS_COLLIDE, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("BoxEmitter", "Particles", "Emitters", "VisualShaderNodeParticleBoxEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("MeshEmitter", "Particles", "Emitters", "VisualShaderNodeParticleMeshEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("RingEmitter", "Particles", "Emitters", "VisualShaderNodeParticleRingEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("SphereEmitter", "Particles", "Emitters", "VisualShaderNodeParticleSphereEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("BoxEmitter", "Particles/Emitters", "VisualShaderNodeParticleBoxEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("MeshEmitter", "Particles/Emitters", "VisualShaderNodeParticleMeshEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("RingEmitter", "Particles/Emitters", "VisualShaderNodeParticleRingEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("SphereEmitter", "Particles/Emitters", "VisualShaderNodeParticleSphereEmitter", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); - add_options.push_back(AddOption("ConeVelocity", "Particles", "Velocity", "VisualShaderNodeParticleConeVelocity", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); + add_options.push_back(AddOption("ConeVelocity", "Particles/Velocity", "VisualShaderNodeParticleConeVelocity", "", {}, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_EMIT, Shader::MODE_PARTICLES)); // SCALAR - add_options.push_back(AddOption("FloatFunc", "Scalar", "Common", "VisualShaderNodeFloatFunc", TTR("Float function."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("FloatOp", "Scalar", "Common", "VisualShaderNodeFloatOp", TTR("Float operator."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("IntFunc", "Scalar", "Common", "VisualShaderNodeIntFunc", TTR("Integer function."), {}, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("IntOp", "Scalar", "Common", "VisualShaderNodeIntOp", TTR("Integer operator."), {}, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("FloatFunc", "Scalar/Common", "VisualShaderNodeFloatFunc", TTR("Float function."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("FloatOp", "Scalar/Common", "VisualShaderNodeFloatOp", TTR("Float operator."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("IntFunc", "Scalar/Common", "VisualShaderNodeIntFunc", TTR("Integer function."), {}, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("IntOp", "Scalar/Common", "VisualShaderNodeIntOp", TTR("Integer operator."), {}, VisualShaderNode::PORT_TYPE_SCALAR_INT)); // CONSTANTS for (int i = 0; i < MAX_FLOAT_CONST_DEFS; i++) { - add_options.push_back(AddOption(float_constant_defs[i].name, "Scalar", "Constants", "VisualShaderNodeFloatConstant", float_constant_defs[i].desc, { float_constant_defs[i].value }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption(float_constant_defs[i].name, "Scalar/Constants", "VisualShaderNodeFloatConstant", float_constant_defs[i].desc, { float_constant_defs[i].value }, VisualShaderNode::PORT_TYPE_SCALAR)); } // FUNCTIONS - add_options.push_back(AddOption("Abs", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ABS }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Abs", "Scalar", "Functions", "VisualShaderNodeIntFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeIntFunc::FUNC_ABS }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("ACos", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the arc-cosine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ACOS }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("ACosH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ACOSH }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("ASin", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the arc-sine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ASIN }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("ASinH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ASINH }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("ATan", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the arc-tangent of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ATAN }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("ATan2", "Scalar", "Functions", "VisualShaderNodeFloatOp", TTR("Returns the arc-tangent of the parameters."), { VisualShaderNodeFloatOp::OP_ATAN2 }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("ATanH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ATANH }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("BitwiseNOT", "Scalar", "Functions", "VisualShaderNodeIntFunc", TTR("Returns the result of bitwise NOT (~a) operation on the integer."), { VisualShaderNodeIntFunc::FUNC_BITWISE_NOT }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("Ceil", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), { VisualShaderNodeFloatFunc::FUNC_CEIL }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Clamp", "Scalar", "Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_FLOAT }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Clamp", "Scalar", "Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_INT }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("Cos", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the cosine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_COS }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("CosH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the hyperbolic cosine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_COSH }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Degrees", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Converts a quantity in radians to degrees."), { VisualShaderNodeFloatFunc::FUNC_DEGREES }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("DFdX", "Scalar", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'x' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_X, VisualShaderNodeDerivativeFunc::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("DFdY", "Scalar", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'y' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_Y, VisualShaderNodeDerivativeFunc::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("Exp", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Base-e Exponential."), { VisualShaderNodeFloatFunc::FUNC_EXP }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Exp2", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Base-2 Exponential."), { VisualShaderNodeFloatFunc::FUNC_EXP2 }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Floor", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest integer less than or equal to the parameter."), { VisualShaderNodeFloatFunc::FUNC_FLOOR }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Fract", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Computes the fractional part of the argument."), { VisualShaderNodeFloatFunc::FUNC_FRACT }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("InverseSqrt", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse of the square root of the parameter."), { VisualShaderNodeFloatFunc::FUNC_INVERSE_SQRT }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Log", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Natural logarithm."), { VisualShaderNodeFloatFunc::FUNC_LOG }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Log2", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Base-2 logarithm."), { VisualShaderNodeFloatFunc::FUNC_LOG2 }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Max", "Scalar", "Functions", "VisualShaderNodeFloatOp", TTR("Returns the greater of two values."), { VisualShaderNodeFloatOp::OP_MAX }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Min", "Scalar", "Functions", "VisualShaderNodeFloatOp", TTR("Returns the lesser of two values."), { VisualShaderNodeFloatOp::OP_MIN }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Mix", "Scalar", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two scalars."), { VisualShaderNodeMix::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("MultiplyAdd", "Scalar", "Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on scalars."), { VisualShaderNodeMultiplyAdd::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Negate", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeFloatFunc::FUNC_NEGATE }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Negate", "Scalar", "Functions", "VisualShaderNodeIntFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeIntFunc::FUNC_NEGATE }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("OneMinus", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("1.0 - scalar"), { VisualShaderNodeFloatFunc::FUNC_ONEMINUS }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Pow", "Scalar", "Functions", "VisualShaderNodeFloatOp", TTR("Returns the value of the first parameter raised to the power of the second."), { VisualShaderNodeFloatOp::OP_POW }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Radians", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Converts a quantity in degrees to radians."), { VisualShaderNodeFloatFunc::FUNC_RADIANS }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Reciprocal", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("1.0 / scalar"), { VisualShaderNodeFloatFunc::FUNC_RECIPROCAL }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Round", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest integer to the parameter."), { VisualShaderNodeFloatFunc::FUNC_ROUND }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("RoundEven", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest even integer to the parameter."), { VisualShaderNodeFloatFunc::FUNC_ROUNDEVEN }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Saturate", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Clamps the value between 0.0 and 1.0."), { VisualShaderNodeFloatFunc::FUNC_SATURATE }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Sign", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeFloatFunc::FUNC_SIGN }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Sign", "Scalar", "Functions", "VisualShaderNodeIntFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeIntFunc::FUNC_SIGN }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("Sin", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the sine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_SIN }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("SinH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the hyperbolic sine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_SINH }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Sqrt", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the square root of the parameter."), { VisualShaderNodeFloatFunc::FUNC_SQRT }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("SmoothStep", "Scalar", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Step", "Scalar", "Functions", "VisualShaderNodeStep", TTR("Step function( scalar(edge), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Sum", "Scalar", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeDerivativeFunc::FUNC_SUM, VisualShaderNodeDerivativeFunc::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("Tan", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the tangent of the parameter."), { VisualShaderNodeFloatFunc::FUNC_TAN }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("TanH", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Returns the hyperbolic tangent of the parameter."), { VisualShaderNodeFloatFunc::FUNC_TANH }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Trunc", "Scalar", "Functions", "VisualShaderNodeFloatFunc", TTR("Finds the truncated value of the parameter."), { VisualShaderNodeFloatFunc::FUNC_TRUNC }, VisualShaderNode::PORT_TYPE_SCALAR)); - - add_options.push_back(AddOption("Add", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Sums two floating-point scalars."), { VisualShaderNodeFloatOp::OP_ADD }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Add", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Sums two integer scalars."), { VisualShaderNodeIntOp::OP_ADD }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("BitwiseAND", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise AND (a & b) operation for two integers."), { VisualShaderNodeIntOp::OP_BITWISE_AND }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("BitwiseLeftShift", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise left shift (a << b) operation on the integer."), { VisualShaderNodeIntOp::OP_BITWISE_LEFT_SHIFT }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("BitwiseOR", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise OR (a | b) operation for two integers."), { VisualShaderNodeIntOp::OP_BITWISE_OR }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("BitwiseRightShift", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise right shift (a >> b) operation on the integer."), { VisualShaderNodeIntOp::OP_BITWISE_RIGHT_SHIFT }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("BitwiseXOR", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise XOR (a ^ b) operation on the integer."), { VisualShaderNodeIntOp::OP_BITWISE_XOR }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("Divide", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Divides two floating-point scalars."), { VisualShaderNodeFloatOp::OP_DIV }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Divide", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Divides two integer scalars."), { VisualShaderNodeIntOp::OP_DIV }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("Multiply", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Multiplies two floating-point scalars."), { VisualShaderNodeFloatOp::OP_MUL }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Multiply", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Multiplies two integer scalars."), { VisualShaderNodeIntOp::OP_MUL }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("Remainder", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Returns the remainder of the two floating-point scalars."), { VisualShaderNodeFloatOp::OP_MOD }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Remainder", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Returns the remainder of the two integer scalars."), { VisualShaderNodeIntOp::OP_MOD }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("Subtract", "Scalar", "Operators", "VisualShaderNodeFloatOp", TTR("Subtracts two floating-point scalars."), { VisualShaderNodeFloatOp::OP_SUB }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Subtract", "Scalar", "Operators", "VisualShaderNodeIntOp", TTR("Subtracts two integer scalars."), { VisualShaderNodeIntOp::OP_SUB }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - - add_options.push_back(AddOption("FloatConstant", "Scalar", "Variables", "VisualShaderNodeFloatConstant", TTR("Scalar floating-point constant."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("IntConstant", "Scalar", "Variables", "VisualShaderNodeIntConstant", TTR("Scalar integer constant."), {}, VisualShaderNode::PORT_TYPE_SCALAR_INT)); - add_options.push_back(AddOption("FloatParameter", "Scalar", "Variables", "VisualShaderNodeFloatParameter", TTR("Scalar floating-point parameter."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("IntParameter", "Scalar", "Variables", "VisualShaderNodeIntParameter", TTR("Scalar integer parameter."), {}, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("Abs", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ABS }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Abs", "Scalar/Functions", "VisualShaderNodeIntFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeIntFunc::FUNC_ABS }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("ACos", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the arc-cosine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ACOS }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("ACosH", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ACOSH }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("ASin", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the arc-sine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ASIN }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("ASinH", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ASINH }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("ATan", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the arc-tangent of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ATAN }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("ATan2", "Scalar/Functions", "VisualShaderNodeFloatOp", TTR("Returns the arc-tangent of the parameters."), { VisualShaderNodeFloatOp::OP_ATAN2 }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("ATanH", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), { VisualShaderNodeFloatFunc::FUNC_ATANH }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("BitwiseNOT", "Scalar/Functions", "VisualShaderNodeIntFunc", TTR("Returns the result of bitwise NOT (~a) operation on the integer."), { VisualShaderNodeIntFunc::FUNC_BITWISE_NOT }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("Ceil", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), { VisualShaderNodeFloatFunc::FUNC_CEIL }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Clamp", "Scalar/Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_FLOAT }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Clamp", "Scalar/Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_INT }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("Cos", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the cosine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_COS }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("CosH", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the hyperbolic cosine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_COSH }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Degrees", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Converts a quantity in radians to degrees."), { VisualShaderNodeFloatFunc::FUNC_DEGREES }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("DFdX", "Scalar/Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'x' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_X, VisualShaderNodeDerivativeFunc::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("DFdY", "Scalar/Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'y' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_Y, VisualShaderNodeDerivativeFunc::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("Exp", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Base-e Exponential."), { VisualShaderNodeFloatFunc::FUNC_EXP }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Exp2", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Base-2 Exponential."), { VisualShaderNodeFloatFunc::FUNC_EXP2 }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Floor", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest integer less than or equal to the parameter."), { VisualShaderNodeFloatFunc::FUNC_FLOOR }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Fract", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Computes the fractional part of the argument."), { VisualShaderNodeFloatFunc::FUNC_FRACT }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("InverseSqrt", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the inverse of the square root of the parameter."), { VisualShaderNodeFloatFunc::FUNC_INVERSE_SQRT }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Log", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Natural logarithm."), { VisualShaderNodeFloatFunc::FUNC_LOG }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Log2", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Base-2 logarithm."), { VisualShaderNodeFloatFunc::FUNC_LOG2 }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Max", "Scalar/Functions", "VisualShaderNodeFloatOp", TTR("Returns the greater of two values."), { VisualShaderNodeFloatOp::OP_MAX }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Min", "Scalar/Functions", "VisualShaderNodeFloatOp", TTR("Returns the lesser of two values."), { VisualShaderNodeFloatOp::OP_MIN }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Mix", "Scalar/Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two scalars."), { VisualShaderNodeMix::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("MultiplyAdd", "Scalar/Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on scalars."), { VisualShaderNodeMultiplyAdd::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Negate", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeFloatFunc::FUNC_NEGATE }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Negate", "Scalar/Functions", "VisualShaderNodeIntFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeIntFunc::FUNC_NEGATE }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("OneMinus", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("1.0 - scalar"), { VisualShaderNodeFloatFunc::FUNC_ONEMINUS }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Pow", "Scalar/Functions", "VisualShaderNodeFloatOp", TTR("Returns the value of the first parameter raised to the power of the second."), { VisualShaderNodeFloatOp::OP_POW }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Radians", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Converts a quantity in degrees to radians."), { VisualShaderNodeFloatFunc::FUNC_RADIANS }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Reciprocal", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("1.0 / scalar"), { VisualShaderNodeFloatFunc::FUNC_RECIPROCAL }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Round", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest integer to the parameter."), { VisualShaderNodeFloatFunc::FUNC_ROUND }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("RoundEven", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Finds the nearest even integer to the parameter."), { VisualShaderNodeFloatFunc::FUNC_ROUNDEVEN }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Saturate", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Clamps the value between 0.0 and 1.0."), { VisualShaderNodeFloatFunc::FUNC_SATURATE }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Sign", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeFloatFunc::FUNC_SIGN }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Sign", "Scalar/Functions", "VisualShaderNodeIntFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeIntFunc::FUNC_SIGN }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("Sin", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the sine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_SIN }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("SinH", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the hyperbolic sine of the parameter."), { VisualShaderNodeFloatFunc::FUNC_SINH }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Sqrt", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the square root of the parameter."), { VisualShaderNodeFloatFunc::FUNC_SQRT }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("SmoothStep", "Scalar/Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Step", "Scalar/Functions", "VisualShaderNodeStep", TTR("Step function( scalar(edge), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Sum", "Scalar/Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeDerivativeFunc::FUNC_SUM, VisualShaderNodeDerivativeFunc::OP_TYPE_SCALAR }, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("Tan", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the tangent of the parameter."), { VisualShaderNodeFloatFunc::FUNC_TAN }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("TanH", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Returns the hyperbolic tangent of the parameter."), { VisualShaderNodeFloatFunc::FUNC_TANH }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Trunc", "Scalar/Functions", "VisualShaderNodeFloatFunc", TTR("Finds the truncated value of the parameter."), { VisualShaderNodeFloatFunc::FUNC_TRUNC }, VisualShaderNode::PORT_TYPE_SCALAR)); + + add_options.push_back(AddOption("Add", "Scalar/Operators", "VisualShaderNodeFloatOp", TTR("Sums two floating-point scalars."), { VisualShaderNodeFloatOp::OP_ADD }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Add", "Scalar/Operators", "VisualShaderNodeIntOp", TTR("Sums two integer scalars."), { VisualShaderNodeIntOp::OP_ADD }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("BitwiseAND", "Scalar/Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise AND (a & b) operation for two integers."), { VisualShaderNodeIntOp::OP_BITWISE_AND }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("BitwiseLeftShift", "Scalar/Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise left shift (a << b) operation on the integer."), { VisualShaderNodeIntOp::OP_BITWISE_LEFT_SHIFT }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("BitwiseOR", "Scalar/Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise OR (a | b) operation for two integers."), { VisualShaderNodeIntOp::OP_BITWISE_OR }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("BitwiseRightShift", "Scalar/Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise right shift (a >> b) operation on the integer."), { VisualShaderNodeIntOp::OP_BITWISE_RIGHT_SHIFT }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("BitwiseXOR", "Scalar/Operators", "VisualShaderNodeIntOp", TTR("Returns the result of bitwise XOR (a ^ b) operation on the integer."), { VisualShaderNodeIntOp::OP_BITWISE_XOR }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("Divide", "Scalar/Operators", "VisualShaderNodeFloatOp", TTR("Divides two floating-point scalars."), { VisualShaderNodeFloatOp::OP_DIV }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Divide", "Scalar/Operators", "VisualShaderNodeIntOp", TTR("Divides two integer scalars."), { VisualShaderNodeIntOp::OP_DIV }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("Multiply", "Scalar/Operators", "VisualShaderNodeFloatOp", TTR("Multiplies two floating-point scalars."), { VisualShaderNodeFloatOp::OP_MUL }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Multiply", "Scalar/Operators", "VisualShaderNodeIntOp", TTR("Multiplies two integer scalars."), { VisualShaderNodeIntOp::OP_MUL }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("Remainder", "Scalar/Operators", "VisualShaderNodeFloatOp", TTR("Returns the remainder of the two floating-point scalars."), { VisualShaderNodeFloatOp::OP_MOD }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Remainder", "Scalar/Operators", "VisualShaderNodeIntOp", TTR("Returns the remainder of the two integer scalars."), { VisualShaderNodeIntOp::OP_MOD }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("Subtract", "Scalar/Operators", "VisualShaderNodeFloatOp", TTR("Subtracts two floating-point scalars."), { VisualShaderNodeFloatOp::OP_SUB }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Subtract", "Scalar/Operators", "VisualShaderNodeIntOp", TTR("Subtracts two integer scalars."), { VisualShaderNodeIntOp::OP_SUB }, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + + add_options.push_back(AddOption("FloatConstant", "Scalar/Variables", "VisualShaderNodeFloatConstant", TTR("Scalar floating-point constant."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("IntConstant", "Scalar/Variables", "VisualShaderNodeIntConstant", TTR("Scalar integer constant."), {}, VisualShaderNode::PORT_TYPE_SCALAR_INT)); + add_options.push_back(AddOption("FloatParameter", "Scalar/Variables", "VisualShaderNodeFloatParameter", TTR("Scalar floating-point parameter."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("IntParameter", "Scalar/Variables", "VisualShaderNodeIntParameter", TTR("Scalar integer parameter."), {}, VisualShaderNode::PORT_TYPE_SCALAR_INT)); // SDF { - add_options.push_back(AddOption("ScreenUVToSDF", "SDF", "", "VisualShaderNodeScreenUVToSDF", TTR("Converts screen UV to a SDF."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("SDFRaymarch", "SDF", "", "VisualShaderNodeSDFRaymarch", TTR("Casts a ray against the screen SDF and returns the distance travelled."), {}, -1, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("SDFToScreenUV", "SDF", "", "VisualShaderNodeSDFToScreenUV", TTR("Converts a SDF to screen UV."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("TextureSDF", "SDF", "", "VisualShaderNodeTextureSDF", TTR("Performs a SDF texture lookup."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("TextureSDFNormal", "SDF", "", "VisualShaderNodeTextureSDFNormal", TTR("Performs a SDF normal texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ScreenUVToSDF", "SDF", "VisualShaderNodeScreenUVToSDF", TTR("Converts screen UV to a SDF."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("SDFRaymarch", "SDF", "VisualShaderNodeSDFRaymarch", TTR("Casts a ray against the screen SDF and returns the distance travelled."), {}, -1, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("SDFToScreenUV", "SDF", "VisualShaderNodeSDFToScreenUV", TTR("Converts a SDF to screen UV."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("TextureSDF", "SDF", "VisualShaderNodeTextureSDF", TTR("Performs a SDF texture lookup."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("TextureSDFNormal", "SDF", "VisualShaderNodeTextureSDFNormal", TTR("Performs a SDF normal texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); } // TEXTURES - add_options.push_back(AddOption("UVFunc", "Textures", "Common", "VisualShaderNodeUVFunc", TTR("Function to be applied on texture coordinates."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("UVPolarCoord", "Textures", "Common", "VisualShaderNodeUVPolarCoord", TTR("Polar coordinates conversion applied on texture coordinates."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("UVFunc", "Textures/Common", "VisualShaderNodeUVFunc", TTR("Function to be applied on texture coordinates."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("UVPolarCoord", "Textures/Common", "VisualShaderNodeUVPolarCoord", TTR("Polar coordinates conversion applied on texture coordinates."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); cubemap_node_option_idx = add_options.size(); - add_options.push_back(AddOption("CubeMap", "Textures", "Functions", "VisualShaderNodeCubemap", TTR("Perform the cubic texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("CubeMap", "Textures/Functions", "VisualShaderNodeCubemap", TTR("Perform the cubic texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); curve_node_option_idx = add_options.size(); - add_options.push_back(AddOption("CurveTexture", "Textures", "Functions", "VisualShaderNodeCurveTexture", TTR("Perform the curve texture lookup."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("CurveTexture", "Textures/Functions", "VisualShaderNodeCurveTexture", TTR("Perform the curve texture lookup."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); curve_xyz_node_option_idx = add_options.size(); - add_options.push_back(AddOption("CurveXYZTexture", "Textures", "Functions", "VisualShaderNodeCurveXYZTexture", TTR("Perform the three components curve texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("LinearSceneDepth", "Textures", "Functions", "VisualShaderNodeLinearSceneDepth", TTR("Returns the depth value of the DEPTH_TEXTURE node in a linear space."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("CurveXYZTexture", "Textures/Functions", "VisualShaderNodeCurveXYZTexture", TTR("Perform the three components curve texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("LinearSceneDepth", "Textures/Functions", "VisualShaderNodeLinearSceneDepth", TTR("Returns the depth value of the DEPTH_TEXTURE node in a linear space."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); texture2d_node_option_idx = add_options.size(); - add_options.push_back(AddOption("Texture2D", "Textures", "Functions", "VisualShaderNodeTexture", TTR("Perform the 2D texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Texture2D", "Textures/Functions", "VisualShaderNodeTexture", TTR("Perform the 2D texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); texture2d_array_node_option_idx = add_options.size(); - add_options.push_back(AddOption("Texture2DArray", "Textures", "Functions", "VisualShaderNodeTexture2DArray", TTR("Perform the 2D-array texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Texture2DArray", "Textures/Functions", "VisualShaderNodeTexture2DArray", TTR("Perform the 2D-array texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); texture3d_node_option_idx = add_options.size(); - add_options.push_back(AddOption("Texture3D", "Textures", "Functions", "VisualShaderNodeTexture3D", TTR("Perform the 3D texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("UVPanning", "Textures", "Functions", "VisualShaderNodeUVFunc", TTR("Apply panning function on texture coordinates."), { VisualShaderNodeUVFunc::FUNC_PANNING }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("UVScaling", "Textures", "Functions", "VisualShaderNodeUVFunc", TTR("Apply scaling function on texture coordinates."), { VisualShaderNodeUVFunc::FUNC_SCALING }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Texture3D", "Textures/Functions", "VisualShaderNodeTexture3D", TTR("Perform the 3D texture lookup."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("UVPanning", "Textures/Functions", "VisualShaderNodeUVFunc", TTR("Apply panning function on texture coordinates."), { VisualShaderNodeUVFunc::FUNC_PANNING }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("UVScaling", "Textures/Functions", "VisualShaderNodeUVFunc", TTR("Apply scaling function on texture coordinates."), { VisualShaderNodeUVFunc::FUNC_SCALING }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("CubeMapParameter", "Textures", "Variables", "VisualShaderNodeCubemapParameter", TTR("Cubic texture parameter lookup."), {}, VisualShaderNode::PORT_TYPE_SAMPLER)); - add_options.push_back(AddOption("Texture2DParameter", "Textures", "Variables", "VisualShaderNodeTexture2DParameter", TTR("2D texture parameter lookup."), {}, VisualShaderNode::PORT_TYPE_SAMPLER)); - add_options.push_back(AddOption("TextureParameterTriplanar", "Textures", "Variables", "VisualShaderNodeTextureParameterTriplanar", TTR("2D texture parameter lookup with triplanar."), {}, -1, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Texture2DArrayParameter", "Textures", "Variables", "VisualShaderNodeTexture2DArrayParameter", TTR("2D array of textures parameter lookup."), {}, VisualShaderNode::PORT_TYPE_SAMPLER)); - add_options.push_back(AddOption("Texture3DParameter", "Textures", "Variables", "VisualShaderNodeTexture3DParameter", TTR("3D texture parameter lookup."), {}, VisualShaderNode::PORT_TYPE_SAMPLER)); + add_options.push_back(AddOption("CubeMapParameter", "Textures/Variables", "VisualShaderNodeCubemapParameter", TTR("Cubic texture parameter lookup."), {}, VisualShaderNode::PORT_TYPE_SAMPLER)); + add_options.push_back(AddOption("Texture2DParameter", "Textures/Variables", "VisualShaderNodeTexture2DParameter", TTR("2D texture parameter lookup."), {}, VisualShaderNode::PORT_TYPE_SAMPLER)); + add_options.push_back(AddOption("TextureParameterTriplanar", "Textures/Variables", "VisualShaderNodeTextureParameterTriplanar", TTR("2D texture parameter lookup with triplanar."), {}, -1, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Texture2DArrayParameter", "Textures/Variables", "VisualShaderNodeTexture2DArrayParameter", TTR("2D array of textures parameter lookup."), {}, VisualShaderNode::PORT_TYPE_SAMPLER)); + add_options.push_back(AddOption("Texture3DParameter", "Textures/Variables", "VisualShaderNodeTexture3DParameter", TTR("3D texture parameter lookup."), {}, VisualShaderNode::PORT_TYPE_SAMPLER)); // TRANSFORM - add_options.push_back(AddOption("TransformFunc", "Transform", "Common", "VisualShaderNodeTransformFunc", TTR("Transform function."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("TransformOp", "Transform", "Common", "VisualShaderNodeTransformOp", TTR("Transform operator."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("TransformFunc", "Transform/Common", "VisualShaderNodeTransformFunc", TTR("Transform function."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("TransformOp", "Transform/Common", "VisualShaderNodeTransformOp", TTR("Transform operator."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("OuterProduct", "Transform", "Composition", "VisualShaderNodeOuterProduct", TTR("Calculate the outer product of a pair of vectors.\n\nOuterProduct treats the first parameter 'c' as a column vector (matrix with one column) and the second parameter 'r' as a row vector (matrix with one row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix whose number of rows is the number of components in 'c' and whose number of columns is the number of components in 'r'."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("TransformCompose", "Transform", "Composition", "VisualShaderNodeTransformCompose", TTR("Composes transform from four vectors."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("TransformDecompose", "Transform", "Composition", "VisualShaderNodeTransformDecompose", TTR("Decomposes transform to four vectors."))); + add_options.push_back(AddOption("OuterProduct", "Transform/Composition", "VisualShaderNodeOuterProduct", TTR("Calculate the outer product of a pair of vectors.\n\nOuterProduct treats the first parameter 'c' as a column vector (matrix with one column) and the second parameter 'r' as a row vector (matrix with one row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix whose number of rows is the number of components in 'c' and whose number of columns is the number of components in 'r'."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("TransformCompose", "Transform/Composition", "VisualShaderNodeTransformCompose", TTR("Composes transform from four vectors."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("TransformDecompose", "Transform/Composition", "VisualShaderNodeTransformDecompose", TTR("Decomposes transform to four vectors."))); - add_options.push_back(AddOption("Determinant", "Transform", "Functions", "VisualShaderNodeDeterminant", TTR("Calculates the determinant of a transform."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("GetBillboardMatrix", "Transform", "Functions", "VisualShaderNodeBillboard", TTR("Calculates how the object should face the camera to be applied on Model View Matrix output port for 3D objects."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("Inverse", "Transform", "Functions", "VisualShaderNodeTransformFunc", TTR("Calculates the inverse of a transform."), { VisualShaderNodeTransformFunc::FUNC_INVERSE }, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("Transpose", "Transform", "Functions", "VisualShaderNodeTransformFunc", TTR("Calculates the transpose of a transform."), { VisualShaderNodeTransformFunc::FUNC_TRANSPOSE }, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("Determinant", "Transform/Functions", "VisualShaderNodeDeterminant", TTR("Calculates the determinant of a transform."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("GetBillboardMatrix", "Transform/Functions", "VisualShaderNodeBillboard", TTR("Calculates how the object should face the camera to be applied on Model View Matrix output port for 3D objects."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM, TYPE_FLAGS_VERTEX, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("Inverse", "Transform/Functions", "VisualShaderNodeTransformFunc", TTR("Calculates the inverse of a transform."), { VisualShaderNodeTransformFunc::FUNC_INVERSE }, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("Transpose", "Transform/Functions", "VisualShaderNodeTransformFunc", TTR("Calculates the transpose of a transform."), { VisualShaderNodeTransformFunc::FUNC_TRANSPOSE }, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("Add", "Transform", "Operators", "VisualShaderNodeTransformOp", TTR("Sums two transforms."), { VisualShaderNodeTransformOp::OP_ADD }, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("Divide", "Transform", "Operators", "VisualShaderNodeTransformOp", TTR("Divides two transforms."), { VisualShaderNodeTransformOp::OP_A_DIV_B }, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("Multiply", "Transform", "Operators", "VisualShaderNodeTransformOp", TTR("Multiplies two transforms."), { VisualShaderNodeTransformOp::OP_AxB }, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("MultiplyComp", "Transform", "Operators", "VisualShaderNodeTransformOp", TTR("Performs per-component multiplication of two transforms."), { VisualShaderNodeTransformOp::OP_AxB_COMP }, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("Subtract", "Transform", "Operators", "VisualShaderNodeTransformOp", TTR("Subtracts two transforms."), { VisualShaderNodeTransformOp::OP_A_MINUS_B }, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("TransformVectorMult", "Transform", "Operators", "VisualShaderNodeTransformVecMult", TTR("Multiplies vector by transform."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Add", "Transform/Operators", "VisualShaderNodeTransformOp", TTR("Sums two transforms."), { VisualShaderNodeTransformOp::OP_ADD }, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("Divide", "Transform/Operators", "VisualShaderNodeTransformOp", TTR("Divides two transforms."), { VisualShaderNodeTransformOp::OP_A_DIV_B }, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("Multiply", "Transform/Operators", "VisualShaderNodeTransformOp", TTR("Multiplies two transforms."), { VisualShaderNodeTransformOp::OP_AxB }, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("MultiplyComp", "Transform/Operators", "VisualShaderNodeTransformOp", TTR("Performs per-component multiplication of two transforms."), { VisualShaderNodeTransformOp::OP_AxB_COMP }, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("Subtract", "Transform/Operators", "VisualShaderNodeTransformOp", TTR("Subtracts two transforms."), { VisualShaderNodeTransformOp::OP_A_MINUS_B }, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("TransformVectorMult", "Transform/Operators", "VisualShaderNodeTransformVecMult", TTR("Multiplies vector by transform."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("TransformConstant", "Transform", "Variables", "VisualShaderNodeTransformConstant", TTR("Transform constant."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("TransformParameter", "Transform", "Variables", "VisualShaderNodeTransformParameter", TTR("Transform parameter."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("TransformConstant", "Transform/Variables", "VisualShaderNodeTransformConstant", TTR("Transform constant."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("TransformParameter", "Transform/Variables", "VisualShaderNodeTransformParameter", TTR("Transform parameter."), {}, VisualShaderNode::PORT_TYPE_TRANSFORM)); // UTILITY - add_options.push_back(AddOption("DistanceFade", "Utility", "", "VisualShaderNodeDistanceFade", TTR("The distance fade effect fades out each pixel based on its distance to another object."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("ProximityFade", "Utility", "", "VisualShaderNodeProximityFade", TTR("The proximity fade effect fades out each pixel based on its distance to another object."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("RandomRange", "Utility", "", "VisualShaderNodeRandomRange", TTR("Returns a random value between the minimum and maximum input values."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Remap", "Utility", "", "VisualShaderNodeRemap", TTR("Remaps a given input from the input range to the output range."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("DistanceFade", "Utility", "VisualShaderNodeDistanceFade", TTR("The distance fade effect fades out each pixel based on its distance to another object."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("ProximityFade", "Utility", "VisualShaderNodeProximityFade", TTR("The proximity fade effect fades out each pixel based on its distance to another object."), {}, VisualShaderNode::PORT_TYPE_SCALAR, TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("RandomRange", "Utility", "VisualShaderNodeRandomRange", TTR("Returns a random value between the minimum and maximum input values."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Remap", "Utility", "VisualShaderNodeRemap", TTR("Remaps a given input from the input range to the output range."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); // VECTOR - add_options.push_back(AddOption("VectorFunc", "Vector", "Common", "VisualShaderNodeVectorFunc", TTR("Vector function."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("VectorOp", "Vector", "Common", "VisualShaderNodeVectorOp", TTR("Vector operator."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("VectorCompose", "Vector", "Common", "VisualShaderNodeVectorCompose", TTR("Composes vector from scalars."))); - add_options.push_back(AddOption("VectorDecompose", "Vector", "Common", "VisualShaderNodeVectorDecompose", TTR("Decomposes vector to scalars."))); - - add_options.push_back(AddOption("Vector2Compose", "Vector", "Composition", "VisualShaderNodeVectorCompose", TTR("Composes 2D vector from two scalars."), { VisualShaderNodeVectorCompose::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Vector2Decompose", "Vector", "Composition", "VisualShaderNodeVectorDecompose", TTR("Decomposes 2D vector to two scalars."), { VisualShaderNodeVectorDecompose::OP_TYPE_VECTOR_2D })); - add_options.push_back(AddOption("Vector3Compose", "Vector", "Composition", "VisualShaderNodeVectorCompose", TTR("Composes 3D vector from three scalars."), { VisualShaderNodeVectorCompose::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Vector3Decompose", "Vector", "Composition", "VisualShaderNodeVectorDecompose", TTR("Decomposes 3D vector to three scalars."), { VisualShaderNodeVectorDecompose::OP_TYPE_VECTOR_3D })); - add_options.push_back(AddOption("Vector4Compose", "Vector", "Composition", "VisualShaderNodeVectorCompose", TTR("Composes 4D vector from four scalars."), { VisualShaderNodeVectorCompose::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Vector4Decompose", "Vector", "Composition", "VisualShaderNodeVectorDecompose", TTR("Decomposes 4D vector to four scalars."), { VisualShaderNodeVectorDecompose::OP_TYPE_VECTOR_4D })); - - add_options.push_back(AddOption("Abs", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ABS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Abs", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ABS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Abs", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ABS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("ACos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("ACos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("ACos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("ACosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("ACosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("ACosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("ASin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("ASin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("ASin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("ASinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("ASinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("ASinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("ATan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("ATan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("ATan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("ATan2", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the arc-tangent of the parameters."), { VisualShaderNodeVectorOp::OP_ATAN2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("ATan2", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the arc-tangent of the parameters."), { VisualShaderNodeVectorOp::OP_ATAN2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("ATan2", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the arc-tangent of the parameters."), { VisualShaderNodeVectorOp::OP_ATAN2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("ATanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("ATanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("ATanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Ceil", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_CEIL }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Ceil", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_CEIL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Ceil", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_CEIL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Clamp", "Vector", "Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Clamp", "Vector", "Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Clamp", "Vector", "Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Cos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Cos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Cos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("CosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("CosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("CosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Cross", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Calculates the cross product of two vectors."), { VisualShaderNodeVectorOp::OP_CROSS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Degrees", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in radians to degrees."), { VisualShaderNodeVectorFunc::FUNC_DEGREES, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Degrees", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in radians to degrees."), { VisualShaderNodeVectorFunc::FUNC_DEGREES, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Degrees", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in radians to degrees."), { VisualShaderNodeVectorFunc::FUNC_DEGREES, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("DFdX", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_X, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("DFdX", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_X, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("DFdX", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_X, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("DFdY", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_Y, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("DFdY", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_Y, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("DFdY", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_Y, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("Distance2D", "Vector", "Functions", "VisualShaderNodeVectorDistance", TTR("Returns the distance between two points."), { VisualShaderNodeVectorDistance::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Distance3D", "Vector", "Functions", "VisualShaderNodeVectorDistance", TTR("Returns the distance between two points."), { VisualShaderNodeVectorDistance::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Distance4D", "Vector", "Functions", "VisualShaderNodeVectorDistance", TTR("Returns the distance between two points."), { VisualShaderNodeVectorDistance::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Dot", "Vector", "Functions", "VisualShaderNodeDotProduct", TTR("Calculates the dot product of two vectors."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Exp", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-e Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Exp", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-e Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Exp", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-e Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Exp2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Exp2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Exp2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("FaceForward", "Vector", "Functions", "VisualShaderNodeFaceForward", TTR("Returns the vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."), { VisualShaderNodeFaceForward::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("FaceForward", "Vector", "Functions", "VisualShaderNodeFaceForward", TTR("Returns the vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."), { VisualShaderNodeFaceForward::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("FaceForward", "Vector", "Functions", "VisualShaderNodeFaceForward", TTR("Returns the vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."), { VisualShaderNodeFaceForward::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Floor", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer less than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_FLOOR, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Floor", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer less than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_FLOOR, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Floor", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer less than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_FLOOR, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Fract", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Computes the fractional part of the argument."), { VisualShaderNodeVectorFunc::FUNC_FRACT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Fract", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Computes the fractional part of the argument."), { VisualShaderNodeVectorFunc::FUNC_FRACT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Fract", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Computes the fractional part of the argument."), { VisualShaderNodeVectorFunc::FUNC_FRACT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Fresnel", "Vector", "Functions", "VisualShaderNodeFresnel", TTR("Returns falloff based on the dot product of surface normal and view direction of camera (pass associated inputs to it)."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("InverseSqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse of the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_INVERSE_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("InverseSqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse of the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_INVERSE_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("InverseSqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse of the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_INVERSE_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Length2D", "Vector", "Functions", "VisualShaderNodeVectorLen", TTR("Calculates the length of a vector."), { VisualShaderNodeVectorLen::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Length3D", "Vector", "Functions", "VisualShaderNodeVectorLen", TTR("Calculates the length of a vector."), { VisualShaderNodeVectorLen::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Length4D", "Vector", "Functions", "VisualShaderNodeVectorLen", TTR("Calculates the length of a vector."), { VisualShaderNodeVectorLen::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Log", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Natural logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Log", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Natural logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Log", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Natural logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Log2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Log2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Log2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Max", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the greater of two values."), { VisualShaderNodeVectorOp::OP_MAX, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Max", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the greater of two values."), { VisualShaderNodeVectorOp::OP_MAX, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Max", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the greater of two values."), { VisualShaderNodeVectorOp::OP_MAX, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Min", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the lesser of two values."), { VisualShaderNodeVectorOp::OP_MIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Min", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the lesser of two values."), { VisualShaderNodeVectorOp::OP_MIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Min", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the lesser of two values."), { VisualShaderNodeVectorOp::OP_MIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Mix", "Vector", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors."), { VisualShaderNodeMix::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Mix", "Vector", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors."), { VisualShaderNodeMix::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Mix", "Vector", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors."), { VisualShaderNodeMix::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("MixS", "Vector", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors using scalar."), { VisualShaderNodeMix::OP_TYPE_VECTOR_2D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("MixS", "Vector", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors using scalar."), { VisualShaderNodeMix::OP_TYPE_VECTOR_3D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("MixS", "Vector", "Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors using scalar."), { VisualShaderNodeMix::OP_TYPE_VECTOR_4D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("MultiplyAdd", "Vector", "Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on vectors."), { VisualShaderNodeMultiplyAdd::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("MultiplyAdd", "Vector", "Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on vectors."), { VisualShaderNodeMultiplyAdd::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("MultiplyAdd", "Vector", "Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on vectors."), { VisualShaderNodeMultiplyAdd::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Negate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_NEGATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Negate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_NEGATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Negate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_NEGATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Normalize", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Calculates the normalize product of vector."), { VisualShaderNodeVectorFunc::FUNC_NORMALIZE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Normalize", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Calculates the normalize product of vector."), { VisualShaderNodeVectorFunc::FUNC_NORMALIZE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Normalize", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Calculates the normalize product of vector."), { VisualShaderNodeVectorFunc::FUNC_NORMALIZE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("OneMinus", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 - vector"), { VisualShaderNodeVectorFunc::FUNC_ONEMINUS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("OneMinus", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 - vector"), { VisualShaderNodeVectorFunc::FUNC_ONEMINUS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("OneMinus", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 - vector"), { VisualShaderNodeVectorFunc::FUNC_ONEMINUS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Pow", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the value of the first parameter raised to the power of the second."), { VisualShaderNodeVectorOp::OP_POW, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Pow", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the value of the first parameter raised to the power of the second."), { VisualShaderNodeVectorOp::OP_POW, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Pow", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the value of the first parameter raised to the power of the second."), { VisualShaderNodeVectorOp::OP_POW, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Radians", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in degrees to radians."), { VisualShaderNodeVectorFunc::FUNC_RADIANS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Radians", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in degrees to radians."), { VisualShaderNodeVectorFunc::FUNC_RADIANS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Radians", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in degrees to radians."), { VisualShaderNodeVectorFunc::FUNC_RADIANS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Reciprocal", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 / vector"), { VisualShaderNodeVectorFunc::FUNC_RECIPROCAL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Reciprocal", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 / vector"), { VisualShaderNodeVectorFunc::FUNC_RECIPROCAL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Reciprocal", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 / vector"), { VisualShaderNodeVectorFunc::FUNC_RECIPROCAL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Reflect", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the vector that points in the direction of reflection ( a : incident vector, b : normal vector )."), { VisualShaderNodeVectorOp::OP_REFLECT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Reflect", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the vector that points in the direction of reflection ( a : incident vector, b : normal vector )."), { VisualShaderNodeVectorOp::OP_REFLECT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Reflect", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the vector that points in the direction of reflection ( a : incident vector, b : normal vector )."), { VisualShaderNodeVectorOp::OP_REFLECT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Refract", "Vector", "Functions", "VisualShaderNodeVectorRefract", TTR("Returns the vector that points in the direction of refraction."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Refract", "Vector", "Functions", "VisualShaderNodeVectorRefract", TTR("Returns the vector that points in the direction of refraction."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Refract", "Vector", "Functions", "VisualShaderNodeVectorRefract", TTR("Returns the vector that points in the direction of refraction."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Round", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUND, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Round", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUND, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Round", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUND, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("RoundEven", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest even integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("RoundEven", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest even integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("RoundEven", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest even integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Saturate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Clamps the value between 0.0 and 1.0."), { VisualShaderNodeVectorFunc::FUNC_SATURATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Saturate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Clamps the value between 0.0 and 1.0."), { VisualShaderNodeVectorFunc::FUNC_SATURATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Saturate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Clamps the value between 0.0 and 1.0."), { VisualShaderNodeVectorFunc::FUNC_SATURATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Sign", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIGN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Sign", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIGN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Sign", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIGN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Sin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Sin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Sin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("SinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("SinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("SinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Sqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Sqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Sqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("SmoothStep", "Vector", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("SmoothStep", "Vector", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("SmoothStep", "Vector", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("SmoothStepS", "Vector", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_2D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("SmoothStepS", "Vector", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_3D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("SmoothStepS", "Vector", "Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_4D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Step", "Vector", "Functions", "VisualShaderNodeStep", TTR("Step function( vector(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Step", "Vector", "Functions", "VisualShaderNodeStep", TTR("Step function( vector(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("StepS", "Vector", "Functions", "VisualShaderNodeStep", TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_2D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("StepS", "Vector", "Functions", "VisualShaderNodeStep", TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_3D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("StepS", "Vector", "Functions", "VisualShaderNodeStep", TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_4D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Sum", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeDerivativeFunc::FUNC_SUM, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("Sum", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeDerivativeFunc::FUNC_SUM, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("Sum", "Vector", "Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeDerivativeFunc::FUNC_SUM, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); - add_options.push_back(AddOption("Tan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Tan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Tan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("TanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("TanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("TanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Trunc", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the truncated value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TRUNC, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Trunc", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the truncated value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TRUNC, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Trunc", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the truncated value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TRUNC, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - - add_options.push_back(AddOption("Add", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Adds 2D vector to 2D vector."), { VisualShaderNodeVectorOp::OP_ADD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Add", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Adds 3D vector to 3D vector."), { VisualShaderNodeVectorOp::OP_ADD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Add", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Adds 4D vector to 4D vector."), { VisualShaderNodeVectorOp::OP_ADD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Divide", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Divides 2D vector by 2D vector."), { VisualShaderNodeVectorOp::OP_DIV, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Divide", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Divides 3D vector by 3D vector."), { VisualShaderNodeVectorOp::OP_DIV, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Divide", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Divides 4D vector by 4D vector."), { VisualShaderNodeVectorOp::OP_DIV, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Multiply", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Multiplies 2D vector by 2D vector."), { VisualShaderNodeVectorOp::OP_MUL, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Multiply", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Multiplies 3D vector by 3D vector."), { VisualShaderNodeVectorOp::OP_MUL, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Multiply", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Multiplies 4D vector by 4D vector."), { VisualShaderNodeVectorOp::OP_MUL, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Remainder", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Returns the remainder of the two 2D vectors."), { VisualShaderNodeVectorOp::OP_MOD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Remainder", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Returns the remainder of the two 3D vectors."), { VisualShaderNodeVectorOp::OP_MOD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Remainder", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Returns the remainder of the two 4D vectors."), { VisualShaderNodeVectorOp::OP_MOD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Subtract", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Subtracts 2D vector from 2D vector."), { VisualShaderNodeVectorOp::OP_SUB, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Subtract", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Subtracts 3D vector from 3D vector."), { VisualShaderNodeVectorOp::OP_SUB, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Subtract", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Subtracts 4D vector from 4D vector."), { VisualShaderNodeVectorOp::OP_SUB, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - - add_options.push_back(AddOption("Vector2Constant", "Vector", "Variables", "VisualShaderNodeVec2Constant", TTR("2D vector constant."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Vector2Parameter", "Vector", "Variables", "VisualShaderNodeVec2Parameter", TTR("2D vector parameter."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); - add_options.push_back(AddOption("Vector3Constant", "Vector", "Variables", "VisualShaderNodeVec3Constant", TTR("3D vector constant."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Vector3Parameter", "Vector", "Variables", "VisualShaderNodeVec3Parameter", TTR("3D vector parameter."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); - add_options.push_back(AddOption("Vector4Constant", "Vector", "Variables", "VisualShaderNodeVec4Constant", TTR("4D vector constant."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); - add_options.push_back(AddOption("Vector4Parameter", "Vector", "Variables", "VisualShaderNodeVec4Parameter", TTR("4D vector parameter."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("VectorFunc", "Vector/Common", "VisualShaderNodeVectorFunc", TTR("Vector function."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("VectorOp", "Vector/Common", "VisualShaderNodeVectorOp", TTR("Vector operator."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("VectorCompose", "Vector/Common", "VisualShaderNodeVectorCompose", TTR("Composes vector from scalars."))); + add_options.push_back(AddOption("VectorDecompose", "Vector/Common", "VisualShaderNodeVectorDecompose", TTR("Decomposes vector to scalars."))); + + add_options.push_back(AddOption("Vector2Compose", "Vector/Composition", "VisualShaderNodeVectorCompose", TTR("Composes 2D vector from two scalars."), { VisualShaderNodeVectorCompose::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Vector2Decompose", "Vector/Composition", "VisualShaderNodeVectorDecompose", TTR("Decomposes 2D vector to two scalars."), { VisualShaderNodeVectorDecompose::OP_TYPE_VECTOR_2D })); + add_options.push_back(AddOption("Vector3Compose", "Vector/Composition", "VisualShaderNodeVectorCompose", TTR("Composes 3D vector from three scalars."), { VisualShaderNodeVectorCompose::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Vector3Decompose", "Vector/Composition", "VisualShaderNodeVectorDecompose", TTR("Decomposes 3D vector to three scalars."), { VisualShaderNodeVectorDecompose::OP_TYPE_VECTOR_3D })); + add_options.push_back(AddOption("Vector4Compose", "Vector/Composition", "VisualShaderNodeVectorCompose", TTR("Composes 4D vector from four scalars."), { VisualShaderNodeVectorCompose::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Vector4Decompose", "Vector/Composition", "VisualShaderNodeVectorDecompose", TTR("Decomposes 4D vector to four scalars."), { VisualShaderNodeVectorDecompose::OP_TYPE_VECTOR_4D })); + + add_options.push_back(AddOption("Abs", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ABS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Abs", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ABS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Abs", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the absolute value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ABS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("ACos", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ACos", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ACos", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("ACosH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ACosH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ACosH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ACOSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("ASin", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ASin", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ASin", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("ASinH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ASinH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ASinH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ASINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("ATan", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ATan", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ATan", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("ATan2", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the arc-tangent of the parameters."), { VisualShaderNodeVectorOp::OP_ATAN2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ATan2", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the arc-tangent of the parameters."), { VisualShaderNodeVectorOp::OP_ATAN2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ATan2", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the arc-tangent of the parameters."), { VisualShaderNodeVectorOp::OP_ATAN2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("ATanH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("ATanH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("ATanH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_ATANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Ceil", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_CEIL }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Ceil", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_CEIL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Ceil", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_CEIL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Clamp", "Vector/Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Clamp", "Vector/Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Clamp", "Vector/Functions", "VisualShaderNodeClamp", TTR("Constrains a value to lie between two further values."), { VisualShaderNodeClamp::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Cos", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Cos", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Cos", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("CosH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("CosH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("CosH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic cosine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_COSH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Cross", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Calculates the cross product of two vectors."), { VisualShaderNodeVectorOp::OP_CROSS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Degrees", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in radians to degrees."), { VisualShaderNodeVectorFunc::FUNC_DEGREES, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Degrees", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in radians to degrees."), { VisualShaderNodeVectorFunc::FUNC_DEGREES, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Degrees", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in radians to degrees."), { VisualShaderNodeVectorFunc::FUNC_DEGREES, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("DFdX", "Vector/Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_X, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("DFdX", "Vector/Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_X, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("DFdX", "Vector/Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_X, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("DFdY", "Vector/Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_Y, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("DFdY", "Vector/Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_Y, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("DFdY", "Vector/Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), { VisualShaderNodeDerivativeFunc::FUNC_Y, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("Distance2D", "Vector/Functions", "VisualShaderNodeVectorDistance", TTR("Returns the distance between two points."), { VisualShaderNodeVectorDistance::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Distance3D", "Vector/Functions", "VisualShaderNodeVectorDistance", TTR("Returns the distance between two points."), { VisualShaderNodeVectorDistance::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Distance4D", "Vector/Functions", "VisualShaderNodeVectorDistance", TTR("Returns the distance between two points."), { VisualShaderNodeVectorDistance::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Dot", "Vector/Functions", "VisualShaderNodeDotProduct", TTR("Calculates the dot product of two vectors."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Exp", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Base-e Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Exp", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Base-e Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Exp", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Base-e Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Exp2", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Exp2", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Exp2", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 Exponential."), { VisualShaderNodeVectorFunc::FUNC_EXP2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("FaceForward", "Vector/Functions", "VisualShaderNodeFaceForward", TTR("Returns the vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."), { VisualShaderNodeFaceForward::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("FaceForward", "Vector/Functions", "VisualShaderNodeFaceForward", TTR("Returns the vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."), { VisualShaderNodeFaceForward::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("FaceForward", "Vector/Functions", "VisualShaderNodeFaceForward", TTR("Returns the vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."), { VisualShaderNodeFaceForward::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Floor", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer less than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_FLOOR, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Floor", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer less than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_FLOOR, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Floor", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer less than or equal to the parameter."), { VisualShaderNodeVectorFunc::FUNC_FLOOR, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Fract", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Computes the fractional part of the argument."), { VisualShaderNodeVectorFunc::FUNC_FRACT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Fract", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Computes the fractional part of the argument."), { VisualShaderNodeVectorFunc::FUNC_FRACT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Fract", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Computes the fractional part of the argument."), { VisualShaderNodeVectorFunc::FUNC_FRACT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Fresnel", "Vector/Functions", "VisualShaderNodeFresnel", TTR("Returns falloff based on the dot product of surface normal and view direction of camera (pass associated inputs to it)."), {}, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("InverseSqrt", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse of the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_INVERSE_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("InverseSqrt", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse of the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_INVERSE_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("InverseSqrt", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse of the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_INVERSE_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Length2D", "Vector/Functions", "VisualShaderNodeVectorLen", TTR("Calculates the length of a vector."), { VisualShaderNodeVectorLen::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Length3D", "Vector/Functions", "VisualShaderNodeVectorLen", TTR("Calculates the length of a vector."), { VisualShaderNodeVectorLen::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Length4D", "Vector/Functions", "VisualShaderNodeVectorLen", TTR("Calculates the length of a vector."), { VisualShaderNodeVectorLen::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Log", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Natural logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Log", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Natural logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Log", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Natural logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Log2", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Log2", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Log2", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 logarithm."), { VisualShaderNodeVectorFunc::FUNC_LOG2, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Max", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the greater of two values."), { VisualShaderNodeVectorOp::OP_MAX, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Max", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the greater of two values."), { VisualShaderNodeVectorOp::OP_MAX, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Max", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the greater of two values."), { VisualShaderNodeVectorOp::OP_MAX, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Min", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the lesser of two values."), { VisualShaderNodeVectorOp::OP_MIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Min", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the lesser of two values."), { VisualShaderNodeVectorOp::OP_MIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Min", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the lesser of two values."), { VisualShaderNodeVectorOp::OP_MIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Mix", "Vector/Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors."), { VisualShaderNodeMix::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Mix", "Vector/Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors."), { VisualShaderNodeMix::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Mix", "Vector/Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors."), { VisualShaderNodeMix::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("MixS", "Vector/Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors using scalar."), { VisualShaderNodeMix::OP_TYPE_VECTOR_2D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("MixS", "Vector/Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors using scalar."), { VisualShaderNodeMix::OP_TYPE_VECTOR_3D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("MixS", "Vector/Functions", "VisualShaderNodeMix", TTR("Linear interpolation between two vectors using scalar."), { VisualShaderNodeMix::OP_TYPE_VECTOR_4D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("MultiplyAdd", "Vector/Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on vectors."), { VisualShaderNodeMultiplyAdd::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("MultiplyAdd", "Vector/Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on vectors."), { VisualShaderNodeMultiplyAdd::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("MultiplyAdd", "Vector/Functions", "VisualShaderNodeMultiplyAdd", TTR("Performs a fused multiply-add operation (a * b + c) on vectors."), { VisualShaderNodeMultiplyAdd::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Negate", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_NEGATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Negate", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_NEGATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Negate", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the opposite value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_NEGATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Normalize", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Calculates the normalize product of vector."), { VisualShaderNodeVectorFunc::FUNC_NORMALIZE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Normalize", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Calculates the normalize product of vector."), { VisualShaderNodeVectorFunc::FUNC_NORMALIZE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Normalize", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Calculates the normalize product of vector."), { VisualShaderNodeVectorFunc::FUNC_NORMALIZE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("OneMinus", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("1.0 - vector"), { VisualShaderNodeVectorFunc::FUNC_ONEMINUS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("OneMinus", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("1.0 - vector"), { VisualShaderNodeVectorFunc::FUNC_ONEMINUS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("OneMinus", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("1.0 - vector"), { VisualShaderNodeVectorFunc::FUNC_ONEMINUS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Pow", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the value of the first parameter raised to the power of the second."), { VisualShaderNodeVectorOp::OP_POW, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Pow", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the value of the first parameter raised to the power of the second."), { VisualShaderNodeVectorOp::OP_POW, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Pow", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the value of the first parameter raised to the power of the second."), { VisualShaderNodeVectorOp::OP_POW, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Radians", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in degrees to radians."), { VisualShaderNodeVectorFunc::FUNC_RADIANS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Radians", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in degrees to radians."), { VisualShaderNodeVectorFunc::FUNC_RADIANS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Radians", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in degrees to radians."), { VisualShaderNodeVectorFunc::FUNC_RADIANS, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Reciprocal", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("1.0 / vector"), { VisualShaderNodeVectorFunc::FUNC_RECIPROCAL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Reciprocal", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("1.0 / vector"), { VisualShaderNodeVectorFunc::FUNC_RECIPROCAL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Reciprocal", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("1.0 / vector"), { VisualShaderNodeVectorFunc::FUNC_RECIPROCAL, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Reflect", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the vector that points in the direction of reflection ( a : incident vector, b : normal vector )."), { VisualShaderNodeVectorOp::OP_REFLECT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Reflect", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the vector that points in the direction of reflection ( a : incident vector, b : normal vector )."), { VisualShaderNodeVectorOp::OP_REFLECT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Reflect", "Vector/Functions", "VisualShaderNodeVectorOp", TTR("Returns the vector that points in the direction of reflection ( a : incident vector, b : normal vector )."), { VisualShaderNodeVectorOp::OP_REFLECT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Refract", "Vector/Functions", "VisualShaderNodeVectorRefract", TTR("Returns the vector that points in the direction of refraction."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Refract", "Vector/Functions", "VisualShaderNodeVectorRefract", TTR("Returns the vector that points in the direction of refraction."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Refract", "Vector/Functions", "VisualShaderNodeVectorRefract", TTR("Returns the vector that points in the direction of refraction."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Round", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUND, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Round", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUND, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Round", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUND, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("RoundEven", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest even integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("RoundEven", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest even integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("RoundEven", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest even integer to the parameter."), { VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Saturate", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Clamps the value between 0.0 and 1.0."), { VisualShaderNodeVectorFunc::FUNC_SATURATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Saturate", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Clamps the value between 0.0 and 1.0."), { VisualShaderNodeVectorFunc::FUNC_SATURATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Saturate", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Clamps the value between 0.0 and 1.0."), { VisualShaderNodeVectorFunc::FUNC_SATURATE, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Sign", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIGN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Sign", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIGN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Sign", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Extracts the sign of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIGN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Sin", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Sin", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Sin", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SIN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("SinH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("SinH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("SinH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic sine of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SINH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Sqrt", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Sqrt", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Sqrt", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the square root of the parameter."), { VisualShaderNodeVectorFunc::FUNC_SQRT, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("SmoothStep", "Vector/Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("SmoothStep", "Vector/Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("SmoothStep", "Vector/Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("SmoothStepS", "Vector/Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_2D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("SmoothStepS", "Vector/Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_3D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("SmoothStepS", "Vector/Functions", "VisualShaderNodeSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), { VisualShaderNodeSmoothStep::OP_TYPE_VECTOR_4D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Step", "Vector/Functions", "VisualShaderNodeStep", TTR("Step function( vector(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Step", "Vector/Functions", "VisualShaderNodeStep", TTR("Step function( vector(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("StepS", "Vector/Functions", "VisualShaderNodeStep", TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_2D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("StepS", "Vector/Functions", "VisualShaderNodeStep", TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_3D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("StepS", "Vector/Functions", "VisualShaderNodeStep", TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0."), { VisualShaderNodeStep::OP_TYPE_VECTOR_4D_SCALAR }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Sum", "Vector/Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeDerivativeFunc::FUNC_SUM, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("Sum", "Vector/Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeDerivativeFunc::FUNC_SUM, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("Sum", "Vector/Functions", "VisualShaderNodeDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), { VisualShaderNodeDerivativeFunc::FUNC_SUM, VisualShaderNodeDerivativeFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, -1, true)); + add_options.push_back(AddOption("Tan", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Tan", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Tan", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TAN, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("TanH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("TanH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("TanH", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic tangent of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TANH, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Trunc", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the truncated value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TRUNC, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Trunc", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the truncated value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TRUNC, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Trunc", "Vector/Functions", "VisualShaderNodeVectorFunc", TTR("Finds the truncated value of the parameter."), { VisualShaderNodeVectorFunc::FUNC_TRUNC, VisualShaderNodeVectorFunc::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + + add_options.push_back(AddOption("Add", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Adds 2D vector to 2D vector."), { VisualShaderNodeVectorOp::OP_ADD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Add", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Adds 3D vector to 3D vector."), { VisualShaderNodeVectorOp::OP_ADD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Add", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Adds 4D vector to 4D vector."), { VisualShaderNodeVectorOp::OP_ADD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Divide", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Divides 2D vector by 2D vector."), { VisualShaderNodeVectorOp::OP_DIV, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Divide", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Divides 3D vector by 3D vector."), { VisualShaderNodeVectorOp::OP_DIV, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Divide", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Divides 4D vector by 4D vector."), { VisualShaderNodeVectorOp::OP_DIV, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Multiply", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Multiplies 2D vector by 2D vector."), { VisualShaderNodeVectorOp::OP_MUL, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Multiply", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Multiplies 3D vector by 3D vector."), { VisualShaderNodeVectorOp::OP_MUL, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Multiply", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Multiplies 4D vector by 4D vector."), { VisualShaderNodeVectorOp::OP_MUL, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Remainder", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Returns the remainder of the two 2D vectors."), { VisualShaderNodeVectorOp::OP_MOD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Remainder", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Returns the remainder of the two 3D vectors."), { VisualShaderNodeVectorOp::OP_MOD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Remainder", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Returns the remainder of the two 4D vectors."), { VisualShaderNodeVectorOp::OP_MOD, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Subtract", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Subtracts 2D vector from 2D vector."), { VisualShaderNodeVectorOp::OP_SUB, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_2D }, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Subtract", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Subtracts 3D vector from 3D vector."), { VisualShaderNodeVectorOp::OP_SUB, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_3D }, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Subtract", "Vector/Operators", "VisualShaderNodeVectorOp", TTR("Subtracts 4D vector from 4D vector."), { VisualShaderNodeVectorOp::OP_SUB, VisualShaderNodeVectorOp::OP_TYPE_VECTOR_4D }, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + + add_options.push_back(AddOption("Vector2Constant", "Vector/Variables", "VisualShaderNodeVec2Constant", TTR("2D vector constant."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Vector2Parameter", "Vector/Variables", "VisualShaderNodeVec2Parameter", TTR("2D vector parameter."), {}, VisualShaderNode::PORT_TYPE_VECTOR_2D)); + add_options.push_back(AddOption("Vector3Constant", "Vector/Variables", "VisualShaderNodeVec3Constant", TTR("3D vector constant."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Vector3Parameter", "Vector/Variables", "VisualShaderNodeVec3Parameter", TTR("3D vector parameter."), {}, VisualShaderNode::PORT_TYPE_VECTOR_3D)); + add_options.push_back(AddOption("Vector4Constant", "Vector/Variables", "VisualShaderNodeVec4Constant", TTR("4D vector constant."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); + add_options.push_back(AddOption("Vector4Parameter", "Vector/Variables", "VisualShaderNodeVec4Parameter", TTR("4D vector parameter."), {}, VisualShaderNode::PORT_TYPE_VECTOR_4D)); // SPECIAL - add_options.push_back(AddOption("Comment", "Special", "", "VisualShaderNodeComment", TTR("A rectangular area with a description string for better graph organization."))); - add_options.push_back(AddOption("Expression", "Special", "", "VisualShaderNodeExpression", TTR("Custom Godot Shader Language expression, with custom amount of input and output ports. This is a direct injection of code into the vertex/fragment/light function, do not use it to write the function declarations inside."))); - add_options.push_back(AddOption("GlobalExpression", "Special", "", "VisualShaderNodeGlobalExpression", TTR("Custom Godot Shader Language expression, which is placed on top of the resulted shader. You can place various function definitions inside and call it later in the Expressions. You can also declare varyings, parameters and constants."))); - add_options.push_back(AddOption("ParameterRef", "Special", "", "VisualShaderNodeParameterRef", TTR("A reference to an existing parameter."))); - add_options.push_back(AddOption("VaryingGetter", "Special", "", "VisualShaderNodeVaryingGetter", TTR("Get varying parameter."), {}, -1, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("VaryingSetter", "Special", "", "VisualShaderNodeVaryingSetter", TTR("Set varying parameter."), {}, -1, TYPE_FLAGS_VERTEX | TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); - add_options.push_back(AddOption("VaryingGetter", "Special", "", "VisualShaderNodeVaryingGetter", TTR("Get varying parameter."), {}, -1, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("VaryingSetter", "Special", "", "VisualShaderNodeVaryingSetter", TTR("Set varying parameter."), {}, -1, TYPE_FLAGS_VERTEX | TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("Comment", "Special", "VisualShaderNodeComment", TTR("A rectangular area with a description string for better graph organization."))); + add_options.push_back(AddOption("Expression", "Special", "VisualShaderNodeExpression", TTR("Custom Godot Shader Language expression, with custom amount of input and output ports. This is a direct injection of code into the vertex/fragment/light function, do not use it to write the function declarations inside."))); + add_options.push_back(AddOption("GlobalExpression", "Special", "VisualShaderNodeGlobalExpression", TTR("Custom Godot Shader Language expression, which is placed on top of the resulted shader. You can place various function definitions inside and call it later in the Expressions. You can also declare varyings, parameters and constants."))); + add_options.push_back(AddOption("ParameterRef", "Special", "VisualShaderNodeParameterRef", TTR("A reference to an existing parameter."))); + add_options.push_back(AddOption("VaryingGetter", "Special", "VisualShaderNodeVaryingGetter", TTR("Get varying parameter."), {}, -1, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("VaryingSetter", "Special", "VisualShaderNodeVaryingSetter", TTR("Set varying parameter."), {}, -1, TYPE_FLAGS_VERTEX | TYPE_FLAGS_FRAGMENT, Shader::MODE_SPATIAL)); + add_options.push_back(AddOption("VaryingGetter", "Special", "VisualShaderNodeVaryingGetter", TTR("Get varying parameter."), {}, -1, TYPE_FLAGS_FRAGMENT | TYPE_FLAGS_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("VaryingSetter", "Special", "VisualShaderNodeVaryingSetter", TTR("Set varying parameter."), {}, -1, TYPE_FLAGS_VERTEX | TYPE_FLAGS_FRAGMENT, Shader::MODE_CANVAS_ITEM)); custom_node_option_idx = add_options.size(); @@ -5693,7 +5693,7 @@ VisualShaderEditor::VisualShaderEditor() { graph_plugin->set_editor(this); property_editor_popup = memnew(PopupPanel); - property_editor_popup->set_min_size(Size2i(180, 0) * EDSCALE); + property_editor_popup->set_min_size(Size2(180, 0) * EDSCALE); add_child(property_editor_popup); edited_property_holder.instantiate(); diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h index 869e00ca5d..f7e033d753 100644 --- a/editor/plugins/visual_shader_editor_plugin.h +++ b/editor/plugins/visual_shader_editor_plugin.h @@ -312,10 +312,10 @@ class VisualShaderEditor : public VBoxContainer { bool is_custom = false; int temp_idx = 0; - AddOption(const String &p_name = String(), const String &p_category = String(), const String &p_sub_category = String(), const String &p_type = String(), const String &p_description = String(), const Vector<Variant> &p_ops = Vector<Variant>(), int p_return_type = -1, int p_mode = -1, int p_func = -1, bool p_highend = false) { + AddOption(const String &p_name = String(), const String &p_category = String(), const String &p_type = String(), const String &p_description = String(), const Vector<Variant> &p_ops = Vector<Variant>(), int p_return_type = -1, int p_mode = -1, int p_func = -1, bool p_highend = false) { name = p_name; type = p_type; - category = p_category + "/" + p_sub_category; + category = p_category; description = p_description; ops = p_ops; return_type = p_return_type; diff --git a/editor/progress_dialog.cpp b/editor/progress_dialog.cpp index 1c9afa8be8..4cc60c4c3c 100644 --- a/editor/progress_dialog.cpp +++ b/editor/progress_dialog.cpp @@ -176,7 +176,7 @@ void ProgressDialog::add_task(const String &p_task, const String &p_label, int p } else { cancel_hb->hide(); } - cancel_hb->raise(); + cancel_hb->move_to_front(); cancelled = false; _popup(); if (p_can_cancel) { @@ -207,7 +207,9 @@ bool ProgressDialog::task_step(const String &p_task, const String &p_state, int DisplayServer::get_singleton()->process_events(); } +#ifndef ANDROID_ENABLED Main::iteration(); // this will not work on a lot of platforms, so it's only meant for the editor +#endif return cancelled; } diff --git a/editor/project_converter_3_to_4.cpp b/editor/project_converter_3_to_4.cpp index 47c4557f14..0bd3ec0925 100644 --- a/editor/project_converter_3_to_4.cpp +++ b/editor/project_converter_3_to_4.cpp @@ -38,6 +38,7 @@ const int ERROR_CODE = 77; #include "modules/regex/regex.h" +#include "core/io/dir_access.h" #include "core/os/time.h" #include "core/templates/hash_map.h" #include "core/templates/list.h" @@ -240,6 +241,8 @@ static const char *gdscript_function_renames[][2] = { { "can_instance", "can_instantiate" }, // PackedScene, Script { "canvas_light_set_scale", "canvas_light_set_texture_scale" }, // RenderingServer { "center_viewport_to_cursor", "center_viewport_to_caret" }, // TextEdit + { "change_scene", "change_scene_to_file" }, // SceneTree + { "change_scene_to", "change_scene_to_packed" }, // SceneTree { "clip_polygons_2d", "clip_polygons" }, // Geometry2D { "clip_polyline_with_polygon_2d", "clip_polyline_with_polygon" }, //Geometry2D { "commit_handle", "_commit_handle" }, // EditorNode3DGizmo @@ -290,7 +293,7 @@ static const char *gdscript_function_renames[][2] = { { "get_collision_layer_bit", "get_collision_layer_value" }, // CSGShape3D and a lot of others like GridMap { "get_collision_mask_bit", "get_collision_mask_value" }, // CSGShape3D and a lot of others like GridMap { "get_color_types", "get_color_type_list" }, // Theme - { "get_command", "is_command_pressed" }, // InputEventWithModifiers + { "get_command", "is_command_or_control_pressed" }, // InputEventWithModifiers { "get_constant_types", "get_constant_type_list" }, // Theme { "get_control", "is_ctrl_pressed" }, // InputEventWithModifiers { "get_cull_mask_bit", "get_cull_mask_value" }, // Camera3D @@ -416,6 +419,7 @@ static const char *gdscript_function_renames[][2] = { { "is_normalmap", "is_normal_map" }, // NoiseTexture { "is_refusing_new_network_connections", "is_refusing_new_connections" }, // Multiplayer API { "is_region", "is_region_enabled" }, // Sprite2D + { "is_rotating", "is_ignoring_rotation" }, // Camera2D { "is_scancode_unicode", "is_keycode_unicode" }, // OS { "is_selectable_when_hidden", "_is_selectable_when_hidden" }, // EditorNode3DGizmoPlugin { "is_set_as_toplevel", "is_set_as_top_level" }, // CanvasItem @@ -478,7 +482,7 @@ static const char *gdscript_function_renames[][2] = { { "set_collision_layer_bit", "set_collision_layer_value" }, // CSGShape3D and a lot of others like GridMap { "set_collision_mask_bit", "set_collision_mask_value" }, // CSGShape3D and a lot of others like GridMap { "set_column_min_width", "set_column_custom_minimum_width" }, // Tree - { "set_command", "set_command_pressed" }, // InputEventWithModifiers + { "set_command", "set_meta_pressed" }, // InputEventWithModifiers { "set_control", "set_ctrl_pressed" }, // InputEventWithModifiers { "set_create_options", "_set_create_options" }, // EditorResourcePicker { "set_cull_mask_bit", "set_cull_mask_value" }, // Camera3D @@ -670,6 +674,8 @@ static const char *csharp_function_renames[][2] = { { "CanInstance", "CanInstantiate" }, // PackedScene, Script { "CanvasLightSetScale", "CanvasLightSetTextureScale" }, // RenderingServer { "CenterViewportToCursor", "CenterViewportToCaret" }, // TextEdit + { "ChangeScene", "ChangeSceneToFile" }, // SceneTree + { "ChangeSceneTo", "ChangeSceneToPacked" }, // SceneTree { "ClipPolygons2d", "ClipPolygons" }, // Geometry2D { "ClipPolylineWithPolygon2d", "ClipPolylineWithPolygon" }, //Geometry2D { "CommitHandle", "_CommitHandle" }, // EditorNode3DGizmo @@ -836,6 +842,7 @@ static const char *csharp_function_renames[][2] = { { "IsNormalmap", "IsNormalMap" }, // NoiseTexture { "IsRefusingNewNetworkConnections", "IsRefusingNewConnections" }, // Multiplayer API { "IsRegion", "IsRegionEnabled" }, // Sprite2D + { "IsRotating", "IsIgnoringRotation" }, // Camera2D { "IsScancodeUnicode", "IsKeycodeUnicode" }, // OS { "IsSelectableWhenHidden", "_IsSelectableWhenHidden" }, // EditorNode3DGizmoPlugin { "IsSetAsToplevel", "IsSetAsTopLevel" }, // CanvasItem @@ -1266,7 +1273,7 @@ static const char *project_settings_renames[][2] = { { "network/limits/debugger_stdout/max_errors_per_second", "network/limits/debugger/max_errors_per_second" }, { "network/limits/debugger_stdout/max_messages_per_frame", "network/limits/debugger/max_queued_messages" }, { "network/limits/debugger_stdout/max_warnings_per_second", "network/limits/debugger/max_warnings_per_second" }, - { "network/ssl/certificates", "network/ssl/certificate_bundle_override" }, + { "network/ssl/certificates", "network/tls/certificate_bundle_override" }, { "physics/2d/thread_model", "physics/2d/run_on_thread" }, // TODO not sure { "rendering/environment/default_clear_color", "rendering/environment/defaults/default_clear_color" }, { "rendering/environment/default_environment", "rendering/environment/defaults/default_environment" }, @@ -1550,7 +1557,6 @@ static const char *class_renames[][2] = { { nullptr, nullptr }, }; -// TODO - this colors needs to be validated(not all are valid) static const char *color_renames[][2] = { { "aliceblue", "ALICE_BLUE" }, { "antiquewhite", "ANTIQUE_WHITE" }, @@ -1704,7 +1710,7 @@ static const char *color_renames[][2] = { class ProjectConverter3To4::RegExContainer { public: - // Custom GDScript + // Custom GDScript. RegEx reg_is_empty = RegEx("\\bempty\\("); RegEx reg_super = RegEx("([\t ])\\.([a-zA-Z_])"); RegEx reg_json_to = RegEx("\\bto_json\\b"); @@ -1721,7 +1727,7 @@ public: RegEx reg_os_fullscreen = RegEx("OS.window_fullscreen[= ]+([^#^\n]+)"); RegEx reg_instantiate = RegEx("\\.instance\\(([^\\)]*)\\)"); - // GDScript keywords + // GDScript keywords. RegEx keyword_gdscript_tool = RegEx("^tool"); RegEx keyword_gdscript_export_single = RegEx("^export"); RegEx keyword_gdscript_export_mutli = RegEx("([\t]+)export\\b"); @@ -1735,7 +1741,7 @@ public: RegEx keyword_gdscript_master = RegEx("^master func"); RegEx keyword_gdscript_mastersync = RegEx("^mastersync func"); - // CSharp keywords + // CSharp keywords. RegEx keyword_csharp_remote = RegEx("\\[Remote(Attribute)?(\\(\\))?\\]"); RegEx keyword_csharp_remotesync = RegEx("\\[(Remote)?Sync(Attribute)?(\\(\\))?\\]"); RegEx keyword_csharp_puppet = RegEx("\\[(Puppet|Slave)(Attribute)?(\\(\\))?\\]"); @@ -1743,11 +1749,11 @@ public: RegEx keyword_csharp_master = RegEx("\\[Master(Attribute)?(\\(\\))?\\]"); RegEx keyword_csharp_mastersync = RegEx("\\[MasterSync(Attribute)?(\\(\\))?\\]"); - // Colors + // Colors. LocalVector<RegEx *> color_regexes; LocalVector<String> color_renamed; - // Classes + // Classes. LocalVector<RegEx *> class_tscn_regexes; LocalVector<RegEx *> class_gd_regexes; LocalVector<RegEx *> class_shader_regexes; @@ -1762,7 +1768,7 @@ public: LocalVector<String> class_temp_gd_renames; LocalVector<String> class_temp_shader_renames; - // Common + // Common. LocalVector<RegEx *> enum_regexes; LocalVector<RegEx *> gdscript_function_regexes; LocalVector<RegEx *> project_settings_regexes; @@ -1775,58 +1781,58 @@ public: LocalVector<RegEx *> csharp_signal_regexes; RegExContainer() { - // Common + // Common. { - // Enum + // Enum. for (unsigned int current_index = 0; enum_renames[current_index][0]; current_index++) { enum_regexes.push_back(memnew(RegEx(String("\\b") + enum_renames[current_index][0] + "\\b"))); } - // GDScript functions + // GDScript functions. for (unsigned int current_index = 0; gdscript_function_renames[current_index][0]; current_index++) { gdscript_function_regexes.push_back(memnew(RegEx(String("\\b") + gdscript_function_renames[current_index][0] + "\\b"))); } - // Project Settings + // Project Settings. for (unsigned int current_index = 0; project_settings_renames[current_index][0]; current_index++) { project_settings_regexes.push_back(memnew(RegEx(String("\\b") + project_settings_renames[current_index][0] + "\\b"))); } - // GDScript properties + // GDScript properties. for (unsigned int current_index = 0; gdscript_properties_renames[current_index][0]; current_index++) { gdscript_properties_regexes.push_back(memnew(RegEx(String("\\b") + gdscript_properties_renames[current_index][0] + "\\b"))); } - // GDScript Signals + // GDScript Signals. for (unsigned int current_index = 0; gdscript_signals_renames[current_index][0]; current_index++) { gdscript_signals_regexes.push_back(memnew(RegEx(String("\\b") + gdscript_signals_renames[current_index][0] + "\\b"))); } - // Shaders + // Shaders. for (unsigned int current_index = 0; shaders_renames[current_index][0]; current_index++) { shaders_regexes.push_back(memnew(RegEx(String("\\b") + shaders_renames[current_index][0] + "\\b"))); } - // Builtin types + // Builtin types. for (unsigned int current_index = 0; builtin_types_renames[current_index][0]; current_index++) { builtin_types_regexes.push_back(memnew(RegEx(String("\\b") + builtin_types_renames[current_index][0] + "\\b"))); } - // CSharp function renames + // CSharp function renames. for (unsigned int current_index = 0; csharp_function_renames[current_index][0]; current_index++) { csharp_function_regexes.push_back(memnew(RegEx(String("\\b") + csharp_function_renames[current_index][0] + "\\b"))); } - // CSharp properties renames + // CSharp properties renames. for (unsigned int current_index = 0; csharp_properties_renames[current_index][0]; current_index++) { csharp_properties_regexes.push_back(memnew(RegEx(String("\\b") + csharp_properties_renames[current_index][0] + "\\b"))); } - // CSharp signals renames + // CSharp signals renames. for (unsigned int current_index = 0; csharp_signals_renames[current_index][0]; current_index++) { csharp_signal_regexes.push_back(memnew(RegEx(String("\\b") + csharp_signals_renames[current_index][0] + "\\b"))); } } - // Colors + // Colors. { for (unsigned int current_index = 0; color_renames[current_index][0]; current_index++) { color_regexes.push_back(memnew(RegEx(String("\\bColor.") + color_renames[current_index][0] + "\\b"))); color_renamed.push_back(String("Color.") + color_renames[current_index][1]); } } - // Classes + // Classes. { for (unsigned int current_index = 0; class_renames[current_index][0]; current_index++) { class_tscn_regexes.push_back(memnew(RegEx(String("\\b") + class_renames[current_index][0] + ".tscn\\b"))); @@ -1884,12 +1890,12 @@ public: } }; -ProjectConverter3To4::ProjectConverter3To4(int maximum_file_size_kb, int maximum_line_length) { - this->maximum_file_size = maximum_file_size_kb * 1024; - this->maximum_line_length = maximum_line_length; +ProjectConverter3To4::ProjectConverter3To4(int p_maximum_file_size_kb, int p_maximum_line_length) { + maximum_file_size = p_maximum_file_size_kb * 1024; + maximum_line_length = p_maximum_line_length; } -// Function responsible for converting project +// Function responsible for converting project. int ProjectConverter3To4::convert() { print_line("Starting conversion."); uint64_t conversion_start_time = Time::get_singleton()->get_ticks_msec(); @@ -1897,7 +1903,7 @@ int ProjectConverter3To4::convert() { RegExContainer reg_container = RegExContainer(); int cached_maximum_line_length = maximum_line_length; - maximum_line_length = 10000; // Use only for tests bigger value, to not break them + maximum_line_length = 10000; // Use only for tests bigger value, to not break them. ERR_FAIL_COND_V_MSG(!test_array_names(), ERROR_CODE, "Cannot start converting due to problems with data in arrays."); ERR_FAIL_COND_V_MSG(!test_conversion(reg_container), ERROR_CODE, "Cannot start converting due to problems with converting arrays."); @@ -1905,36 +1911,36 @@ int ProjectConverter3To4::convert() { maximum_line_length = cached_maximum_line_length; // Checking if folder contains valid Godot 3 project. - // Project should not be converted more than 1 times + // Project should not be converted more than once. { - String conventer_text = "; Project was converted by built-in tool to Godot 4.0"; + String converter_text = "; Project was converted by built-in tool to Godot 4.0"; - ERR_FAIL_COND_V_MSG(!FileAccess::exists("project.godot"), ERROR_CODE, "Current directory doesn't contains any Godot 3 project"); + ERR_FAIL_COND_V_MSG(!FileAccess::exists("project.godot"), ERROR_CODE, "Current working directory doesn't contain a \"project.godot\" file for a Godot 3 project."); Error err = OK; String project_godot_content = FileAccess::get_file_as_string("project.godot", &err); - ERR_FAIL_COND_V_MSG(err != OK, ERROR_CODE, "Failed to read content of \"project.godot\" file."); - ERR_FAIL_COND_V_MSG(project_godot_content.contains(conventer_text), ERROR_CODE, "Project already was converted with this tool."); + ERR_FAIL_COND_V_MSG(err != OK, ERROR_CODE, "Unable to read \"project.godot\"."); + ERR_FAIL_COND_V_MSG(project_godot_content.contains(converter_text), ERROR_CODE, "Project was already converted with this tool."); Ref<FileAccess> file = FileAccess::open("project.godot", FileAccess::WRITE); - ERR_FAIL_COND_V_MSG(file.is_null(), ERROR_CODE, "Failed to open project.godot file."); + ERR_FAIL_COND_V_MSG(file.is_null(), ERROR_CODE, "Unable to open \"project.godot\"."); - file->store_string(conventer_text + "\n" + project_godot_content); + file->store_string(converter_text + "\n" + project_godot_content); } Vector<String> collected_files = check_for_files(); uint32_t converted_files = 0; - // Check file by file + // Check file by file. for (int i = 0; i < collected_files.size(); i++) { String file_name = collected_files[i]; Vector<String> lines; uint32_t ignored_lines = 0; { Ref<FileAccess> file = FileAccess::open(file_name, FileAccess::READ); - ERR_CONTINUE_MSG(file.is_null(), "Failed to read content of \"" + file_name + "\"."); + ERR_CONTINUE_MSG(file.is_null(), vformat("Unable to read content of \"%s\".", file_name)); while (!file->eof_reached()) { String line = file->get_line(); lines.append(line); @@ -1943,7 +1949,7 @@ int ProjectConverter3To4::convert() { String file_content_before = collect_string_from_vector(lines); uint64_t hash_before = file_content_before.hash(); uint64_t file_size = file_content_before.size(); - print_line("Trying to convert\t" + itos(i + 1) + "/" + itos(collected_files.size()) + " file - \"" + file_name.trim_prefix("res://") + "\" with size - " + itos(file_size / 1024) + " KB"); + print_line(vformat("Trying to convert\t%d/%d file - \"%s\" with size - %d KB", i + 1, collected_files.size(), file_name.trim_prefix("res://"), file_size / 1024)); Vector<String> reason; bool is_ignored = false; @@ -1955,15 +1961,15 @@ int ProjectConverter3To4::convert() { } if (file_size < uint64_t(maximum_file_size)) { - // TSCN must be the same work exactly same as .gd file because it may contains builtin script + // ".tscn" must work exactly the same as ".gd" files because they may contain built-in Scripts. if (file_name.ends_with(".gd")) { - rename_classes(lines, reg_container); // Using only specialized function + rename_classes(lines, reg_container); // Using only specialized function. rename_common(enum_renames, reg_container.enum_regexes, lines); - rename_colors(lines, reg_container); // Require to additional rename + rename_colors(lines, reg_container); // Require to additional rename. rename_common(gdscript_function_renames, reg_container.gdscript_function_regexes, lines); - rename_gdscript_functions(lines, reg_container, false); // Require to additional rename + rename_gdscript_functions(lines, reg_container, false); // Require to additional rename. rename_common(project_settings_renames, reg_container.project_settings_regexes, lines); rename_gdscript_keywords(lines, reg_container); @@ -1974,13 +1980,13 @@ int ProjectConverter3To4::convert() { custom_rename(lines, "\\.shader", ".gdshader"); } else if (file_name.ends_with(".tscn")) { - rename_classes(lines, reg_container); // Using only specialized function + rename_classes(lines, reg_container); // Using only specialized function. rename_common(enum_renames, reg_container.enum_regexes, lines); - rename_colors(lines, reg_container); // Require to additional rename + rename_colors(lines, reg_container); // Require to do additional renames. rename_common(gdscript_function_renames, reg_container.gdscript_function_regexes, lines); - rename_gdscript_functions(lines, reg_container, true); // Require to additional rename + rename_gdscript_functions(lines, reg_container, true); // Require to do additional renames. rename_common(project_settings_renames, reg_container.project_settings_regexes, lines); rename_gdscript_keywords(lines, reg_container); @@ -1990,8 +1996,8 @@ int ProjectConverter3To4::convert() { rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines); custom_rename(lines, "\\.shader", ".gdshader"); - } else if (file_name.ends_with(".cs")) { // TODO, C# should use different methods - rename_classes(lines, reg_container); // Using only specialized function + } else if (file_name.ends_with(".cs")) { // TODO, C# should use different methods. + rename_classes(lines, reg_container); // Using only specialized function. rename_common(csharp_function_renames, reg_container.csharp_function_regexes, lines); rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines); rename_common(csharp_properties_renames, reg_container.csharp_properties_regexes, lines); @@ -2002,7 +2008,7 @@ int ProjectConverter3To4::convert() { } else if (file_name.ends_with(".gdshader") || file_name.ends_with(".shader")) { rename_common(shaders_renames, reg_container.shaders_regexes, lines); } else if (file_name.ends_with("tres")) { - rename_classes(lines, reg_container); // Using only specialized function + rename_classes(lines, reg_container); // Using only specialized function. rename_common(shaders_renames, reg_container.shaders_regexes, lines); rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines); @@ -2024,41 +2030,40 @@ int ProjectConverter3To4::convert() { } } } else { - reason.append(" ERROR: File has exceeded the maximum size allowed - " + itos(maximum_file_size / 1024) + " KB"); + reason.append(vformat(" ERROR: File has exceeded the maximum size allowed - %d KB", maximum_file_size / 1024)); is_ignored = true; } uint64_t end_time = Time::get_singleton()->get_ticks_msec(); if (is_ignored) { - String end_message = " Checking file took " + itos(end_time - start_time) + " ms."; + String end_message = vformat(" Checking file took %d ms.", end_time - start_time); print_line(end_message); } else { String file_content_after = collect_string_from_vector(lines); uint64_t hash_after = file_content_after.hash64(); - // Don't need to save file without any changes - // Save if this is a shader, because it was renamed + // Don't need to save file without any changes. + // Save if this is a shader, because it was renamed. if (hash_before != hash_after || file_name.ends_with(".gdshader")) { converted_files++; Ref<FileAccess> file = FileAccess::open(file_name, FileAccess::WRITE); - ERR_CONTINUE_MSG(file.is_null(), "Failed to open \"" + file_name + "\" to save data to file."); + ERR_CONTINUE_MSG(file.is_null(), vformat("Unable to apply changes to \"%s\", no writing access.", file_name)); file->store_string(file_content_after); - reason.append(" File was changed, conversion took " + itos(end_time - start_time) + " ms."); + reason.append(vformat(" File was changed, conversion took %d ms.", end_time - start_time)); } else { - reason.append(" File was not changed, checking took " + itos(end_time - start_time) + " ms."); + reason.append(vformat(" File was left unchanged, checking took %d ms.", end_time - start_time)); } if (ignored_lines != 0) { - reason.append(" Ignored " + itos(ignored_lines) + " lines, because their length exceeds maximum allowed characters - " + itos(maximum_line_length)); + reason.append(vformat(" Ignored %d lines, because their length exceeds maximum allowed characters - %d.", ignored_lines, maximum_line_length)); } } for (int k = 0; k < reason.size(); k++) { print_line(reason[k]); } } - - print_line("Conversion ended - all files(" + itos(collected_files.size()) + "), converted files(" + itos(converted_files) + "), not converted files(" + itos(collected_files.size() - converted_files) + ")."); + print_line(vformat("Conversion ended - all files(%d), converted files: (%d), not converted files: (%d).", collected_files.size(), converted_files, collected_files.size() - converted_files)); uint64_t conversion_end_time = Time::get_singleton()->get_ticks_msec(); - print_line("Conversion of all files took " + itos(conversion_end_time - conversion_start_time) + " ms."); + print_line(vformat("Conversion of all files took %10.3f seconds.", (conversion_end_time - conversion_start_time) / 1000.0)); return 0; }; @@ -2070,7 +2075,7 @@ int ProjectConverter3To4::validate_conversion() { RegExContainer reg_container = RegExContainer(); int cached_maximum_line_length = maximum_line_length; - maximum_line_length = 10000; // Use only for tests bigger value, to not break them + maximum_line_length = 10000; // To avoid breaking the tests, only use this for the their larger value. ERR_FAIL_COND_V_MSG(!test_array_names(), ERROR_CODE, "Cannot start converting due to problems with data in arrays."); ERR_FAIL_COND_V_MSG(!test_conversion(reg_container), ERROR_CODE, "Cannot start converting due to problems with converting arrays."); @@ -2078,7 +2083,7 @@ int ProjectConverter3To4::validate_conversion() { maximum_line_length = cached_maximum_line_length; // Checking if folder contains valid Godot 3 project. - // Project should not be converted more than 1 times + // Project should not be converted more than once. { String conventer_text = "; Project was converted by built-in tool to Godot 4.0"; @@ -2095,7 +2100,7 @@ int ProjectConverter3To4::validate_conversion() { uint32_t converted_files = 0; - // Check file by file + // Check file by file. for (int i = 0; i < collected_files.size(); i++) { String file_name = collected_files[i]; Vector<String> lines; @@ -2103,14 +2108,14 @@ int ProjectConverter3To4::validate_conversion() { uint64_t file_size = 0; { Ref<FileAccess> file = FileAccess::open(file_name, FileAccess::READ); - ERR_CONTINUE_MSG(file.is_null(), "Failed to read content of \"" + file_name + "\"."); + ERR_CONTINUE_MSG(file.is_null(), vformat("Unable to read content of \"%s\".", file_name)); while (!file->eof_reached()) { String line = file->get_line(); file_size += line.size(); lines.append(line); } } - print_line("Checking for conversion - " + itos(i + 1) + "/" + itos(collected_files.size()) + " file - \"" + file_name.trim_prefix("res://") + "\" with size - " + itos(file_size / 1024) + " KB"); + print_line(vformat("Checking for conversion - %d/%d file - \"%s\" with size - %d KB"), i + 1, collected_files.size(), file_name.trim_prefix("res://"), file_size / 1024); Vector<String> changed_elements; Vector<String> reason; @@ -2118,7 +2123,7 @@ int ProjectConverter3To4::validate_conversion() { uint64_t start_time = Time::get_singleton()->get_ticks_msec(); if (file_name.ends_with(".shader")) { - reason.append("\tFile extension will be renamed from `shader` to `gdshader`."); + reason.append("\tFile extension will be renamed from \"shader\" to \"gdshader\"."); } if (file_size < uint64_t(maximum_file_size)) { @@ -2180,7 +2185,7 @@ int ProjectConverter3To4::validate_conversion() { } else if (file_name.ends_with(".csproj")) { // TODO } else { - ERR_PRINT(file_name + " is not supported!"); + ERR_PRINT(vformat("\"%s\", is not supported!", file_name)); continue; } @@ -2190,14 +2195,14 @@ int ProjectConverter3To4::validate_conversion() { } } } else { - reason.append("\tERROR: File has exceeded the maximum size allowed - " + itos(maximum_file_size / 1024) + " KB"); + reason.append(vformat("\tERROR: File has exceeded the maximum size allowed - %d KB.", maximum_file_size / 1024)); is_ignored = true; } uint64_t end_time = Time::get_singleton()->get_ticks_msec(); - String end_message = " Checking file took " + itos(end_time - start_time) + " ms."; + String end_message = vformat(" Checking file took %10.3f ms.", (end_time - start_time) / 1000.0); if (ignored_lines != 0) { - end_message += " Ignored " + itos(ignored_lines) + " lines, because their length exceeds maximum allowed characters - " + itos(maximum_line_length); + end_message += vformat(" Ignored %d lines, because their length exceeds maximum allowed characters - %d.", ignored_lines, maximum_line_length); } print_line(end_message); @@ -2214,35 +2219,36 @@ int ProjectConverter3To4::validate_conversion() { } } - print_line("Checking for valid conversion ended - all files(" + itos(collected_files.size()) + "), files which would be converted(" + itos(converted_files) + "), files which would not be converted(" + itos(collected_files.size() - converted_files) + ")."); + print_line(vformat("Checking for valid conversion ended - all files(%d), files which would be converted(%d), files which would not be converted(%d).", collected_files.size(), converted_files, collected_files.size() - converted_files)); uint64_t conversion_end_time = Time::get_singleton()->get_ticks_msec(); - print_line("Conversion of all files took " + itos(conversion_end_time - conversion_start_time) + " ms."); + print_line(vformat("Conversion of all files took %10.3f seconds.", (conversion_end_time - conversion_start_time) / 1000.0)); return 0; } -// Collect files which will be checked, it will not touch txt, mp4, wav etc. files +// Collect files which will be checked, excluding ".txt", ".mp4", ".wav" etc. files. Vector<String> ProjectConverter3To4::check_for_files() { Vector<String> collected_files = Vector<String>(); Vector<String> directories_to_check = Vector<String>(); directories_to_check.push_back("res://"); - core_bind::Directory dir = core_bind::Directory(); while (!directories_to_check.is_empty()) { String path = directories_to_check.get(directories_to_check.size() - 1); // Is there any pop_back function? directories_to_check.resize(directories_to_check.size() - 1); // Remove last element - if (dir.open(path) == OK) { - dir.set_include_hidden(true); - dir.list_dir_begin(); - String current_dir = dir.get_current_dir(); - String file_name = dir.get_next(); + + Ref<DirAccess> dir = DirAccess::create_for_path(path); + if (dir.is_valid()) { + dir->set_include_hidden(true); + dir->list_dir_begin(); + String current_dir = dir->get_current_dir(); + String file_name = dir->_get_next(); while (file_name != "") { if (file_name == ".git" || file_name == ".import" || file_name == ".godot") { - file_name = dir.get_next(); + file_name = dir->_get_next(); continue; } - if (dir.current_is_dir()) { + if (dir->current_is_dir()) { directories_to_check.append(current_dir.path_join(file_name) + "/"); } else { bool proper_extension = false; @@ -2253,7 +2259,7 @@ Vector<String> ProjectConverter3To4::check_for_files() { collected_files.append(current_dir.path_join(file_name)); } } - file_name = dir.get_next(); + file_name = dir->_get_next(); } } else { print_verbose("Failed to open " + path); @@ -2267,10 +2273,7 @@ bool ProjectConverter3To4::test_conversion_gdscript_builtin(String name, String Vector<String> got = name.split("\n"); (this->*func)(got, reg_container, builtin_script); String got_str = collect_string_from_vector(got); - if (expected != got_str) { - ERR_PRINT("Failed to convert " + what + " `" + name + "` to `" + expected + "`, got instead `" + got_str + "`"); - return false; - } + ERR_FAIL_COND_V_MSG(expected != got_str, false, vformat("Failed to convert %s \"%s\" to \"%s\", got instead \"%s\"", what, name, expected, got_str)); return true; } @@ -2279,10 +2282,7 @@ bool ProjectConverter3To4::test_conversion_with_regex(String name, String expect Vector<String> got = name.split("\n"); (this->*func)(got, reg_container); String got_str = collect_string_from_vector(got); - if (expected != got_str) { - ERR_PRINT("Failed to convert " + what + " `" + name + "` to `" + expected + "`, got instead `" + got_str + "`"); - return false; - } + ERR_FAIL_COND_V_MSG(expected != got_str, false, vformat("Failed to convert %s \"%s\" to \"%s\", got instead \"%s\"", what, name, expected, got_str)); return true; } @@ -2291,187 +2291,185 @@ bool ProjectConverter3To4::test_conversion_basic(String name, String expected, c Vector<String> got = name.split("\n"); rename_common(array, regex_cache, got); String got_str = collect_string_from_vector(got); - if (expected != got_str) { - ERR_PRINT("Failed to convert " + what + " `" + name + "` to `" + expected + "`, got instead `" + got_str + "`"); - return false; - } + ERR_FAIL_COND_V_MSG(expected != got_str, false, vformat("Failed to convert %s \"%s\" to \"%s\", got instead \"%s\"", what, name, expected, got_str)); + return true; } -// Validate if conversions are proper +// Validate if conversions are proper. bool ProjectConverter3To4::test_conversion(RegExContainer ®_container) { bool valid = true; - valid = valid & test_conversion_basic("TYPE_REAL", "TYPE_FLOAT", enum_renames, reg_container.enum_regexes, "enum"); + valid = valid && test_conversion_basic("TYPE_REAL", "TYPE_FLOAT", enum_renames, reg_container.enum_regexes, "enum"); - valid = valid & test_conversion_basic("can_instance", "can_instantiate", gdscript_function_renames, reg_container.gdscript_function_regexes, "gdscript function"); + valid = valid && test_conversion_basic("can_instance", "can_instantiate", gdscript_function_renames, reg_container.gdscript_function_regexes, "gdscript function"); - valid = valid & test_conversion_basic("CanInstance", "CanInstantiate", csharp_function_renames, reg_container.csharp_function_regexes, "csharp function"); + valid = valid && test_conversion_basic("CanInstance", "CanInstantiate", csharp_function_renames, reg_container.csharp_function_regexes, "csharp function"); - valid = valid & test_conversion_basic("translation", "position", gdscript_properties_renames, reg_container.gdscript_properties_regexes, "gdscript property"); + valid = valid && test_conversion_basic("translation", "position", gdscript_properties_renames, reg_container.gdscript_properties_regexes, "gdscript property"); - valid = valid & test_conversion_basic("Translation", "Position", csharp_properties_renames, reg_container.csharp_properties_regexes, "csharp property"); + valid = valid && test_conversion_basic("Translation", "Position", csharp_properties_renames, reg_container.csharp_properties_regexes, "csharp property"); - valid = valid & test_conversion_basic("NORMALMAP", "NORMAL_MAP", shaders_renames, reg_container.shaders_regexes, "shader"); + valid = valid && test_conversion_basic("NORMALMAP", "NORMAL_MAP", shaders_renames, reg_container.shaders_regexes, "shader"); - valid = valid & test_conversion_basic("text_entered", "text_submitted", gdscript_signals_renames, reg_container.gdscript_signals_regexes, "gdscript signal"); + valid = valid && test_conversion_basic("text_entered", "text_submitted", gdscript_signals_renames, reg_container.gdscript_signals_regexes, "gdscript signal"); - valid = valid & test_conversion_basic("TextEntered", "TextSubmitted", csharp_signals_renames, reg_container.csharp_signal_regexes, "csharp signal"); + valid = valid && test_conversion_basic("TextEntered", "TextSubmitted", csharp_signals_renames, reg_container.csharp_signal_regexes, "csharp signal"); - valid = valid & test_conversion_basic("audio/channel_disable_threshold_db", "audio/buses/channel_disable_threshold_db", project_settings_renames, reg_container.project_settings_regexes, "project setting"); + valid = valid && test_conversion_basic("audio/channel_disable_threshold_db", "audio/buses/channel_disable_threshold_db", project_settings_renames, reg_container.project_settings_regexes, "project setting"); - valid = valid & test_conversion_basic("Transform", "Transform3D", builtin_types_renames, reg_container.builtin_types_regexes, "builtin type"); + valid = valid && test_conversion_basic("Transform", "Transform3D", builtin_types_renames, reg_container.builtin_types_regexes, "builtin type"); - // Custom Renames + // Custom Renames. - valid = valid & test_conversion_with_regex("(Connect(A,B,C,D,E,F,G) != OK):", "(Connect(A,new Callable(B,C),D,E,F,G) != OK):", &ProjectConverter3To4::rename_csharp_functions, "custom rename csharp", reg_container); - valid = valid & test_conversion_with_regex("(Disconnect(A,B,C) != OK):", "(Disconnect(A,new Callable(B,C)) != OK):", &ProjectConverter3To4::rename_csharp_functions, "custom rename csharp", reg_container); - valid = valid & test_conversion_with_regex("(IsConnected(A,B,C) != OK):", "(IsConnected(A,new Callable(B,C)) != OK):", &ProjectConverter3To4::rename_csharp_functions, "custom rename", reg_container); + valid = valid && test_conversion_with_regex("(Connect(A,B,C,D,E,F,G) != OK):", "(Connect(A,new Callable(B,C),D,E,F,G) != OK):", &ProjectConverter3To4::rename_csharp_functions, "custom rename csharp", reg_container); + valid = valid && test_conversion_with_regex("(Disconnect(A,B,C) != OK):", "(Disconnect(A,new Callable(B,C)) != OK):", &ProjectConverter3To4::rename_csharp_functions, "custom rename csharp", reg_container); + valid = valid && test_conversion_with_regex("(IsConnected(A,B,C) != OK):", "(IsConnected(A,new Callable(B,C)) != OK):", &ProjectConverter3To4::rename_csharp_functions, "custom rename", reg_container); - valid = valid & test_conversion_with_regex("[Remote]", "[RPC(MultiplayerAPI.RPCMode.AnyPeer)]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); - valid = valid & test_conversion_with_regex("[RemoteSync]", "[RPC(MultiplayerAPI.RPCMode.AnyPeer, CallLocal = true)]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); - valid = valid & test_conversion_with_regex("[Sync]", "[RPC(MultiplayerAPI.RPCMode.AnyPeer, CallLocal = true)]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); - valid = valid & test_conversion_with_regex("[Slave]", "[RPC]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); - valid = valid & test_conversion_with_regex("[Puppet]", "[RPC]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); - valid = valid & test_conversion_with_regex("[PuppetSync]", "[RPC(CallLocal = true)]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); - valid = valid & test_conversion_with_regex("[Master]", "The master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using Multiplayer.GetRemoteSenderId()\n[RPC]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); - valid = valid & test_conversion_with_regex("[MasterSync]", "The master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using Multiplayer.GetRemoteSenderId()\n[RPC(CallLocal = true)]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); - - valid = valid & test_conversion_gdscript_builtin("OS.window_fullscreen = Settings.fullscreen", "ProjectSettings.set(\"display/window/size/fullscreen\", Settings.fullscreen)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("OS.window_fullscreen = Settings.fullscreen", "ProjectSettings.set(\\\"display/window/size/fullscreen\\\", Settings.fullscreen)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, true); - valid = valid & test_conversion_gdscript_builtin("OS.get_window_safe_area()", "DisplayServer.get_display_safe_area()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("\tvar aa = roman(r.move_and_slide( a, b, c, d, e, f )) # Roman", "\tr.set_velocity(a)\n\tr.set_up_direction(b)\n\tr.set_floor_stop_on_slope_enabled(c)\n\tr.set_max_slides(d)\n\tr.set_floor_max_angle(e)\n\t# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `f`\n\tr.move_and_slide()\n\tvar aa = roman(r.velocity) # Roman", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("\tvar aa = roman(r.move_and_slide_with_snap( a, g, b, c, d, e, f )) # Roman", "\tr.set_velocity(a)\n\t# TODOConverter40 looks that snap in Godot 4.0 is float, not vector like in Godot 3 - previous value `g`\n\tr.set_up_direction(b)\n\tr.set_floor_stop_on_slope_enabled(c)\n\tr.set_max_slides(d)\n\tr.set_floor_max_angle(e)\n\t# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `f`\n\tr.move_and_slide()\n\tvar aa = roman(r.velocity) # Roman", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_with_regex("[Remote]", "[RPC(MultiplayerAPI.RPCMode.AnyPeer)]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); + valid = valid && test_conversion_with_regex("[RemoteSync]", "[RPC(MultiplayerAPI.RPCMode.AnyPeer, CallLocal = true)]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); + valid = valid && test_conversion_with_regex("[Sync]", "[RPC(MultiplayerAPI.RPCMode.AnyPeer, CallLocal = true)]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); + valid = valid && test_conversion_with_regex("[Slave]", "[RPC]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); + valid = valid && test_conversion_with_regex("[Puppet]", "[RPC]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); + valid = valid && test_conversion_with_regex("[PuppetSync]", "[RPC(CallLocal = true)]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); + valid = valid && test_conversion_with_regex("[Master]", "The master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using Multiplayer.GetRemoteSenderId()\n[RPC]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); + valid = valid && test_conversion_with_regex("[MasterSync]", "The master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using Multiplayer.GetRemoteSenderId()\n[RPC(CallLocal = true)]", &ProjectConverter3To4::rename_csharp_attributes, "custom rename csharp", reg_container); + + valid = valid && test_conversion_gdscript_builtin("OS.window_fullscreen = Settings.fullscreen", "ProjectSettings.set(\"display/window/size/fullscreen\", Settings.fullscreen)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("OS.window_fullscreen = Settings.fullscreen", "ProjectSettings.set(\\\"display/window/size/fullscreen\\\", Settings.fullscreen)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, true); + valid = valid && test_conversion_gdscript_builtin("OS.get_window_safe_area()", "DisplayServer.get_display_safe_area()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("\tvar aa = roman(r.move_and_slide( a, b, c, d, e, f )) # Roman", "\tr.set_velocity(a)\n\tr.set_up_direction(b)\n\tr.set_floor_stop_on_slope_enabled(c)\n\tr.set_max_slides(d)\n\tr.set_floor_max_angle(e)\n\t# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `f`\n\tr.move_and_slide()\n\tvar aa = roman(r.velocity) # Roman", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("\tvar aa = roman(r.move_and_slide_with_snap( a, g, b, c, d, e, f )) # Roman", "\tr.set_velocity(a)\n\t# TODOConverter40 looks that snap in Godot 4.0 is float, not vector like in Godot 3 - previous value `g`\n\tr.set_up_direction(b)\n\tr.set_floor_stop_on_slope_enabled(c)\n\tr.set_max_slides(d)\n\tr.set_floor_max_angle(e)\n\t# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `f`\n\tr.move_and_slide()\n\tvar aa = roman(r.velocity) # Roman", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("list_dir_begin( a , b )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("list_dir_begin( a )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("list_dir_begin( )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("list_dir_begin( a , b )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("list_dir_begin( a )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("list_dir_begin( )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("sort_custom( a , b )", "sort_custom(Callable(a,b))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("func c(var a, var b)", "func c(a, b)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("sort_custom( a , b )", "sort_custom(Callable(a,b))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("func c(var a, var b)", "func c(a, b)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("draw_line(1, 2, 3, 4, 5)", "draw_line(1,2,3,4)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("draw_line(1, 2, 3, 4, 5)", "draw_line(1,2,3,4)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("\timage.lock()", "\tfalse # image.lock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("\timage.unlock()", "\tfalse # image.unlock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("\troman.image.unlock()", "\tfalse # roman.image.unlock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("\tmtx.lock()", "\tmtx.lock()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("\tmutex.unlock()", "\tmutex.unlock()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("\timage.lock()", "\tfalse # image.lock() # TODOConverter40, Image no longer requires locking, `false` helps to not break one line if/else, so it can freely be removed", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("\timage.unlock()", "\tfalse # image.unlock() # TODOConverter40, Image no longer requires locking, `false` helps to not break one line if/else, so it can freely be removed", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("\troman.image.unlock()", "\tfalse # roman.image.unlock() # TODOConverter40, Image no longer requires locking, `false` helps to not break one line if/else, so it can freely be removed", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("\tmtx.lock()", "\tmtx.lock()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("\tmutex.unlock()", "\tmutex.unlock()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_with_regex("extends CSGBox", "extends CSGBox3D", &ProjectConverter3To4::rename_classes, "classes", reg_container); - valid = valid & test_conversion_with_regex("CSGBox", "CSGBox3D", &ProjectConverter3To4::rename_classes, "classes", reg_container); - valid = valid & test_conversion_with_regex("Spatial", "Node3D", &ProjectConverter3To4::rename_classes, "classes", reg_container); - valid = valid & test_conversion_with_regex("Spatial.tscn", "Spatial.tscn", &ProjectConverter3To4::rename_classes, "classes", reg_container); - valid = valid & test_conversion_with_regex("Spatial.gd", "Spatial.gd", &ProjectConverter3To4::rename_classes, "classes", reg_container); - valid = valid & test_conversion_with_regex("Spatial.shader", "Spatial.shader", &ProjectConverter3To4::rename_classes, "classes", reg_container); - valid = valid & test_conversion_with_regex("Spatial.other", "Node3D.other", &ProjectConverter3To4::rename_classes, "classes", reg_container); - - valid = valid & test_conversion_with_regex("\nonready", "\n@onready", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("onready", "@onready", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex(" onready", " onready", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\nexport", "\n@export", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\texport", "\t@export", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\texport_dialog", "\texport_dialog", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("export", "@export", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex(" export", " export", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("tool", "@tool", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\n tool", "\n tool", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\n\ntool", "\n\n@tool", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\n\nremote func", "\n\n@rpc(any_peer) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\n\nremotesync func", "\n\n@rpc(any_peer, call_local) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\n\nsync func", "\n\n@rpc(any_peer, call_local) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\n\nslave func", "\n\n@rpc func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\n\npuppet func", "\n\n@rpc func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\n\npuppetsync func", "\n\n@rpc(call_local) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\n\nmaster func", "\n\nThe master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using get_multiplayer().get_remote_sender_id()\n@rpc func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - valid = valid & test_conversion_with_regex("\n\nmastersync func", "\n\nThe master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using get_multiplayer().get_remote_sender_id()\n@rpc(call_local) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); - - valid = valid & test_conversion_gdscript_builtin("var size : Vector2 = Vector2() setget set_function , get_function", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Copy here content of get_function\n set(mod_value):\n mod_value # TODOConverter40 Copy here content of set_function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("var size : Vector2 = Vector2() setget set_function , ", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Non existent get function \n set(mod_value):\n mod_value # TODOConverter40 Copy here content of set_function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("var size : Vector2 = Vector2() setget set_function", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Non existent get function \n set(mod_value):\n mod_value # TODOConverter40 Copy here content of set_function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("var size : Vector2 = Vector2() setget , get_function", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Copy here content of get_function \n set(mod_value):\n mod_value # TODOConverter40 Non existent set function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("get_node(@", "get_node(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("yield(this, \"timeout\")", "await this.timeout", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("yield(this, \\\"timeout\\\")", "await this.timeout", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, true); - - valid = valid & test_conversion_gdscript_builtin(" Transform.xform(Vector3(a,b,c)) ", " Transform * Vector3(a,b,c) ", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin(" Transform.xform_inv(Vector3(a,b,c)) ", " Vector3(a,b,c) * Transform ", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("export(float) var lifetime = 3.0", "export var lifetime: float = 3.0", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("export(String, 'AnonymousPro', 'CourierPrime') var _font_name = 'AnonymousPro'", "export var _font_name = 'AnonymousPro' # (String, 'AnonymousPro', 'CourierPrime')", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); // TODO, this is only a workaround - valid = valid & test_conversion_gdscript_builtin("export(PackedScene) var mob_scene", "export var mob_scene: PackedScene", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("var d = parse_json(roman(sfs))", "var test_json_conv = JSON.new()\ntest_json_conv.parse(roman(sfs))\nvar d = test_json_conv.get_data()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("to_json( AA ) szon", "JSON.new().stringify( AA ) szon", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("s to_json", "s JSON.new().stringify", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("AF to_json2", "AF to_json2", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("var rr = JSON.parse(a)", "var test_json_conv = JSON.new()\ntest_json_conv.parse(a)\nvar rr = test_json_conv.get_data()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("empty()", "is_empty()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin(".empty", ".empty", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin(").roman(", ").roman(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("\t.roman(", "\tsuper.roman(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin(" .roman(", " super.roman(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin(".1", ".1", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin(" .1", " .1", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("'.'", "'.'", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("'.a'", "'.a'", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("\t._input(_event)", "\tsuper._input(_event)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("(connect(A,B,C) != OK):", "(connect(A,Callable(B,C)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("(connect(A,B,C,D) != OK):", "(connect(A,Callable(B,C).bind(D)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("(connect(A,B,C,[D]) != OK):", "(connect(A,Callable(B,C).bind(D)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("(connect(A,B,C,[D,E]) != OK):", "(connect(A,Callable(B,C).bind(D,E)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("(connect(A,B,C,[D,E],F) != OK):", "(connect(A,Callable(B,C).bind(D,E),F) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("(connect(A,B,C,D,E) != OK):", "(connect(A,Callable(B,C).bind(D),E) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("(start(A,B) != OK):", "(start(Callable(A,B)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("func start(A,B):", "func start(A,B):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("(start(A,B,C,D,E,F,G) != OK):", "(start(Callable(A,B).bind(C),D,E,F,G) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("disconnect(A,B,C) != OK):", "disconnect(A,Callable(B,C)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("is_connected(A,B,C) != OK):", "is_connected(A,Callable(B,C)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("is_connected(A,B,C))", "is_connected(A,Callable(B,C)))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("(tween_method(A,B,C,D,E).foo())", "(tween_method(Callable(A,B),C,D,E).foo())", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("(tween_method(A,B,C,D,E,[F,G]).foo())", "(tween_method(Callable(A,B).bind(F,G),C,D,E).foo())", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("(tween_callback(A,B).foo())", "(tween_callback(Callable(A,B)).foo())", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("(tween_callback(A,B,[C,D]).foo())", "(tween_callback(Callable(A,B).bind(C,D)).foo())", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("func _init(", "func _init(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("func _init(p_x:int)->void:", "func _init(p_x:int):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("q_PackedDataContainer._iter_init(variable1)", "q_PackedDataContainer._iter_init(variable1)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("assert(speed < 20, str(randi()%10))", "assert(speed < 20) #,str(randi()%10))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("assert(speed < 2)", "assert(speed < 2)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("assert(false, \"Missing type --\" + str(argument.type) + \"--, needs to be added to project\")", "assert(false) #,\"Missing type --\" + str(argument.type) + \"--, needs to be added to project\")", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("create_from_image(aa, bb)", "create_from_image(aa) #,bb", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("q_ImageTexture.create_from_image(variable1, variable2)", "q_ImageTexture.create_from_image(variable1) #,variable2", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("set_cell_item(a, b, c, d ,e) # AA", "set_cell_item( Vector3(a,b,c) ,d,e) # AA", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("set_cell_item(a, b)", "set_cell_item(a, b)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("get_cell_item_orientation(a, b,c)", "get_cell_item_orientation(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("get_cell_item(a, b,c)", "get_cell_item(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("map_to_world(a, b,c)", "map_to_local(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("PackedStringArray(req_godot).join('.')", "'.'.join(PackedStringArray(req_godot))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("=PackedStringArray(req_godot).join('.')", "='.'.join(PackedStringArray(req_godot))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_gdscript_builtin("apply_force(position, impulse)", "apply_force(impulse, position)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("apply_impulse(position, impulse)", "apply_impulse(impulse, position)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("draw_rect(a,b,c,d,e).abc", "draw_rect(a,b,c,d).abc# e) TODOGODOT4 Antialiasing argument is missing", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("get_focus_owner()", "get_viewport().gui_get_focus_owner()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("button.pressed = 1", "button.button_pressed = 1", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("button.pressed=1", "button.button_pressed=1", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_gdscript_builtin("button.pressed SF", "button.pressed SF", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - - valid = valid & test_conversion_with_regex("AAA Color.white AF", "AAA Color.WHITE AF", &ProjectConverter3To4::rename_colors, "custom rename", reg_container); + valid = valid && test_conversion_with_regex("extends CSGBox", "extends CSGBox3D", &ProjectConverter3To4::rename_classes, "classes", reg_container); + valid = valid && test_conversion_with_regex("CSGBox", "CSGBox3D", &ProjectConverter3To4::rename_classes, "classes", reg_container); + valid = valid && test_conversion_with_regex("Spatial", "Node3D", &ProjectConverter3To4::rename_classes, "classes", reg_container); + valid = valid && test_conversion_with_regex("Spatial.tscn", "Spatial.tscn", &ProjectConverter3To4::rename_classes, "classes", reg_container); + valid = valid && test_conversion_with_regex("Spatial.gd", "Spatial.gd", &ProjectConverter3To4::rename_classes, "classes", reg_container); + valid = valid && test_conversion_with_regex("Spatial.shader", "Spatial.shader", &ProjectConverter3To4::rename_classes, "classes", reg_container); + valid = valid && test_conversion_with_regex("Spatial.other", "Node3D.other", &ProjectConverter3To4::rename_classes, "classes", reg_container); + + valid = valid && test_conversion_with_regex("\nonready", "\n@onready", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("onready", "@onready", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex(" onready", " onready", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\nexport", "\n@export", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\texport", "\t@export", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\texport_dialog", "\texport_dialog", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("export", "@export", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex(" export", " export", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("tool", "@tool", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\n tool", "\n tool", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\n\ntool", "\n\n@tool", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\n\nremote func", "\n\n@rpc(any_peer) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\n\nremotesync func", "\n\n@rpc(any_peer, call_local) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\n\nsync func", "\n\n@rpc(any_peer, call_local) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\n\nslave func", "\n\n@rpc func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\n\npuppet func", "\n\n@rpc func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\n\npuppetsync func", "\n\n@rpc(call_local) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\n\nmaster func", "\n\nThe master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using get_multiplayer().get_remote_sender_id()\n@rpc func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + valid = valid && test_conversion_with_regex("\n\nmastersync func", "\n\nThe master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using get_multiplayer().get_remote_sender_id()\n@rpc(call_local) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword", reg_container); + + valid = valid && test_conversion_gdscript_builtin("var size : Vector2 = Vector2() setget set_function , get_function", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Copy here content of get_function\n set(mod_value):\n mod_value # TODOConverter40 Copy here content of set_function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("var size : Vector2 = Vector2() setget set_function , ", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Non existent get function \n set(mod_value):\n mod_value # TODOConverter40 Copy here content of set_function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("var size : Vector2 = Vector2() setget set_function", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Non existent get function \n set(mod_value):\n mod_value # TODOConverter40 Copy here content of set_function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("var size : Vector2 = Vector2() setget , get_function", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Copy here content of get_function \n set(mod_value):\n mod_value # TODOConverter40 Non existent set function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("get_node(@", "get_node(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("yield(this, \"timeout\")", "await this.timeout", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("yield(this, \\\"timeout\\\")", "await this.timeout", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, true); + + valid = valid && test_conversion_gdscript_builtin(" Transform.xform(Vector3(a,b,c)) ", " Transform * Vector3(a,b,c) ", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin(" Transform.xform_inv(Vector3(a,b,c)) ", " Vector3(a,b,c) * Transform ", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("export(float) var lifetime = 3.0", "export var lifetime: float = 3.0", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("export(String, 'AnonymousPro', 'CourierPrime') var _font_name = 'AnonymousPro'", "export var _font_name = 'AnonymousPro' # (String, 'AnonymousPro', 'CourierPrime')", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); // TODO, this is only a workaround + valid = valid && test_conversion_gdscript_builtin("export(PackedScene) var mob_scene", "export var mob_scene: PackedScene", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("var d = parse_json(roman(sfs))", "var test_json_conv = JSON.new()\ntest_json_conv.parse(roman(sfs))\nvar d = test_json_conv.get_data()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("to_json( AA ) szon", "JSON.new().stringify( AA ) szon", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("s to_json", "s JSON.new().stringify", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("AF to_json2", "AF to_json2", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("var rr = JSON.parse(a)", "var test_json_conv = JSON.new()\ntest_json_conv.parse(a)\nvar rr = test_json_conv.get_data()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("empty()", "is_empty()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin(".empty", ".empty", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin(").roman(", ").roman(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("\t.roman(", "\tsuper.roman(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin(" .roman(", " super.roman(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin(".1", ".1", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin(" .1", " .1", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("'.'", "'.'", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("'.a'", "'.a'", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("\t._input(_event)", "\tsuper._input(_event)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("(connect(A,B,C) != OK):", "(connect(A,Callable(B,C)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("(connect(A,B,C,D) != OK):", "(connect(A,Callable(B,C).bind(D)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("(connect(A,B,C,[D]) != OK):", "(connect(A,Callable(B,C).bind(D)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("(connect(A,B,C,[D,E]) != OK):", "(connect(A,Callable(B,C).bind(D,E)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("(connect(A,B,C,[D,E],F) != OK):", "(connect(A,Callable(B,C).bind(D,E),F) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("(connect(A,B,C,D,E) != OK):", "(connect(A,Callable(B,C).bind(D),E) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("(start(A,B) != OK):", "(start(Callable(A,B)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("func start(A,B):", "func start(A,B):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("(start(A,B,C,D,E,F,G) != OK):", "(start(Callable(A,B).bind(C),D,E,F,G) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("disconnect(A,B,C) != OK):", "disconnect(A,Callable(B,C)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("is_connected(A,B,C) != OK):", "is_connected(A,Callable(B,C)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("is_connected(A,B,C))", "is_connected(A,Callable(B,C)))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("(tween_method(A,B,C,D,E).foo())", "(tween_method(Callable(A,B),C,D,E).foo())", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("(tween_method(A,B,C,D,E,[F,G]).foo())", "(tween_method(Callable(A,B).bind(F,G),C,D,E).foo())", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("(tween_callback(A,B).foo())", "(tween_callback(Callable(A,B)).foo())", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("(tween_callback(A,B,[C,D]).foo())", "(tween_callback(Callable(A,B).bind(C,D)).foo())", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("func _init(", "func _init(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("func _init(p_x:int)->void:", "func _init(p_x:int):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("q_PackedDataContainer._iter_init(variable1)", "q_PackedDataContainer._iter_init(variable1)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("assert(speed < 20, str(randi()%10))", "assert(speed < 20) #,str(randi()%10))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("assert(speed < 2)", "assert(speed < 2)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("assert(false, \"Missing type --\" + str(argument.type) + \"--, needs to be added to project\")", "assert(false) #,\"Missing type --\" + str(argument.type) + \"--, needs to be added to project\")", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("create_from_image(aa, bb)", "create_from_image(aa) #,bb", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("q_ImageTexture.create_from_image(variable1, variable2)", "q_ImageTexture.create_from_image(variable1) #,variable2", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("set_cell_item(a, b, c, d ,e) # AA", "set_cell_item( Vector3(a,b,c) ,d,e) # AA", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("set_cell_item(a, b)", "set_cell_item(a, b)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("get_cell_item_orientation(a, b,c)", "get_cell_item_orientation(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("get_cell_item(a, b,c)", "get_cell_item(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("map_to_world(a, b,c)", "map_to_local(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("PackedStringArray(req_godot).join('.')", "'.'.join(PackedStringArray(req_godot))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("=PackedStringArray(req_godot).join('.')", "='.'.join(PackedStringArray(req_godot))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_gdscript_builtin("apply_force(position, impulse)", "apply_force(impulse, position)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("apply_impulse(position, impulse)", "apply_impulse(impulse, position)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("draw_rect(a,b,c,d,e).abc", "draw_rect(a,b,c,d).abc# e) TODOGODOT4 Antialiasing argument is missing", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("get_focus_owner()", "get_viewport().gui_get_focus_owner()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("button.pressed = 1", "button.button_pressed = 1", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("button.pressed=1", "button.button_pressed=1", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid && test_conversion_gdscript_builtin("button.pressed SF", "button.pressed SF", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid && test_conversion_with_regex("AAA Color.white AF", "AAA Color.WHITE AF", &ProjectConverter3To4::rename_colors, "custom rename", reg_container); // Custom rule conversion { @@ -2483,9 +2481,9 @@ bool ProjectConverter3To4::test_conversion(RegExContainer ®_container) { custom_rename(got, from, to); String got_str = collect_string_from_vector(got); if (got_str != expected) { - ERR_PRINT("Failed to convert custom rename `" + name + "` to `" + expected + "`, got instead `" + got_str + "`"); + ERR_PRINT(vformat("Failed to convert custom rename \"%s\" to \"%s\", got \"%s\", instead.", name, expected, got_str)); } - valid = valid & (got_str == expected); + valid = valid && (got_str == expected); } // get_object_of_execution @@ -2494,36 +2492,36 @@ bool ProjectConverter3To4::test_conversion(RegExContainer ®_container) { String expected = "kieliszek."; String got = get_object_of_execution(base); if (got != expected) { - ERR_PRINT("Failed to get proper data from get_object_of_execution `" + base + "` should return `" + expected + "`(" + itos(expected.size()) + "), got instead `" + got + "`(" + itos(got.size()) + ")"); + ERR_PRINT(vformat("Failed to get proper data from get_object_of_execution. \"%s\" should return \"%s\"(%d), got \"%s\"(%d), instead.", base, expected, expected.size(), got, got.size())); } - valid = valid & (got == expected); + valid = valid && (got == expected); } { String base = "r."; String expected = "r."; String got = get_object_of_execution(base); if (got != expected) { - ERR_PRINT("Failed to get proper data from get_object_of_execution `" + base + "` should return `" + expected + "`(" + itos(expected.size()) + "), got instead `" + got + "`(" + itos(got.size()) + ")"); + ERR_PRINT(vformat("Failed to get proper data from get_object_of_execution. \"%s\" should return \"%s\"(%d), got \"%s\"(%d), instead.", base, expected, expected.size(), got, got.size())); } - valid = valid & (got == expected); + valid = valid && (got == expected); } { String base = "mortadela("; String expected = ""; String got = get_object_of_execution(base); if (got != expected) { - ERR_PRINT("Failed to get proper data from get_object_of_execution `" + base + "` should return `" + expected + "`(" + itos(expected.size()) + "), got instead `" + got + "`(" + itos(got.size()) + ")"); + ERR_PRINT(vformat("Failed to get proper data from get_object_of_execution. \"%s\" should return \"%s\"(%d), got \"%s\"(%d), instead.", base, expected, expected.size(), got, got.size())); } - valid = valid & (got == expected); + valid = valid && (got == expected); } { String base = "var node = $world/ukraine/lviv."; String expected = "$world/ukraine/lviv."; String got = get_object_of_execution(base); if (got != expected) { - ERR_PRINT("Failed to get proper data from get_object_of_execution `" + base + "` should return `" + expected + "`(" + itos(expected.size()) + "), got instead `" + got + "`(" + itos(got.size()) + ")"); + ERR_PRINT(vformat("Failed to get proper data from get_object_of_execution. \"%s\" should return \"%s\"(%d), got \"%s\"(%d), instead.", base, expected, expected.size(), got, got.size())); } - valid = valid & (got == expected); + valid = valid && (got == expected); } } // get_starting_space @@ -2532,9 +2530,9 @@ bool ProjectConverter3To4::test_conversion(RegExContainer ®_container) { String expected = "\t\t\t"; String got = get_starting_space(base); if (got != expected) { - ERR_PRINT("Failed to get proper data from get_starting_space `" + base + "` should return `" + expected + "`(" + itos(expected.size()) + "), got instead `" + got + "`(" + itos(got.size()) + ")"); + ERR_PRINT(vformat("Failed to get proper data from get_object_of_execution. \"%s\" should return \"%s\"(%d), got \"%s\"(%d), instead.", base, expected, expected.size(), got, got.size())); } - valid = valid & (got == expected); + valid = valid && (got == expected); } // Parse Arguments { @@ -2546,9 +2544,9 @@ bool ProjectConverter3To4::test_conversion(RegExContainer ®_container) { got += part + "|||"; } if (got != expected) { - ERR_PRINT("Failed to get proper data from parse_arguments `" + line + "` should return `" + expected + "`(" + itos(expected.size()) + "), got instead `" + got + "`(" + itos(got.size()) + ")"); + ERR_PRINT(vformat("Failed to get proper data from parse_arguments. \"%s\" should return \"%s\"(%d), got \"%s\"(%d), instead.", line, expected, expected.size(), got, got.size())); } - valid = valid & (got == expected); + valid = valid && (got == expected); } { String line = "(a , b , c)"; @@ -2559,9 +2557,9 @@ bool ProjectConverter3To4::test_conversion(RegExContainer ®_container) { got += part + "|||"; } if (got != expected) { - ERR_PRINT("Failed to get proper data from parse_arguments `" + line + "` should return `" + expected + "`(" + itos(expected.size()) + "), got instead `" + got + "`(" + itos(got.size()) + ")"); + ERR_PRINT(vformat("Failed to get proper data from parse_arguments. \"%s\" should return \"%s\"(%d), got \"%s\"(%d), instead.", line, expected, expected.size(), got, got.size())); } - valid = valid & (got == expected); + valid = valid && (got == expected); } { String line = "(a , \"b,\" , c)"; @@ -2572,9 +2570,9 @@ bool ProjectConverter3To4::test_conversion(RegExContainer ®_container) { got += part + "|||"; } if (got != expected) { - ERR_PRINT("Failed to get proper data from parse_arguments `" + line + "` should return `" + expected + "`(" + itos(expected.size()) + "), got instead `" + got + "`(" + itos(got.size()) + ")"); + ERR_PRINT(vformat("Failed to get proper data from parse_arguments. \"%s\" should return \"%s\"(%d), got \"%s\"(%d), instead.", line, expected, expected.size(), got, got.size())); } - valid = valid & (got == expected); + valid = valid && (got == expected); } { String line = "(a , \"(,),,,,\" , c)"; @@ -2585,35 +2583,35 @@ bool ProjectConverter3To4::test_conversion(RegExContainer ®_container) { got += part + "|||"; } if (got != expected) { - ERR_PRINT("Failed to get proper data from parse_arguments `" + line + "` should return `" + expected + "`(" + itos(expected.size()) + "), got instead `" + got + "`(" + itos(got.size()) + ")"); + ERR_PRINT(vformat("Failed to get proper data from parse_arguments. \"%s\" should return \"%s\"(%d), got \"%s\"(%d), instead.", line, expected, expected.size(), got, got.size())); } - valid = valid & (got == expected); + valid = valid && (got == expected); } return valid; } -// Validate in all arrays if names don't do cyclic renames `Node` -> `Node2D` | `Node2D` -> `2DNode` +// Validate in all arrays if names don't do cyclic renames "Node" -> "Node2D" | "Node2D" -> "2DNode" bool ProjectConverter3To4::test_array_names() { bool valid = true; Vector<String> names = Vector<String>(); - // Validate if all classes are valid + // Validate if all classes are valid. { for (unsigned int current_index = 0; class_renames[current_index][0]; current_index++) { const String old_class = class_renames[current_index][0]; const String new_class = class_renames[current_index][1]; - // Light2D, Texture, Viewport are special classes(probably virtual ones) + // Light2D, Texture, Viewport are special classes(probably virtual ones). if (ClassDB::class_exists(StringName(old_class)) && old_class != "Light2D" && old_class != "Texture" && old_class != "Viewport") { - ERR_PRINT(String("Class `") + old_class + "` exists in Godot 4.0, so cannot be renamed to something else."); - valid = false; // This probably should be only a warning, but not 100% sure - this would need to be added to CI + ERR_PRINT(vformat("Class \"%s\" exists in Godot 4.0, so it cannot be renamed to something else.", old_class)); + valid = false; // This probably should be only a warning, but not 100% sure - this would need to be added to CI. } - // Callable is special class, to which normal classes may be renamed + // Callable is special class, to which normal classes may be renamed. if (!ClassDB::class_exists(StringName(new_class)) && new_class != "Callable") { - ERR_PRINT(String("Class `") + new_class + "` doesn't exists in Godot 4.0, so cannot be used in conversion."); - valid = false; // This probably should be only a warning, but not 100% sure - this would need to be added to CI + ERR_PRINT(vformat("Class \"%s\" does not exist in Godot 4.0, so it cannot be used in the conversion.", old_class)); + valid = false; // This probably should be only a warning, but not 100% sure - this would need to be added to CI. } } } @@ -2621,8 +2619,8 @@ bool ProjectConverter3To4::test_array_names() { { HashSet<String> all_functions; - // List of excluded functions from builtin types and global namespace, because currently it is not possible to get list of functions from them - // This will be available when https://github.com/godotengine/godot/pull/49053 or similar will be included into Godot + // List of excluded functions from builtin types and global namespace, because currently it is not possible to get list of functions from them. + // This will be available when https://github.com/godotengine/godot/pull/49053 or similar will be included into Godot. static const char *builtin_types_excluded_functions[] = { "dict_to_inst", "inst_to_dict", "bytes_to_var", "bytes_to_var_with_objects", "db_to_linear", "deg_to_rad", "linear_to_db", "rad_to_deg", "randf_range", "snapped", "str_to_var", "var_to_str", "var_to_bytes", "var_to_bytes_with_objects", "move_toward", "uri_encode", "uri_decode", "remove_at", "get_rotation_quaternion", "clamp", "grow_side", "is_absolute_path", "is_valid_int", "lerp", "to_ascii_buffer", "to_utf8_buffer", "to_utf32_buffer", "snapped", "remap", nullptr }; for (int current_index = 0; builtin_types_excluded_functions[current_index]; current_index++) { all_functions.insert(builtin_types_excluded_functions[current_index]); @@ -2652,82 +2650,79 @@ bool ProjectConverter3To4::test_array_names() { int current_element = 0; while (gdscript_function_renames[current_element][0] != nullptr) { + String name_3_x = gdscript_function_renames[current_element][0]; + String name_4_0 = gdscript_function_renames[current_element][1]; if (!all_functions.has(gdscript_function_renames[current_element][1])) { - ERR_PRINT(String("Missing gdscript function in pair (") + gdscript_function_renames[current_element][0] + " - ===> " + gdscript_function_renames[current_element][1] + " <===)"); + ERR_PRINT(vformat("Missing GDScript function in pair (%s - ===> %s <===)", name_3_x, name_4_0)); valid = false; } current_element++; } } if (!valid) { - ERR_PRINT("Found function which is used in converter, but cannot be found in Godot 4. Rename this element to new name or remove entire rule about it if is obsolete."); + ERR_PRINT("Found function which is used in the converter, but it cannot be found in Godot 4. Rename this element or remove its entry if it's obsolete."); } - valid = valid & test_single_array(enum_renames); - valid = valid & test_single_array(class_renames, true); - valid = valid & test_single_array(gdscript_function_renames, true); - valid = valid & test_single_array(csharp_function_renames, true); - valid = valid & test_single_array(gdscript_properties_renames, true); - valid = valid & test_single_array(csharp_properties_renames); - valid = valid & test_single_array(shaders_renames, true); - valid = valid & test_single_array(gdscript_signals_renames); - valid = valid & test_single_array(project_settings_renames); - valid = valid & test_single_array(builtin_types_renames); - valid = valid & test_single_array(color_renames); + valid = valid && test_single_array(enum_renames); + valid = valid && test_single_array(class_renames, true); + valid = valid && test_single_array(gdscript_function_renames, true); + valid = valid && test_single_array(csharp_function_renames, true); + valid = valid && test_single_array(gdscript_properties_renames, true); + valid = valid && test_single_array(csharp_properties_renames); + valid = valid && test_single_array(shaders_renames, true); + valid = valid && test_single_array(gdscript_signals_renames); + valid = valid && test_single_array(project_settings_renames); + valid = valid && test_single_array(builtin_types_renames); + valid = valid && test_single_array(color_renames); return valid; } -// Validate in one array if names don't do cyclic renames `Node` -> `Node2D` | `Node2D` -> `2DNode` -// Also checks if in name contains spaces at the end or beginning -bool ProjectConverter3To4::test_single_array(const char *array[][2], bool ignore_second_check) { +// Validates the array to prevent cyclic renames, such as `Node` -> `Node2D`, then `Node2D` -> `2DNode`. +// Also checks if names contain leading or trailing spaces. +bool ProjectConverter3To4::test_single_array(const char *p_array[][2], bool p_ignore_4_0_name) { bool valid = true; Vector<String> names = Vector<String>(); - for (unsigned int current_index = 0; array[current_index][0]; current_index++) { - if (String(array[current_index][0]).begins_with(" ") || String(array[current_index][0]).ends_with(" ")) { - { - ERR_PRINT(String("Entry \"") + array[current_index][0] + "\" ends or stars with space."); - valid = false; - } + for (unsigned int current_index = 0; p_array[current_index][0]; current_index++) { + String name_3_x = p_array[current_index][0]; + String name_4_0 = p_array[current_index][1]; + if (name_3_x != name_3_x.strip_edges()) { + ERR_PRINT(vformat("Invalid Entry \"%s\" contains leading or trailing spaces.", name_3_x)); + valid = false; } - if (names.has(array[current_index][0])) { - ERR_PRINT(String("Found duplicated things, pair ( -> ") + array[current_index][0] + " , " + array[current_index][1] + ")"); + if (names.has(name_3_x)) { + ERR_PRINT(vformat("Found duplicated entry, pair ( -> %s , %s)", name_3_x, name_4_0)); valid = false; } - names.append(array[current_index][0]); + names.append(name_3_x); - if (String(array[current_index][1]).begins_with(" ") || String(array[current_index][1]).ends_with(" ")) { - { - ERR_PRINT(String("Entry \"") + array[current_index][1] + "\" ends or stars with space."); - valid = false; - } + if (name_4_0 != name_4_0.strip_edges()) { + ERR_PRINT(vformat("Invalid Entry \"%s\" contains leading or trailing spaces.", name_3_x)); + valid = false; } - if (names.has(array[current_index][1])) { - ERR_PRINT(String("Found duplicated things, pair (") + array[current_index][0] + " , ->" + array[current_index][1] + ")"); + if (names.has(name_4_0)) { + ERR_PRINT(vformat("Found duplicated entry, pair ( -> %s , %s)", name_3_x, name_4_0)); valid = false; } - if (!ignore_second_check) { - names.append(array[current_index][1]); + if (!p_ignore_4_0_name) { + names.append(name_4_0); } } return valid; }; -// Returns arguments from given function execution, this cannot be really done as regex +// Returns arguments from given function execution, this cannot be really done as regex. // `abc(d,e(f,g),h)` -> [d], [e(f,g)], [h] Vector<String> ProjectConverter3To4::parse_arguments(const String &line) { Vector<String> parts; int string_size = line.length(); - int start_part = 0; // Index of beginning of start par + int start_part = 0; // Index of beginning of start part. int parts_counter = 0; char32_t previous_character = '\0'; - bool is_inside_string = false; // if true, it ignore this 3 characters ( , ) inside string + bool is_inside_string = false; // If true, it ignores these 3 characters ( , ) inside string. - if (line.count("(") != line.count(")")) { - ERR_PRINT("Converter internal bug: substring should have equal number of open and close parenthess in line - `" + line + "`"); - return parts; - } + ERR_FAIL_COND_V_MSG(line.count("(") != line.count(")"), parts, vformat("Converter internal bug: substring should have equal number of open and close parentheses in line - \"%s\".", line)); for (int current_index = 0; current_index < string_size; current_index++) { char32_t character = line.get(current_index); @@ -2788,9 +2783,9 @@ Vector<String> ProjectConverter3To4::parse_arguments(const String &line) { return clean_parts; } -// Finds latest parenthess owned by function +// Finds latest parenthesis owned by function. // `function(abc(a,b),DD)):` finds this parenthess `function(abc(a,b),DD => ) <= ):` -int ProjectConverter3To4::get_end_parenthess(const String &line) const { +int ProjectConverter3To4::get_end_parenthesis(const String &line) const { int current_state = 0; for (int current_index = 0; line.length() > current_index; current_index++) { char32_t character = line.get(current_index); @@ -2807,8 +2802,8 @@ int ProjectConverter3To4::get_end_parenthess(const String &line) const { return -1; } -// Connects arguments from vector to one string -// Needed when after processing e.g. 2 arguments, later arguments are not changed in any way +// Merges multiple arguments into a single String. +// Needed when after processing e.g. 2 arguments, later arguments are not changed in any way. String ProjectConverter3To4::connect_arguments(const Vector<String> &arguments, int from, int to) const { if (to == -1) { to = arguments.size(); @@ -2828,7 +2823,7 @@ String ProjectConverter3To4::connect_arguments(const Vector<String> &arguments, return value; } -// Return spaces or tabs which starts line e.g. `\t\tmove_this` will return `\t\t` +// Returns the indentation (spaces and tabs) at the start of the line e.g. `\t\tmove_this` returns `\t\t`. String ProjectConverter3To4::get_starting_space(const String &line) const { String empty_space; int current_character = 0; @@ -2860,9 +2855,8 @@ String ProjectConverter3To4::get_starting_space(const String &line) const { return empty_space; } -// Return object which execute specific function -// e.g. in `var roman = kieliszek.funkcja()` to this function is passed everything before function which we want to check -// so it is `var roman = kieliszek.` and this function return `kieliszek.` +// Returns the object that’s executing the function in the line. +// e.g. Passing the line "var roman = kieliszek.funkcja()" to this function returns "kieliszek". String ProjectConverter3To4::get_object_of_execution(const String &line) const { int end = line.size() - 1; // Last one is \0 int variable_start = end - 1; @@ -2880,10 +2874,10 @@ String ProjectConverter3To4::get_object_of_execution(const String &line) const { if (start == 0) { break; } else if (is_nodepath_sep) { - // Freeze variable_start, try to fetch more chars since this might be node path literal + // Freeze variable_start, try to fetch more chars since this might be a Node path literal. is_possibly_nodepath = true; } else if (is_nodepath_start) { - // Found $, this is a node path literal + // Found $, this is a Node path literal. is_valid_nodepath = true; break; } @@ -2893,8 +2887,8 @@ String ProjectConverter3To4::get_object_of_execution(const String &line) const { start--; continue; } else { - // Abandon all hope, this is neither a variable nor a node path literal - variable_start++; // Found invalid character, needs to be ignored + // Abandon all hope, this is neither a variable nor a Node path literal. + variable_start++; // Found invalid character, needs to be ignored. break; } } @@ -2943,7 +2937,7 @@ void ProjectConverter3To4::rename_classes(Vector<String> &lines, const RegExCont for (unsigned int current_index = 0; class_renames[current_index][0]; current_index++) { if (line.contains(class_renames[current_index][0])) { bool found_ignored_items = false; - // Renaming Spatial.tscn to TEMP_RENAMED_CLASS.tscn + // Renaming Spatial.tscn to TEMP_RENAMED_CLASS.tscn. if (line.contains(String(class_renames[current_index][0]) + ".")) { found_ignored_items = true; line = reg_container.class_tscn_regexes[current_index]->sub(line, "TEMP_RENAMED_CLASS.tscn", true); @@ -2951,10 +2945,10 @@ void ProjectConverter3To4::rename_classes(Vector<String> &lines, const RegExCont line = reg_container.class_shader_regexes[current_index]->sub(line, "TEMP_RENAMED_CLASS.shader", true); } - // Causal renaming Spatial -> Node3D + // Causal renaming Spatial -> Node3D. line = reg_container.class_regexes[current_index]->sub(line, class_renames[current_index][1], true); - // Restore Spatial.tscn from TEMP_RENAMED_CLASS.tscn + // Restore Spatial.tscn from TEMP_RENAMED_CLASS.tscn. if (found_ignored_items) { line = reg_container.class_temp_tscn.sub(line, reg_container.class_temp_tscn_renames[current_index], true); line = reg_container.class_temp_gd.sub(line, reg_container.class_temp_gd_renames[current_index], true); @@ -2977,7 +2971,7 @@ Vector<String> ProjectConverter3To4::check_for_rename_classes(Vector<String> &li if (line.contains(class_renames[current_index][0])) { String old_line = line; bool found_ignored_items = false; - // Renaming Spatial.tscn to TEMP_RENAMED_CLASS.tscn + // Renaming Spatial.tscn to TEMP_RENAMED_CLASS.tscn. if (line.contains(String(class_renames[current_index][0]) + ".")) { found_ignored_items = true; line = reg_container.class_tscn_regexes[current_index]->sub(line, "TEMP_RENAMED_CLASS.tscn", true); @@ -2985,13 +2979,13 @@ Vector<String> ProjectConverter3To4::check_for_rename_classes(Vector<String> &li line = reg_container.class_shader_regexes[current_index]->sub(line, "TEMP_RENAMED_CLASS.shader", true); } - // Causal renaming Spatial -> Node3D + // Causal renaming Spatial -> Node3D. TypedArray<RegExMatch> reg_match = reg_container.class_regexes[current_index]->search_all(line); if (reg_match.size() > 0) { found_renames.append(line_formatter(current_line, class_renames[current_index][0], class_renames[current_index][1], old_line)); } - // Restore Spatial.tscn from TEMP_RENAMED_CLASS.tscn + // Restore Spatial.tscn from TEMP_RENAMED_CLASS.tscn. if (found_ignored_items) { line = reg_container.class_temp_tscn.sub(line, reg_container.class_temp_tscn_renames[current_index], true); line = reg_container.class_temp_gd.sub(line, reg_container.class_temp_gd_renames[current_index], true); @@ -3031,13 +3025,14 @@ Vector<String> ProjectConverter3To4::check_for_rename_gdscript_functions(Vector< return found_renames; } -// TODO, this function should run only on all .gd files and also on lines in tscn files which +// TODO, this function should run only on all ".gd" files and also on lines in ".tscn" files which are parts of built-in Scripts. void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContainer ®_container, bool builtin) { - // In this and other functions, reg.sub are used only after checking line with str.contains function which is sometimes few times faster with bigger line lengths + // In this and other functions, reg.sub() is used only after checking lines with str.contains(). + // With longer lines, doing so can sometimes be significantly faster. if ((line.contains(".lock") || line.contains(".unlock")) && !line.contains("mtx") && !line.contains("mutex") && !line.contains("Mutex")) { - line = reg_container.reg_image_lock.sub(line, "false # $1.lock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", true); - line = reg_container.reg_image_unlock.sub(line, "false # $1.unlock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", true); + line = reg_container.reg_image_lock.sub(line, "false # $1.lock() # TODOConverter40, Image no longer requires locking, `false` helps to not break one line if/else, so it can freely be removed", true); + line = reg_container.reg_image_unlock.sub(line, "false # $1.unlock() # TODOConverter40, Image no longer requires locking, `false` helps to not break one line if/else, so it can freely be removed", true); } // PackedStringArray(req_godot).join('.') -> '.'.join(PackedStringArray(req_godot)) PoolStringArray @@ -3116,7 +3111,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- r.move_and_slide( a, b, c, d, e ) -> r.set_velocity(a) ... r.move_and_slide() KinematicBody if (line.contains(("move_and_slide("))) { int start = line.find("move_and_slide("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { String base_obj = get_object_of_execution(line.substr(0, start)); String starting_space = get_starting_space(line); @@ -3162,7 +3157,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- r.move_and_slide_with_snap( a, b, c, d, e ) -> r.set_velocity(a) ... r.move_and_slide() KinematicBody if (line.contains("move_and_slide_with_snap(")) { int start = line.find("move_and_slide_with_snap("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { String base_obj = get_object_of_execution(line.substr(0, start)); String starting_space = get_starting_space(line); @@ -3213,7 +3208,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- sort_custom( a , b ) -> sort_custom(Callable( a , b )) Object if (line.contains("sort_custom(")) { int start = line.find("sort_custom("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 2) { @@ -3225,7 +3220,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- list_dir_begin( ) -> list_dir_begin() Object if (line.contains("list_dir_begin(")) { int start = line.find("list_dir_begin("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { line = line.substr(0, start) + "list_dir_begin() " + line.substr(end + start) + "# TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547"; } @@ -3234,7 +3229,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- draw_line(1,2,3,4,5) -> draw_line(1,2,3,4) CanvasItem if (line.contains("draw_line(")) { int start = line.find("draw_line("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 5) { @@ -3247,7 +3242,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai if (line.contains("func ") && line.contains("var ")) { int start = line.find("func "); start = line.substr(start).find("(") + start; - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); @@ -3265,7 +3260,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- yield(this, \"timeout\") -> await this.timeout GDScript if (line.contains("yield(")) { int start = line.find("yield("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 2) { @@ -3281,7 +3276,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- parse_json( AA ) -> TODO Object if (line.contains("parse_json(")) { int start = line.find("parse_json("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); line = line.substr(0, start) + "JSON.new().stringify(" + connect_arguments(parts, 0) + ")" + line.substr(end + start); @@ -3291,7 +3286,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- .xform(Vector3(a,b,c)) -> * Vector3(a,b,c) Transform if (line.contains(".xform(")) { int start = line.find(".xform("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 1) { @@ -3303,7 +3298,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- .xform_inv(Vector3(a,b,c)) -> * Vector3(a,b,c) Transform if (line.contains(".xform_inv(")) { int start = line.find(".xform_inv("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { String object_exec = get_object_of_execution(line.substr(0, start)); if (line.contains(object_exec + ".xform")) { @@ -3321,7 +3316,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai int start = line.find("connect("); // Protection from disconnect if (start == 0 || line.get(start - 1) != 's') { - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 3) { @@ -3335,7 +3330,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- disconnect(a,b,c) -> disconnect(a,Callable(b,c)) Object if (line.contains("disconnect(")) { int start = line.find("disconnect("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 3) { @@ -3346,7 +3341,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- is_connected(a,b,c) -> is_connected(a,Callable(b,c)) Object if (line.contains("is_connected(")) { int start = line.find("is_connected("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 3) { @@ -3358,7 +3353,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- "(tween_method(A,B,C,D,E,[F,G]) != OK):", "(tween_method(Callable(A,B).bind(F,G),C,D,E) Object if (line.contains("tween_method(")) { int start = line.find("tween_method("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 5) { @@ -3371,7 +3366,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- "(tween_callback(A,B,[C,D]) != OK):", "(connect(Callable(A,B).bind(C,D)) Object if (line.contains("tween_callback(")) { int start = line.find("tween_callback("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 2) { @@ -3385,7 +3380,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // -- start(a,b,c,d) -> start(Callable(a,b).bind(c),d) Thread if (line.contains("start(")) { int start = line.find("start("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; // Protection from 'func start' if (!line.begins_with("func ")) { if (end > -1) { @@ -3412,7 +3407,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // assert(speed < 20, str(randi()%10)) -> assert(speed < 20) #,str(randi()%10)) GDScript - GDScript bug constant message if (line.contains("assert(")) { int start = line.find("assert("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 2) { @@ -3423,7 +3418,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // create_from_image(aa, bb) -> create_from_image(aa) #, bb ImageTexture if (line.contains("create_from_image(")) { int start = line.find("create_from_image("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 2) { @@ -3434,7 +3429,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // set_cell_item(a, b, c, d ,e) -> set_cell_item(Vector3(a, b, c), d ,e) if (line.contains("set_cell_item(")) { int start = line.find("set_cell_item("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() > 2) { @@ -3445,7 +3440,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // get_cell_item(a, b, c) -> get_cell_item(Vector3i(a, b, c)) if (line.contains("get_cell_item(")) { int start = line.find("get_cell_item("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 3) { @@ -3456,7 +3451,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // get_cell_item_orientation(a, b, c) -> get_cell_item_orientation(Vector3i(a, b, c)) if (line.contains("get_cell_item_orientation(")) { int start = line.find("get_cell_item_orientation("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 3) { @@ -3467,7 +3462,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // apply_impulse(A, B) -> apply_impulse(B, A) if (line.contains("apply_impulse(")) { int start = line.find("apply_impulse("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 2) { @@ -3478,7 +3473,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // apply_force(A, B) -> apply_force(B, A) if (line.contains("apply_force(")) { int start = line.find("apply_force("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 2) { @@ -3489,7 +3484,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // map_to_world(a, b, c) -> map_to_local(Vector3i(a, b, c)) if (line.contains("map_to_world(")) { int start = line.find("map_to_world("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 3) { @@ -3499,10 +3494,24 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai } } } + + // set_rotating(true) -> set_ignore_rotation(false) + if (line.contains("set_rotating(")) { + int start = line.find("set_rotating("); + int end = get_end_parenthesis(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 1) { + String opposite = parts[0] == "true" ? "false" : "true"; + line = line.substr(0, start) + "set_ignore_rotation(" + opposite + ")"; + } + } + } + // OS.get_window_safe_area() -> DisplayServer.get_display_safe_area() if (line.contains("OS.get_window_safe_area(")) { int start = line.find("OS.get_window_safe_area("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 0) { @@ -3513,7 +3522,7 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai // draw_rect(a,b,c,d,e) -> draw_rect(a,b,c,d)#e) TODOGODOT4 Antialiasing argument is missing if (line.contains("draw_rect(")) { int start = line.find("draw_rect("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 5) { @@ -3546,6 +3555,29 @@ void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContai } } + // rotating = true -> ignore_rotation = false # reversed "rotating" for Camera2D + if (line.contains("rotating")) { + int start = line.find("rotating"); + bool foundNextEqual = false; + String line_to_check = line.substr(start + String("rotating").length()); + String assigned_value; + for (int current_index = 0; line_to_check.length() > current_index; current_index++) { + char32_t chr = line_to_check.get(current_index); + if (chr == '\t' || chr == ' ') { + continue; + } else if (chr == '=') { + foundNextEqual = true; + assigned_value = line.right(current_index).strip_edges(); + assigned_value = assigned_value == "true" ? "false" : "true"; + } else { + break; + } + } + if (foundNextEqual) { + line = line.substr(0, start) + "ignore_rotation =" + assigned_value + " # reversed \"rotating\" for Camera2D"; + } + } + // OS -> Time functions if (line.contains("OS.get_ticks_msec")) { line = line.replace("OS.get_ticks_msec", "Time.get_ticks_msec"); @@ -3566,7 +3598,7 @@ void ProjectConverter3To4::process_csharp_line(String &line, const RegExContaine int start = line.find("Connect("); // Protection from disconnect if (start == 0 || line.get(start - 1) != 's') { - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() >= 3) { @@ -3578,7 +3610,7 @@ void ProjectConverter3To4::process_csharp_line(String &line, const RegExContaine // -- Disconnect(a,b,c) -> Disconnect(a,Callable(b,c)) Object if (line.contains("Disconnect(")) { int start = line.find("Disconnect("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 3) { @@ -3589,7 +3621,7 @@ void ProjectConverter3To4::process_csharp_line(String &line, const RegExContaine // -- IsConnected(a,b,c) -> IsConnected(a,Callable(b,c)) Object if (line.contains("IsConnected(")) { int start = line.find("IsConnected("); - int end = get_end_parenthess(line.substr(start)) + 1; + int end = get_end_parenthesis(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 3) { @@ -3866,7 +3898,7 @@ Vector<String> ProjectConverter3To4::check_for_custom_rename(Vector<String> &lin if (uint64_t(line.length()) <= maximum_line_length) { TypedArray<RegExMatch> reg_match = reg.search_all(line); if (reg_match.size() > 0) { - found_renames.append(line_formatter(current_line, from.replace("\\.", "."), to, line)); // Without replacing it will print "\.shader" instead ".shader" + found_renames.append(line_formatter(current_line, from.replace("\\.", "."), to, line)); // Without replacing it will print "\.shader" instead ".shader". } } current_line++; @@ -3920,19 +3952,28 @@ String ProjectConverter3To4::line_formatter(int current_line, String from, Strin if (line.size() > 400) { line = line.substr(0, 397) + "..."; } - return String("Line (") + itos(current_line) + ") " + from.replace("\r", "").replace("\n", "") + " -> " + to.replace("\r", "").replace("\n", "") + " - LINE \"\"\" " + line.replace("\r", "").replace("\n", "").strip_edges() + " \"\"\""; + + from = from.strip_escapes(); + to = to.strip_escapes(); + line = line.replace("\r", "").replace("\n", "").strip_edges(); + + return vformat("Line(%d), %s -> %s - LINE \"\"\" %s \"\"\"", current_line, from, to, line); } // Prints only full lines e.g.: // Line (1) - FULL LINES - """yield(get_tree().create_timer(3), 'timeout')""" =====> """ await get_tree().create_timer(3).timeout """ -String ProjectConverter3To4::simple_line_formatter(int current_line, String old_line, String line) { +String ProjectConverter3To4::simple_line_formatter(int current_line, String old_line, String new_line) { if (old_line.size() > 1000) { old_line = old_line.substr(0, 997) + "..."; } - if (line.size() > 1000) { - line = line.substr(0, 997) + "..."; + if (new_line.size() > 1000) { + new_line = new_line.substr(0, 997) + "..."; } - return String("Line (") + itos(current_line) + ") - FULL LINES - \"\"\"" + old_line.replace("\r", "").replace("\n", "").strip_edges() + "\"\"\" =====> \"\"\" " + line.replace("\r", "").replace("\n", "").strip_edges() + " \"\"\""; + + old_line = old_line.replace("\r", "").replace("\n", "").strip_edges(); + new_line = new_line.replace("\r", "").replace("\n", "").strip_edges(); + + return vformat("Line (%d) - FULL LINES - \"\"\" %s \"\"\" =====> \"\"\" %s \"\"\"", current_line, old_line, new_line); } // Collects string from vector strings @@ -3948,14 +3989,16 @@ String ProjectConverter3To4::collect_string_from_vector(Vector<String> &vector) return string; } -#else // No regex. +#else // No RegEx. + +ProjectConverter3To4::ProjectConverter3To4(int _p_maximum_file_size_kb, int _p_maximum_line_length) {} int ProjectConverter3To4::convert() { - ERR_FAIL_V_MSG(ERROR_CODE, "Can't run converter for Godot 3.x projects as RegEx module is disabled."); + ERR_FAIL_V_MSG(ERROR_CODE, "Can't run converter for Godot 3.x projects, because RegEx module is disabled."); } int ProjectConverter3To4::validate_conversion() { - ERR_FAIL_V_MSG(ERROR_CODE, "Can't validate conversion for Godot 3.x projects as RegEx module is disabled."); + ERR_FAIL_V_MSG(ERROR_CODE, "Can't validate conversion for Godot 3.x projects, because RegEx module is disabled."); } #endif // MODULE_REGEX_ENABLED diff --git a/editor/project_converter_3_to_4.h b/editor/project_converter_3_to_4.h index fc6d66c9a8..d03e645ac7 100644 --- a/editor/project_converter_3_to_4.h +++ b/editor/project_converter_3_to_4.h @@ -31,7 +31,6 @@ #ifndef PROJECT_CONVERTER_3_TO_4_H #define PROJECT_CONVERTER_3_TO_4_H -#include "core/core_bind.h" #include "core/io/file_access.h" #include "core/object/ref_counted.h" #include "core/string/ustring.h" @@ -76,7 +75,7 @@ private: Vector<String> check_for_files(); Vector<String> parse_arguments(const String &line); - int get_end_parenthess(const String &line) const; + int get_end_parenthesis(const String &line) const; String connect_arguments(const Vector<String> &line, int from, int to = -1) const; String get_starting_space(const String &line) const; String get_object_of_execution(const String &line) const; diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 2b0d6f740a..673da8872d 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -59,6 +59,8 @@ #include "servers/navigation_server_3d.h" #include "servers/physics_server_2d.h" +constexpr int GODOT4_CONFIG_VERSION = 5; + class ProjectDialog : public ConfirmationDialog { GDCLASS(ProjectDialog, ConfirmationDialog); @@ -90,9 +92,9 @@ private: Container *name_container; Container *path_container; Container *install_path_container; - Container *rasterizer_container; + Container *renderer_container; HBoxContainer *default_files_container; - Ref<ButtonGroup> rasterizer_button_group; + Ref<ButtonGroup> renderer_button_group; Label *msg; LineEdit *project_path; LineEdit *project_name; @@ -141,7 +143,7 @@ private: install_status_rect->set_texture(new_icon); } - set_size(Size2i(500, 0) * EDSCALE); + set_size(Size2(500, 0) * EDSCALE); } String _test_path() { @@ -471,16 +473,19 @@ private: } PackedStringArray project_features = ProjectSettings::get_required_features(); ProjectSettings::CustomMap initial_settings; + // Be sure to change this code if/when renderers are changed. - int renderer_type = rasterizer_button_group->get_pressed_button()->get_meta(SNAME("driver_name")); - initial_settings["rendering/vulkan/rendering/back_end"] = renderer_type; - if (renderer_type == 0) { - project_features.push_back("Vulkan Clustered"); - } else if (renderer_type == 1) { - project_features.push_back("Vulkan Mobile"); + String renderer_type = renderer_button_group->get_pressed_button()->get_meta(SNAME("rendering_method")); + initial_settings["rendering/renderer/rendering_method"] = renderer_type; + + if (renderer_type == "forward_plus") { + project_features.push_back("Forward Plus"); + } else if (renderer_type == "mobile") { + project_features.push_back("Mobile"); } else { WARN_PRINT("Unknown renderer type. Please report this as a bug on GitHub."); } + project_features.sort(); initial_settings["application/config/features"] = project_features; initial_settings["application/config/name"] = project_name->get_text().strip_edges(); @@ -682,7 +687,7 @@ public: msg->hide(); install_path_container->hide(); install_status_rect->hide(); - rasterizer_container->hide(); + renderer_container->hide(); default_files_container->hide(); get_ok_button()->set_disabled(false); @@ -733,7 +738,7 @@ public: set_ok_button_text(TTR("Import & Edit")); name_container->hide(); install_path_container->hide(); - rasterizer_container->hide(); + renderer_container->hide(); default_files_container->hide(); project_path->grab_focus(); @@ -742,7 +747,7 @@ public: set_ok_button_text(TTR("Create & Edit")); name_container->show(); install_path_container->hide(); - rasterizer_container->show(); + renderer_container->show(); default_files_container->show(); project_name->call_deferred(SNAME("grab_focus")); project_name->call_deferred(SNAME("select_all")); @@ -753,7 +758,7 @@ public: project_name->set_text(zip_title); name_container->show(); install_path_container->hide(); - rasterizer_container->hide(); + renderer_container->hide(); default_files_container->hide(); project_path->grab_focus(); } @@ -761,7 +766,7 @@ public: _test_path(); } - popup_centered(Size2i(500, 0) * EDSCALE); + popup_centered(Size2(500, 0) * EDSCALE); } ProjectDialog() { @@ -841,23 +846,23 @@ public: msg->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); vb->add_child(msg); - // rasterizer selection - rasterizer_container = memnew(VBoxContainer); - vb->add_child(rasterizer_container); + // Renderer selection. + renderer_container = memnew(VBoxContainer); + vb->add_child(renderer_container); l = memnew(Label); l->set_text(TTR("Renderer:")); - rasterizer_container->add_child(l); - Container *rshb = memnew(HBoxContainer); - rasterizer_container->add_child(rshb); - rasterizer_button_group.instantiate(); + renderer_container->add_child(l); + HBoxContainer *rshc = memnew(HBoxContainer); + renderer_container->add_child(rshc); + renderer_button_group.instantiate(); Container *rvb = memnew(VBoxContainer); rvb->set_h_size_flags(Control::SIZE_EXPAND_FILL); - rshb->add_child(rvb); + rshc->add_child(rvb); Button *rs_button = memnew(CheckBox); - rs_button->set_button_group(rasterizer_button_group); - rs_button->set_text(TTR("Vulkan Clustered")); - rs_button->set_meta(SNAME("driver_name"), 0); // Vulkan backend "Forward Clustered" + rs_button->set_button_group(renderer_button_group); + rs_button->set_text(TTR("Forward+")); + rs_button->set_meta(SNAME("rendering_method"), "forward_plus"); rs_button->set_pressed(true); rvb->add_child(rs_button); l = memnew(Label); @@ -869,15 +874,15 @@ public: l->set_modulate(Color(1, 1, 1, 0.7)); rvb->add_child(l); - rshb->add_child(memnew(VSeparator)); + rshc->add_child(memnew(VSeparator)); rvb = memnew(VBoxContainer); rvb->set_h_size_flags(Control::SIZE_EXPAND_FILL); - rshb->add_child(rvb); + rshc->add_child(rvb); rs_button = memnew(CheckBox); - rs_button->set_button_group(rasterizer_button_group); - rs_button->set_text(TTR("Vulkan Mobile")); - rs_button->set_meta(SNAME("driver_name"), 1); // Vulkan backend "Forward Mobile" + rs_button->set_button_group(renderer_button_group); + rs_button->set_text(TTR("Mobile")); + rs_button->set_meta(SNAME("rendering_method"), "mobile"); rvb->add_child(rs_button); l = memnew(Label); l->set_text( @@ -895,7 +900,7 @@ public: l->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); l->set_vertical_alignment(VERTICAL_ALIGNMENT_CENTER); l->set_modulate(Color(1, 1, 1, 0.7)); - rasterizer_container->add_child(l); + renderer_container->add_child(l); default_files_container = memnew(HBoxContainer); vb->add_child(default_files_container); @@ -1065,6 +1070,7 @@ public: int refresh_project(const String &dir_path); void add_project(const String &dir_path, bool favorite); void save_config(); + void set_project_version(const String &p_project_path, int version); private: static void _bind_methods(); @@ -1673,6 +1679,15 @@ void ProjectList::save_config() { _config.save(_config_path); } +void ProjectList::set_project_version(const String &p_project_path, int p_version) { + for (ProjectList::Item &E : _projects) { + if (E.path == p_project_path) { + E.version = p_version; + break; + } + } +} + int ProjectList::get_project_count() const { return _projects.size(); } @@ -1993,7 +2008,7 @@ void ProjectManager::shortcut_input(const Ref<InputEvent> &p_ev) { // This is handled by the platform implementation on macOS, // so only define the shortcut on other platforms #ifndef MACOS_ENABLED - if (k->get_keycode_with_modifiers() == (KeyModifierMask::CMD | Key::Q)) { + if (k->get_keycode_with_modifiers() == (KeyModifierMask::META | Key::Q)) { _dim_window(); get_tree()->quit(); } @@ -2051,7 +2066,7 @@ void ProjectManager::shortcut_input(const Ref<InputEvent> &p_ev) { } break; case Key::F: { - if (k->is_command_pressed()) { + if (k->is_command_or_control_pressed()) { this->search_box->grab_focus(); } else { keycode_handled = false; @@ -2152,9 +2167,11 @@ void ProjectManager::_open_selected_projects_ask() { return; } + const Size2i popup_min_width = Size2i(600.0 * EDSCALE, 0); + if (selected_list.size() > 1) { - multi_open_ask->set_text(TTR("Are you sure to open more than one project?")); - multi_open_ask->popup_centered(); + multi_open_ask->set_text(vformat(TTR("You requested to open %d projects in parallel. Do you confirm?\nNote that usual checks for engine version compatibility will be bypassed."), selected_list.size())); + multi_open_ask->popup_centered(popup_min_width); return; } @@ -2163,30 +2180,40 @@ void ProjectManager::_open_selected_projects_ask() { return; } - // Update the project settings or don't open - const String conf = project.path.path_join("project.godot"); + // Update the project settings or don't open. const int config_version = project.version; PackedStringArray unsupported_features = project.unsupported_features; Label *ask_update_label = ask_update_settings->get_label(); ask_update_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_LEFT); // Reset in case of previous center align. + full_convert_button->hide(); - // Check if the config_version property was empty or 0 + ask_update_settings->get_ok_button()->set_text("OK"); + + // Check if the config_version property was empty or 0. if (config_version == 0) { - ask_update_settings->set_text(vformat(TTR("The following project settings file does not specify the version of Godot through which it was created.\n\n%s\n\nIf you proceed with opening it, it will be converted to Godot's current configuration file format.\nWarning: You won't be able to open the project with previous versions of the engine anymore."), conf)); - ask_update_settings->popup_centered(); + ask_update_settings->set_text(vformat(TTR("The selected project \"%s\" does not specify its supported Godot version in its configuration file (\"project.godot\").\n\nProject path: %s\n\nIf you proceed with opening it, it will be converted to Godot's current configuration file format.\n\nWarning: You won't be able to open the project with previous versions of the engine anymore."), project.project_name, project.path)); + ask_update_settings->popup_centered(popup_min_width); return; } - // Check if we need to convert project settings from an earlier engine version + // Check if we need to convert project settings from an earlier engine version. if (config_version < ProjectSettings::CONFIG_VERSION) { - ask_update_settings->set_text(vformat(TTR("The following project settings file was generated by an older engine version, and needs to be converted for this version:\n\n%s\n\nDo you want to convert it?\nWarning: You won't be able to open the project with previous versions of the engine anymore."), conf)); - ask_update_settings->popup_centered(); + if (config_version == GODOT4_CONFIG_VERSION - 1 && ProjectSettings::CONFIG_VERSION == GODOT4_CONFIG_VERSION) { // Conversion from Godot 3 to 4. + full_convert_button->show(); + ask_update_settings->set_text(vformat(TTR("The selected project \"%s\" was generated by Godot 3.x, and needs to be converted for Godot 4.x.\n\nProject path: %s\n\nYou have three options:\n- Convert only the configuration file (\"project.godot\"). Use this to open the project without attempting to convert its scenes, resources and scripts.\n- Convert the entire project including its scenes, resources and scripts (recommended if you are upgrading).\n- Do nothing and go back.\n\nWarning: If you select a conversion option, you won't be able to open the project with previous versions of the engine anymore."), project.project_name, project.path)); + ask_update_settings->get_ok_button()->set_text(TTR("Convert project.godot Only")); + } else { + ask_update_settings->set_text(vformat(TTR("The selected project \"%s\" was generated by an older engine version, and needs to be converted for this version.\n\nProject path: %s\n\nDo you want to convert it?\n\nWarning: You won't be able to open the project with previous versions of the engine anymore."), project.project_name, project.path)); + ask_update_settings->get_ok_button()->set_text(TTR("Convert project.godot")); + } + ask_update_settings->popup_centered(popup_min_width); + ask_update_settings->get_cancel_button()->grab_focus(); // To prevent accidents. return; } - // Check if the file was generated by a newer, incompatible engine version + // Check if the file was generated by a newer, incompatible engine version. if (config_version > ProjectSettings::CONFIG_VERSION) { - dialog_error->set_text(vformat(TTR("Can't open project at '%s'.") + "\n" + TTR("The project settings were created by a newer engine version, whose settings are not compatible with this version."), project.path)); - dialog_error->popup_centered(); + dialog_error->set_text(vformat(TTR("Can't open project \"%s\" at the following path:\n\n%s\n\nThe project settings were created by a newer engine version, whose settings are not compatible with this version."), project.project_name, project.path)); + dialog_error->popup_centered(popup_min_width); return; } // Check if the project is using features not supported by this build of Godot. @@ -2215,14 +2242,46 @@ void ProjectManager::_open_selected_projects_ask() { warning_message += TTR("Open anyway? Project will be modified."); ask_update_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); ask_update_settings->set_text(warning_message); - ask_update_settings->popup_centered(); + ask_update_settings->popup_centered(popup_min_width); return; } - // Open if the project is up-to-date + // Open if the project is up-to-date. _open_selected_projects(); } +void ProjectManager::_full_convert_button_pressed() { + ask_update_settings->hide(); + ask_full_convert_dialog->popup_centered(Size2i(600.0 * EDSCALE, 0)); + ask_full_convert_dialog->get_cancel_button()->grab_focus(); +} + +void ProjectManager::_perform_full_project_conversion() { + Vector<ProjectList::Item> selected_list = _project_list->get_selected_projects(); + if (selected_list.is_empty()) { + return; + } + + const String &path = selected_list[0].path; + + print_line("Converting project: " + path); + + Ref<ConfigFile> cf; + cf.instantiate(); + cf->load(path.path_join("project.godot")); + cf->set_value("", "config_version", GODOT4_CONFIG_VERSION); + cf->save(path.path_join("project.godot")); + _project_list->set_project_version(path, GODOT4_CONFIG_VERSION); + + List<String> args; + args.push_back("--path"); + args.push_back(path); + args.push_back("--convert-3to4"); + + Error err = OS::get_singleton()->create_instance(args); + ERR_FAIL_COND(err); +} + void ProjectManager::_run_project_confirm() { Vector<ProjectList::Item> selected_list = _project_list->get_selected_projects(); @@ -2628,21 +2687,21 @@ ProjectManager::ProjectManager() { create_btn = memnew(Button); create_btn->set_text(TTR("New Project")); create_btn->add_theme_constant_override("h_separation", btn_h_separation); - create_btn->set_shortcut(ED_SHORTCUT("project_manager/new_project", TTR("New Project"), KeyModifierMask::CMD | Key::N)); + create_btn->set_shortcut(ED_SHORTCUT("project_manager/new_project", TTR("New Project"), KeyModifierMask::CMD_OR_CTRL | Key::N)); create_btn->connect("pressed", callable_mp(this, &ProjectManager::_new_project)); tree_vb->add_child(create_btn); import_btn = memnew(Button); import_btn->set_text(TTR("Import")); import_btn->add_theme_constant_override("h_separation", btn_h_separation); - import_btn->set_shortcut(ED_SHORTCUT("project_manager/import_project", TTR("Import Project"), KeyModifierMask::CMD | Key::I)); + import_btn->set_shortcut(ED_SHORTCUT("project_manager/import_project", TTR("Import Project"), KeyModifierMask::CMD_OR_CTRL | Key::I)); import_btn->connect("pressed", callable_mp(this, &ProjectManager::_import_project)); tree_vb->add_child(import_btn); scan_btn = memnew(Button); scan_btn->set_text(TTR("Scan")); scan_btn->add_theme_constant_override("h_separation", btn_h_separation); - scan_btn->set_shortcut(ED_SHORTCUT("project_manager/scan_projects", TTR("Scan Projects"), KeyModifierMask::CMD | Key::S)); + scan_btn->set_shortcut(ED_SHORTCUT("project_manager/scan_projects", TTR("Scan Projects"), KeyModifierMask::CMD_OR_CTRL | Key::S)); scan_btn->connect("pressed", callable_mp(this, &ProjectManager::_scan_projects)); tree_vb->add_child(scan_btn); @@ -2651,14 +2710,14 @@ ProjectManager::ProjectManager() { open_btn = memnew(Button); open_btn->set_text(TTR("Edit")); open_btn->add_theme_constant_override("h_separation", btn_h_separation); - open_btn->set_shortcut(ED_SHORTCUT("project_manager/edit_project", TTR("Edit Project"), KeyModifierMask::CMD | Key::E)); + open_btn->set_shortcut(ED_SHORTCUT("project_manager/edit_project", TTR("Edit Project"), KeyModifierMask::CMD_OR_CTRL | Key::E)); open_btn->connect("pressed", callable_mp(this, &ProjectManager::_open_selected_projects_ask)); tree_vb->add_child(open_btn); run_btn = memnew(Button); run_btn->set_text(TTR("Run")); run_btn->add_theme_constant_override("h_separation", btn_h_separation); - run_btn->set_shortcut(ED_SHORTCUT("project_manager/run_project", TTR("Run Project"), KeyModifierMask::CMD | Key::R)); + run_btn->set_shortcut(ED_SHORTCUT("project_manager/run_project", TTR("Run Project"), KeyModifierMask::CMD_OR_CTRL | Key::R)); run_btn->connect("pressed", callable_mp(this, &ProjectManager::_run_project)); tree_vb->add_child(run_btn); @@ -2724,9 +2783,10 @@ ProjectManager::ProjectManager() { settings_hb->add_child(h_spacer); language_btn = memnew(OptionButton); - language_btn->set_flat(true); language_btn->set_icon(get_theme_icon(SNAME("Environment"), SNAME("EditorIcons"))); language_btn->set_focus_mode(Control::FOCUS_NONE); + language_btn->set_fit_to_longest_item(false); + language_btn->set_flat(true); language_btn->connect("item_selected", callable_mp(this, &ProjectManager::_language_selected)); #ifdef ANDROID_ENABLED // The language selection dropdown doesn't work on Android (as the setting isn't saved), see GH-60353. @@ -2823,9 +2883,18 @@ ProjectManager::ProjectManager() { add_child(multi_scan_ask); ask_update_settings = memnew(ConfirmationDialog); + ask_update_settings->set_autowrap(true); ask_update_settings->get_ok_button()->connect("pressed", callable_mp(this, &ProjectManager::_confirm_update_settings)); + full_convert_button = ask_update_settings->add_button("Convert Full Project", !GLOBAL_GET("gui/common/swap_cancel_ok")); + full_convert_button->connect("pressed", callable_mp(this, &ProjectManager::_full_convert_button_pressed)); add_child(ask_update_settings); + ask_full_convert_dialog = memnew(ConfirmationDialog); + ask_full_convert_dialog->set_autowrap(true); + ask_full_convert_dialog->set_text(TTR("This option will perform full project conversion, updating scenes, resources and scripts from Godot 3.x to work in Godot 4.0.\n\nNote that this is a best-effort conversion, i.e. it makes upgrading the project easier, but it will not open out-of-the-box and will still require manual adjustments.\n\nIMPORTANT: Make sure to backup your project before converting, as this operation makes it impossible to open it in older versions of Godot.")); + ask_full_convert_dialog->connect("confirmed", callable_mp(this, &ProjectManager::_perform_full_project_conversion)); + add_child(ask_full_convert_dialog); + npdialog = memnew(ProjectDialog); npdialog->connect("projects_updated", callable_mp(this, &ProjectManager::_on_projects_updated)); npdialog->connect("project_created", callable_mp(this, &ProjectManager::_on_project_created)); diff --git a/editor/project_manager.h b/editor/project_manager.h index 10bf25c048..7c05429dde 100644 --- a/editor/project_manager.h +++ b/editor/project_manager.h @@ -87,6 +87,7 @@ class ProjectManager : public Control { ConfirmationDialog *multi_open_ask = nullptr; ConfirmationDialog *multi_run_ask = nullptr; ConfirmationDialog *multi_scan_ask = nullptr; + ConfirmationDialog *ask_full_convert_dialog = nullptr; ConfirmationDialog *ask_update_settings = nullptr; ConfirmationDialog *open_templates = nullptr; EditorAbout *about = nullptr; @@ -97,6 +98,7 @@ class ProjectManager : public Control { AcceptDialog *dialog_error = nullptr; ProjectDialog *npdialog = nullptr; + Button *full_convert_button = nullptr; OptionButton *language_btn = nullptr; LinkButton *version_btn = nullptr; @@ -106,6 +108,8 @@ class ProjectManager : public Control { void _run_project_confirm(); void _open_selected_projects(); void _open_selected_projects_ask(); + void _full_convert_button_pressed(); + void _perform_full_project_conversion(); void _import_project(); void _new_project(); void _rename_project(); diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index 11cbc4132c..2da49f11cc 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -239,7 +239,7 @@ void ProjectSettingsEditor::shortcut_input(const Ref<InputEvent> &p_event) { handled = true; } - if (k->get_keycode_with_modifiers() == (KeyModifierMask::CMD | Key::F)) { + if (k->is_match(InputEventKey::create_reference(KeyModifierMask::CMD_OR_CTRL | Key::F))) { search_box->grab_focus(); search_box->select_all(); handled = true; diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index cde4490cd3..aefb2c78c1 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -135,6 +135,8 @@ void SceneTreeDock::shortcut_input(const Ref<InputEvent> &p_event) { _tool_selected(TOOL_ERASE, true); } else if (ED_IS_SHORTCUT("scene_tree/copy_node_path", p_event)) { _tool_selected(TOOL_COPY_NODE_PATH); + } else if (ED_IS_SHORTCUT("scene_tree/toggle_unique_name", p_event)) { + _tool_selected(TOOL_TOGGLE_SCENE_UNIQUE_NAME); } else if (ED_IS_SHORTCUT("scene_tree/delete", p_event)) { _tool_selected(TOOL_ERASE); } else { @@ -916,6 +918,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { String existing; if (extensions.size()) { String root_name(tocopy->get_name()); + root_name = EditorNode::adjust_scene_name_casing(root_name); existing = root_name + "." + extensions.front()->get().to_lower(); } new_scene_from_dialog->set_current_path(existing); @@ -1073,6 +1076,14 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { if (first_selected == nullptr) { return; } + if (first_selected->get() == EditorNode::get_singleton()->get_edited_scene()) { + // Exclude Root Node. It should never be unique name in its own scene! + editor_selection->remove_node(first_selected->get()); + first_selected = editor_selection->get_selected_node_list().front(); + if (first_selected == nullptr) { + return; + } + } bool enabling = !first_selected->get()->is_unique_name_in_owner(); List<Node *> full_selection = editor_selection->get_full_selected_node_list(); @@ -1235,14 +1246,14 @@ void SceneTreeDock::_notification(int p_what) { CanvasItemEditorPlugin *canvas_item_plugin = Object::cast_to<CanvasItemEditorPlugin>(editor_data->get_editor("2D")); if (canvas_item_plugin) { - canvas_item_plugin->get_canvas_item_editor()->connect("item_lock_status_changed", Callable(scene_tree, "_update_tree")); - canvas_item_plugin->get_canvas_item_editor()->connect("item_group_status_changed", Callable(scene_tree, "_update_tree")); + canvas_item_plugin->get_canvas_item_editor()->connect("item_lock_status_changed", callable_mp(scene_tree, &SceneTreeEditor::_update_tree)); + canvas_item_plugin->get_canvas_item_editor()->connect("item_group_status_changed", callable_mp(scene_tree, &SceneTreeEditor::_update_tree)); scene_tree->connect("node_changed", callable_mp((CanvasItem *)canvas_item_plugin->get_canvas_item_editor()->get_viewport_control(), &CanvasItem::queue_redraw)); } Node3DEditorPlugin *spatial_editor_plugin = Object::cast_to<Node3DEditorPlugin>(editor_data->get_editor("3D")); - spatial_editor_plugin->get_spatial_editor()->connect("item_lock_status_changed", Callable(scene_tree, "_update_tree")); - spatial_editor_plugin->get_spatial_editor()->connect("item_group_status_changed", Callable(scene_tree, "_update_tree")); + spatial_editor_plugin->get_spatial_editor()->connect("item_lock_status_changed", callable_mp(scene_tree, &SceneTreeEditor::_update_tree)); + spatial_editor_plugin->get_spatial_editor()->connect("item_group_status_changed", callable_mp(scene_tree, &SceneTreeEditor::_update_tree)); button_add->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); button_instance->set_icon(get_theme_icon(SNAME("Instance"), SNAME("EditorIcons"))); @@ -1987,7 +1998,7 @@ void SceneTreeDock::_script_created(Ref<Script> p_script) { Node *node = selected.front()->get(); Ref<Script> existing = node->get_script(); - editor_data->get_undo_redo()->create_action(TTR("Attach Script")); + editor_data->get_undo_redo()->create_action(TTR("Attach Script"), UndoRedo::MERGE_DISABLE, node); editor_data->get_undo_redo()->add_do_method(InspectorDock::get_singleton(), "store_script_properties", node); editor_data->get_undo_redo()->add_undo_method(InspectorDock::get_singleton(), "store_script_properties", node); editor_data->get_undo_redo()->add_do_method(node, "set_script", p_script); @@ -1998,7 +2009,7 @@ void SceneTreeDock::_script_created(Ref<Script> p_script) { editor_data->get_undo_redo()->add_undo_method(this, "_update_script_button"); editor_data->get_undo_redo()->commit_action(); } else { - editor_data->get_undo_redo()->create_action(TTR("Attach Script")); + editor_data->get_undo_redo()->create_action(TTR("Attach Script"), UndoRedo::MERGE_DISABLE, selected.front()->get()); for (Node *E : selected) { Ref<Script> existing = E->get_script(); editor_data->get_undo_redo()->add_do_method(InspectorDock::get_singleton(), "store_script_properties", E); @@ -2093,9 +2104,9 @@ void SceneTreeDock::_delete_confirm(bool p_cut) { EditorNode::get_singleton()->get_editor_plugins_over()->make_visible(false); if (p_cut) { - editor_data->get_undo_redo()->create_action(TTR("Cut Node(s)")); + editor_data->get_undo_redo()->create_action(TTR("Cut Node(s)"), UndoRedo::MERGE_DISABLE, remove_list.front()->get()); } else { - editor_data->get_undo_redo()->create_action(TTR("Remove Node(s)")); + editor_data->get_undo_redo()->create_action(TTR("Remove Node(s)"), UndoRedo::MERGE_DISABLE, remove_list.front()->get()); } bool entire_scene = false; @@ -2103,6 +2114,7 @@ void SceneTreeDock::_delete_confirm(bool p_cut) { for (const Node *E : remove_list) { if (E == edited_scene) { entire_scene = true; + break; } } @@ -2220,7 +2232,7 @@ void SceneTreeDock::_do_create(Node *p_parent) { Node *child = Object::cast_to<Node>(c); ERR_FAIL_COND(!child); - editor_data->get_undo_redo()->create_action(TTR("Create Node")); + editor_data->get_undo_redo()->create_action_for_history(TTR("Create Node"), editor_data->get_current_edited_scene_history_id()); if (edited_scene) { editor_data->get_undo_redo()->add_do_method(p_parent, "add_child", child, true); @@ -2637,7 +2649,7 @@ void SceneTreeDock::_script_dropped(String p_file, NodePath p_to) { Ref<Script> scr = ResourceLoader::load(p_file); ERR_FAIL_COND(!scr.is_valid()); if (Node *n = get_node(p_to)) { - editor_data->get_undo_redo()->create_action(TTR("Attach Script")); + editor_data->get_undo_redo()->create_action(TTR("Attach Script"), UndoRedo::MERGE_DISABLE, n); editor_data->get_undo_redo()->add_do_method(InspectorDock::get_singleton(), "store_script_properties", n); editor_data->get_undo_redo()->add_undo_method(InspectorDock::get_singleton(), "store_script_properties", n); editor_data->get_undo_redo()->add_do_method(n, "set_script", scr); @@ -2864,10 +2876,13 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { } } if (all_owned) { - menu->add_separator(); - menu->add_icon_check_item(get_theme_icon(SNAME("SceneUniqueName"), SNAME("EditorIcons")), TTR("Access as Scene Unique Name"), TOOL_TOGGLE_SCENE_UNIQUE_NAME); - // Checked based on `selection[0]` because `full_selection` has undesired ordering. - menu->set_item_checked(menu->get_item_index(TOOL_TOGGLE_SCENE_UNIQUE_NAME), selection[0]->is_unique_name_in_owner()); + // Group "toggle_unique_name" with "copy_node_path", if it is available. + if (menu->get_item_index(TOOL_COPY_NODE_PATH) == -1) { + menu->add_separator(); + } + Node *node = full_selection[0]; + menu->add_icon_shortcut(get_theme_icon(SNAME("SceneUniqueName"), SNAME("EditorIcons")), ED_GET_SHORTCUT("scene_tree/toggle_unique_name"), TOOL_TOGGLE_SCENE_UNIQUE_NAME); + menu->set_item_text(menu->get_item_index(TOOL_TOGGLE_SCENE_UNIQUE_NAME), node->is_unique_name_in_owner() ? TTR("Revoke Unique Name") : TTR("Access as Unique Name")); } } @@ -3402,24 +3417,25 @@ SceneTreeDock::SceneTreeDock(Node *p_scene_root, EditorSelection *p_editor_selec ED_SHORTCUT("scene_tree/batch_rename", TTR("Batch Rename"), KeyModifierMask::SHIFT | Key::F2); ED_SHORTCUT_OVERRIDE("scene_tree/batch_rename", "macos", KeyModifierMask::SHIFT | Key::ENTER); - ED_SHORTCUT("scene_tree/add_child_node", TTR("Add Child Node"), KeyModifierMask::CMD | Key::A); - ED_SHORTCUT("scene_tree/instance_scene", TTR("Instantiate Child Scene"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::A); + ED_SHORTCUT("scene_tree/add_child_node", TTR("Add Child Node"), KeyModifierMask::CMD_OR_CTRL | Key::A); + ED_SHORTCUT("scene_tree/instance_scene", TTR("Instantiate Child Scene"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::A); ED_SHORTCUT("scene_tree/expand_collapse_all", TTR("Expand/Collapse Branch")); - ED_SHORTCUT("scene_tree/cut_node", TTR("Cut"), KeyModifierMask::CMD | Key::X); - ED_SHORTCUT("scene_tree/copy_node", TTR("Copy"), KeyModifierMask::CMD | Key::C); - ED_SHORTCUT("scene_tree/paste_node", TTR("Paste"), KeyModifierMask::CMD | Key::V); + ED_SHORTCUT("scene_tree/cut_node", TTR("Cut"), KeyModifierMask::CMD_OR_CTRL | Key::X); + ED_SHORTCUT("scene_tree/copy_node", TTR("Copy"), KeyModifierMask::CMD_OR_CTRL | Key::C); + ED_SHORTCUT("scene_tree/paste_node", TTR("Paste"), KeyModifierMask::CMD_OR_CTRL | Key::V); ED_SHORTCUT("scene_tree/change_node_type", TTR("Change Type")); ED_SHORTCUT("scene_tree/attach_script", TTR("Attach Script")); ED_SHORTCUT("scene_tree/extend_script", TTR("Extend Script")); ED_SHORTCUT("scene_tree/detach_script", TTR("Detach Script")); - ED_SHORTCUT("scene_tree/move_up", TTR("Move Up"), KeyModifierMask::CMD | Key::UP); - ED_SHORTCUT("scene_tree/move_down", TTR("Move Down"), KeyModifierMask::CMD | Key::DOWN); - ED_SHORTCUT("scene_tree/duplicate", TTR("Duplicate"), KeyModifierMask::CMD | Key::D); + ED_SHORTCUT("scene_tree/move_up", TTR("Move Up"), KeyModifierMask::CMD_OR_CTRL | Key::UP); + ED_SHORTCUT("scene_tree/move_down", TTR("Move Down"), KeyModifierMask::CMD_OR_CTRL | Key::DOWN); + ED_SHORTCUT("scene_tree/duplicate", TTR("Duplicate"), KeyModifierMask::CMD_OR_CTRL | Key::D); ED_SHORTCUT("scene_tree/reparent", TTR("Reparent")); ED_SHORTCUT("scene_tree/reparent_to_new_node", TTR("Reparent to New Node")); ED_SHORTCUT("scene_tree/make_root", TTR("Make Scene Root")); ED_SHORTCUT("scene_tree/save_branch_as_scene", TTR("Save Branch as Scene")); - ED_SHORTCUT("scene_tree/copy_node_path", TTR("Copy Node Path"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::C); + ED_SHORTCUT("scene_tree/copy_node_path", TTR("Copy Node Path"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::C); + ED_SHORTCUT("scene_tree/toggle_unique_name", TTR("Toggle Access as Unique Name")); ED_SHORTCUT("scene_tree/delete_no_confirm", TTR("Delete (No Confirm)"), KeyModifierMask::SHIFT | Key::KEY_DELETE); ED_SHORTCUT("scene_tree/delete", TTR("Delete"), Key::KEY_DELETE); diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index 50bb6496e1..6fff2ab7cb 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -603,7 +603,7 @@ void SceneTreeEditor::_update_tree(bool p_scroll_to_selected) { updating_tree = false; tree_dirty = false; - if (!filter.is_empty()) { + if (!filter.strip_edges().is_empty()) { _update_filter(nullptr, p_scroll_to_selected); } } @@ -618,18 +618,28 @@ bool SceneTreeEditor::_update_filter(TreeItem *p_parent, bool p_scroll_to_select return false; } - bool keep = false; + bool keep_for_children = false; for (TreeItem *child = p_parent->get_first_child(); child; child = child->get_next()) { - keep = _update_filter(child, p_scroll_to_selected) || keep; + // Always keep if at least one of the children are kept. + keep_for_children = _update_filter(child, p_scroll_to_selected) || keep_for_children; } - if (!keep) { - StringName node_type = get_node(p_parent->get_metadata(0))->get_class(); - bool is_kept_by_type = (filter.begins_with("type:") && filter.trim_prefix("type:").is_subsequence_ofn(node_type)) || (filter.begins_with("t:") && filter.trim_prefix("t:").is_subsequence_ofn(node_type)); - keep = (filter.is_subsequence_ofn(p_parent->get_text(0)) || is_kept_by_type); + // Now find other reasons to keep this Node, too. + PackedStringArray terms = filter.to_lower().split_spaces(); + bool keep = _item_matches_all_terms(p_parent, terms); + + p_parent->set_visible(keep_for_children || keep); + if (keep_for_children) { + if (keep) { + p_parent->clear_custom_color(0); + p_parent->set_selectable(0, true); + } else { + p_parent->set_custom_color(0, get_theme_color(SNAME("disabled_font_color"), SNAME("Editor"))); + p_parent->set_selectable(0, false); + p_parent->deselect(0); + } } - p_parent->set_visible(keep); if (editor_selection) { Node *n = get_node(p_parent->get_metadata(0)); if (keep) { @@ -644,7 +654,68 @@ bool SceneTreeEditor::_update_filter(TreeItem *p_parent, bool p_scroll_to_select } } - return keep; + return keep || keep_for_children; +} + +bool SceneTreeEditor::_item_matches_all_terms(TreeItem *p_item, PackedStringArray p_terms) { + if (p_terms.is_empty()) { + return true; + } + + for (int i = 0; i < p_terms.size(); i++) { + String term = p_terms[i]; + + // Recognise special filter. + if (term.contains(":") && !term.get_slicec(':', 0).is_empty()) { + String parameter = term.get_slicec(':', 0); + String argument = term.get_slicec(':', 1); + + if (parameter == "type" || parameter == "t") { + // Filter by Type. + String node_type = get_node(p_item->get_metadata(0))->get_class().to_lower(); + + if (!node_type.contains(argument)) { + return false; + } + } else if (parameter == "group" || parameter == "g") { + // Filter by Group. + Node *node = get_node(p_item->get_metadata(0)); + + List<Node::GroupInfo> group_info_list; + node->get_groups(&group_info_list); + if (group_info_list.is_empty()) { + return false; + } + // When argument is empty, match all Nodes belonging to any group. + if (!argument.is_empty()) { + bool term_in_groups = false; + for (int j = 0; j < group_info_list.size(); j++) { + // Ignore private groups. + if (String(group_info_list[j].name).begins_with("__")) { + continue; + } + if (String(group_info_list[j].name).to_lower().contains(argument)) { + term_in_groups = true; + break; + } + } + if (!term_in_groups) { + return false; + } + } + } else { + WARN_PRINT(vformat(TTR("Special Node filter \"%s\" is not recognised. Available filters include \"type\" and \"group\"."), parameter)); + continue; + } + } else { + // Default. + if (!p_item->get_text(0).to_lower().contains(term)) { + return false; + } + } + } + + return true; } void SceneTreeEditor::_compute_hash(Node *p_node, uint64_t &hash) { @@ -764,7 +835,7 @@ void SceneTreeEditor::_notification(int p_what) { get_tree()->connect("tree_process_mode_changed", callable_mp(this, &SceneTreeEditor::_tree_process_mode_changed)); get_tree()->connect("node_removed", callable_mp(this, &SceneTreeEditor::_node_removed)); get_tree()->connect("node_renamed", callable_mp(this, &SceneTreeEditor::_node_renamed)); - get_tree()->connect("node_configuration_warning_changed", callable_mp(this, &SceneTreeEditor::_warning_changed), CONNECT_DEFERRED); + get_tree()->connect("node_configuration_warning_changed", callable_mp(this, &SceneTreeEditor::_warning_changed)); tree->connect("item_collapsed", callable_mp(this, &SceneTreeEditor::_cell_collapsed)); @@ -1261,7 +1332,7 @@ void SceneTreeEditor::set_connecting_signal(bool p_enable) { } void SceneTreeEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_update_tree"), &SceneTreeEditor::_update_tree, DEFVAL(false)); // Still used by some connect_compat. + ClassDB::bind_method(D_METHOD("_update_tree"), &SceneTreeEditor::_update_tree, DEFVAL(false)); // Still used by UndoRedo. ClassDB::bind_method("_rename_node", &SceneTreeEditor::_rename_node); ClassDB::bind_method("_test_update_tree", &SceneTreeEditor::_test_update_tree); diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h index 0c13ad96cd..8fbc3ab6d6 100644 --- a/editor/scene_tree_editor.h +++ b/editor/scene_tree_editor.h @@ -76,8 +76,8 @@ class SceneTreeEditor : public Control { void _add_nodes(Node *p_node, TreeItem *p_parent); void _test_update_tree(); - void _update_tree(bool p_scroll_to_selected = false); bool _update_filter(TreeItem *p_parent = nullptr, bool p_scroll_to_selected = false); + bool _item_matches_all_terms(TreeItem *p_item, PackedStringArray p_terms); void _tree_changed(); void _tree_process_mode_changed(); void _node_removed(Node *p_node); @@ -137,6 +137,9 @@ class SceneTreeEditor : public Control { Vector<StringName> valid_types; public: + // Public for use with callable_mp. + void _update_tree(bool p_scroll_to_selected = false); + void set_filter(const String &p_filter); String get_filter() const; diff --git a/editor/shader_globals_editor.cpp b/editor/shader_globals_editor.cpp index eef0f3eae1..473bbd69d9 100644 --- a/editor/shader_globals_editor.cpp +++ b/editor/shader_globals_editor.cpp @@ -483,7 +483,7 @@ ShaderGlobalsEditor::ShaderGlobalsEditor() { inspector->connect("property_deleted", callable_mp(this, &ShaderGlobalsEditor::_variable_deleted), CONNECT_DEFERRED); interface = memnew(ShaderGlobalsEditorInterface); - interface->connect("var_changed", Callable(this, "_changed")); + interface->connect("var_changed", callable_mp(this, &ShaderGlobalsEditor::_changed)); } ShaderGlobalsEditor::~ShaderGlobalsEditor() { diff --git a/editor/translations/af.po b/editor/translations/af.po index f2e389b6f5..8ada9c3379 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -4588,6 +4588,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7430,7 +7431,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15506,18 +15508,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nodus Naam:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nodus Naam:" #: editor/scene_tree_dock.cpp @@ -15717,6 +15719,11 @@ msgstr "" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nodus Naam:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Koppel tans Sein:" @@ -15781,6 +15788,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17655,6 +17666,21 @@ msgstr "Alle Seleksie" msgid "Auto Update Project" msgstr "Projek Stigters" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Vervang Alles" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Kies 'n Gids" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Kies 'n Gids" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19446,6 +19472,11 @@ msgstr "Anim Dupliseer Sleutels" msgid "Custom BG Color" msgstr "Anim Dupliseer Sleutels" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Anim Verander Transform" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -20282,6 +20313,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Ongeldige naam." diff --git a/editor/translations/ar.po b/editor/translations/ar.po index cda76c44c8..adaef249f8 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -67,14 +67,15 @@ # Jhon Smith <jhonsmaith3@gmail.com>, 2022. # Oo mohab oO <mohab9225@gmail.com>, 2022. # عبد الرØÙ…Ù† أبو سعدة ||Abd Alrahman abo saada <abdalrahmanabs2005@gmail.com>, 2022. +# xX-Void-Xx <arandomdude75@gmail.com>, 2022. +# Ø£ØÙ…د النور <ahmed2699@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: عبد الرØÙ…Ù† أبو سعدة ||Abd Alrahman abo saada " -"<abdalrahmanabs2005@gmail.com>\n" +"PO-Revision-Date: 2022-09-08 07:39+0000\n" +"Last-Translator: Ø£ØÙ…د النور <ahmed2699@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -83,7 +84,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -452,9 +453,8 @@ msgid "Command" msgstr "Ù…ÙØªØ§Ø Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "(Ùيزيائي)" +msgstr "Ùيزيائي" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -508,7 +508,7 @@ msgstr "الضغط" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Ù‚Ùلب القلم" #: core/os/input_event.cpp msgid "Relative" @@ -1199,7 +1199,7 @@ msgstr "خطوة الدوران:" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp msgid "Value" -msgstr "القيمة" +msgstr "قيمة" #: editor/animation_track_editor.cpp #, fuzzy @@ -4575,6 +4575,7 @@ msgstr "أدوات مشروع أو مشهد متنوعة." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "مشروع" @@ -5402,9 +5403,8 @@ msgid "Icon And Font Color" msgstr "لون الأيقونة والخط" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Color" -msgstr "الألوان" +msgstr "اللون الاساسي" #: editor/editor_settings.cpp #, fuzzy @@ -5434,9 +5434,8 @@ msgid "Use Graph Node Headers" msgstr "استخدم رؤوس ÙˆØØ¯Ø§Øª الرسم البياني" #: editor/editor_settings.cpp -#, fuzzy msgid "Additional Spacing" -msgstr "تكرار الرسوم Ø§Ù„Ù…ØªØØ±ÙƒØ©" +msgstr "Ù…Ø³Ø§ØØ© اضاÙية" #: editor/editor_settings.cpp #, fuzzy @@ -5444,9 +5443,8 @@ msgid "Custom Theme" msgstr "مظهر Ø§Ù„Ù…ØØ±Ø±/برنامج-جودوه" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Script Button" -msgstr "زر العجلة يميناً" +msgstr "اضهار زر السكربت" #: editor/editor_settings.cpp #, fuzzy @@ -5464,9 +5462,8 @@ msgid "Default Project Path" msgstr "مسار المشروع:" #: editor/editor_settings.cpp -#, fuzzy msgid "On Save" -msgstr "ØÙظ" +msgstr "عند الØÙظ" #: editor/editor_settings.cpp #, fuzzy @@ -5501,9 +5498,8 @@ msgid "Start Create Dialog Fully Expanded" msgstr "بدء Ù†Ø§ÙØ°Ø© ØÙˆØ§Ø± الإنشاء موسعة بالكامل" #: editor/editor_settings.cpp -#, fuzzy msgid "Always Show Folders" -msgstr "إظهار الشبكة دوماً" +msgstr "إظهار Ø§Ù„Ù…Ù„ÙØ§Øª دوماً" #: editor/editor_settings.cpp #, fuzzy @@ -5567,14 +5563,12 @@ msgid "Convert Indent On Save" msgstr "تØÙˆÙŠÙ„ Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة إلى Ù…Ø³Ø§ÙØ§Øª" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Tabs" -msgstr "استدعاءات الرسم:" +msgstr "رسم ÙØ±Ø§ØºØ§Øª زر التاب" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Spaces" -msgstr "استدعاءات الرسم:" +msgstr "رسم ÙØ±Ø§ØºØ§Øª زر السبايس" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/tile_map.cpp @@ -5592,9 +5586,8 @@ msgid "V Scroll Speed" msgstr "سرعة التمرير العمودي" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Minimap" -msgstr "إظهار المركز" +msgstr "إظهار الخريطة" #: editor/editor_settings.cpp msgid "Minimap Width" @@ -5618,9 +5611,8 @@ msgid "Appearance" msgstr "المظهر" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Show Line Numbers" -msgstr "رقم الخط:" +msgstr "اضهار رقم الخط" #: editor/editor_settings.cpp #, fuzzy @@ -5661,9 +5653,8 @@ msgid "Line Length Guideline Hard Column" msgstr "عمود غامق لتوجيه طول السطر" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script List" -msgstr "Ù…ØØ±Ø± النص البرمجي" +msgstr "Ù„Ø§Ø¦ØØ© السكربتات" #: editor/editor_settings.cpp msgid "Show Members Overview" @@ -5725,16 +5716,14 @@ msgid "Caret Blink Speed" msgstr "سرعة وميض علامة Ø§Ù„Ø¥Ù‚ØØ§Ù…" #: editor/editor_settings.cpp -#, fuzzy msgid "Right Click Moves Caret" -msgstr "اضغط بالزر الأيمن Ù„Ø¥Ø¶Ø§ÙØ© نقطة" +msgstr "اضغط بالزر الأيمن Ù„Ø¥Ø¶Ø§ÙØ© علامة Ø§Ù„Ø¥Ù‚ØØ§Ù…" #: editor/editor_settings.cpp modules/gdscript/gdscript.cpp #: modules/gdscript/gdscript_editor.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion" -msgstr "نسخ Ø§Ù„Ù…ÙØØ¯Ø¯" +msgstr "تكملة" #: editor/editor_settings.cpp msgid "Idle Parse Delay" @@ -5793,14 +5782,12 @@ msgid "Grid Map" msgstr "خريطة الشبكة" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Pick Distance" -msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©:" +msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Preview Size" -msgstr "عرض" +msgstr "ØØ¬Ù… العرض" #: editor/editor_settings.cpp msgid "Primary Grid Color" @@ -7500,7 +7487,8 @@ msgid "8 Bit" msgstr "8 بت" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Ø§ØØ§Ø¯ÙŠÙ‡" @@ -15550,18 +15538,19 @@ msgstr "" msgid "Make Local" msgstr "اجعله Ù…ØÙ„ياً" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "إسم العقدة:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "لقد تم استخدام هذا الاسم ÙÙŠ ÙˆØ¸ÙŠÙØ© برمجية/ Ù…ÙØªØºÙŠÙ‘ر/ إشارة، من قبل:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "إسم العقدة:" #: editor/scene_tree_dock.cpp @@ -15761,6 +15750,11 @@ msgid "Button Group" msgstr "مجموعة الأزرار" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "إسم العقدة:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(الإتصال من)" @@ -15836,6 +15830,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "اسم عÙقدة غير ØµØ§Ù„ØØŒ إن Ø§Ù„Ø£ØØ±Ù التالية غير Ù…Ø³Ù…ÙˆØØ©:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "إعادة تسمية العÙقدة" @@ -17272,7 +17270,7 @@ msgstr "" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp #, fuzzy msgid "Translation" -msgstr "الترجمات" +msgstr "الترجمة" #: modules/gltf/gltf_node.cpp #, fuzzy @@ -17706,6 +17704,21 @@ msgstr "" msgid "Auto Update Project" msgstr "ØªØØ¯ÙŠØ« المشروع تلقائيًا" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "إظهار الكل" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "ØØ¯Ø¯ الوجهة" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "ØØ¯Ø¯ الوجهة" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "نهاية تتبع مكدس الاستثناء الداخلي" @@ -19575,6 +19588,11 @@ msgstr "قص العÙقد" msgid "Custom BG Color" msgstr "قص العÙقد" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "توسيع الكل" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20432,6 +20450,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "اسم Ø§Ù„Ø±ÙØ²Ù…Ø© القصير غير صالØ." diff --git a/editor/translations/az.po b/editor/translations/az.po index af28a85240..d4ffe0665e 100644 --- a/editor/translations/az.po +++ b/editor/translations/az.po @@ -4444,6 +4444,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7176,7 +7177,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14914,18 +14916,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Animasiya Addımını DÉ™yiÅŸdirin" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Animasiya Addımını DÉ™yiÅŸdirin" #: editor/scene_tree_dock.cpp @@ -15115,6 +15117,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Animasiya Addımını DÉ™yiÅŸdirin" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15178,6 +15185,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16983,6 +16994,19 @@ msgstr "" msgid "Auto Update Project" msgstr "ÆlaqÉ™ni redaktÉ™ edin:" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "LayihÉ™ Qurucuları" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18707,6 +18731,11 @@ msgstr "Funksiyalar:" msgid "Custom BG Color" msgstr "Funksiyalar:" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "3D Transformasya izi" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19503,6 +19532,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index d2d7a56dc3..46640b0b55 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -4506,6 +4506,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Проект" @@ -7336,7 +7337,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15161,18 +15163,19 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Име на обекта:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Името вече е заето от друга функциÑ/променлива/Ñигнал:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Име на обекта:" #: editor/scene_tree_dock.cpp @@ -15364,6 +15367,11 @@ msgid "Button Group" msgstr "Група бутони" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Име на обекта:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Свързване от)" @@ -15427,6 +15435,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17325,6 +17337,21 @@ msgstr "Запълване на избраното" msgid "Auto Update Project" msgstr "Редактиране на проекта" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Показване на вÑичко" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Изберете папка" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Изберете папка" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Край на Ð²ÑŠÑ‚Ñ€ÐµÑˆÐ½Ð¸Ñ Ñтек на проÑледÑване за изключението" @@ -19126,6 +19153,11 @@ msgstr "ПерÑонализиран обект" msgid "Custom BG Color" msgstr "ПерÑонализиран обект" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Задаване на отÑтъп" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19974,6 +20006,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Ðеправилно кратко име на пакет." diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 6f1e8f945d..f32a090f27 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -4748,6 +4748,7 @@ msgstr "পà§à¦°à¦•লà§à¦ª অথবা দৃশà§à¦¯à§‡-বà§à¦¯à¦¾à¦ªà§€ #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp #, fuzzy msgid "Project" msgstr "নতà§à¦¨ পà§à¦°à¦•লà§à¦ª" @@ -7789,7 +7790,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -16332,18 +16334,19 @@ msgstr "" msgid "Make Local" msgstr "সà§à¦¥à¦¾à¦¨à§€à§Ÿ করà§à¦¨" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "নোডের নাম:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "নামটি ইতিমধà§à¦¯à§‡à¦‡ অপর ফাংশন/চলক(à¦à§‡à¦°à¦¿à¦¯à¦¼à§‡à¦¬à¦²)/সংকেত(সিগনà§à¦¯à¦¾à¦²)-ঠবà§à¦¯à¦¬à¦¹à§ƒà¦¤ হয়েছে:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "নোডের নাম:" #: editor/scene_tree_dock.cpp @@ -16560,6 +16563,11 @@ msgstr "বোতাম à§" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "নোডের নাম:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "সংযোগ..." @@ -16640,6 +16648,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নোডের নাম, নীমà§à¦¨à§‹à¦•à§à¦¤ অকà§à¦·à¦°à¦¸à¦®à§‚হ গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "নোড পà§à¦¨à¦ƒà¦¨à¦¾à¦®à¦•রণ করà§à¦¨" @@ -18644,6 +18656,21 @@ msgstr "সব সিলেকà§à¦Ÿ করà§à¦¨" msgid "Auto Update Project" msgstr "নামহীন পà§à¦°à¦•লà§à¦ª" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Normal পà§à¦°à¦¦à¦°à§à¦¶à¦¨" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "à¦à¦•টি সà§à¦¥à¦¾à¦¨ পছনà§à¦¦ করà§à¦¨" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "à¦à¦•টি সà§à¦¥à¦¾à¦¨ পছনà§à¦¦ করà§à¦¨" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -20545,6 +20572,11 @@ msgstr "নোড-সমূহ করà§à¦¤à¦¨/কাট করà§à¦¨" msgid "Custom BG Color" msgstr "নোড-সমূহ করà§à¦¤à¦¨/কাট করà§à¦¨" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "ধারক/বাহক পরà§à¦¯à¦¨à§à¦¤ বিসà§à¦¤à§ƒà¦¤ করà§à¦¨" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -21398,6 +21430,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ কà§à¦²à¦¾à¦¸ নাম" diff --git a/editor/translations/br.po b/editor/translations/br.po index 823490a280..7b92059104 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -4371,6 +4371,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7071,7 +7072,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14762,18 +14764,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Cheñch Pazenn ar Fiñvskeudenn" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Cheñch Pazenn ar Fiñvskeudenn" #: editor/scene_tree_dock.cpp @@ -14963,6 +14965,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Cheñch Pazenn ar Fiñvskeudenn" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15026,6 +15033,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16816,6 +16827,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18520,6 +18543,11 @@ msgstr "Fonksionoù :" msgid "Custom BG Color" msgstr "Fonksionoù :" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Roudenn Treuzfurmadur 3D" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19309,6 +19337,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 04c9b7761c..b08b3be823 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -4569,6 +4569,7 @@ msgstr "Eines và ries o d'escena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projecte" @@ -7508,7 +7509,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15819,18 +15821,19 @@ msgstr "" msgid "Make Local" msgstr "Fer Local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nom del node:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Nom usat en un altra funció/variable/senyal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Nom del node:" #: editor/scene_tree_dock.cpp @@ -16034,6 +16037,11 @@ msgid "Button Group" msgstr "Grup de botons" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nom del node:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Connectant des de)" @@ -16110,6 +16118,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "El Nom del node no és và lid. No es permeten els carà cters següents:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Reanomena el Node" @@ -18069,6 +18081,21 @@ msgstr "Omplir la Selecció" msgid "Auto Update Project" msgstr "Projecte sense nom" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Mostra-ho tot" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Tria un Directori" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Tria un Directori" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Final de la traça de la pila d'excepció interna" @@ -19976,6 +20003,11 @@ msgstr "Talla els Nodes" msgid "Custom BG Color" msgstr "Talla els Nodes" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Expandir tot" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20832,6 +20864,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "El nom curt del paquet no és và lid." diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 1e92a92ae7..ed04f66e4b 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -30,13 +30,14 @@ # Jakub JanÅ¡ta <jansta.ja@gmail.com>, 2021. # Petr Voparil <voparil.petr96@gmail.com>, 2022. # JoeMoos <josephmoose13@gmail.com>, 2022. +# Mirinek <mirek.nozicka77@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-04-08 07:29+0000\n" -"Last-Translator: ZbynÄ›k <zbynek.fiala@gmail.com>\n" +"PO-Revision-Date: 2022-08-30 03:11+0000\n" +"Last-Translator: Petr Voparil <voparil.petr96@gmail.com>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" "Language: cs\n" @@ -44,7 +45,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -65,7 +66,7 @@ msgstr "Kód pro ukonÄenà (exit code)" #: core/bind/core_bind.cpp #, fuzzy msgid "V-Sync Enabled" -msgstr "Povolit" +msgstr "V-Sync Zapnutý" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" @@ -78,7 +79,7 @@ msgstr "" #: core/bind/core_bind.cpp #, fuzzy msgid "Low Processor Usage Mode" -msgstr "Režim pÅ™esouvánÃ" +msgstr "Režim NÃzkého Využità Procesoru" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" @@ -90,14 +91,12 @@ msgid "Keep Screen On" msgstr "Nechat ladÃcà program otevÅ™ený" #: core/bind/core_bind.cpp -#, fuzzy msgid "Min Window Size" -msgstr "Velikost obrysu:" +msgstr "Minimálnà Velikost Okna" #: core/bind/core_bind.cpp -#, fuzzy msgid "Max Window Size" -msgstr "Velikost obrysu:" +msgstr "Maximálnà Velikost Okna" #: core/bind/core_bind.cpp #, fuzzy @@ -116,8 +115,9 @@ msgid "Borderless" msgstr "HraniÄnà pixely" #: core/bind/core_bind.cpp +#, fuzzy msgid "Per Pixel Transparency Enabled" -msgstr "" +msgstr "Per Pixel Průhlednost Aktivována" #: core/bind/core_bind.cpp core/project_settings.cpp #, fuzzy @@ -136,7 +136,7 @@ msgstr "Inicializovat" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "PÅ™izpůsobitelná velikost" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp @@ -170,7 +170,7 @@ msgstr "Editor" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "Vypsat chybové hlášky" #: core/bind/core_bind.cpp #, fuzzy @@ -183,9 +183,8 @@ msgid "Target FPS" msgstr "CÃl" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "Uzel TimeScale" +msgstr "ÄŒasová Osa" #: core/bind/core_bind.cpp main/main.cpp #, fuzzy @@ -213,7 +212,7 @@ msgstr "Výsledky hledánÃ" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" -msgstr "" +msgstr "Paměť" #: core/command_queue_mt.cpp core/message_queue.cpp #: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -229,11 +228,11 @@ msgstr "" #: core/command_queue_mt.cpp #, fuzzy msgid "Command Queue" -msgstr "PÅ™Ãkaz: OtoÄit" +msgstr "Fronta PÅ™Ãkazů" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" -msgstr "" +msgstr "Velikost vÃcevláknové fronty (KB)" #: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -263,9 +262,8 @@ msgid "Remote FS" msgstr "Vzdálený " #: core/io/file_access_network.cpp -#, fuzzy msgid "Page Size" -msgstr "Strana: " +msgstr "Velikost Stránky" #: core/io/file_access_network.cpp msgid "Page Read Ahead" @@ -292,11 +290,11 @@ msgstr "Kreslené objekty:" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp #, fuzzy msgid "Allow Object Decoding" -msgstr "Povolit Onion Skinning" +msgstr "Povolit Dekódovánà Objektu" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" -msgstr "" +msgstr "OdmÃtnout nová sÃÅ¥ová pÅ™ipojenÃ" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp #, fuzzy @@ -309,9 +307,8 @@ msgid "Root Node" msgstr "Název koÅ™enového uzlu" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Refuse New Connections" -msgstr "PÅ™ipojit" +msgstr "OdmÃtnout Nová PÅ™ipojenÃ" #: core/io/networked_multiplayer_peer.cpp #, fuzzy @@ -398,8 +395,9 @@ msgstr "PÅ™i volánà '%s':" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp +#, fuzzy msgid "Seed" -msgstr "" +msgstr "Seed" #: core/math/random_number_generator.cpp #, fuzzy @@ -412,7 +410,7 @@ msgstr "" #: core/message_queue.cpp msgid "Max Size (KB)" -msgstr "" +msgstr "Maximálnà Velikost (KB)" #: core/os/input.cpp #, fuzzy @@ -435,8 +433,9 @@ msgid "Alt" msgstr "vÅ¡ichni" #: core/os/input_event.cpp +#, fuzzy msgid "Shift" -msgstr "" +msgstr "Shift" #: core/os/input_event.cpp #, fuzzy @@ -450,7 +449,7 @@ msgstr "" #: core/os/input_event.cpp #, fuzzy msgid "Command" -msgstr "Komunita" +msgstr "PÅ™Ãkaz" #: core/os/input_event.cpp #, fuzzy @@ -462,7 +461,7 @@ msgstr "Fyzická Klávesa" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Pressed" -msgstr "Profil" +msgstr "Stisknuté" #: core/os/input_event.cpp #, fuzzy @@ -475,8 +474,9 @@ msgid "Physical Scancode" msgstr "Fyzická Klávesa" #: core/os/input_event.cpp +#, fuzzy msgid "Unicode" -msgstr "" +msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" @@ -488,9 +488,8 @@ msgid "Button Mask" msgstr "TlaÄÃtko" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp -#, fuzzy msgid "Global Position" -msgstr "KonstantnÃ" +msgstr "Globálnà Pozice" #: core/os/input_event.cpp #, fuzzy @@ -503,12 +502,14 @@ msgid "Button Index" msgstr "Index tlaÄÃtka myÅ¡i:" #: core/os/input_event.cpp +#, fuzzy msgid "Doubleclick" -msgstr "" +msgstr "Dvojklik" #: core/os/input_event.cpp +#, fuzzy msgid "Tilt" -msgstr "" +msgstr "Sklon" #: core/os/input_event.cpp #, fuzzy @@ -556,11 +557,12 @@ msgstr "Akce" #: core/os/input_event.cpp scene/resources/environment.cpp #: scene/resources/material.cpp msgid "Strength" -msgstr "" +msgstr "SÃla" #: core/os/input_event.cpp +#, fuzzy msgid "Delta" -msgstr "" +msgstr "Delta" #: core/os/input_event.cpp #, fuzzy @@ -648,12 +650,12 @@ msgstr "Hlavnà scéna" #: core/project_settings.cpp #, fuzzy msgid "Disable stdout" -msgstr "Deaktivovat Autotile" +msgstr "Deaktivovat stdout" #: core/project_settings.cpp #, fuzzy msgid "Disable stderr" -msgstr "Deaktivovaná položka" +msgstr "Deaktivovat stderr" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" @@ -678,7 +680,7 @@ msgstr "Zobrazit vÅ¡echny" #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Å ÃÅ™ka" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -686,13 +688,13 @@ msgstr "" #: scene/resources/capsule_shape_2d.cpp scene/resources/cylinder_shape.cpp #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp -#, fuzzy msgid "Height" -msgstr "SvÄ›tlo" +msgstr "Výška" #: core/project_settings.cpp +#, fuzzy msgid "Always On Top" -msgstr "" +msgstr "Vždy na hoÅ™e" #: core/project_settings.cpp #, fuzzy @@ -757,7 +759,7 @@ msgstr "PÅ™idat vstup" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "Potvrdit" #: core/project_settings.cpp #, fuzzy @@ -790,8 +792,9 @@ msgid "UI Right" msgstr "Vpravo nahoÅ™e" #: core/project_settings.cpp +#, fuzzy msgid "UI Up" -msgstr "" +msgstr "NahoÅ™e" #: core/project_settings.cpp #, fuzzy @@ -836,7 +839,7 @@ msgstr "Fyzikálnà snÃmek %" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "3D" #: core/project_settings.cpp #, fuzzy @@ -864,7 +867,7 @@ msgstr "VykreslovaÄ:" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Kvalita" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp @@ -874,8 +877,9 @@ msgid "Filters" msgstr "Filtry:" #: core/project_settings.cpp scene/main/viewport.cpp +#, fuzzy msgid "Sharpen Intensity" -msgstr "" +msgstr "Intenzita ZaostÅ™enÃ" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -924,8 +928,9 @@ msgid "Long Distance Matching" msgstr "" #: core/project_settings.cpp +#, fuzzy msgid "Compression Level" -msgstr "" +msgstr "Úroveň Komprese" #: core/project_settings.cpp msgid "Window Log Size" @@ -937,19 +942,20 @@ msgstr "" #: core/project_settings.cpp msgid "Gzip" -msgstr "" +msgstr "Gzip" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" -msgstr "" +msgstr "Android" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "Moduly" #: core/register_core_types.cpp +#, fuzzy msgid "TCP" -msgstr "" +msgstr "TCP" #: core/register_core_types.cpp #, fuzzy @@ -966,12 +972,11 @@ msgstr "" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" -msgstr "" +msgstr "SSL" #: core/register_core_types.cpp main/main.cpp -#, fuzzy msgid "Certificates" -msgstr "Vrcholy:" +msgstr "Certifikáty" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_resource_picker.cpp @@ -1042,8 +1047,9 @@ msgstr "EiB" #: drivers/gles3/rasterizer_canvas_base_gles3.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp +#, fuzzy msgid "Buffers" -msgstr "" +msgstr "Vyrovnávacà PamÄ›ti" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1065,7 +1071,7 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1144,7 +1150,7 @@ msgstr "" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "Vysoká Kvalita" #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Blend Shape Max Buffer Size (KB)" @@ -4645,6 +4651,7 @@ msgstr "Různé nástroje pro projekt nebo scény." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7576,7 +7583,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15659,18 +15667,19 @@ msgstr "" msgid "Make Local" msgstr "ZmÄ›nit na lokálnÃ" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Název uzlu:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Jméno už je použito jinou funkcÃ/promÄ›nnou/signálem:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Název uzlu:" #: editor/scene_tree_dock.cpp @@ -15868,6 +15877,11 @@ msgid "Button Group" msgstr "Skupina tlaÄÃtek" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Název uzlu:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(PÅ™ipojovánà z)" @@ -15943,6 +15957,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Neplatný název uzlu, následujÃcà znaky nejsou povoleny:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "PÅ™ejmenovat uzel" @@ -17871,6 +17889,21 @@ msgstr "Vyplnit výbÄ›r" msgid "Auto Update Project" msgstr "Nepojmenovaný projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Zobrazit vÅ¡echny" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Vyberte složku" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Vyberte složku" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Konec zásobnÃku trasovánà vnitÅ™nà výjimky" @@ -19742,6 +19775,11 @@ msgstr "Vyjmout uzly" msgid "Custom BG Color" msgstr "Vyjmout uzly" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Rozbalit vÅ¡e" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20596,6 +20634,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Neplatné krátké jméno balÃÄku." diff --git a/editor/translations/da.po b/editor/translations/da.po index 1bb05be6f9..e83ef150e4 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -4697,6 +4697,7 @@ msgstr "Diverse projekt eller scene redskaber." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7636,7 +7637,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15864,18 +15866,19 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Node Navn:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Navnet allerede bruges af en anden func/var/signal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Node Navn:" #: editor/scene_tree_dock.cpp @@ -16083,6 +16086,11 @@ msgstr "Føj til Gruppe" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Node Navn:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Forbindelses fejl" @@ -16147,6 +16155,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -18072,6 +18084,21 @@ msgstr "All selection" msgid "Auto Update Project" msgstr "Eksporter Projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Vis alle" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Vælg en Mappe" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Vælg en Mappe" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19921,6 +19948,11 @@ msgstr "Indsæt Node" msgid "Custom BG Color" msgstr "Indsæt Node" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Udvid alle" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20770,6 +20802,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Ugyldigt navn." diff --git a/editor/translations/de.po b/editor/translations/de.po index aa92914ada..a34395385c 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -83,13 +83,16 @@ # Sajeg <jfx@posteo.de>, 2022. # Tobias Jacobs <tobi@jacobs.rocks>, 2022. # JeremyStarTM <jeremystartm@tuta.io>, 2022. +# Tim <sakul8826@gmail.com>, 2022. +# Anonynonymouse <tom.spaine60388@gmail.com>, 2022. +# Felix Bitsch <felix.a.bitsch@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-31 18:34+0000\n" -"Last-Translator: JeremyStarTM <jeremystartm@tuta.io>\n" +"PO-Revision-Date: 2022-08-30 03:11+0000\n" +"Last-Translator: Felix Bitsch <felix.a.bitsch@gmail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -97,7 +100,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -478,7 +481,7 @@ msgstr "Gedrückt" #: core/os/input_event.cpp msgid "Scancode" -msgstr "Tastencode" +msgstr "Scancode" #: core/os/input_event.cpp msgid "Physical Scancode" @@ -1633,7 +1636,7 @@ msgstr "Methodenaufrufsspurschlüssel hinzufügen" #: editor/animation_track_editor.cpp msgid "Method not found in object:" -msgstr "Methode im Objekt nicht gefunden:" +msgstr "Methode nicht im Objekt gefunden:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -2815,9 +2818,8 @@ msgid "Project export for platform:" msgstr "Projektexport für Plattform:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Fertiggestellt mit Fehlern." +msgstr "Unter Warnungen fertiggestellt." #: editor/editor_export.cpp msgid "Completed successfully." @@ -3501,7 +3503,7 @@ msgstr "Stile" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "Aufzählungstypen" +msgstr "Aufzählungen" #: editor/editor_help.cpp msgid "Property Descriptions" @@ -4564,6 +4566,7 @@ msgstr "Sonstiges Projekt oder szenenübergreifende Werkzeuge." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -5462,7 +5465,7 @@ msgstr "Vorschaubildgröße" #: editor/editor_settings.cpp msgid "Docks" -msgstr "Leisten" +msgstr "Docks" #: editor/editor_settings.cpp msgid "Scene Tree" @@ -5571,7 +5574,7 @@ msgstr "Auswahl ziehen und fallen lassen" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "Im Skript Editor bei ausgewähltem Node bleiben" +msgstr "Im Skript-Editor bei ausgewähltem Node bleiben" #: editor/editor_settings.cpp msgid "Appearance" @@ -7339,7 +7342,8 @@ msgid "8 Bit" msgstr "8-Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -15359,17 +15363,20 @@ msgstr "" msgid "Make Local" msgstr "Lokal machen" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Enable Scene Unique Name(s)" +msgstr "Szenen-eindeutigen Namen aktivieren" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Unique names already used by another node in the scene:" msgstr "" "Ein anderes Node nutzt schon diesen einzigartigen Namen in dieser Szene." #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" -msgstr "Szenen-eindeutigen Namen aktivieren" - -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Szenen-eindeutigen Namen deaktivieren" #: editor/scene_tree_dock.cpp @@ -15569,6 +15576,10 @@ msgid "Button Group" msgstr "Knopf-Gruppe" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Szenen-eindeutigen Namen deaktivieren" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Verbindung von)" @@ -15648,6 +15659,11 @@ msgstr "" "Ungültiger Name für ein Node, die folgenden Zeichen sind nicht gestattet:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" +"Ein anderes Node nutzt schon diesen einzigartigen Namen in dieser Szene." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Node umbenennen" @@ -17427,6 +17443,21 @@ msgstr "Solution bauen" msgid "Auto Update Project" msgstr "Projekt automatisch aktualisieren" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Anzeigename" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Wähle ein Verzeichnis" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Wähle ein Verzeichnis" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Ende des inneren Exception-Stack-Traces" @@ -19192,6 +19223,11 @@ msgstr "Eigene Hintergrundfarbe verwenden" msgid "Custom BG Color" msgstr "Eigene Hintergrundfarbe" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Export-Icon" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19653,8 +19689,8 @@ msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." msgstr "" -"Codesign-Anwendung konnte nicht gestartet werden, stelle sicher dass die " -"Xcode-Kommandozeilen-Tools installiert sind." +"Codesign-Anwendung konnte nicht gestartet werden, bitte sicher stellen dass " +"die Xcode-Kommandozeilen-Hilfsprogramme installiert sind." #: platform/osx/export/export.cpp platform/windows/export/export.cpp msgid "No identity found." @@ -20022,6 +20058,12 @@ msgid "Show Name On Square 310 X 310" msgstr "Zeige Name bei Viereck 310 X 310" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Ungültiger Paket-Kurzname." @@ -20146,21 +20188,19 @@ msgid "Could not find wine executable at \"%s\"." msgstr "Anwendung wine konnte nicht gefunden werden in „%s“." #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start rcedit executable. Configure rcedit path in the Editor " "Settings (Export > Windows > Rcedit), or disable \"Application > Modify " "Resources\" in the export preset." msgstr "" "Anwendung rcedit konnte nicht gestartet werden. Bitte rcedit-Pfad in " -"Editoreinstellungen festlegen (Export > Windows > Rcedit)." +"Editoreinstellungen festlegen (Export > Windows > Rcedit) oder die " +"Einstellung „Application > Modify Resources“ in der Exportvorlage " +"deaktivieren." #: platform/windows/export/export.cpp -#, fuzzy msgid "rcedit failed to modify executable: %s." -msgstr "" -"Modifikation der Anwendung durch rcedit fehlgeschlagen:\n" -"%s" +msgstr "Modifikation der Anwendung durch rcedit fehlgeschlagen: %s." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20179,21 +20219,18 @@ msgid "Invalid timestamp server." msgstr "Ungültiger Zeitstempelserver." #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start signtool executable. Configure signtool path in the Editor " "Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " "export preset." msgstr "" "Anwendung signtool konnte nicht gestartet werden. Bitte signtool-Pfad in " -"Editoreinstellungen festlegen (Export > Windows > Signtool)." +"Editoreinstellungen festlegen (Export > Windows > Signtool) oder Einstellung " +"„Codesign“ in Exportvorlage deaktivieren." #: platform/windows/export/export.cpp -#, fuzzy msgid "Signtool failed to sign executable: %s." -msgstr "" -"Signieren der Anwendung durch Signtool ist fehlgeschlagen:\n" -"%s" +msgstr "Signieren der Anwendung durch Signtool ist fehlgeschlagen: %s." #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 23c58c5ffb..fb76a2c2c7 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -4315,6 +4315,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -6983,7 +6984,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14642,16 +14644,16 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." +#: editor/scene_tree_dock.cpp +msgid "Enable Scene Unique Name(s)" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" msgstr "" #: editor/scene_tree_dock.cpp @@ -14841,6 +14843,10 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -14904,6 +14910,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16677,6 +16687,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18358,6 +18380,10 @@ msgstr "" msgid "Custom BG Color" msgstr "" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19133,6 +19159,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index 4b71ed8528..3ab08f3dbd 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -4612,6 +4612,7 @@ msgstr "Λοιπά ÎÏγα ή εÏγαλεία για όλη τη σκηνή." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "ΈÏγο" @@ -7583,7 +7584,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15791,18 +15793,19 @@ msgstr "" msgid "Make Local" msgstr "Κάνε τοπικό" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Όνομα κόμβου:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Το όνομα χÏησιμοποιείται ήδη από μία άλλη συνάÏτηση/μεταβλητή/σήμα:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Όνομα κόμβου:" #: editor/scene_tree_dock.cpp @@ -16006,6 +16009,11 @@ msgid "Button Group" msgstr "Ομαδοποίηση Κουμπιών" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Όνομα κόμβου:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Πηγή ΣÏνδεση)" @@ -16081,6 +16089,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "ΆκυÏο όνομα κόμβου, οι ακόλουθοι χαÏακτήÏες δεν επιτÏÎπονται:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Μετονομασία κόμβου" @@ -18019,6 +18031,21 @@ msgstr "ΓÎμισμα Επιλογής" msgid "Auto Update Project" msgstr "Ανώνυμο ÎÏγο" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Εμφάνιση όλων" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "ΕπιλÎξτε Îνα λεξικό" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "ΕπιλÎξτε Îνα λεξικό" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "ΤÎλος ιχνηλάτησης στοίβας εσωτεÏικής εξαίÏεσης" @@ -19913,6 +19940,11 @@ msgstr "Αποκοπή κόμβων" msgid "Custom BG Color" msgstr "Αποκοπή κόμβων" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Ανάπτυξη Όλων" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20769,6 +20801,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "ΆκυÏο σÏντομο όνομα πακÎτου." diff --git a/editor/translations/en_Shaw.po b/editor/translations/en_Shaw.po index 361c10ce1a..63ce9ca3d5 100644 --- a/editor/translations/en_Shaw.po +++ b/editor/translations/en_Shaw.po @@ -4341,6 +4341,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7028,7 +7029,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14704,18 +14706,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ð‘—ð‘±ð‘¯ð‘¡ ð‘¨ð‘¯ð‘¦ð‘¥ð‘±ð‘–ð‘©ð‘¯ ð‘¤ð‘§ð‘™ð‘’ð‘”" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "ð‘—ð‘±ð‘¯ð‘¡ ð‘¨ð‘¯ð‘¦ð‘¥ð‘±ð‘–ð‘©ð‘¯ ð‘¤ð‘§ð‘™ð‘’ð‘”" #: editor/scene_tree_dock.cpp @@ -14905,6 +14907,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ð‘—ð‘±ð‘¯ð‘¡ ð‘¨ð‘¯ð‘¦ð‘¥ð‘±ð‘–ð‘©ð‘¯ ð‘¤ð‘§ð‘™ð‘’ð‘”" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -14968,6 +14975,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16747,6 +16758,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18443,6 +18466,11 @@ msgstr "ð‘“ð‘³ð‘™ð‘’ð‘–ð‘©ð‘¯ð‘Ÿ:" msgid "Custom BG Color" msgstr "ð‘“ð‘³ð‘™ð‘’ð‘–ð‘©ð‘¯ð‘Ÿ:" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "3-ð‘› ð‘‘ð‘®ð‘¨ð‘¯ð‘•ð‘“ð‘¹ð‘¥ ð‘‘ð‘®ð‘¨ð‘’" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19229,6 +19257,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 0139382972..2bcbc62274 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-03 02:51+0000\n" +"PO-Revision-Date: 2022-08-21 06:01+0000\n" "Last-Translator: Kedr <lava20121991@gmail.com>\n" "Language-Team: Esperanto <https://hosted.weblate.org/projects/godot-engine/" "godot/eo/>\n" @@ -27,12 +27,11 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp -#, fuzzy msgid "Tablet Driver" -msgstr "Pelilo de tabulo" +msgstr "Pelilo de e-tabulo" #: core/bind/core_bind.cpp msgid "Clipboard" @@ -72,14 +71,12 @@ msgid "Keep Screen On" msgstr "" #: core/bind/core_bind.cpp -#, fuzzy msgid "Min Window Size" -msgstr "Grando de konturo:" +msgstr "Minimuma fenestra grando" #: core/bind/core_bind.cpp -#, fuzzy msgid "Max Window Size" -msgstr "Grando de konturo:" +msgstr "Maksimuma fenestra grando" #: core/bind/core_bind.cpp #, fuzzy @@ -138,9 +135,8 @@ msgstr "Pozicio de doko" #: scene/resources/primitive_meshes.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp -#, fuzzy msgid "Size" -msgstr "Grando: " +msgstr "Grando" #: core/bind/core_bind.cpp msgid "Endian Swap" @@ -166,9 +162,8 @@ msgid "Target FPS" msgstr "Celo" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "Skalo:" +msgstr "Skalo de tempo" #: core/bind/core_bind.cpp main/main.cpp #, fuzzy @@ -180,14 +175,12 @@ msgid "Error" msgstr "" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "Eraro dum movado de:" +msgstr "Literĉeno de eraro" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error Line" -msgstr "Eraro dum movado de:" +msgstr "Lineo de eraroj" #: core/bind/core_bind.cpp #, fuzzy @@ -221,9 +214,8 @@ msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Funkcioj:" +msgstr "Funkcio" #: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp @@ -240,14 +232,12 @@ msgid "Network" msgstr "Reta Profililo" #: core/io/file_access_network.cpp -#, fuzzy msgid "Remote FS" -msgstr "Fora " +msgstr "Fora DS" #: core/io/file_access_network.cpp -#, fuzzy msgid "Page Size" -msgstr "PaÄo: " +msgstr "Grando de paÄo" #: core/io/file_access_network.cpp msgid "Page Read Ahead" @@ -285,9 +275,8 @@ msgid "Network Peer" msgstr "Reta Profililo" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp -#, fuzzy msgid "Root Node" -msgstr "Krei radikan nodon:" +msgstr "Radika nodo" #: core/io/networked_multiplayer_peer.cpp #, fuzzy @@ -328,9 +317,8 @@ msgid "Blocking Handshake" msgstr "" #: core/io/udp_server.cpp -#, fuzzy msgid "Max Pending Connections" -msgstr "Redakti Konekton:" +msgstr "Maksimuma kvanto de atendeblaj konektoj" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -475,9 +463,8 @@ msgid "Factor" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Button Index" -msgstr "Indekso de musbutono:" +msgstr "Indekso de butono" #: core/os/input_event.cpp msgid "Doubleclick" @@ -505,9 +492,8 @@ msgstr "Kapti relative" #: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/resources/environment.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed" -msgstr "Skalo:" +msgstr "Rapideco" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: scene/3d/sprite_3d.cpp @@ -520,9 +506,8 @@ msgid "Axis Value" msgstr "(valoro)" #: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Index" -msgstr "Indekso:" +msgstr "Indekso" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -550,9 +535,8 @@ msgid "Message" msgstr "ÅœanÄu" #: core/os/input_event.cpp -#, fuzzy msgid "Pitch" -msgstr "Skalo:" +msgstr "Alteco" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp @@ -565,9 +549,8 @@ msgid "Instrument" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Controller Number" -msgstr "Lineo-Numeron:" +msgstr "Numero de kontrolilo" #: core/os/input_event.cpp msgid "Controller Value" @@ -586,9 +569,8 @@ msgid "Config" msgstr "Agordi kapton" #: core/project_settings.cpp -#, fuzzy msgid "Project Settings Override" -msgstr "Projektaj agordoj..." +msgstr "Redifino de projekta agordoj" #: core/project_settings.cpp core/resource.cpp #: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp @@ -683,9 +665,8 @@ msgid "Audio" msgstr "AÅdio" #: core/project_settings.cpp -#, fuzzy msgid "Default Bus Layout" -msgstr "Åœargi la defaÅlta busaranÄo." +msgstr "BusaranÄo je defaÅlto" #: core/project_settings.cpp editor/editor_export.cpp #: editor/editor_file_system.cpp editor/editor_node.cpp @@ -695,14 +676,12 @@ msgid "Editor" msgstr "Redaktilo" #: core/project_settings.cpp -#, fuzzy msgid "Main Run Args" -msgstr "Parametroj de ĉefa sceno:" +msgstr "Bazaj parametroj de lanĉo" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "Scena dosierindiko:" +msgstr "Nomado de scenoj" #: core/project_settings.cpp msgid "Search In File Extensions" @@ -733,9 +712,8 @@ msgid "UI Accept" msgstr "" #: core/project_settings.cpp -#, fuzzy msgid "UI Select" -msgstr "Elekti" +msgstr "UI Elekti" #: core/project_settings.cpp #, fuzzy @@ -772,9 +750,8 @@ msgid "UI Down" msgstr "ElÅuta" #: core/project_settings.cpp -#, fuzzy msgid "UI Page Up" -msgstr "PaÄo: " +msgstr "UI paÄon supren" #: core/project_settings.cpp msgid "UI Page Down" @@ -825,9 +802,8 @@ msgstr "Krei fratan triangulo-maÅan kolizifiguron" #: modules/lightmapper_cpu/register_types.cpp scene/main/scene_tree.cpp #: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Rendering" -msgstr "Bildigilo:" +msgstr "Bildigo" #: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -842,9 +818,8 @@ msgstr "" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "Filtriloj:" +msgstr "Filtriloj" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" @@ -925,9 +900,8 @@ msgid "TCP" msgstr "" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "Konektoj al metodo:" +msgstr "Atendtempo de konekto en sekundoj" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -1099,9 +1073,8 @@ msgstr "" #: scene/animation/animation_blend_tree.cpp scene/gui/control.cpp #: scene/main/canvas_layer.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Scale" -msgstr "Skalo:" +msgstr "Skalo" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Follow Surface" @@ -1150,11 +1123,11 @@ msgstr "Enmetu Ålosilon ĉi tien" #: editor/animation_bezier_editor.cpp msgid "Duplicate Selected Key(s)" -msgstr "Duplikati Elektita(j)n Åœlosilo(j)n" +msgstr "Duplikati elektita(j)n Ålosilo(j)n" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" -msgstr "Forigi Elektita(j)n Åœlosilo(j)n" +msgstr "Forigi elektita(j)n Ålosilo(j)n" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" @@ -1215,9 +1188,8 @@ msgstr "Lokaĵigado" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "Rotacia paÅo:" +msgstr "Rotacio" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp @@ -1259,14 +1231,12 @@ msgid "Stream" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "Krada deÅovo:" +msgstr "Komenca deÅovo" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "Krada deÅovo:" +msgstr "Fina deÅovo" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1389,14 +1359,12 @@ msgid "Remove this track." msgstr "Forigi ĉi tiun trakon." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "Fojo (s): " +msgstr "Tempo (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "Pozicio de doko" +msgstr "Pozicio:" #: editor/animation_track_editor.cpp #, fuzzy @@ -1418,9 +1386,8 @@ msgid "Type:" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "Nevalida kromprogramo." +msgstr "(Nevalida, atendebla tipo: %s)" #: editor/animation_track_editor.cpp #, fuzzy @@ -1442,9 +1409,8 @@ msgid "Stream:" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "Komenci" +msgstr "Komenco (s):" #: editor/animation_track_editor.cpp #, fuzzy @@ -1669,9 +1635,8 @@ msgid "Add Method Track Key" msgstr "Aldoni metodan trakan Ålosilon" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" -msgstr "Metodon ne trovis en objekto: " +msgstr "En objekto ne estas tia metodo:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -1746,11 +1711,11 @@ msgstr "Averto: Redaktanti importis animadon" #: editor/animation_track_editor.cpp msgid "Select an AnimationPlayer node to create and edit animations." -msgstr "Elektu AnimationPlayer-a nodo por krei kaj redakti animadojn." +msgstr "Elektu AnimationPlayer-nodon por krei kaj redakti animaciojn." #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." -msgstr "Nur vidigi trakojn el elektitajn nodojn en la arbo." +msgstr "Vidigi trakojn nur el elektitajn nodojn en la arbo." #: editor/animation_track_editor.cpp msgid "Group tracks by node or display them as plain list." @@ -1906,7 +1871,7 @@ msgstr "Kopii" #: editor/animation_track_editor.cpp msgid "Select All/None" -msgstr "Elekti Ĉiuj/Neniuj" +msgstr "Elekti Ĉiujn/Neniujn" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -2578,7 +2543,7 @@ msgstr "Solo" #: editor/editor_audio_buses.cpp msgid "Mute" -msgstr "Mute" +msgstr "Surdigi" #: editor/editor_audio_buses.cpp msgid "Bypass" @@ -2642,9 +2607,8 @@ msgid "There is no '%s' file." msgstr "Estas neniu dosiero '%s'." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "AranÄo" +msgstr "AranÄo:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2818,7 +2782,7 @@ msgstr "[ne konservis]" #: editor/editor_dir_dialog.cpp msgid "Please select a base directory first." -msgstr "Bonvolu selekti bazan dosierujon unue." +msgstr "Bonvolu elektu bazan dosierujon." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -2852,19 +2816,16 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Kopii elektaron" +msgstr "Finite kun eraroj." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "Pakaĵo instalis sukcese!" +msgstr "Finite sen eraroj." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "Eraris:" +msgstr "Malsukcesis." #: editor/editor_export.cpp msgid "Storing File:" @@ -2889,14 +2850,12 @@ msgid "Cannot create file \"%s\"." msgstr "Ne povis krei dosierujon." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Ne eble komencas subprocezon!" +msgstr "Malsukcesis eksporti dosierojn de projekto." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "Ne malfermeblas dosieron por skribi:" +msgstr "Ne malfermeblas dosieron por legado el vojo \"%s\"." #: editor/editor_export.cpp #, fuzzy @@ -3024,9 +2983,8 @@ msgid "Custom release template not found." msgstr "Propra eldona Åablono ne trovitis." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "Åœablono:" +msgstr "Pretigi Åablonon" #: editor/editor_export.cpp platform/osx/export/export.cpp #, fuzzy @@ -3034,9 +2992,8 @@ msgid "The given export path doesn't exist." msgstr "La provizinta dosierindiko ne ekzistas." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "Åœablonan dosieron ne trovis:" +msgstr "Åœablona dosiero ne troviÄas: \"%s\"." #: editor/editor_export.cpp #, fuzzy @@ -3107,8 +3064,7 @@ msgid "" "Allows to work with signals and groups of the node selected in the Scene " "dock." msgstr "" -"Permesas labori la signalojn kaj la grupojn de la nodo elektitas en la Sceno-" -"doko." +"Permesas labori kun signaloj kaj grupoj de la elektita nodo en sceno-panelo." #: editor/editor_feature_profile.cpp msgid "Allows to browse the local file system via a dedicated dock." @@ -3132,7 +3088,7 @@ msgstr "(nenio)" #: editor/editor_feature_profile.cpp msgid "Remove currently selected profile, '%s'? Cannot be undone." -msgstr "Forigi aktuale elektitan profilon '%s'? Ne malfareblas." +msgstr "Forigi kurantan elektitan profilon '%s'? Ne malfareblas." #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -3266,7 +3222,7 @@ msgstr "Profilo de funkciaro de Godot" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" -msgstr "Elekti aktualan dosierujon" +msgstr "Elekti kurantan dosierujon" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File exists, overwrite?" @@ -3334,14 +3290,12 @@ msgid "Save a File" msgstr "Konservi dosieron" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Access" -msgstr "Sukceso!" +msgstr "Atingo" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp -#, fuzzy msgid "Display Mode" -msgstr "ReÄimo de ludado:" +msgstr "ReÄimo de montro" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3359,19 +3313,16 @@ msgid "Mode" msgstr "Panoramada reÄimo" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Dir" -msgstr "Aktuala profilo:" +msgstr "Kuranta dosierujo" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current File" -msgstr "Aktuala profilo:" +msgstr "Kuranta dosiero" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Path" -msgstr "Aktuala profilo:" +msgstr "Kuranta vojo" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp @@ -4475,9 +4426,8 @@ msgid "Inspector" msgstr "Inspektoro" #: editor/editor_node.cpp -#, fuzzy msgid "Default Property Name Style" -msgstr "Projekta vojo:" +msgstr "DefaÅlta stilo de eca nomo" #: editor/editor_node.cpp msgid "Default Float Step" @@ -4623,6 +4573,7 @@ msgstr "Diversa projekto aÅ tut-scenaj iloj." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekto" @@ -4889,9 +4840,8 @@ msgid "Play Custom Scene" msgstr "Ludi laÅmendan scenon" #: editor/editor_node.cpp -#, fuzzy msgid "Changing the video driver requires restarting the editor." -msgstr "ÅœanÄanto de la videa pelilo postulas rekomenci la redaktilon." +msgstr "Por ÅanÄo de videopelilo, necesas restarto de redaktilo." #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp @@ -4941,7 +4891,7 @@ msgstr "Instali el dosiero" #: editor/editor_node.cpp msgid "Select android sources file" -msgstr "" +msgstr "Elekti Android dosieron de risurcoj" #: editor/editor_node.cpp msgid "" @@ -5021,9 +4971,8 @@ msgid "Select" msgstr "Elekti" #: editor/editor_node.cpp -#, fuzzy msgid "Select Current" -msgstr "Elekti aktualan dosierujon" +msgstr "Elekti kurantan" #: editor/editor_node.cpp msgid "Open 2D Editor" @@ -5091,9 +5040,8 @@ msgstr "Äœisdatigi" #: editor/editor_plugin_settings.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/export/export.cpp -#, fuzzy msgid "Version" -msgstr "Versio:" +msgstr "Versio" #: editor/editor_plugin_settings.cpp #, fuzzy @@ -5230,14 +5178,12 @@ msgstr "Elektinta nodo ne estas Viewport!" #: editor/editor_properties_array_dict.cpp #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Size:" -msgstr "Grando: " +msgstr "Grando" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "Page:" -msgstr "PaÄo: " +msgstr "PaÄo" #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -5324,9 +5270,8 @@ msgid "Extend Script" msgstr "Etendi skripton" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Script Owner" -msgstr "Nomo de skripto:" +msgstr "Posedanto de scenaro" #: editor/editor_run_native.cpp msgid "" @@ -5502,14 +5447,12 @@ msgid "Directories" msgstr "Direktoj" #: editor/editor_settings.cpp -#, fuzzy msgid "Autoscan Project Path" -msgstr "Projekta vojo:" +msgstr "Vojo de projektaj aÅtoskano" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Project Path" -msgstr "Projekta vojo:" +msgstr "Projekta vojo defaÅlte" #: editor/editor_settings.cpp #, fuzzy @@ -5530,9 +5473,8 @@ msgid "File Dialog" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Thumbnail Size" -msgstr "Bildeto..." +msgstr "Grando de miniaturoj" #: editor/editor_settings.cpp msgid "Docks" @@ -5666,14 +5608,12 @@ msgid "Appearance" msgstr "" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Show Line Numbers" -msgstr "Lineo-Numeron:" +msgstr "Aperigi numeroj de literĉenoj" #: editor/editor_settings.cpp -#, fuzzy msgid "Line Numbers Zero Padded" -msgstr "Lineo-Numeron:" +msgstr "Numeroj de literĉenoj kun nulaj plenigiloj" #: editor/editor_settings.cpp msgid "Show Bookmark Gutter" @@ -5842,9 +5782,8 @@ msgid "Pick Distance" msgstr "Elektu ĉefan scenon" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Preview Size" -msgstr "AntaÅrigardo:" +msgstr "Grando de antaÅrigardo" #: editor/editor_settings.cpp msgid "Primary Grid Color" @@ -5891,14 +5830,12 @@ msgid "Shape" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Primary Grid Steps" -msgstr "Krada paÅo:" +msgstr "Bazaj paÅoj de krado" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid Size" -msgstr "Krada paÅo:" +msgstr "Grando de krado" #: editor/editor_settings.cpp msgid "Grid Division Level Max" @@ -6073,9 +6010,8 @@ msgid "Bone Color 2" msgstr "Renomi nodon" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Selected Color" -msgstr "Agordi elektitan profilon:" +msgstr "Koloro de elektita osto" #: editor/editor_settings.cpp msgid "Bone IK Color" @@ -6086,9 +6022,8 @@ msgid "Bone Outline Color" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Outline Size" -msgstr "Grando de konturo:" +msgstr "Grando de osta konturo" #: editor/editor_settings.cpp msgid "Viewport Border Color" @@ -6181,9 +6116,8 @@ msgid "Auto Save" msgstr "Ne konservi" #: editor/editor_settings.cpp -#, fuzzy msgid "Save Before Running" -msgstr "Konservu scenon antaÅ ruloto..." +msgstr "Konservi antaÅ lanĉo" #: editor/editor_settings.cpp msgid "Font Size" @@ -6191,9 +6125,8 @@ msgstr "" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Host" -msgstr "Fora " +msgstr "Fora retnodo" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp @@ -6226,9 +6159,8 @@ msgstr "Mastrumilo de Projektoj" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp -#, fuzzy msgid "Sorting Order" -msgstr "Renomas dosierujon:" +msgstr "Ordo de disspecigo" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" @@ -6260,9 +6192,8 @@ msgid "Comment Color" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "String Color" -msgstr "Memoras dosieron:" +msgstr "Koloro de literĉeno" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp @@ -6298,14 +6229,12 @@ msgid "Text Color" msgstr "Elekti koloron" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Number Color" -msgstr "Lineo-Numeron:" +msgstr "Koloro de lineaj numeroj" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Safe Line Number Color" -msgstr "Lineo-Numeron:" +msgstr "Koloro de senriskaj lineaj je numeroj" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" @@ -6348,9 +6277,8 @@ msgid "Number Color" msgstr "" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Function Color" -msgstr "Funkcioj:" +msgstr "Koloro de funkcio" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6408,9 +6336,8 @@ msgid "Hide Slider" msgstr "Videblaj koliziaj formoj" #: editor/editor_sub_scene.cpp -#, fuzzy msgid "Select Node(s) to Import" -msgstr "Selektu nodo(j)n por enporti" +msgstr "Elektu nodo(j)n por importado" #: editor/editor_sub_scene.cpp editor/project_manager.cpp msgid "Browse" @@ -7556,7 +7483,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15556,18 +15484,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nomo de nodo:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nomo de nodo:" #: editor/scene_tree_dock.cpp @@ -15765,6 +15693,11 @@ msgid "Button Group" msgstr "Grupo de butono" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nomo de nodo:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Konektas el)" @@ -15840,6 +15773,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Malvalida nomo de nodo, la jenaj signoj ne permesas:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renomi nodon" @@ -17745,6 +17682,21 @@ msgstr "" msgid "Auto Update Project" msgstr "Sennoma projekto" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Vidigi tutan" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Elekti dosierujon" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Elekti dosierujon" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19572,6 +19524,11 @@ msgstr "Eltondi nodo(j)n" msgid "Custom BG Color" msgstr "Eltondi nodo(j)n" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Etendi tuton" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20419,6 +20376,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Nevalida grupa nomo." diff --git a/editor/translations/es.po b/editor/translations/es.po index 173b195cc4..2788483a33 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -85,12 +85,16 @@ # Angel Andrade <aandradeb99@gmail.com>, 2022. # Juan Felipe Gómez López <juanfgomez0912@gmail.com>, 2022. # Pineappletooth <yochank003@gmail.com>, 2022. +# David A. Rodas S. <woshianima@gmail.com>, 2022. +# Fernando Joaquin Manzano Lopez <ticantin12@gmail.com>, 2022. +# M3CG <cgmario1999@gmail.com>, 2022. +# Chalan <Valentin06ch@outlook.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-05 01:04+0000\n" +"PO-Revision-Date: 2022-09-07 21:02+0000\n" "Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" @@ -99,7 +103,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -478,7 +482,7 @@ msgstr "FÃsica" #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Pressed" -msgstr "Preset" +msgstr "Presionado" #: core/os/input_event.cpp msgid "Scancode" @@ -601,11 +605,11 @@ msgstr "Valor del Controlador" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp msgid "Application" -msgstr "Aplicação" +msgstr "Aplicación" #: core/project_settings.cpp main/main.cpp msgid "Config" -msgstr "Configuração" +msgstr "Configuración" #: core/project_settings.cpp msgid "Project Settings Override" @@ -652,11 +656,11 @@ msgstr "Desactivar stderr" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "Utilizar el Directorio de Datos Ocultos del Proyecto" +msgstr "Usar Directorio de Datos Ocultos del Proyecto" #: core/project_settings.cpp msgid "Use Custom User Dir" -msgstr "Utilizar Directorio de Usuario Personalizado" +msgstr "Usar Directorio de Usuario Personalizado" #: core/project_settings.cpp msgid "Custom User Dir Name" @@ -702,7 +706,7 @@ msgstr "Audio" #: core/project_settings.cpp msgid "Default Bus Layout" -msgstr "Layout de Bus por Defecto" +msgstr "Layout de Bus Predeterminado" #: core/project_settings.cpp editor/editor_export.cpp #: editor/editor_file_system.cpp editor/editor_node.cpp @@ -966,7 +970,7 @@ msgstr "Idioma" #: core/translation.cpp msgid "Test" -msgstr "Probar" +msgstr "Test" #: core/translation.cpp scene/resources/font.cpp msgid "Fallback" @@ -1239,11 +1243,11 @@ msgstr "Stream" #: editor/animation_track_editor.cpp msgid "Start Offset" -msgstr "Desplazamiento de Inicio" +msgstr "Offset de Inicio" #: editor/animation_track_editor.cpp msgid "End Offset" -msgstr "Desplazamiento Final" +msgstr "Offset Final" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1700,12 +1704,12 @@ msgstr "" "Esta animación pertenece a una escena importada, por lo que los cambios en " "las pistas importadas no se guardarán.\n" "\n" -"Para habilitar la capacidad de añadir pistas personalizadas, ve a la " +"Para habilitar la posibilidad de añadir pistas personalizadas, ve a la " "configuración de importación de la escena y establece\n" -"\"Animation > Storage\" a \"Files\", activa \"Animation > Keep Custom " -"Tracks\", y luego reimporta.\n" -"También puedes usar un preset de importación que importa animaciones para " -"separar archivos." +"\"Animación > Almacenamiento\" a \"Archivos\", active \"Animación > Mantener " +"Pistas Personalizadas\", y vuelve a importar.\n" +"Como alternativa, utiliza un preset de importación que importe las " +"animaciones a archivos separados." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" @@ -1791,7 +1795,7 @@ msgstr "Ir al Paso Anterior" #: editor/animation_track_editor.cpp msgid "Apply Reset" -msgstr "Aplicar Restablecer" +msgstr "Aplicar Reset" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -2649,11 +2653,11 @@ msgstr "Guardar este Bus Layout a un archivo." #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" -msgstr "Cargar Valores por Defecto" +msgstr "Cargar Valores Predeterminados" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "Cargar el Bus Layout predeterminado." +msgstr "Cargue el Layout del Bus predeterminado." #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." @@ -2689,7 +2693,7 @@ msgstr "No debe coincidir con una constante global existente." #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "La palabra clave no se puede utilizar como nombre de autoload." +msgstr "La palabra clave no se puede usar como nombre de autoload." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" @@ -2817,9 +2821,8 @@ msgid "Project export for platform:" msgstr "Exportar proyecto para la plataforma:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Completado con errores." +msgstr "Completado con advertencias." #: editor/editor_export.cpp msgid "Completed successfully." @@ -3150,7 +3153,7 @@ msgstr "Error al guardar el perfil en la ruta: '%s'." #: editor/editor_feature_profile.cpp msgid "Reset to Default" -msgstr "Restablecer Valores por Defecto" +msgstr "Restablecer Valores Predeterminados" #: editor/editor_feature_profile.cpp msgid "Current Profile:" @@ -3221,7 +3224,7 @@ msgstr "Administrar Perfiles de CaracterÃsticas del Editor" #: editor/editor_feature_profile.cpp msgid "Default Feature Profile" -msgstr "Perfil de CaracterÃsticas por Defecto" +msgstr "Perfil de CaracterÃsticas Predeterminado" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -3920,9 +3923,9 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" -"Layout por defecto del editor sobreescrita.\n" -"Para recuperar el layout por defecto, utiliza la opción Eliminar Layout y " -"borra el Layout por defecto." +"Layout por defecto del editor anulado.\n" +"Para recuperar el layout predeterminado, utiliza la opción Eliminar Layout y " +"borra el layout Predeterminado." #: editor/editor_node.cpp msgid "Layout name not found!" @@ -3930,7 +3933,7 @@ msgstr "¡Nombre de layout no encontrado!" #: editor/editor_node.cpp msgid "Restored the Default layout to its base settings." -msgstr "Se restauró el diseño por defecto a su configuración básica." +msgstr "Se restauró el diseño predeterminado a su configuración básica." #: editor/editor_node.cpp msgid "" @@ -4282,7 +4285,7 @@ msgstr "Eliminar Layout" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "Por defecto" +msgstr "Predeterminado" #: editor/editor_node.cpp editor/editor_resource_picker.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp @@ -4415,11 +4418,11 @@ msgstr "Inspector" #: editor/editor_node.cpp msgid "Default Property Name Style" -msgstr "Estilo por Defecto del Nombrado de Propiedades" +msgstr "Estilo del nombre de la Propiedad Predeterminada" #: editor/editor_node.cpp msgid "Default Float Step" -msgstr "Escalonado de Flotantes por Defecto" +msgstr "Escalonado de Flotantes Predeterminado" #: editor/editor_node.cpp scene/gui/tree.cpp msgid "Disable Folding" @@ -4447,7 +4450,7 @@ msgstr "Recursos Para Abrir En Nuevo Inspector" #: editor/editor_node.cpp msgid "Default Color Picker Mode" -msgstr "Modo De Selección De Color Por Defecto" +msgstr "Modo de Selección de Color Predeterminado" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -4557,6 +4560,7 @@ msgstr "Herramientas variadas de proyecto o escena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proyecto" @@ -4617,8 +4621,8 @@ msgstr "" "Cuando esta opción está activada, al utilizar el despliegue con un clic, el " "ejecutable intentará conectarse a la IP de este equipo para que el proyecto " "en ejecución pueda ser depurado.\n" -"Esta opción está pensada para ser usada en la depuración remota " -"( normalmente con un dispositivo móvil).\n" +"Esta opción está pensada para ser usada en la depuración remota (normalmente " +"con un dispositivo móvil).\n" "No es necesario habilitarla para usar el depurador GDScript localmente." #: editor/editor_node.cpp @@ -5435,7 +5439,7 @@ msgstr "Autoescaneo de la Ruta del Proyecto" #: editor/editor_settings.cpp msgid "Default Project Path" -msgstr "Ruta del Proyecto por Defecto" +msgstr "Ruta del Proyecto Predeterminada" #: editor/editor_settings.cpp msgid "On Save" @@ -5702,7 +5706,7 @@ msgstr "Colocar Tooltip de Llamada Debajo de la LÃnea Actual" #: editor/editor_settings.cpp msgid "Callhint Tooltip Offset" -msgstr "Desplazamiento del Tooltip de Llamada" +msgstr "Offset del Tooltip de Llamada" #: editor/editor_settings.cpp msgid "Complete File Paths" @@ -5714,7 +5718,7 @@ msgstr "Añadir Sugerencias de Tipo" #: editor/editor_settings.cpp msgid "Use Single Quotes" -msgstr "Utilizar Comillas Simples" +msgstr "Usar Comillas Simples" #: editor/editor_settings.cpp msgid "Show Help Index" @@ -5818,19 +5822,19 @@ msgstr "CuadrÃcula Plano YZ" #: editor/editor_settings.cpp msgid "Default FOV" -msgstr "Campo de Visión por Defecto" +msgstr "FOV Predeterminado" #: editor/editor_settings.cpp msgid "Default Z Near" -msgstr "Z Cercana por Defecto" +msgstr "Z Cercano Predeterminado" #: editor/editor_settings.cpp msgid "Default Z Far" -msgstr "Z Lejana por Defecto" +msgstr "Z Lejano Predeterminado" #: editor/editor_settings.cpp msgid "Lightmap Baking Number Of CPU Threads" -msgstr "Número de hilos de la CPU para el Lightmap Baking" +msgstr "Número de Hilos de la CPU para el Lightmap Baking" #: editor/editor_settings.cpp msgid "Navigation Scheme" @@ -6002,7 +6006,7 @@ msgstr "Crear Pistas Bézier Predeterminadas" #: editor/editor_settings.cpp msgid "Default Create Reset Tracks" -msgstr "Crear Pistas de Reinicio por Defecto" +msgstr "Crear Pistas de Reinicio Predeterminado" #: editor/editor_settings.cpp msgid "Onion Layers Past Color" @@ -6118,7 +6122,7 @@ msgstr "Color de los Comentarios" #: editor/editor_settings.cpp msgid "String Color" -msgstr "Color de Cadena" +msgstr "Color del String" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp @@ -6176,7 +6180,7 @@ msgstr "Color de Selección" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Brace Mismatch Color" -msgstr "" +msgstr "Color de Corchetes Incompletos" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Current Line Color" @@ -6184,7 +6188,7 @@ msgstr "Color de LÃnea Actual" #: editor/editor_settings.cpp msgid "Line Length Guideline Color" -msgstr "" +msgstr "Color de GuÃa de la LÃnea de Longitud" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Word Highlighted Color" @@ -6192,11 +6196,11 @@ msgstr "Color de la Palabra Resaltada" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Number Color" -msgstr "Número del Color" +msgstr "Color del Número" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Function Color" -msgstr "Función Color" +msgstr "Color de la Función" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Member Variable Color" @@ -6212,15 +6216,15 @@ msgstr "Color del Marcador" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Breakpoint Color" -msgstr "Puntos de Interrupción" +msgstr "Color de Puntos de Interrupción" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Executing Line Color" -msgstr "Color de la lÃnea de ejecución" +msgstr "Color de la lÃnea en ejecución" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Code Folding Color" -msgstr "" +msgstr "Color del Código Plegado" #: editor/editor_settings.cpp msgid "Search Result Color" @@ -6246,7 +6250,7 @@ msgstr "Ocultar Deslizador" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" -msgstr "Selecciona nodo(s) a importar" +msgstr "Seleccione nodo(s) a importar" #: editor/editor_sub_scene.cpp editor/project_manager.cpp msgid "Browse" @@ -6279,7 +6283,7 @@ msgstr "No hay espejos disponibles." #: editor/export_template_manager.cpp msgid "Retrieving the mirror list..." -msgstr "Recuperar la lista de espejos..." +msgstr "Recuperar el listado de mirrors..." #: editor/export_template_manager.cpp msgid "Starting the download..." @@ -6291,7 +6295,7 @@ msgstr "Error al solicitar la URL:" #: editor/export_template_manager.cpp msgid "Connecting to the mirror..." -msgstr "Conectando con el espejo..." +msgstr "Conectando con el mirror..." #: editor/export_template_manager.cpp msgid "Can't resolve the requested address." @@ -6299,11 +6303,11 @@ msgstr "No se puede resolver la dirección solicitada." #: editor/export_template_manager.cpp msgid "Can't connect to the mirror." -msgstr "No se puede conectar al espejo." +msgstr "No se puede conectar con el mirror." #: editor/export_template_manager.cpp msgid "No response from the mirror." -msgstr "No hay respuesta del espejo." +msgstr "No hay respuesta del mirror." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -6320,7 +6324,7 @@ msgstr "Petición fallida:" #: editor/export_template_manager.cpp msgid "Download complete; extracting templates..." -msgstr "Descarga completa; extracción de plantillas..." +msgstr "Descarga completa; extrayendo plantillas..." #: editor/export_template_manager.cpp msgid "Cannot remove temporary file:" @@ -6336,17 +6340,17 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Error getting the list of mirrors." -msgstr "Error al obtener la lista de espejos." +msgstr "Error al obtener el listado de mirrors." #: editor/export_template_manager.cpp msgid "Error parsing JSON with the list of mirrors. Please report this issue!" msgstr "" -"Error al analizar el JSON con la lista de espejos ¡Por favor, reporta este " +"Error al leer el JSON con la lista de mirrors ¡Por favor, informa de este " "problema!" #: editor/export_template_manager.cpp msgid "Best available mirror" -msgstr "El mejor espejo disponible" +msgstr "Mejor mirror disponible" #: editor/export_template_manager.cpp msgid "" @@ -6540,7 +6544,7 @@ msgstr "" #: editor/fileserver/editor_file_server.cpp msgid "File Server" -msgstr "" +msgstr "Servidor de Archivos" #: editor/fileserver/editor_file_server.cpp #: editor/plugins/version_control_editor_plugin.cpp @@ -6913,11 +6917,11 @@ msgstr "Administrar Grupos" #: editor/import/editor_import_collada.cpp msgid "Collada" -msgstr "" +msgstr "Collada" #: editor/import/editor_import_collada.cpp msgid "Use Ambient" -msgstr "" +msgstr "Usar Ambiente" #: editor/import/resource_importer_bitmask.cpp msgid "Create From" @@ -6926,7 +6930,7 @@ msgstr "Crear Desde" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp msgid "Threshold" -msgstr "" +msgstr "Umbral" #: editor/import/resource_importer_csv_translation.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -7011,7 +7015,7 @@ msgstr "Escalar Mesh" #: editor/import/resource_importer_obj.cpp msgid "Offset Mesh" -msgstr "Offset de Malla" +msgstr "Offset de Mesh" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp @@ -7089,7 +7093,7 @@ msgstr "Almacenamiento" #: editor/import/resource_importer_scene.cpp msgid "Use Legacy Names" -msgstr "" +msgstr "Usar Nombres Heredados" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Materials" @@ -7117,7 +7121,7 @@ msgstr "Tamaño Lightmap Texel" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Skins" -msgstr "" +msgstr "Skins" #: editor/import/resource_importer_scene.cpp msgid "Use Named Skins" @@ -7129,7 +7133,7 @@ msgstr "Archivos Externos" #: editor/import/resource_importer_scene.cpp msgid "Store In Subdir" -msgstr "" +msgstr "Guardar en el Subdirectorio" #: editor/import/resource_importer_scene.cpp msgid "Filter Script" @@ -7231,16 +7235,21 @@ msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" +"%s: Textura detectada siendo usada como mapa de normales en 3D. Activando la " +"compresión de la textura rojo-verde para reducir el uso de memoria (el canal " +"azul se descarta)." #: editor/import/resource_importer_texture.cpp msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s: Textura detectada siendo usada en 3D. Activando el filtro, la " +"repetición, la generación de mipmaps y la compresión de textura VRAM." #: editor/import/resource_importer_texture.cpp msgid "2D, Detect 3D" -msgstr "" +msgstr "2D, Detectar 3D" #: editor/import/resource_importer_texture.cpp msgid "2D Pixel" @@ -7248,7 +7257,7 @@ msgstr "Pixel 2D" #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp msgid "Lossy Quality" -msgstr "" +msgstr "Con Pérdidas de Calidad" #: editor/import/resource_importer_texture.cpp msgid "HDR Mode" @@ -7256,14 +7265,14 @@ msgstr "Modo HDR" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp msgid "Normal Map" -msgstr "" +msgstr "Mapa de Normales" #: editor/import/resource_importer_texture.cpp msgid "Process" @@ -7271,7 +7280,7 @@ msgstr "Proceso" #: editor/import/resource_importer_texture.cpp msgid "Fix Alpha Border" -msgstr "" +msgstr "Corregir Borde Alfa" #: editor/import/resource_importer_texture.cpp msgid "Premult Alpha" @@ -7279,7 +7288,7 @@ msgstr "Premult Alpha" #: editor/import/resource_importer_texture.cpp msgid "Hdr As Srgb" -msgstr "" +msgstr "Hdr como Srgb" #: editor/import/resource_importer_texture.cpp msgid "Invert Color" @@ -7295,7 +7304,7 @@ msgstr "Tamaño LÃmite" #: editor/import/resource_importer_texture.cpp msgid "Detect 3D" -msgstr "" +msgstr "Detectar 3D" #: editor/import/resource_importer_texture.cpp msgid "SVG" @@ -7306,6 +7315,9 @@ msgid "" "Warning, no suitable PC VRAM compression enabled in Project Settings. This " "texture will not display correctly on PC." msgstr "" +"Advertencia, no se ha activado la compresión VRAM para PC en la " +"configuración del proyecto. Esta textura no se mostrará correctamente en el " +"PC." #: editor/import/resource_importer_texture_atlas.cpp msgid "Atlas File" @@ -7321,7 +7333,7 @@ msgstr "Recortar la Región" #: editor/import/resource_importer_texture_atlas.cpp msgid "Trim Alpha Border From Region" -msgstr "" +msgstr "Recortar Borde Alfa de la Región" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp msgid "Force" @@ -7329,12 +7341,13 @@ msgstr "Fuerza" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" -msgstr "" +msgstr "8 Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" -msgstr "" +msgstr "Mono" #: editor/import/resource_importer_wav.cpp msgid "Max Rate" @@ -7346,7 +7359,7 @@ msgstr "Tasa Máxima Hz" #: editor/import/resource_importer_wav.cpp msgid "Trim" -msgstr "" +msgstr "Recorte" #: editor/import/resource_importer_wav.cpp msgid "Normalize" @@ -7377,7 +7390,7 @@ msgstr "Importador:" #: editor/import_defaults_editor.cpp msgid "Reset to Defaults" -msgstr "Restablecer Valores por Defecto" +msgstr "Restablecer Valores Predeterminados" #: editor/import_dock.cpp msgid "Keep File (No Import)" @@ -7393,7 +7406,7 @@ msgstr "Establecer como predeterminado para '%s'" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "Restablecer Predeterminado para '%s'" +msgstr "Eliminar los Valores Predeterminados para '%s'" #: editor/import_dock.cpp msgid "Reimport" @@ -7461,7 +7474,7 @@ msgstr "Localizado" #: editor/inspector_dock.cpp msgid "Localization not available for current language." -msgstr "" +msgstr "La traducción no está disponible para el idioma actual." #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -8341,7 +8354,7 @@ msgstr "Filtros..." #: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp msgid "Use Threads" -msgstr "" +msgstr "Usar Hilos" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -8569,7 +8582,7 @@ msgstr "Prueba" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed to get repository configuration." -msgstr "" +msgstr "Fallo en la obtención de la configuración del repositorio." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -8599,8 +8612,8 @@ msgstr "" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed creating lightmap images, make sure path is writable." msgstr "" -"Error al crear las imágenes del \"lighmap\", asegúrate de que se puede " -"escribir en la ruta." +"Error al crear las imágenes del lightmap, asegúrate de que se puede escribir " +"en la ruta." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed determining lightmap size. Maximum lightmap size too small?" @@ -8646,7 +8659,7 @@ msgstr "Configurar Snap" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Offset:" -msgstr "Desplazamiento de CuadrÃcula:" +msgstr "Offset de CuadrÃcula:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Step:" @@ -8702,7 +8715,7 @@ msgstr "Crear GuÃas Horizontales y Verticales" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" -msgstr "Ajusta el Offset del pivote del CanvasItem \"%s\" a (%d, %d)" +msgstr "Fija el Offset del pivote del CanvasItem \"%s\" a (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate %d CanvasItems" @@ -9326,7 +9339,7 @@ msgstr "Error al instanciar escena desde %s" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Default Type" -msgstr "Cambiar Tipo por Defecto" +msgstr "Cambiar Tipo Predeterminado" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -9502,11 +9515,11 @@ msgstr "Degradado Editado" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap GradientTexture2D Fill Points" -msgstr "" +msgstr "Intercambiar Puntos de Relleno de GradientTexture2D" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap Gradient Fill Points" -msgstr "" +msgstr "Intercambiar Puntos de Relleno de Degradado" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Toggle Grid Snap" @@ -9529,7 +9542,7 @@ msgstr "Icono" #: editor/plugins/item_list_editor_plugin.cpp msgid "ID" -msgstr "" +msgstr "ID" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp @@ -10312,11 +10325,11 @@ msgstr "Configurar CuadrÃcula:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset X:" -msgstr "Desplazamiento de CuadrÃcula en X:" +msgstr "Offset de CuadrÃcula en X:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset Y:" -msgstr "Desplazamiento de CuadrÃcula en Y:" +msgstr "Offset de CuadrÃcula en Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Step X:" @@ -10332,7 +10345,7 @@ msgstr "Sincronizar Huesos con el PolÃgono" #: editor/plugins/ray_cast_2d_editor_plugin.cpp msgid "Set cast_to" -msgstr "" +msgstr "Establecer cast_to" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -10663,11 +10676,11 @@ msgstr "Resultados de la Búsqueda" #: editor/plugins/script_editor_plugin.cpp msgid "Open Dominant Script On Scene Change" -msgstr "" +msgstr "Abrir el Script Principal en el Cambio de Escena" #: editor/plugins/script_editor_plugin.cpp msgid "External" -msgstr "" +msgstr "Externo" #: editor/plugins/script_editor_plugin.cpp msgid "Use External Editor" @@ -10683,11 +10696,11 @@ msgstr "Temperatura del Script Activada" #: editor/plugins/script_editor_plugin.cpp msgid "Highlight Current Script" -msgstr "" +msgstr "Resaltar Script Actual" #: editor/plugins/script_editor_plugin.cpp msgid "Script Temperature History Size" -msgstr "" +msgstr "Tamaño de Historial de Temperatura del Script" #: editor/plugins/script_editor_plugin.cpp msgid "Current Script Background Color" @@ -10707,7 +10720,7 @@ msgstr "Lista de Nombres de Script Como" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" -msgstr "" +msgstr "Indicadores de Ejecución" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Scripts" @@ -11284,7 +11297,7 @@ msgid "" "It cannot be used as a reliable indication of in-game performance." msgstr "" "Nota: El valor FPS que se muestra es la velocidad de fotogramas del editor.\n" -"No se puede utilizar como un indicador fiable del rendimiento en el juego." +"No se puede usar como un indicador fiable del rendimiento en el juego." #: editor/plugins/spatial_editor_plugin.cpp msgid "Convert Rooms" @@ -11403,7 +11416,7 @@ msgstr "Incrementar el Campo de Visión" #: editor/plugins/spatial_editor_plugin.cpp msgid "Reset Field of View to Default" -msgstr "Restablecer el Campo de Visión por Defecto" +msgstr "Restablecer el Campo de Visión Predeterminado" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Object to Floor" @@ -11524,11 +11537,11 @@ msgstr "Posterior" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Size" -msgstr "" +msgstr "Tamaño del Gizmo Manipulador" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Opacity" -msgstr "" +msgstr "Opacidad del Gizmo Manipulador" #: editor/plugins/spatial_editor_plugin.cpp msgid "Show Viewport Rotation Gizmo" @@ -12220,13 +12233,13 @@ msgstr "Establer tipo de base" #: editor/plugins/theme_editor_plugin.cpp msgid "Show Default" -msgstr "Mostrar Por Defecto" +msgstr "Mostrar por Defecto" #: editor/plugins/theme_editor_plugin.cpp msgid "Show default type items alongside items that have been overridden." msgstr "" -"Mostrar los elementos de tipo por defecto junto a los elementos que han sido " -"anulados." +"Mostrar los elementos de tipo predeterminado junto a los elementos que han " +"sido anulados." #: editor/plugins/theme_editor_plugin.cpp msgid "Override All" @@ -12234,7 +12247,7 @@ msgstr "Anular Todo" #: editor/plugins/theme_editor_plugin.cpp msgid "Override all default type items." -msgstr "Anular todos los elementos de tipo por defecto." +msgstr "Anular todos los elementos de tipo predeterminado." #: editor/plugins/theme_editor_plugin.cpp msgid "Select the variation base type from a list of available types." @@ -12268,7 +12281,7 @@ msgstr "Añadir Vista Previa" #: editor/plugins/theme_editor_plugin.cpp msgid "Default Preview" -msgstr "Vista Previa Por Defecto" +msgstr "Vista Previa Predeterminada" #: editor/plugins/theme_editor_plugin.cpp msgid "Select UI Scene:" @@ -12877,7 +12890,7 @@ msgstr "Opciones de Ajuste" #: scene/main/canvas_layer.cpp scene/resources/material.cpp #: scene/resources/particles_material.cpp scene/resources/style_box.cpp msgid "Offset" -msgstr "Desplazamiento" +msgstr "Offset" #: editor/plugins/tile_set_editor_plugin.cpp editor/rename_dialog.cpp #: scene/gui/range.cpp scene/resources/animation.cpp @@ -12907,7 +12920,7 @@ msgstr "Textura" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Tex Offset" -msgstr "Desplazamiento de Textura" +msgstr "Offset de Textura" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp @@ -12938,15 +12951,15 @@ msgstr "Espaciado de Subtile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Occluder Offset" -msgstr "Desplazamiento del Oclusor" +msgstr "Offset del Oclusor" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Navigation Offset" -msgstr "Desplazamiento de Navegación" +msgstr "Offset de Navegación" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Shape Offset" -msgstr "Desplazamiento del Shape" +msgstr "Offset del Shape" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Shape Transform" @@ -14066,11 +14079,13 @@ msgstr "Ejecutable" #: editor/project_export.cpp msgid "Export the project for all the presets defined." -msgstr "" +msgstr "Exportar el proyecto para todos los presets definidos." #: editor/project_export.cpp msgid "All presets must have an export path defined for Export All to work." msgstr "" +"Todos los presets deben tener una ruta de exportación definida para que " +"Exportar Todo funcione." #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -14183,6 +14198,8 @@ msgid "" "Note: Encryption key needs to be stored in the binary,\n" "you need to build the export templates from source." msgstr "" +"Nota: La clave de encriptación debe ser almacenada en el binario,\n" +"es necesario construir las plantillas de exportación desde el código fuente." #: editor/project_export.cpp msgid "More Info..." @@ -14944,7 +14961,7 @@ msgstr "Plugins" #: editor/project_settings_editor.cpp msgid "Import Defaults" -msgstr "Valores de Importación por Defecto" +msgstr "Valores de Importación Predeterminados" #: editor/property_editor.cpp msgid "Preset..." @@ -15323,8 +15340,8 @@ msgid "" "Disabling \"editable_instance\" will cause all properties of the node to be " "reverted to their default." msgstr "" -"Desactivar \"editable_instance\" causara que todas las propiedades del nodo " -"vuelvan a sus valores por defecto." +"Desactivar \"editable_instance\" causará que todas las propiedades del nodo " +"vuelvan a sus valores predeterminados." #: editor/scene_tree_dock.cpp msgid "" @@ -15332,23 +15349,26 @@ msgid "" "cause all properties of the node to be reverted to their default." msgstr "" "Activar \"Cargar Como Placeholder\" desactivará \"Hijos Editables\" y " -"causará que todas las propiedades del nodo se reviertan a sus valores por " -"defecto." +"causará que todas las propiedades del nodo se reviertan a sus valores " +"predeterminados." #: editor/scene_tree_dock.cpp msgid "Make Local" msgstr "Crear Local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +#, fuzzy +msgid "Enable Scene Unique Name(s)" msgstr "Activar Nombre Único de Escena" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Unique names already used by another node in the scene:" +msgstr "Otro nodo ya utiliza este nombre único en la escena." + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Desactivar Nombre Único de Escena" #: editor/scene_tree_dock.cpp @@ -15425,7 +15445,7 @@ msgstr "Sub-Recursos" #: editor/scene_tree_dock.cpp msgid "Access as Scene Unique Name" -msgstr "" +msgstr "Acceso como Nombre Único de Escena" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" @@ -15529,7 +15549,7 @@ msgstr "Mostrar Selección de la RaÃz del Ãrbol de Escenas" #: editor/scene_tree_dock.cpp msgid "Derive Script Globals By Name" -msgstr "" +msgstr "Derivar Script Globales por Nombre" #: editor/scene_tree_dock.cpp msgid "Use Favorites Root Selection" @@ -15548,6 +15568,10 @@ msgid "Button Group" msgstr "Grupo de Botones" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Desactivar Nombre Único de Escena" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Conectando Desde)" @@ -15561,6 +15585,9 @@ msgid "" "with the '%s' prefix in a node path.\n" "Click to disable this." msgstr "" +"Se puede acceder a este nodo desde cualquier parte de la escena anteponiendo " +"el prefijo '%s' en una ruta de nodo.\n" +"Haz clic para desactivar esto." #: editor/scene_tree_editor.cpp msgid "" @@ -15624,6 +15651,10 @@ msgstr "" "El nombre del nodo no es correcto, las siguientes letras no están permitidas:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Otro nodo ya utiliza este nombre único en la escena." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renombrar Nodo" @@ -15853,15 +15884,15 @@ msgstr "Filtrar variables apiladas" #: editor/script_editor_debugger.cpp msgid "Auto Switch To Remote Scene Tree" -msgstr "" +msgstr "Cambio Automático al Ãrbol de Escenas Remoto" #: editor/script_editor_debugger.cpp msgid "Remote Scene Tree Refresh Interval" -msgstr "" +msgstr "Intervalo de Refresco del Ãrbol de Escenas Remoto" #: editor/script_editor_debugger.cpp msgid "Remote Inspect Refresh Interval" -msgstr "" +msgstr "Intervalo de Refresco de la Inspección Remota" #: editor/script_editor_debugger.cpp msgid "Network Profiler" @@ -15959,7 +15990,7 @@ msgstr "Cambiar Radio de Luces" #: editor/spatial_editor_gizmos.cpp msgid "Stream Player 3D" -msgstr "" +msgstr "Stream Player 3D" #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" @@ -15969,7 +16000,7 @@ msgstr "Cambiar Ãngulo de Emisión de AudioStreamPlayer3D" #: platform/osx/export/export.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Camera" -msgstr "" +msgstr "Cámara" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" @@ -15981,7 +16012,7 @@ msgstr "Cambiar Tamaño de Cámara" #: editor/spatial_editor_gizmos.cpp msgid "Visibility Notifier" -msgstr "" +msgstr "Notificador de Visibilidad" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier AABB" @@ -16053,19 +16084,19 @@ msgstr "Navegación Sólida Desactivada" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body A" -msgstr "" +msgstr "Unir cuerpo A" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body B" -msgstr "" +msgstr "Unir cuerpo B" #: editor/spatial_editor_gizmos.cpp msgid "Room Edge" -msgstr "" +msgstr "LÃmite del Room" #: editor/spatial_editor_gizmos.cpp msgid "Room Overlap" -msgstr "" +msgstr "Solapamiento del Room" #: editor/spatial_editor_gizmos.cpp msgid "Set Room Point Position" @@ -16077,11 +16108,11 @@ msgstr "Margen del Portal" #: editor/spatial_editor_gizmos.cpp msgid "Portal Edge" -msgstr "" +msgstr "Borde del Portal" #: editor/spatial_editor_gizmos.cpp msgid "Portal Arrow" -msgstr "" +msgstr "Puntero del Portal" #: editor/spatial_editor_gizmos.cpp msgid "Set Portal Point Position" @@ -16089,7 +16120,7 @@ msgstr "Establecer Posición del Portal Point" #: editor/spatial_editor_gizmos.cpp msgid "Portal Front" -msgstr "" +msgstr "Frente del portal" #: editor/spatial_editor_gizmos.cpp msgid "Portal Back" @@ -16130,7 +16161,7 @@ msgstr "Orificio Oclusor" #: main/main.cpp msgid "Godot Physics" -msgstr "" +msgstr "FÃsicas de Godot" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp @@ -16152,7 +16183,7 @@ msgstr "Servidor Multihilo" #: main/main.cpp msgid "RID Pool Prealloc" -msgstr "" +msgstr "RID Pool Prealloc" #: main/main.cpp msgid "Debugger stdout" @@ -16160,31 +16191,31 @@ msgstr "Depurador stdout" #: main/main.cpp msgid "Max Chars Per Second" -msgstr "" +msgstr "Máx. Caracteres Por Segundo" #: main/main.cpp msgid "Max Messages Per Frame" -msgstr "" +msgstr "Máx. Llamadas Por Fotograma" #: main/main.cpp msgid "Max Errors Per Second" -msgstr "" +msgstr "Máx. Errores Por Segundo" #: main/main.cpp msgid "Max Warnings Per Second" -msgstr "" +msgstr "Máx. Alertas Por Segundo" #: main/main.cpp msgid "Flush stdout On Print" -msgstr "" +msgstr "Vaciar stdout Al Imprimir" #: main/main.cpp servers/visual_server.cpp msgid "Logging" -msgstr "" +msgstr "Registro" #: main/main.cpp msgid "File Logging" -msgstr "" +msgstr "Registro De Archivos" #: main/main.cpp msgid "Enable File Logging" @@ -16196,11 +16227,11 @@ msgstr "Ruta del Registro" #: main/main.cpp msgid "Max Log Files" -msgstr "" +msgstr "Registro Máx. De Archivos" #: main/main.cpp msgid "Driver" -msgstr "" +msgstr "Controlador" #: main/main.cpp msgid "Driver Name" @@ -16208,19 +16239,19 @@ msgstr "Nombre del Controlador" #: main/main.cpp msgid "Fallback To GLES2" -msgstr "" +msgstr "Altenar A GLES2" #: main/main.cpp msgid "Use Nvidia Rect Flicker Workaround" -msgstr "" +msgstr "Usar la solución de Nvidia Rect Flicker" #: main/main.cpp msgid "DPI" -msgstr "" +msgstr "DPI" #: main/main.cpp msgid "Allow hiDPI" -msgstr "" +msgstr "Permitir hiDPI" #: main/main.cpp msgid "V-Sync" @@ -16232,15 +16263,15 @@ msgstr "Usar Sincronización Vertical" #: main/main.cpp msgid "Per Pixel Transparency" -msgstr "" +msgstr "Transparencia Por Pixel" #: main/main.cpp msgid "Allowed" -msgstr "" +msgstr "Permitido" #: main/main.cpp msgid "Intended Usage" -msgstr "" +msgstr "Uso Planteado" #: main/main.cpp msgid "Framebuffer Allocation" @@ -16252,7 +16283,7 @@ msgstr "Ahorro de EnergÃa" #: main/main.cpp msgid "Threads" -msgstr "" +msgstr "Hilos" #: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h msgid "Thread Model" @@ -16260,11 +16291,11 @@ msgstr "Modelo de Hilo" #: main/main.cpp msgid "Thread Safe BVH" -msgstr "" +msgstr "Hilo Seguro BVH" #: main/main.cpp msgid "Handheld" -msgstr "" +msgstr "Manipulador" #: main/main.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp @@ -16274,7 +16305,7 @@ msgstr "Orientación" #: main/main.cpp scene/gui/scroll_container.cpp scene/gui/text_edit.cpp #: scene/main/scene_tree.cpp scene/register_scene_types.cpp msgid "Common" -msgstr "Común" +msgstr "Más información" #: main/main.cpp msgid "Physics FPS" @@ -16286,25 +16317,25 @@ msgstr "Forzar FPS" #: main/main.cpp msgid "Enable Pause Aware Picking" -msgstr "" +msgstr "Activar Selección en Pausa" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp #: scene/main/viewport.cpp scene/register_scene_types.cpp msgid "GUI" -msgstr "" +msgstr "GUI" #: main/main.cpp msgid "Drop Mouse On GUI Input Disabled" -msgstr "" +msgstr "Colocar el Mouse en la Entrada de la GUI Desactivada" #: main/main.cpp msgid "stdout" -msgstr "" +msgstr "stdout" #: main/main.cpp msgid "Print FPS" -msgstr "" +msgstr "Imprimir FPS" #: main/main.cpp msgid "Verbose stdout" @@ -16324,19 +16355,19 @@ msgstr "Retraso de los Fotogramas Msec" #: main/main.cpp msgid "Low Processor Mode" -msgstr "" +msgstr "Modo Para Procesadores Lentos" #: main/main.cpp msgid "Delta Sync After Draw" -msgstr "" +msgstr "Sincronizar Delta Después Del Evento Draw" #: main/main.cpp msgid "iOS" -msgstr "" +msgstr "iOS" #: main/main.cpp msgid "Hide Home Indicator" -msgstr "" +msgstr "Ocultar Indicador de Inicio" #: main/main.cpp msgid "Input Devices" @@ -16344,15 +16375,15 @@ msgstr "Dispositivos de Entrada" #: main/main.cpp msgid "Pointing" -msgstr "Apuntador" +msgstr "Puntero" #: main/main.cpp msgid "Touch Delay" -msgstr "" +msgstr "Retraso De Toque" #: main/main.cpp servers/visual_server.cpp msgid "GLES3" -msgstr "" +msgstr "GLES3" #: main/main.cpp servers/visual_server.cpp msgid "Shaders" @@ -16370,11 +16401,11 @@ msgstr "Entorno" #: main/main.cpp msgid "Default Clear Color" -msgstr "" +msgstr "Color Claro Predeterminado" #: main/main.cpp msgid "Boot Splash" -msgstr "" +msgstr "Pantalla de Splash" #: main/main.cpp msgid "Show Image" @@ -16382,11 +16413,11 @@ msgstr "Mostrar Imagen" #: main/main.cpp msgid "Image" -msgstr "" +msgstr "imagen" #: main/main.cpp msgid "Fullsize" -msgstr "" +msgstr "Tamaño completo" #: main/main.cpp scene/resources/dynamic_font.cpp msgid "Use Filter" @@ -16402,23 +16433,23 @@ msgstr "Icono Nativo de macOS" #: main/main.cpp msgid "Windows Native Icon" -msgstr "" +msgstr "Icono Nativo Para Windows" #: main/main.cpp msgid "Buffering" -msgstr "" +msgstr "Buffering" #: main/main.cpp msgid "Agile Event Flushing" -msgstr "" +msgstr "Evento Ãgil de Vaciado" #: main/main.cpp msgid "Emulate Touch From Mouse" -msgstr "" +msgstr "Emular Toque Desde El Mouse" #: main/main.cpp msgid "Emulate Mouse From Touch" -msgstr "" +msgstr "Emular Mouse con el Toque" #: main/main.cpp msgid "Mouse Cursor" @@ -16430,11 +16461,11 @@ msgstr "Imagen Personalizada" #: main/main.cpp msgid "Custom Image Hotspot" -msgstr "" +msgstr "Imagen personalizada para el Hotspot" #: main/main.cpp msgid "Tooltip Position Offset" -msgstr "Desplazamiento de Posición del Tooltip" +msgstr "Offset de Posición del Tooltip" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Debugger Agent" @@ -16450,11 +16481,11 @@ msgstr "Tiempo de Espera" #: main/main.cpp msgid "Runtime" -msgstr "" +msgstr "Tiempo De Ejecución" #: main/main.cpp msgid "Unhandled Exception Policy" -msgstr "" +msgstr "PolÃtica de Excepciones No Controladas" #: main/main.cpp msgid "Main Loop Type" @@ -16471,11 +16502,11 @@ msgstr "Aspecto" #: main/main.cpp msgid "Shrink" -msgstr "" +msgstr "Reducción" #: main/main.cpp scene/main/scene_tree.cpp msgid "Auto Accept Quit" -msgstr "" +msgstr "Aceptar Cierre Del Programa Automáticamente" #: main/main.cpp scene/main/scene_tree.cpp msgid "Quit On Go Back" @@ -16487,19 +16518,19 @@ msgstr "Ajustar Controles a PÃxeles" #: main/main.cpp msgid "Dynamic Fonts" -msgstr "" +msgstr "Fuentes Dinámicas" #: main/main.cpp msgid "Use Oversampling" -msgstr "" +msgstr "Usar Sobremuestreo" #: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp msgid "Active Soft World" -msgstr "" +msgstr "Soft World Activo" #: modules/csg/csg_gizmos.cpp msgid "CSG" -msgstr "" +msgstr "CSG" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -16523,7 +16554,7 @@ msgstr "Operación" #: modules/csg/csg_shape.cpp msgid "Calculate Tangents" -msgstr "" +msgstr "Calcular Tangentes" #: modules/csg/csg_shape.cpp msgid "Use Collision" @@ -16572,7 +16603,7 @@ msgstr "Lados" #: modules/csg/csg_shape.cpp msgid "Cone" -msgstr "" +msgstr "Cono" #: modules/csg/csg_shape.cpp msgid "Inner Radius" @@ -16584,7 +16615,7 @@ msgstr "Radio Exterior" #: modules/csg/csg_shape.cpp msgid "Ring Sides" -msgstr "" +msgstr "Lados del Anillo" #: modules/csg/csg_shape.cpp scene/2d/collision_polygon_2d.cpp #: scene/2d/light_occluder_2d.cpp scene/2d/polygon_2d.cpp @@ -16594,11 +16625,11 @@ msgstr "PolÃgono" #: modules/csg/csg_shape.cpp msgid "Spin Degrees" -msgstr "" +msgstr "Grados de Giro" #: modules/csg/csg_shape.cpp msgid "Spin Sides" -msgstr "" +msgstr "Lados de Giro" #: modules/csg/csg_shape.cpp msgid "Path Node" @@ -16610,11 +16641,11 @@ msgstr "Tipo de Intervalo de Ruta" #: modules/csg/csg_shape.cpp msgid "Path Interval" -msgstr "" +msgstr "Intervalo de Ruta" #: modules/csg/csg_shape.cpp msgid "Path Simplify Angle" -msgstr "" +msgstr "Simplificar Ãngulo de Ruta" #: modules/csg/csg_shape.cpp msgid "Path Rotation" @@ -16654,15 +16685,15 @@ msgstr "Siempre Ordenado" #: modules/enet/networked_multiplayer_enet.cpp msgid "Server Relay" -msgstr "" +msgstr "Repetidor del Servidor" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Verify" -msgstr "" +msgstr "Verificar DTLS" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Hostname" -msgstr "" +msgstr "Nombre de Host DTLS" #: modules/enet/networked_multiplayer_enet.cpp msgid "Use DTLS" @@ -16670,11 +16701,11 @@ msgstr "Usar DTLS" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "FBX" -msgstr "" +msgstr "FBX" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "Use FBX" -msgstr "" +msgstr "Usar FBX" #: modules/gdnative/gdnative.cpp msgid "Config File" @@ -16774,7 +16805,7 @@ msgstr "GDScript" #: modules/gdscript/editor/gdscript_highlighter.cpp msgid "Function Definition Color" -msgstr "" +msgstr "Función Definición de Color" #: modules/gdscript/editor/gdscript_highlighter.cpp msgid "Node Path Color" @@ -16786,15 +16817,15 @@ msgstr "" #: modules/gdscript/gdscript.cpp msgid "Treat Warnings As Errors" -msgstr "" +msgstr "Tratar las Advertencias como Errores" #: modules/gdscript/gdscript.cpp msgid "Exclude Addons" -msgstr "" +msgstr "Excluir Addons" #: modules/gdscript/gdscript.cpp msgid "Autocomplete Setters And Getters" -msgstr "" +msgstr "Autocompletar Setters y Getters" #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" @@ -16846,11 +16877,11 @@ msgstr "Activar Smart Resolve" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Show Native Symbols In Editor" -msgstr "" +msgstr "Mostrar SÃmbolos Nativos en el Editor" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Use Thread" -msgstr "" +msgstr "Usar Hilo" #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp msgid "Export Mesh GLTF2" @@ -16866,7 +16897,7 @@ msgstr "Vista del Buffer" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp msgid "Byte Offset" -msgstr "Desplazamiento de Byte" +msgstr "Offset de Byte" #: modules/gltf/gltf_accessor.cpp msgid "Component Type" @@ -16894,11 +16925,11 @@ msgstr "Recuento Parcial" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Buffer View" -msgstr "" +msgstr "Vista del Buffer de Ãndices Esparcidos" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Byte Offset" -msgstr "" +msgstr "Ãndices Dispersos del Offset de Bytes" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Component Type" @@ -16906,11 +16937,11 @@ msgstr "Ãndices Dispersos de Tipo de Componente" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" -msgstr "" +msgstr "Vista del Buffer de Valores Esparcidos" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Byte Offset" -msgstr "" +msgstr "Valores Dispersos del Offset de Bytes" #: modules/gltf/gltf_buffer_view.cpp msgid "Buffer" @@ -16934,7 +16965,7 @@ msgstr "Tamaño de FOV" #: modules/gltf/gltf_camera.cpp msgid "Zfar" -msgstr "" +msgstr "Zfar" #: modules/gltf/gltf_camera.cpp msgid "Znear" @@ -16954,7 +16985,7 @@ msgstr "Color" #: modules/gltf/gltf_light.cpp scene/3d/reflection_probe.cpp #: scene/resources/environment.cpp msgid "Intensity" -msgstr "" +msgstr "Intensidad" #: modules/gltf/gltf_light.cpp scene/2d/light_2d.cpp scene/3d/light.cpp msgid "Range" @@ -16962,11 +16993,11 @@ msgstr "Rango" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" -msgstr "" +msgstr "Ãngulo del Cono Interior" #: modules/gltf/gltf_light.cpp msgid "Outer Cone Angle" -msgstr "" +msgstr "Ãngulo del Cono Exterior" #: modules/gltf/gltf_mesh.cpp msgid "Blend Weights" @@ -16986,7 +17017,7 @@ msgstr "Xform" #: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp msgid "Skin" -msgstr "" +msgstr "Skin" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp msgid "Translation" @@ -17002,11 +17033,11 @@ msgstr "Articulaciones" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp msgid "Roots" -msgstr "" +msgstr "RaÃces" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_state.cpp msgid "Unique Names" -msgstr "" +msgstr "Nombres Únicos" #: modules/gltf/gltf_skeleton.cpp msgid "Godot Bone Node" @@ -17022,7 +17053,7 @@ msgstr "Articulaciones Originales" #: modules/gltf/gltf_skin.cpp msgid "Inverse Binds" -msgstr "" +msgstr "Enlaces Inversos" #: modules/gltf/gltf_skin.cpp msgid "Non Joints" @@ -17030,27 +17061,27 @@ msgstr "Sin Articulaciones" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Bone I" -msgstr "" +msgstr "Unir I a Hueso I" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Name" -msgstr "" +msgstr "Unir I a Nombre" #: modules/gltf/gltf_skin.cpp msgid "Godot Skin" -msgstr "" +msgstr "Skin de Godot" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Img" -msgstr "" +msgstr "Imagen Difusa" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Factor" -msgstr "" +msgstr "Factor Difuso" #: modules/gltf/gltf_spec_gloss.cpp msgid "Gloss Factor" -msgstr "" +msgstr "Factor de Brillo" #: modules/gltf/gltf_spec_gloss.cpp msgid "Specular Factor" @@ -17103,7 +17134,7 @@ msgstr "Texturas" #: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp msgid "Images" -msgstr "" +msgstr "Imágenes" #: modules/gltf/gltf_state.cpp msgid "Cameras" @@ -17131,7 +17162,7 @@ msgstr "Animaciones" #: modules/gltf/gltf_texture.cpp msgid "Src Image" -msgstr "Imagen de Origen" +msgstr "Origen de la Imagen" #: modules/gridmap/grid_map.cpp msgid "Mesh Library" @@ -17364,7 +17395,7 @@ msgstr "" #: modules/stb_vorbis/audio_stream_ogg_vorbis.cpp #: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp msgid "Loop Offset" -msgstr "Desplazamiento de Ciclo" +msgstr "Offset de Bucle" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Eye Height" @@ -17406,6 +17437,21 @@ msgstr "Crear Solución" msgid "Auto Update Project" msgstr "Actualización Automática del Proyecto" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Nombre a Mostrar" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Selecciona un directorio" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Selecciona un directorio" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Fin del reporte de la pila de excepciones" @@ -17495,7 +17541,7 @@ msgstr "" #: modules/opensimplex/noise_texture.cpp msgid "Noise Offset" -msgstr "Desplazamiento de Ruido" +msgstr "Offset de Ruido" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" @@ -17566,8 +17612,8 @@ msgid "" "A node yielded without working memory, please read the docs on how to yield " "properly!" msgstr "" -"¡Un nodo ejecutó un yield sin memoria de trabajo. Prueba leyendo la " -"documentación sobre cómo utilizar yield!" +"¡Un nodo realizo un yield sin memoria de trabajo, por favor, lee la " +"documentación sobre cómo usar yield correctamente!" #: modules/visual_script/visual_script.cpp msgid "" @@ -17617,7 +17663,7 @@ msgstr "Cambiar Nombre del Argumento" #: modules/visual_script/visual_script_editor.cpp msgid "Set Variable Default Value" -msgstr "Establecer Valor por Defecto de la Variable" +msgstr "Fijar Valor Predeterminado de la Variable" #: modules/visual_script/visual_script_editor.cpp msgid "Set Variable Type" @@ -18034,7 +18080,7 @@ msgstr "Ruta del Nodo" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Use Default Args" -msgstr "Usar Argumentos por Defecto" +msgstr "Usar Argumentos Predeterminados" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Validate" @@ -18787,7 +18833,7 @@ msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." msgstr "" -"\"SDK de Destino\" %d es superior a la versión por defecto %d. PodrÃa " +"\"SDK de Destino\" %d es superior a la versión predeterminada %d. PodrÃa " "funcionar, pero no se ha probado y puede ser inestable." #: platform/android/export/export_plugin.cpp @@ -19169,6 +19215,11 @@ msgstr "Usar Color de Fondo Personalizado" msgid "Custom BG Color" msgstr "Color de Fondo Personalizado" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Icono de Exportación" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19994,6 +20045,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nombre corto del paquete inválido." @@ -20020,43 +20077,41 @@ msgstr "Color de fondo inválido." #: platform/uwp/export/export.cpp msgid "Invalid Store Logo image dimensions (should be 50x50)." msgstr "" -"Las dimensiones de la imagen para el Store Logo son inválidas (deberÃa ser " -"50x50)." +"Las dimensiones del logo de la tienda son inválidas (deberÃa ser 50x50)." #: platform/uwp/export/export.cpp msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." msgstr "" -"Las dimensiones de la imagen para el logo cuadrado de 44x44 son inválidas " -"(deberÃa ser 44x44)." +"Las dimensiones de la imagen del logo cuadrado 44x44 son inválidas (deben " +"ser 44x44)." #: platform/uwp/export/export.cpp msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." msgstr "" -"Las dimensiones de la imagen para el logo cuadrado de 71x71 son inválidas " -"(deberÃa ser 71x71)." +"Las dimensiones de la imagen del logo cuadrado 71x71 son inválidas ( deben " +"ser 71x71)." #: platform/uwp/export/export.cpp msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." msgstr "" -"Las dimensiones de la imagen para el logo cuadrado de 150x150 son inválidas " -"(deberÃa ser 150x150)." +"Las dimensiones de la imagen del logo cuadrado 150x150 son inválidas ( deben " +"ser 150x150)." #: platform/uwp/export/export.cpp msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." msgstr "" -"Las dimensiones de la imagen para el logo cuadrado de 310x310 son inválidas " -"(deberÃa ser 310x310)." +"Las dimensiones de la imagen del logo cuadrado 310x310 son inválidas ( deben " +"ser 310x310)." #: platform/uwp/export/export.cpp msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." -msgstr "" -"Las dimensiones de la imagen para el logo ancho de 310x150 son inválidas " -"(deberÃa ser 310x150)." +msgstr "Las dimensiones del logo son inválidas (deben ser 310x150)." #: platform/uwp/export/export.cpp msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" -"Las dimensiones de la imagen del splash son inválidas (deberÃa ser 620x300)." +"Las dimensiones de la imagen de la pantalla de splash son inválidas (deben " +"ser 620x300)." #: platform/uwp/export/export.cpp msgid "UWP" @@ -20131,19 +20186,18 @@ msgid "Could not find wine executable at \"%s\"." msgstr "No se pudo encontrar el ejecutable de wine en \"%s\"." #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start rcedit executable. Configure rcedit path in the Editor " "Settings (Export > Windows > Rcedit), or disable \"Application > Modify " "Resources\" in the export preset." msgstr "" -"No se ha podido iniciar el ejecutable rcedit, configura la ruta de rcedit en " -"la configuración del editor (Exportar > Windows > Rcedit)." +"No se ha podido iniciar el ejecutable de rcedit. Configura la ruta de rcedit " +"en la configuración del editor (Exportar > Windows > Rcedit), o desactiva " +"\"Aplicación > Modificar Recursos\" en el preset de exportación." #: platform/windows/export/export.cpp -#, fuzzy msgid "rcedit failed to modify executable: %s." -msgstr "Fallo al abrir el archivo ejecutable \"%s\"." +msgstr "rcedit falló al modificar el ejecutable: %s." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20162,19 +20216,18 @@ msgid "Invalid timestamp server." msgstr "Servidor de marcas de tiempo inválido." #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start signtool executable. Configure signtool path in the Editor " "Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " "export preset." msgstr "" -"No se ha podido iniciar el ejecutable de signtool, configura la ruta de " -"signtool en la configuración del editor (Exportar > Windows > Signtool)." +"No se ha podido iniciar el ejecutable de signtool. Configura la ruta de " +"signtool en la configuración del editor (Exportar > Windows > Signtool), o " +"desactiva \"Codesign\" en el preset de exportación." #: platform/windows/export/export.cpp -#, fuzzy msgid "Signtool failed to sign executable: %s." -msgstr "Fallo al abrir el archivo ejecutable \"%s\"." +msgstr "Signtool no pudo firmar el ejecutable: %s." #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." @@ -20865,12 +20918,12 @@ msgstr "Curva de Velocidad" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Offset Random" -msgstr "Desplazamiento Aleatorio" +msgstr "Offset Aleatorio" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Offset Curve" -msgstr "Curva de Desplazamiento" +msgstr "Curva de Offset" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be PhysicsBody2Ds" @@ -20921,7 +20974,7 @@ msgstr "" #: scene/2d/joints_2d.cpp msgid "Initial Offset" -msgstr "Desplazamiento Inicial" +msgstr "Offset Inicial" #: scene/2d/joints_2d.cpp scene/3d/vehicle_body.cpp msgid "Rest Length" @@ -21016,7 +21069,7 @@ msgstr "Curva de Ancho" #: scene/2d/line_2d.cpp scene/resources/default_theme/default_theme.cpp msgid "Default Color" -msgstr "Color por Defecto" +msgstr "Color Predeterminado" #: scene/2d/line_2d.cpp scene/resources/texture.cpp msgid "Fill" @@ -21128,7 +21181,7 @@ msgstr "Velocidad Máxima" msgid "" "The NavigationAgent2D can be used only under a Node2D inheriting parent node." msgstr "" -"El NavigationAgent2D sólo puede utilizarse bajo un nodo padre hijo de Node2D." +"El NavigationAgent2D solo puede usarse con un nodo padre del tipo Node2D." #: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_obstacle.cpp msgid "Estimate Radius" @@ -21194,7 +21247,7 @@ msgstr "Scroll" #: scene/2d/parallax_background.cpp msgid "Base Offset" -msgstr "Desplazamiento Base" +msgstr "Offset Base" #: scene/2d/parallax_background.cpp msgid "Base Scale" @@ -21291,15 +21344,15 @@ msgstr "" #: scene/2d/path_2d.cpp scene/3d/path.cpp msgid "Unit Offset" -msgstr "Desplazamiento de Unidad" +msgstr "Offset de Unidad" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp msgid "H Offset" -msgstr "Desplazamiento H" +msgstr "Offset H" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp msgid "V Offset" -msgstr "Desplazamiento V" +msgstr "Offset V" #: scene/2d/path_2d.cpp scene/3d/path.cpp msgid "Cubic Interp" @@ -21338,7 +21391,7 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Default Gravity" -msgstr "Gravedad por Defecto" +msgstr "Gravedad Predeterminada" #: scene/2d/physics_body_2d.cpp msgid "" @@ -21517,7 +21570,7 @@ msgstr "Ruta Remota" #: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp msgid "Use Global Coordinates" -msgstr "Utilizar Coordenadas Globales" +msgstr "Usar Coordenadas Globales" #: scene/2d/skeleton_2d.cpp scene/3d/skeleton.cpp msgid "Rest" @@ -21525,7 +21578,7 @@ msgstr "Reposo" #: scene/2d/skeleton_2d.cpp msgid "Default Length" -msgstr "Longitud por Defecto" +msgstr "Longitud Predeterminada" #: scene/2d/skeleton_2d.cpp msgid "This Bone2D chain should end at a Skeleton2D node." @@ -21583,7 +21636,7 @@ msgstr "Transformación Personalizada" #: scene/2d/tile_map.cpp msgid "Half Offset" -msgstr "Medio Desplazamiento" +msgstr "Medio Offset" #: scene/2d/tile_map.cpp msgid "Tile Origin" @@ -21877,7 +21930,7 @@ msgstr "Propagación" #: scene/3d/baked_lightmap.cpp msgid "Image Path" -msgstr "" +msgstr "Ruta de la Imagen" #: scene/3d/baked_lightmap.cpp msgid "Light Data" @@ -22263,7 +22316,7 @@ msgstr "Altura de la Celda" #: scene/3d/navigation_agent.cpp msgid "Agent Height Offset" -msgstr "" +msgstr "Offset de Altura del Agente" #: scene/3d/navigation_agent.cpp msgid "Ignore Y" @@ -22273,7 +22326,7 @@ msgstr "Ignorar Y" msgid "" "The NavigationAgent can be used only under a Spatial inheriting parent node." msgstr "" -"El NavigationAgent solo puede utilizarse en un nodo padre de tipo Spatial." +"El NavigationAgent solo puede usarse con un nodo padre de tipo Spatial." #: scene/3d/navigation_mesh_instance.cpp scene/resources/mesh_library.cpp msgid "NavMesh" @@ -22557,7 +22610,7 @@ msgstr "Punto de Equilibrio Angular" #: scene/3d/physics_body.cpp msgid "Body Offset" -msgstr "Desplazamiento del Cuerpo" +msgstr "Offset del Cuerpo" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" @@ -22761,7 +22814,7 @@ msgstr "Sala Vinculada" #: scene/3d/portal.cpp msgid "Use Default Margin" -msgstr "Usar Margen por Defecto" +msgstr "Usar Margen Predeterminado" #: scene/3d/proximity_group.cpp msgid "Group Name" @@ -22789,7 +22842,7 @@ msgstr "Modo de Actualización" #: scene/3d/reflection_probe.cpp msgid "Origin Offset" -msgstr "Desplazamiento de Origen" +msgstr "Offset de Origen" #: scene/3d/reflection_probe.cpp msgid "Box Projection" @@ -22842,7 +22895,7 @@ msgstr "" #: scene/3d/room.cpp msgid "Use Default Simplify" -msgstr "" +msgstr "Usar Simplificación Predeterminada" #: scene/3d/room.cpp scene/3d/room_manager.cpp msgid "Room Simplify" @@ -22945,7 +22998,7 @@ msgstr "" #: scene/3d/room_manager.cpp msgid "Default Portal Margin" -msgstr "Margen del Portal por Defecto" +msgstr "Margen del Portal Predeterminado" #: scene/3d/room_manager.cpp msgid "Roaming Expansion Margin" @@ -23351,7 +23404,7 @@ msgstr "Opciones de Reproducción" #: scene/animation/animation_player.cpp msgid "Default Blend Time" -msgstr "Tiempo de Mezcla por Defecto" +msgstr "Tiempo de Mezcla Predeterminado" #: scene/animation/animation_player.cpp msgid "Method Call Mode" @@ -23618,7 +23671,7 @@ msgstr "Tamaño MÃnimo" #: scene/gui/control.cpp msgid "Pivot Offset" -msgstr "Pivote de Desplazamiento" +msgstr "Pivote de Offset" #: scene/gui/control.cpp msgid "Clip Content" @@ -23666,7 +23719,7 @@ msgstr "" #: scene/gui/control.cpp msgid "Default Cursor Shape" -msgstr "Forma del Cursor por Defecto" +msgstr "Forma del Cursor Predeterminado" #: scene/gui/control.cpp msgid "Pass On Modal Close Click" @@ -23718,7 +23771,7 @@ msgstr "Desconexión Correcta" #: scene/gui/graph_edit.cpp msgid "Scroll Offset" -msgstr "Desplazamiento de Scroll" +msgstr "Offset de Scroll" #: scene/gui/graph_edit.cpp msgid "Snap Distance" @@ -24035,7 +24088,6 @@ msgid "Elapsed Time" msgstr "Tiempo Transcurrido" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Env" msgstr "Env" @@ -24107,7 +24159,7 @@ msgstr "Vertical Activada" #: scene/gui/scroll_container.cpp msgid "Default Scroll Deadzone" -msgstr "" +msgstr "Zona Muerta Predeterminada del Scroll" #: scene/gui/slider.cpp msgid "Scrollable" @@ -24131,7 +24183,7 @@ msgstr "Sufijo" #: scene/gui/split_container.cpp msgid "Split Offset" -msgstr "Desplazamiento de División" +msgstr "Offset de División" #: scene/gui/split_container.cpp scene/gui/tree.cpp msgid "Collapsed" @@ -24260,7 +24312,7 @@ msgstr "Progreso" #: scene/gui/texture_progress.cpp msgid "Progress Offset" -msgstr "" +msgstr "Offset de Progreso" #: scene/gui/texture_progress.cpp msgid "Fill Mode" @@ -24284,7 +24336,7 @@ msgstr "Completar Grados" #: scene/gui/texture_progress.cpp scene/resources/primitive_meshes.cpp msgid "Center Offset" -msgstr "Desplazamiento Central" +msgstr "Offset Central" #: scene/gui/texture_progress.cpp msgid "Nine Patch Stretch" @@ -24515,15 +24567,16 @@ msgstr "" #: scene/main/scene_tree.cpp msgid "Default Environment" -msgstr "Entorno por Defecto" +msgstr "Entorno Predeterminado" #: scene/main/scene_tree.cpp msgid "" "Default Environment as specified in Project Settings (Rendering -> " "Environment -> Default Environment) could not be loaded." msgstr "" -"El Entorno por Defecto como se especifica en Configuración del Proyecto " -"(Rendering -> Environment -> Default Environment) no se ha podido cargar." +"No se ha podido cargar el entorno predeterminado especificado en la " +"configuración del proyecto (Renderizado -> Entorno -> Entorno " +"Predeterminado)." #: scene/main/scene_tree.cpp msgid "Enable Object Picking" @@ -24536,11 +24589,11 @@ msgid "" "Consider using a script's process loop instead of relying on a Timer for " "very low wait times." msgstr "" -"Los tiempos de espera del temporizador muy bajos (< 0,05 segundos) pueden " -"comportarse de manera significativamente diferente dependiendo de la " -"velocidad de fotogramas renderizados o de la fÃsica.\n" -"Considera la posibilidad de utilizar un bucle en process dentro del script " -"en lugar de depender de un Timer para tiempos de espera muy bajos." +"Los tiempos de espera del temporizador son muy bajos (< 0.05 segundos) y se " +"puede comportar de manera muy diferente dependiendo de la tasa de fotogramas " +"renderizados o de la fÃsica.\n" +"Considera la posibilidad de utilizar un bucle de procesos en un script en " +"lugar de depender de un Timer para tiempos de espera muy bajos." #: scene/main/timer.cpp msgid "Autostart" @@ -24605,7 +24658,6 @@ msgid "FXAA" msgstr "FXAA" #: scene/main/viewport.cpp -#, fuzzy msgid "Debanding" msgstr "Debanding" @@ -24686,9 +24738,8 @@ msgid "Tooltip Delay (sec)" msgstr "Retraso del Tooltip (sec)" #: scene/register_scene_types.cpp -#, fuzzy msgid "Swap OK Cancel" -msgstr "Intercambio OK Cancelar" +msgstr "Cancelar" #: scene/register_scene_types.cpp msgid "Layer Names" @@ -24832,7 +24883,6 @@ msgid "Check V Adjust" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "On Disabled" msgstr "Desactivado" @@ -24854,11 +24904,11 @@ msgstr "Modulación del Contorno de la Fuente" #: scene/resources/default_theme/default_theme.cpp msgid "Shadow Offset X" -msgstr "Desplazamiento de la Sombra en X" +msgstr "Offset de Sombra en X" #: scene/resources/default_theme/default_theme.cpp msgid "Shadow Offset Y" -msgstr "Desplazamiento de la Sombra en Y" +msgstr "Offset de Sombra en Y" #: scene/resources/default_theme/default_theme.cpp msgid "Shadow As Outline" @@ -24923,43 +24973,36 @@ msgid "Completion Lines" msgstr "Finalización de LÃneas" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Max Width" -msgstr "Completar" +msgstr "Completar Ancho Máximo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Scroll Width" -msgstr "Importar Seleccionado" +msgstr "Completar Ancho de Scroll" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Focus" -msgstr "Llenar superficie" +msgstr "Enfoque de Scroll" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grabber Highlight" -msgstr "Resaltador de Sintaxis" +msgstr "Agarre Resaltado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grabber Pressed" -msgstr "Preset" +msgstr "Agarre Presionado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Increment" -msgstr "Instrumento" +msgstr "Incremento" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Increment Highlight" -msgstr "Resaltador de Sintaxis" +msgstr "Incremento Resaltado" #: scene/resources/default_theme/default_theme.cpp msgid "Increment Pressed" @@ -24970,9 +25013,8 @@ msgid "Decrement" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Decrement Highlight" -msgstr "Resaltador de Sintaxis" +msgstr "Decremento Resaltado" #: scene/resources/default_theme/default_theme.cpp msgid "Decrement Pressed" @@ -24991,9 +25033,8 @@ msgid "Grabber Area Highlight" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grabber Disabled" -msgstr "Desactivar Elemento" +msgstr "Agarre Desactivado" #: scene/resources/default_theme/default_theme.cpp msgid "Tick" @@ -25004,74 +25045,60 @@ msgid "Updown" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scaleborder Size" -msgstr "Tamaño del Borde" +msgstr "Tamaño del Borde de la Escala" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Font" -msgstr "Código Fuente" +msgstr "Fuente del TÃtulo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Color" -msgstr "Color de Texto" +msgstr "Color del TÃtulo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Height" -msgstr "Prueba" +msgstr "Altura del TÃtulo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Highlight" -msgstr "Resaltado" +msgstr "Cierre Resaltado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close H Offset" -msgstr "Desplazamiento de Ruido" +msgstr "Cerrar Offset H" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close V Offset" -msgstr "Desplazamiento de Ruido" +msgstr "Cerrar Offset V" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Parent Folder" -msgstr "Crear Carpeta" +msgstr "Carpeta Padre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Toggle Hidden" -msgstr "Act./Desact. Archivos Ocultos" +msgstr "Oculto" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Panel Disabled" -msgstr "Clip Deshabilitado" +msgstr "Panel Desactivado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Labeled Separator Left" -msgstr "Separador con nombre" +msgstr "Separador con Etiqueta a la Izquierda" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Labeled Separator Right" -msgstr "Separador con nombre" +msgstr "Separador con Etiqueta a la Derecha" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Separator" -msgstr "Separador de Color de Fuentes" +msgstr "Separación de Fuente" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Accel" -msgstr "Color Hueso 1" +msgstr "Color de Fuente Accel" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Separator" @@ -25082,230 +25109,188 @@ msgid "V Separation" msgstr "Separación en V" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selected Frame" -msgstr "Seleccionar Fotogramas" +msgstr "Cuadro Seleccionado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Default Frame" -msgstr "Z Lejana por Defecto" +msgstr "Cuadro Predeterminado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Default Focus" -msgstr "Por defecto" +msgstr "Enfoque Predeterminado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Comment Focus" -msgstr "Confirmar" +msgstr "Comentario Enfocado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Breakpoint" -msgstr "Puntos de interrupción" +msgstr "Punto de Ruptura" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Resizer" -msgstr "Redimensionable" +msgstr "Reajuste" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Color" -msgstr "Colores" +msgstr "Cerrar Color" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Resizer Color" -msgstr "Colores" +msgstr "Cambiar Color" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Offset" -msgstr "Desplazamiento de Byte" +msgstr "Offset del TÃtulo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Offset" -msgstr "Desplazamiento de Ruido" +msgstr "Offset de Cierre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Port Offset" -msgstr "Pivote de Desplazamiento" +msgstr "Offset del Puerto" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "BG Focus" -msgstr "Foco en Ruta" +msgstr "Enfocar BG" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selected Focus" -msgstr "Seleccionar" +msgstr "Enfoque Seleccionado" #: scene/resources/default_theme/default_theme.cpp msgid "Cursor Unfocused" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Button Pressed" -msgstr "Preset" +msgstr "Botón Presionado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Button Normal" -msgstr "Botón de Conmutación" +msgstr "Botón del TÃtulo Normal" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Button Pressed" -msgstr "Botón de Conmutación" +msgstr "Botón del TÃtulo Presionado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Button Hover" -msgstr "Botón de Conmutación" +msgstr "Botón de TÃtulo Hover" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button" -msgstr "CustomNode" +msgstr "Botón Personalizado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button Pressed" -msgstr "Opciones de Bus" +msgstr "Botón Personalizado Presionado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button Hover" -msgstr "CustomNode" +msgstr "Botón Personalizado Hover" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Select Arrow" -msgstr "Seleccionar Todo" +msgstr "Seleccionar Flecha" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Arrow Collapsed" -msgstr "Colapsar Todo" +msgstr "Flecha Colapsada" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Button Font" -msgstr "Botón de Conmutación" +msgstr "Fuente del TÃtulo del Botón" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Button Color" -msgstr "Color de Selección" +msgstr "Color del TÃtulo del Botón" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Guide Color" -msgstr "Color de GuÃas" +msgstr "GuÃa de Colores" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Drop Position Color" -msgstr "Posición del Dock" +msgstr "Posición del Gotero de Color" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Relationship Line Color" -msgstr "Opacidad De LÃnea De Relación" +msgstr "Color de la LÃnea de Relación" #: scene/resources/default_theme/default_theme.cpp msgid "Custom Button Font Highlight" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Item Margin" -msgstr "Asignar Margen" +msgstr "Margen del Ãtem" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Button Margin" -msgstr "Máscara de Botones" +msgstr "Margen del Botón" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Draw Relationship Lines" -msgstr "Opacidad De LÃnea De Relación" +msgstr "Dibujar LÃneas de Relación" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Draw Guides" -msgstr "Mostrar GuÃas" +msgstr "GuÃas de Dibujo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Border" -msgstr "Desplazarse Verticalmente" +msgstr "Borde del Scroll" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Speed" -msgstr "Velocidad Desplazamiento V" +msgstr "Velocidad del Scroll" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Icon Margin" -msgstr "Asignar Margen" +msgstr "Margen del Icono" #: scene/resources/default_theme/default_theme.cpp msgid "Line Separation" msgstr "Separación de LÃneas" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab FG" -msgstr "Tab 1" +msgstr "Pestaña FG" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab BG" -msgstr "Tab 1" +msgstr "Pestaña BG" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab Disabled" -msgstr "Desactivar Elemento" +msgstr "Pestaña Desactivada" #: scene/resources/default_theme/default_theme.cpp msgid "Menu" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Menu Highlight" -msgstr "Resaltado" +msgstr "Menú Resaltado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color FG" -msgstr "Color Hueso 1" +msgstr "Color de Fuente FG" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color BG" -msgstr "Color Hueso 1" +msgstr "Color de Fuente BG" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Side Margin" -msgstr "Asignar Margen" +msgstr "Margen Lateral" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Top Margin" -msgstr "Asignar Margen" +msgstr "Margen Superior" #: scene/resources/default_theme/default_theme.cpp msgid "Label V Align FG" @@ -25316,86 +25301,72 @@ msgid "Label V Align BG" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Large" -msgstr "Objetivo" +msgstr "Largo" #: scene/resources/default_theme/default_theme.cpp msgid "Folder" msgstr "Carpeta" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folder Icon Modulate" -msgstr "Forzar Modulación en Blanco" +msgstr "Modular Icono de Carpeta" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "File Icon Modulate" -msgstr "Modo de Icono" +msgstr "Modular Icono de Archivo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Files Disabled" -msgstr "Clip Deshabilitado" +msgstr "Archivos Desactivados" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "SV Width" -msgstr "Ancho Izquierda" +msgstr "Ancho SV" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "SV Height" -msgstr "Luz" +msgstr "Alto SV" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "H Width" -msgstr "Ancho Izquierda" +msgstr "Ancho H" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Label Width" -msgstr "Ancho Izquierda" +msgstr "Ancho de Etiqueta" #: scene/resources/default_theme/default_theme.cpp msgid "Screen Picker" msgstr "Selector de Pantalla" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Add Preset" -msgstr "Cargar Ajuste Predeterminado" +msgstr "Añadir Preset" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Color Hue" -msgstr "Textura de Color" +msgstr "Tono de Color" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Color Sample" -msgstr "Colores" +msgstr "Muestra de Color" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG" -msgstr "Preajuste" +msgstr "Preset BG" #: scene/resources/default_theme/default_theme.cpp msgid "Overbright Indicator" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset FG" -msgstr "Preajuste" +msgstr "Preset FG" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG Icon" -msgstr "Preajuste" +msgstr "Preset Icono BG" #: scene/resources/default_theme/default_theme.cpp msgid "Normal Font" @@ -25414,9 +25385,8 @@ msgid "Bold Italics Font" msgstr "Fuente Negrita y Cursiva" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mono Font" -msgstr "Fuente Principal" +msgstr "Fuente Mono" #: scene/resources/default_theme/default_theme.cpp msgid "Table H Separation" @@ -25443,9 +25413,8 @@ msgid "Margin Bottom" msgstr "Margen Inferior" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Autohide" -msgstr "Corte Automático" +msgstr "Ocultar Automáticamente" #: scene/resources/default_theme/default_theme.cpp msgid "Minus" @@ -25456,76 +25425,64 @@ msgid "More" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grid Minor" -msgstr "Color de CuadrÃcula" +msgstr "Grid Menor" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grid Major" -msgstr "Mapeo de CuadrÃcula" +msgstr "Grid Mayor" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Fill" -msgstr "Sólo selección" +msgstr "Relleno de Selección" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Stroke" -msgstr "Seleccionar Propiedad" +msgstr "Selección de Stroke" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Activity" -msgstr "Acción" +msgstr "Actividad" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bezier Len Pos" -msgstr "Mover Puntos Bezier" +msgstr "Bezier Len Pos" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bezier Len Neg" -msgstr "Bezier" +msgstr "Bezier Len Neg" #: scene/resources/default_theme/default_theme.cpp msgid "Port Grab Distance Horizontal" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Port Grab Distance Vertical" -msgstr "WaitInstanceSignal" +msgstr "Distancia Vertical del Puerto de Agarre" #: scene/resources/dynamic_font.cpp msgid "Hinting" msgstr "" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Override Oversampling" -msgstr "Elemento de Anulación" +msgstr "Anular Sobremuestreo" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Font Path" -msgstr "Foco en Ruta" +msgstr "Ruta de la Fuente" #: scene/resources/dynamic_font.cpp msgid "Outline Size" msgstr "Tamaño del Contorno" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Outline Color" -msgstr "Función" +msgstr "Color del Contorno" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Use Mipmaps" -msgstr "Señales" +msgstr "Usar Mipmaps" #: scene/resources/dynamic_font.cpp msgid "Extra Spacing" @@ -25536,9 +25493,8 @@ msgid "Char" msgstr "Char" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Font Data" -msgstr "Con Datos" +msgstr "Datos de la Fuente" #: scene/resources/environment.cpp msgid "Background" @@ -25549,14 +25505,12 @@ msgid "Sky" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Custom FOV" -msgstr "CustomNode" +msgstr "FOV Personalizado del Cielo" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Orientation" -msgstr "Documentación en lÃnea" +msgstr "Orientación del Cielo" #: scene/resources/environment.cpp msgid "Sky Rotation" @@ -25575,14 +25529,12 @@ msgid "Camera Feed ID" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Ambient Light" -msgstr "Indentar a la Derecha" +msgstr "Luz Ambiental" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Contribution" -msgstr "Condición" +msgstr "Contribución del Cielo" #: scene/resources/environment.cpp msgid "Fog" @@ -25597,64 +25549,52 @@ msgid "Sun Amount" msgstr "Cantidad de Sol" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Enabled" -msgstr "Profundidad" +msgstr "Profundidad Activada" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Begin" -msgstr "Profundidad" +msgstr "Inicio de la Profundidad" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth End" -msgstr "Profundidad" +msgstr "Fin de la Profundidad" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Curve" -msgstr "Partir Curva" +msgstr "Curva de Profundidad" #: scene/resources/environment.cpp -#, fuzzy msgid "Transmit Enabled" -msgstr "Filtrar señales" +msgstr "Transmisión Activada" #: scene/resources/environment.cpp -#, fuzzy msgid "Transmit Curve" -msgstr "Partir Curva" +msgstr "Curva de Transmisión" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Enabled" -msgstr "Filtrar señales" +msgstr "Altura Activada" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Min" -msgstr "Luz" +msgstr "Altura MÃnima" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Max" -msgstr "Luz" +msgstr "Altura Máxima" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Curve" -msgstr "Partir Curva" +msgstr "Curva de Altura" #: scene/resources/environment.cpp -#, fuzzy msgid "Tonemap" -msgstr "Remapeos" +msgstr "Tonemap" #: scene/resources/environment.cpp -#, fuzzy msgid "Exposure" -msgstr "Exportar" +msgstr "Exposición" #: scene/resources/environment.cpp msgid "White" @@ -25673,14 +25613,12 @@ msgid "Max Luma" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "SS Reflections" -msgstr "Escalar Selección" +msgstr "Reflexiones SS" #: scene/resources/environment.cpp -#, fuzzy msgid "Max Steps" -msgstr "Paso" +msgstr "Pasos Máximos" #: scene/resources/environment.cpp msgid "Fade In" @@ -25691,9 +25629,8 @@ msgid "Fade Out" msgstr "Fundido de Salida" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Tolerance" -msgstr "Profundidad" +msgstr "Tolerancia de Profundidad" #: scene/resources/environment.cpp scene/resources/material.cpp msgid "Roughness" @@ -25712,14 +25649,12 @@ msgid "Intensity 2" msgstr "" #: scene/resources/environment.cpp scene/resources/material.cpp -#, fuzzy msgid "Light Affect" -msgstr "Ancho Derecha" +msgstr "Influencia de la Luz" #: scene/resources/environment.cpp -#, fuzzy msgid "AO Channel Affect" -msgstr "Depuración del Canal UV" +msgstr "Influencia del Canal AO" #: scene/resources/environment.cpp msgid "Blur" @@ -25750,42 +25685,40 @@ msgid "Glow" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Levels" -msgstr "Desarrolladores" +msgstr "Niveles" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp msgid "1" -msgstr "" +msgstr "1" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp msgid "2" -msgstr "" +msgstr "2" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp -#, fuzzy msgid "3" -msgstr "3D" +msgstr "3" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp msgid "4" -msgstr "" +msgstr "4" #: scene/resources/environment.cpp msgid "5" -msgstr "" +msgstr "5" #: scene/resources/environment.cpp msgid "6" -msgstr "" +msgstr "6" #: scene/resources/environment.cpp msgid "7" -msgstr "" +msgstr "7" #: scene/resources/environment.cpp msgid "Bloom" @@ -25800,9 +25733,8 @@ msgid "HDR Luminance Cap" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "HDR Scale" -msgstr "Escala" +msgstr "Escala HDR" #: scene/resources/environment.cpp msgid "Bicubic Upscale" @@ -25813,9 +25745,8 @@ msgid "Adjustments" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Brightness" -msgstr "Luz" +msgstr "Luminosidad" #: scene/resources/environment.cpp msgid "Saturation" @@ -25830,60 +25761,52 @@ msgid "Ascent" msgstr "Aumento" #: scene/resources/font.cpp -#, fuzzy msgid "Distance Field" -msgstr "Modo Sin Distracciones" +msgstr "Campo de Distancia" #: scene/resources/gradient.cpp -#, fuzzy msgid "Raw Data" -msgstr "Profundidad" +msgstr "Datos en Crudo" #: scene/resources/gradient.cpp msgid "Offsets" -msgstr "Desplazamientos" +msgstr "Offsets" #: scene/resources/height_map_shape.cpp msgid "Map Width" msgstr "" #: scene/resources/height_map_shape.cpp -#, fuzzy msgid "Map Depth" -msgstr "Profundidad" +msgstr "Mapa de Profundidad" #: scene/resources/height_map_shape.cpp -#, fuzzy msgid "Map Data" -msgstr "Profundidad" +msgstr "Datos del Mapa" #: scene/resources/line_shape_2d.cpp msgid "D" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Next Pass" -msgstr "Siguiente Plano" +msgstr "Siguiente Paso" #: scene/resources/material.cpp msgid "Use Shadow To Opacity" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Unshaded" -msgstr "Mostrar Sin Sombreado" +msgstr "Sin Sombreado" #: scene/resources/material.cpp -#, fuzzy msgid "Vertex Lighting" -msgstr "Iluminación directa" +msgstr "Iluminación de Vértices" #: scene/resources/material.cpp -#, fuzzy msgid "Use Point Size" -msgstr "Vista Frontal" +msgstr "Usar Tamaño del Punto" #: scene/resources/material.cpp msgid "World Triplanar" @@ -25898,23 +25821,20 @@ msgid "Do Not Receive Shadows" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Disable Ambient Light" -msgstr "Indentar a la Derecha" +msgstr "Desactivar Luz Ambiental" #: scene/resources/material.cpp -#, fuzzy msgid "Ensure Correct Normals" -msgstr "Transformar Normales" +msgstr "Asegurar Normales Correctas" #: scene/resources/material.cpp msgid "Albedo Tex MSDF" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Vertex Color" -msgstr "Vértice" +msgstr "Color del Vértice" #: scene/resources/material.cpp msgid "Use As Albedo" @@ -25929,39 +25849,32 @@ msgid "Parameters" msgstr "Parámetros" #: scene/resources/material.cpp -#, fuzzy msgid "Diffuse Mode" -msgstr "Modo desplazamiento lateral" +msgstr "Modo Difuso" #: scene/resources/material.cpp -#, fuzzy msgid "Specular Mode" -msgstr "Modo de Regla" +msgstr "Modo Especular" #: scene/resources/material.cpp -#, fuzzy msgid "Depth Draw Mode" -msgstr "Modo de Interpolación" +msgstr "Modo de Dibujo de Profundidad" #: scene/resources/material.cpp -#, fuzzy msgid "Line Width" -msgstr "Ancho Izquierda" +msgstr "Ancho de LÃnea" #: scene/resources/material.cpp -#, fuzzy msgid "Point Size" -msgstr "Vista Frontal" +msgstr "Tamaño de Punto" #: scene/resources/material.cpp -#, fuzzy msgid "Billboard Mode" -msgstr "Modo de Regla" +msgstr "Modo Billboard" #: scene/resources/material.cpp -#, fuzzy msgid "Billboard Keep Scale" -msgstr "Modo de Regla" +msgstr "Mantener Escala del Billboard" #: scene/resources/material.cpp msgid "Grow" @@ -25976,19 +25889,16 @@ msgid "Use Alpha Scissor" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Particles Anim" -msgstr "PartÃculas" +msgstr "Animación de PartÃculas" #: scene/resources/material.cpp -#, fuzzy msgid "H Frames" -msgstr "Fotograma %" +msgstr "Cuadros H" #: scene/resources/material.cpp -#, fuzzy msgid "V Frames" -msgstr "Fotograma %" +msgstr "Cuadros V" #: scene/resources/material.cpp msgid "Albedo" @@ -25999,14 +25909,12 @@ msgid "Metallic" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Texture Channel" -msgstr "Región de Textura" +msgstr "Canal de Textura" #: scene/resources/material.cpp -#, fuzzy msgid "Emission" -msgstr "Máscara de Emisión" +msgstr "Emisión" #: scene/resources/material.cpp msgid "On UV2" @@ -26021,9 +25929,8 @@ msgid "Rim" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Clearcoat" -msgstr "Limpiar" +msgstr "Transparencia" #: scene/resources/material.cpp msgid "Gloss" @@ -26038,32 +25945,28 @@ msgid "Flowmap" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Ambient Occlusion" -msgstr "Oclusión" +msgstr "Oclusión Ambiental" #: scene/resources/material.cpp msgid "Deep Parallax" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Min Layers" -msgstr "Capa" +msgstr "Capas MÃnimas" #: scene/resources/material.cpp -#, fuzzy msgid "Max Layers" -msgstr "Capa" +msgstr "Capas Máximas" #: scene/resources/material.cpp msgid "Flip Tangent" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Flip Binormal" -msgstr "Voltear Portal" +msgstr "Voltear Binormal" #: scene/resources/material.cpp msgid "Subsurf Scatter" @@ -26082,14 +25985,12 @@ msgid "Detail" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "UV Layer" -msgstr "Capa" +msgstr "Capa UV" #: scene/resources/material.cpp -#, fuzzy msgid "UV1" -msgstr "UV" +msgstr "UV1" #: scene/resources/material.cpp msgid "Triplanar" @@ -26100,42 +26001,36 @@ msgid "Triplanar Sharpness" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "UV2" -msgstr "UV" +msgstr "UV2" #: scene/resources/material.cpp -#, fuzzy msgid "Proximity Fade" -msgstr "Modo de Prioridad" +msgstr "Desvanecimiento de Proximidad" #: scene/resources/material.cpp msgid "Distance Fade" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Async Mode" -msgstr "Modo desplazamiento lateral" +msgstr "Modo AsÃncrono" #: scene/resources/mesh.cpp -#, fuzzy msgid "Lightmap Size Hint" -msgstr "Calcular Lightmaps" +msgstr "Sugerencia de Tamaño del Lightmap" #: scene/resources/mesh.cpp scene/resources/primitive_meshes.cpp msgid "Custom AABB" msgstr "" #: scene/resources/mesh_library.cpp -#, fuzzy msgid "Mesh Transform" -msgstr "Transformar" +msgstr "Transformación de Mesh" #: scene/resources/mesh_library.cpp -#, fuzzy msgid "NavMesh Transform" -msgstr "Reestablecer Transformación" +msgstr "Transformación de NavMesh" #: scene/resources/multimesh.cpp msgid "Color Format" @@ -26150,9 +26045,8 @@ msgid "Custom Data Format" msgstr "" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Instance Count" -msgstr "Instanciar" +msgstr "Conteo de Instancias" #: scene/resources/multimesh.cpp msgid "Visible Instance Count" @@ -26163,9 +26057,8 @@ msgid "Sampling" msgstr "Muestreo" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Partition Type" -msgstr "Establecer tipo de base de variación" +msgstr "Tipo de Partición" #: scene/resources/navigation_mesh.cpp msgid "Parsed Geometry Type" @@ -26176,18 +26069,16 @@ msgid "Source Geometry Mode" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Source Group Name" -msgstr "Fuente" +msgstr "Nombre del Grupo de Origen" #: scene/resources/navigation_mesh.cpp msgid "Cells" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Agents" -msgstr "Segmentos" +msgstr "Agentes" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" @@ -26198,14 +26089,12 @@ msgid "Max Slope" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Regions" -msgstr "Región" +msgstr "Regiones" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Merge Size" -msgstr "Unir desde escena" +msgstr "Tamaño de Unión" #: scene/resources/navigation_mesh.cpp msgid "Edges" @@ -26220,9 +26109,8 @@ msgid "Verts Per Poly" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Details" -msgstr "Mostrar Por Defecto" +msgstr "Detalles" #: scene/resources/navigation_mesh.cpp msgid "Sample Distance" @@ -26245,14 +26133,12 @@ msgid "Walkable Low Height Spans" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Baking AABB" -msgstr "Generando AABB" +msgstr "Bakear AABB" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Baking AABB Offset" -msgstr "Desplazamiento Base" +msgstr "Bakear Offset AABB" #: scene/resources/occluder_shape.cpp msgid "Spheres" @@ -26263,14 +26149,12 @@ msgid "OccluderShapeSphere Set Spheres" msgstr "Establecer Esferas OccluderShapeSphere" #: scene/resources/occluder_shape_polygon.cpp -#, fuzzy msgid "Polygon Points" -msgstr "PolÃgonos" +msgstr "Puntos de PolÃgonos" #: scene/resources/occluder_shape_polygon.cpp -#, fuzzy msgid "Hole Points" -msgstr "Mover Puntos" +msgstr "Puntos de Rotura" #: scene/resources/packed_scene.cpp msgid "Bundled" @@ -26281,9 +26165,8 @@ msgid "Trail" msgstr "" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Divisor" -msgstr "Dividir %s" +msgstr "Divisor" #: scene/resources/particles_material.cpp msgid "Size Modifier" @@ -26306,9 +26189,8 @@ msgid "Color Texture" msgstr "Textura de Color" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Point Count" -msgstr "Añadir Puerto de Entrada" +msgstr "Conteo de Puntos" #: scene/resources/particles_material.cpp msgid "Scale Random" @@ -26367,9 +26249,8 @@ msgid "Is Hemisphere" msgstr "" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Curve Step" -msgstr "Partir Curva" +msgstr "Paso de Curva" #: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp msgid "Slips On Slope" @@ -26384,19 +26265,16 @@ msgid "Custom Solver Bias" msgstr "" #: scene/resources/skin.cpp -#, fuzzy msgid "Bind Count" -msgstr "Añadir Puerto de Entrada" +msgstr "Conteo de Vinculaciones" #: scene/resources/skin.cpp -#, fuzzy msgid "Bind" msgstr "Vinculación" #: scene/resources/skin.cpp -#, fuzzy msgid "Bone" -msgstr "Huesos" +msgstr "Hueso" #: scene/resources/sky.cpp msgid "Radiance Size" @@ -26407,9 +26285,8 @@ msgid "Panorama" msgstr "" #: scene/resources/sky.cpp -#, fuzzy msgid "Top Color" -msgstr "Siguiente Plano" +msgstr "Color Superior" #: scene/resources/sky.cpp msgid "Horizon Color" @@ -26420,19 +26297,16 @@ msgid "Ground" msgstr "Suelo" #: scene/resources/sky.cpp -#, fuzzy msgid "Bottom Color" -msgstr "Marcadores" +msgstr "Color Inferior" #: scene/resources/sky.cpp -#, fuzzy msgid "Sun" -msgstr "Ejecutar" +msgstr "Sol" #: scene/resources/sky.cpp -#, fuzzy msgid "Latitude" -msgstr "Sustituir" +msgstr "Latitud" #: scene/resources/sky.cpp msgid "Longitude" @@ -26447,23 +26321,20 @@ msgid "Angle Max" msgstr "" #: scene/resources/style_box.cpp -#, fuzzy msgid "Content Margin" -msgstr "Asignar Margen" +msgstr "Margen de Contenido" #: scene/resources/style_box.cpp -#, fuzzy msgid "Expand Margin" -msgstr "Expandir Todo" +msgstr "Expandir Margen" #: scene/resources/style_box.cpp msgid "Skew" msgstr "" #: scene/resources/style_box.cpp -#, fuzzy msgid "Corner Radius" -msgstr "Cambiar Radio Interno de Torus" +msgstr "Radio de Esquina" #: scene/resources/style_box.cpp msgid "Corner Detail" @@ -26482,121 +26353,100 @@ msgid "Grow End" msgstr "" #: scene/resources/texture.cpp -#, fuzzy msgid "Load Path" -msgstr "Cargar Ajuste Predeterminado" +msgstr "Ruta de Carga" #: scene/resources/texture.cpp -#, fuzzy msgid "Base Texture" -msgstr "Eliminar Textura" +msgstr "Textura Base" #: scene/resources/texture.cpp msgid "Image Size" msgstr "Tamaño de la Imagen" #: scene/resources/texture.cpp -#, fuzzy msgid "Side" -msgstr "Mostrar GuÃas" +msgstr "Lado" #: scene/resources/texture.cpp -#, fuzzy msgid "Front" -msgstr "Vista Frontal" +msgstr "Frente" #: scene/resources/texture.cpp -#, fuzzy msgid "Back" -msgstr "Retroceder" +msgstr "Posterior" #: scene/resources/texture.cpp -#, fuzzy msgid "Storage Mode" -msgstr "Modo de Escalado" +msgstr "Modo de Almacenamiento" #: scene/resources/texture.cpp -#, fuzzy msgid "Lossy Storage Quality" -msgstr "Captura" +msgstr "Calidad de Almacenamiento con Pérdidas" #: scene/resources/texture.cpp -#, fuzzy msgid "From" -msgstr "Rellene Desde" +msgstr "Desde" #: scene/resources/texture.cpp -#, fuzzy msgid "To" -msgstr "Superior" +msgstr "A" #: scene/resources/texture.cpp -#, fuzzy msgid "Base" -msgstr "Tipo Base" +msgstr "Base" #: scene/resources/texture.cpp -#, fuzzy msgid "Current Frame" -msgstr "Nombre de la escena actual" +msgstr "Cuadro Actual" #: scene/resources/texture.cpp -#, fuzzy msgid "Pause" -msgstr "Modo desplazamiento lateral" +msgstr "Pausa" #: scene/resources/texture.cpp msgid "Which Feed" msgstr "" #: scene/resources/texture.cpp -#, fuzzy msgid "Camera Is Active" -msgstr "Respetar Mayúsculas/Minúsculas" +msgstr "Cámara Activa" #: scene/resources/theme.cpp -#, fuzzy msgid "Default Font" -msgstr "Por defecto" +msgstr "Fuente Predeterminada" #: scene/resources/visual_shader.cpp msgid "Output Port For Preview" msgstr "" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Depth Draw" -msgstr "Modo de Interpolación" +msgstr "Dibujo de Profundidad" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Cull" -msgstr "Modo de Regla" +msgstr "Cull" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Diffuse" -msgstr "Modo desplazamiento lateral" +msgstr "Difuso" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Async" -msgstr "Modo desplazamiento lateral" +msgstr "AsÃncrono" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Modes" -msgstr "Modo" +msgstr "Modos" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Input Name" -msgstr "Mapa de Entrada" +msgstr "Nombre de Entrada" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Uniform Name" -msgstr "Establecer Nombre de Uniform" +msgstr "Nombre del Uniform" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -26615,85 +26465,72 @@ msgid "Invalid source for shader." msgstr "Fuente inválida para el shader." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Texture Type" -msgstr "Región de Textura" +msgstr "Tipo de Textura" #: scene/resources/visual_shader_nodes.cpp msgid "Cube Map" msgstr "" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Default Value Enabled" -msgstr "Perfil de CaracterÃsticas de Godot" +msgstr "Valor Predeterminado Activado" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Default Value" -msgstr "Cambiar Valor de Entrada" +msgstr "Valor Predeterminado" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Color Default" -msgstr "Cargar Valores por Defecto" +msgstr "Color Predeterminado" #: scene/resources/visual_shader_nodes.cpp msgid "Invalid comparison function for that type." msgstr "Función de comparación inválida para este tipo." #: scene/resources/world.cpp -#, fuzzy msgid "Fallback Environment" -msgstr "Ver Entorno" +msgstr "Entorno de Retorno" #: scene/resources/world.cpp -#, fuzzy msgid "Scenario" -msgstr "Escena" +msgstr "Escenario" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Navigation Map" -msgstr "Navegación" +msgstr "Mapa de Navegación" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Direct Space State" msgstr "" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Gravity Vector" -msgstr "Vista Previa Por Defecto" +msgstr "Vector de Gravedad Predeterminado" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Linear Damp" -msgstr "Izquierda Lineal" +msgstr "Amortiguación Lineal Predeterminada" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Default Angular Damp" -msgstr "" +msgstr "Amortiguación Angular Predeterminada" #: scene/resources/world.cpp -#, fuzzy msgid "Default Map Up" -msgstr "Escalonado de Flotantes por Defecto" +msgstr "Mapa Superior Predeterminado" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Size" -msgstr "Vista Previa Por Defecto" +msgstr "Vista Previa Predeterminada" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Height" -msgstr "Prueba" +msgstr "Altura de Celda Predeterminada" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Edge Connection Margin" -msgstr "Margen de Conexión de Bordes" +msgstr "Margen de Conexión de Bordes Predeterminado" #: scene/resources/world_2d.cpp msgid "Canvas" @@ -26704,9 +26541,8 @@ msgid "Is Primary" msgstr "" #: servers/arvr/arvr_interface.cpp -#, fuzzy msgid "Is Initialized" -msgstr "Inicializar" +msgstr "Inicializado" #: servers/arvr/arvr_interface.cpp msgid "AR" @@ -26717,14 +26553,12 @@ msgid "Is Anchor Detection Enabled" msgstr "" #: servers/arvr_server.cpp -#, fuzzy msgid "Primary Interface" -msgstr "Interfaz de usuario" +msgstr "Interfaz Principal" #: servers/audio/audio_stream.cpp -#, fuzzy msgid "Audio Stream" -msgstr "Radio Elemento" +msgstr "Audio Stream" #: servers/audio/audio_stream.cpp msgid "Random Pitch" @@ -26766,9 +26600,8 @@ msgid "Rate Hz" msgstr "" #: servers/audio/effects/audio_effect_chorus.cpp -#, fuzzy msgid "Depth (ms)" -msgstr "Profundidad" +msgstr "Profundidad (ms)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp @@ -26791,9 +26624,8 @@ msgid "Attack (µs)" msgstr "" #: servers/audio/effects/audio_effect_compressor.cpp -#, fuzzy msgid "Release (ms)" -msgstr "Release" +msgstr "Release (ms)" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Mix" @@ -26814,14 +26646,12 @@ msgstr "" #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_phaser.cpp #: servers/audio/effects/audio_effect_reverb.cpp -#, fuzzy msgid "Feedback" -msgstr "Enviar Feedback de la Documentación" +msgstr "Feedback" #: servers/audio/effects/audio_effect_delay.cpp -#, fuzzy msgid "Low-pass" -msgstr "Omitir" +msgstr "Paso Bajo" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Pre Gain" @@ -26836,14 +26666,12 @@ msgid "Drive" msgstr "" #: servers/audio/effects/audio_effect_distortion.cpp -#, fuzzy msgid "Post Gain" -msgstr "Posterior" +msgstr "Ganancia Puntual" #: servers/audio/effects/audio_effect_filter.cpp -#, fuzzy msgid "Resonance" -msgstr "Recursos" +msgstr "Resonancia" #: servers/audio/effects/audio_effect_limiter.cpp msgid "Ceiling dB" @@ -26891,9 +26719,8 @@ msgid "Room Size" msgstr "" #: servers/audio/effects/audio_effect_reverb.cpp -#, fuzzy msgid "High-pass" -msgstr "Omitir" +msgstr "Paso Alto" #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp msgid "Tap Back Pos" @@ -26912,51 +26739,44 @@ msgid "Surround" msgstr "" #: servers/audio_server.cpp -#, fuzzy msgid "Enable Audio Input" -msgstr "Renombrar Bus de Audio" +msgstr "Activar Entrada de Audio" #: servers/audio_server.cpp -#, fuzzy msgid "Output Latency" -msgstr "Salida" +msgstr "Latencia de Salida" #: servers/audio_server.cpp msgid "Channel Disable Threshold dB" msgstr "" #: servers/audio_server.cpp -#, fuzzy msgid "Channel Disable Time" -msgstr "Cambiar Tiempo de Mezcla" +msgstr "Tiempo de Desconexión del Canal" #: servers/audio_server.cpp msgid "Video Delay Compensation (ms)" msgstr "" #: servers/audio_server.cpp -#, fuzzy msgid "Bus Count" -msgstr "Añadir Puerto de Entrada" +msgstr "Conteo de Buses" #: servers/audio_server.cpp -#, fuzzy msgid "Capture Device" -msgstr "Capturar desde pÃxel" +msgstr "Dispositivo de Captura" #: servers/audio_server.cpp -#, fuzzy msgid "Global Rate Scale" -msgstr "Variable" +msgstr "Escala Global de Porcentajes" #: servers/camera/camera_feed.cpp msgid "Feed" msgstr "" #: servers/camera/camera_feed.cpp -#, fuzzy msgid "Is Active" -msgstr "Perspectiva" +msgstr "Activo" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Sleep Threshold Linear" @@ -26983,28 +26803,24 @@ msgid "Inverse Mass" msgstr "" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Inverse Inertia" -msgstr "Vista Libre Izquierda" +msgstr "Inercia Inversa" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Total Angular Damp" msgstr "" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Total Linear Damp" -msgstr "Lineal" +msgstr "Amortiguación Lineal Total" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Total Gravity" -msgstr "Vista Previa Por Defecto" +msgstr "Gravedad Total" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Linear Velocity" -msgstr "Inicializar" +msgstr "Velocidad Lineal" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Exclude" @@ -27015,9 +26831,8 @@ msgid "Shape RID" msgstr "" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collide With Bodies" -msgstr "Modo de Colisión" +msgstr "Colisión de Cuerpos" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collide With Areas" @@ -27028,39 +26843,32 @@ msgid "Motion Remainder" msgstr "" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Point" -msgstr "Modo de Colisión" +msgstr "Punto de Colisión" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Normal" -msgstr "Modo de Colisión" +msgstr "Colisión Normal" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Depth" -msgstr "Modo de Colisión" +msgstr "Profundidad de Colisión" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Safe Fraction" -msgstr "Modo de Colisión" +msgstr "Fracción Segura de Colisión" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Unsafe Fraction" -msgstr "Modo de Colisión" +msgstr "Fracción Insegura de Colisión" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Physics Engine" -msgstr "Fotogramas de FÃsica %" +msgstr "Motor de FÃsica" #: servers/physics_server.cpp -#, fuzzy msgid "Center Of Mass" -msgstr "Centro Izquierda" +msgstr "Centro de la Masa" #: servers/physics_server.cpp msgid "Principal Inertia Axes" @@ -27071,22 +26879,20 @@ msgid "Varying may not be assigned in the '%s' function." msgstr "No se puede asignar la variable en la función '%s'." #: servers/visual/shader_language.cpp -#, fuzzy msgid "" "Varyings which were assigned in 'vertex' function may not be reassigned in " "'fragment' or 'light'." msgstr "" -"Las variaciones asignadas en función 'vértice' no pueden reasignarse en " -"'fragmento' o 'luz'." +"Las variaciones que se asignaron en la función 'vertex'no pueden reasignarse " +"en 'fragment' o 'light'." #: servers/visual/shader_language.cpp -#, fuzzy msgid "" "Varyings which were assigned in 'fragment' function may not be reassigned in " "'vertex' or 'light'." msgstr "" -"Varyings Cuál asignó en 'fragmento' la función no puede ser reasignada en " -"'vértice' o 'ligero'." +"Las variaciones que se asignaron en la función 'fragment' no pueden " +"reasignarse en 'vertex' o 'light'." #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -27105,48 +26911,40 @@ msgid "Spatial Partitioning" msgstr "Partición de Espacios" #: servers/visual_server.cpp -#, fuzzy msgid "Render Loop Enabled" -msgstr "Filtrar señales" +msgstr "Bucle de Renderización Activado" #: servers/visual_server.cpp -#, fuzzy msgid "VRAM Compression" -msgstr "Expresión" +msgstr "Compresión VRAM" #: servers/visual_server.cpp -#, fuzzy msgid "Import BPTC" -msgstr "Importar" +msgstr "Importar BPTC" #: servers/visual_server.cpp -#, fuzzy msgid "Import S3TC" -msgstr "Importar" +msgstr "Importar S3TC" #: servers/visual_server.cpp -#, fuzzy msgid "Import ETC" -msgstr "Importar" +msgstr "Importar ETC" #: servers/visual_server.cpp -#, fuzzy msgid "Import ETC2" -msgstr "Importar" +msgstr "Importar ETC2" #: servers/visual_server.cpp -#, fuzzy msgid "Import PVRTC" -msgstr "Importar Theme" +msgstr "Importar PVRTC" #: servers/visual_server.cpp msgid "Lossless Compression" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Force PNG" -msgstr "Forzar Push" +msgstr "Forzar PNG" #: servers/visual_server.cpp msgid "WebP Compression Level" @@ -27157,9 +26955,8 @@ msgid "Time Rollover Secs" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Cubemap Size" -msgstr "Cambiar Tamaño de Cámara" +msgstr "Tamaño del Cubemap" #: servers/visual_server.cpp msgid "Quadrant 0 Subdiv" @@ -27178,19 +26975,16 @@ msgid "Quadrant 3 Subdiv" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shadows" -msgstr "Shader" +msgstr "Sombras" #: servers/visual_server.cpp -#, fuzzy msgid "Filter Mode" -msgstr "Filtrar nodos" +msgstr "Modo de Filtrado" #: servers/visual_server.cpp -#, fuzzy msgid "Texture Array Reflections" -msgstr "Centrar Selección" +msgstr "Reflejos del Array de Texturas" #: servers/visual_server.cpp msgid "High Quality GGX" @@ -27201,9 +26995,8 @@ msgid "Irradiance Max Size" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shading" -msgstr "Relleno" +msgstr "Sombreado" #: servers/visual_server.cpp msgid "Force Vertex Shading" @@ -27222,9 +27015,8 @@ msgid "Mesh Storage" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Split Stream" -msgstr "Partir Curva" +msgstr "Stream Dividido" #: servers/visual_server.cpp msgid "Use Physical Light Attenuation" @@ -27263,23 +27055,20 @@ msgid "Use Software Skinning" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Ninepatch Mode" -msgstr "Modo de Interpolación" +msgstr "Modo Ninepatch" #: servers/visual_server.cpp -#, fuzzy msgid "OpenGL" -msgstr "Abrir" +msgstr "OpenGL" #: servers/visual_server.cpp msgid "Batching Send Null" -msgstr "" +msgstr "EnvÃo de Lotes Nulo" #: servers/visual_server.cpp -#, fuzzy msgid "Batching Stream" -msgstr "Renombrar por lote" +msgstr "Flujo de Lotes" #: servers/visual_server.cpp msgid "Legacy Orphan Buffers" @@ -27291,16 +27080,15 @@ msgstr "" #: servers/visual_server.cpp msgid "Batching" -msgstr "Puesta en marcha" +msgstr "División en Lotes" #: servers/visual_server.cpp msgid "Use Batching" -msgstr "" +msgstr "Usar División en Lotes" #: servers/visual_server.cpp -#, fuzzy msgid "Use Batching In Editor" -msgstr "Actualización del editor" +msgstr "Usar División en Lotes en el Editor" #: servers/visual_server.cpp msgid "Single Rect Fallback" @@ -27332,12 +27120,11 @@ msgstr "" #: servers/visual_server.cpp msgid "Flash Batching" -msgstr "" +msgstr "Procesamiento Instantáneo de Lotes" #: servers/visual_server.cpp -#, fuzzy msgid "Diagnose Frame" -msgstr "Pegar Fotograma" +msgstr "Diagnosticar Cuadro" #: servers/visual_server.cpp msgid "GLES2" @@ -27352,9 +27139,8 @@ msgid "Disable Half Float" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Enable High Float" -msgstr "Activar Prioridad" +msgstr "Activar Flotante Alto" #: servers/visual_server.cpp msgid "Precision" @@ -27369,9 +27155,8 @@ msgid "UV Contract Amount" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Use Simple PVS" -msgstr "Usar Ajuste de Escalado" +msgstr "Usar PVS Simple" #: servers/visual_server.cpp msgid "PVS Logging" @@ -27382,18 +27167,16 @@ msgid "Use Signals" msgstr "Usar Señales" #: servers/visual_server.cpp -#, fuzzy msgid "Remove Danglers" -msgstr "Eliminar Tile" +msgstr "Eliminar Danglers" #: servers/visual_server.cpp msgid "Flip Imported Portals" msgstr "Voltear Portales Importados" #: servers/visual_server.cpp -#, fuzzy msgid "Occlusion Culling" -msgstr "Ver Eliminación de Oclusión" +msgstr "Occlusion Culling" #: servers/visual_server.cpp msgid "Max Active Spheres" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 10a562d0b8..5babe4ff23 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -4584,6 +4584,7 @@ msgstr "Herramientas misceláneas a nivel proyecto o escena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proyecto" @@ -7533,7 +7534,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15614,18 +15616,19 @@ msgstr "" msgid "Make Local" msgstr "Crear Local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nombre de Nodo:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "El nombre ya está en uso por otra función/variable/señal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Nombre de Nodo:" #: editor/scene_tree_dock.cpp @@ -15828,6 +15831,11 @@ msgid "Button Group" msgstr "Grupo de Botones" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nombre de Nodo:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Conectando Desde)" @@ -15904,6 +15912,10 @@ msgstr "" "Nombre de nodo inválido, los siguientes caracteres no están permitidos:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renombrar Nodo" @@ -17830,6 +17842,21 @@ msgstr "Construir Solución" msgid "Auto Update Project" msgstr "Proyecto Sin Nombre" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Mostrar Todo" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Elegà un Directorio" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Elegà un Directorio" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Fin del stack trace de excepción interna" @@ -19698,6 +19725,11 @@ msgstr "CustomNode" msgid "Custom BG Color" msgstr "CustomNode" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Expandir Todos" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20593,6 +20625,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nombre corto de paquete inválido." diff --git a/editor/translations/et.po b/editor/translations/et.po index 3976c9f0bd..20da09ffc5 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -4507,6 +4507,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7299,7 +7300,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15134,18 +15136,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Sõlme nimi:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Sõlme nimi:" #: editor/scene_tree_dock.cpp @@ -15337,6 +15339,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Sõlme nimi:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15400,6 +15407,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17256,6 +17267,21 @@ msgstr "Poolresolutioon" msgid "Auto Update Project" msgstr "Projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Kuva kõik" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Vali kataloog" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Vali kataloog" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19042,6 +19068,11 @@ msgstr "Kustuta sõlm(ed)" msgid "Custom BG Color" msgstr "Kustuta sõlm(ed)" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Laienda kõik" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19877,6 +19908,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index 3e69f3c4b9..c0f1953269 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -4426,6 +4426,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proiektua" @@ -7197,7 +7198,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14999,18 +15001,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Animazio berriaren izena:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Animazio berriaren izena:" #: editor/scene_tree_dock.cpp @@ -15200,6 +15202,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Animazio berriaren izena:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15263,6 +15270,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17102,6 +17113,21 @@ msgstr "" msgid "Auto Update Project" msgstr "Proiektua" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Erakutsi guztiak" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Ireki direktorioa" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Ireki direktorioa" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18861,6 +18887,11 @@ msgstr "Funtzioak:" msgid "Custom BG Color" msgstr "Funtzioak:" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Esportatu" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19684,6 +19715,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index 86b847e530..186ab7264e 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -26,13 +26,18 @@ # Seyed Fazel Alavi <fazel8195@gmail.com>, 2022. # Giga hertz <gigahertzyt@gmail.com>, 2022. # Aryan Azadeh <aryan@azadeh.email>, 2022. +# Mitsuha Miamizu <mitsuha.miamizu4444@gmail.com>, 2022. +# LordProfo <nimaentity30@gmail.com>, 2022. +# LordProfo (Nima) <nimaentity30@gmail.com>, 2022. +# John Smith <pkafsharix@gmail.com>, 2022. +# Ali Jafari <ali.jafari.sn@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-20 06:44+0000\n" -"Last-Translator: Aryan Azadeh <aryan@azadeh.email>\n" +"PO-Revision-Date: 2022-09-09 12:36+0000\n" +"Last-Translator: LordProfo (Nima) <nimaentity30@gmail.com>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot/fa/>\n" "Language: fa\n" @@ -40,107 +45,97 @@ 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.13.1-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "" +msgstr "درایور تبلت" #: core/bind/core_bind.cpp -#, fuzzy msgid "Clipboard" -msgstr "ØØ§Ùظه پنهان خالی است!" +msgstr "کلیپ‌بورد" #: core/bind/core_bind.cpp -#, fuzzy msgid "Current Screen" -msgstr "ØØ±Ú©Øª دادن گره(ها)" +msgstr "ØµÙØÙ‡ کنونی" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "کد خروج" #: core/bind/core_bind.cpp -#, fuzzy msgid "V-Sync Enabled" -msgstr "روشن" +msgstr "V-Sync ÙØ¹Ø§Ù„ شد" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "V-Sync از طریق کامپوزیتور" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "" +msgstr "هموارسازی دلتا" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode" -msgstr "ØØ§Ù„ت صدور:" +msgstr "ØØ§Ù„ت Ø§Ø³ØªÙØ§Ø¯Ù‡Ù” Ú©Ù… پردازنده" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "" +msgstr "ØØ§Ù„ت خواب Ø§Ø³ØªÙØ§Ø¯Ù‡ Ú©Ù… پردازنده (µsec)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" -msgstr "" +msgstr "روشن Ù†Ú¯Ù‡ داشتن ØµÙØÙ‡ نمایش" #: core/bind/core_bind.cpp -#, fuzzy msgid "Min Window Size" -msgstr "باز کردن Ùˆ اجرای یک اسکریپت" +msgstr "ØØ¯Ø§Ù‚Ù„ اندازهٔ پنجره" #: core/bind/core_bind.cpp -#, fuzzy msgid "Max Window Size" -msgstr "باز کردن Ùˆ اجرای یک اسکریپت" +msgstr "ØØ¯Ø§Ú©Ø«Ø± اندازهٔ پنجره" #: core/bind/core_bind.cpp -#, fuzzy msgid "Screen Orientation" -msgstr "شمارش ها" +msgstr "جهت ØµÙØÙ‡ نمایش" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Window" -msgstr "چارچوب جدید" +msgstr "پنجره" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Borderless" -msgstr "" +msgstr "بدون ØØ§Ø´ÛŒÙ‡" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "" +msgstr "Ø´ÙØ§Ùیت پیکسل به پیکسل ÙØ¹Ø§Ù„ است" #: core/bind/core_bind.cpp core/project_settings.cpp -#, fuzzy msgid "Fullscreen" msgstr "ØØ§Ù„ت تمام ØµÙØÙ‡" #: core/bind/core_bind.cpp msgid "Maximized" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± اندازه" #: core/bind/core_bind.cpp msgid "Minimized" -msgstr "" +msgstr "ØØ¯Ø§Ù‚Ù„ اندازه" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "قابل تغییر اندازه" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/physics_body.cpp scene/3d/remote_transform.cpp #: scene/gui/control.cpp scene/gui/line_edit.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Position" -msgstr "برداشتن موج" +msgstr "موقعیت" #: core/bind/core_bind.cpp core/project_settings.cpp editor/editor_settings.cpp #: main/main.cpp modules/gridmap/grid_map.cpp @@ -152,61 +147,55 @@ msgstr "برداشتن موج" #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp msgid "Size" -msgstr "" +msgstr "اندازه" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "" +msgstr "جا‌به‌جایی اندیان" #: core/bind/core_bind.cpp -#, fuzzy msgid "Editor Hint" -msgstr "ویرایشگر" +msgstr "راهنمای ویرایشگر" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "چاپ کردن پیام خطا" #: core/bind/core_bind.cpp -#, fuzzy msgid "Iterations Per Second" -msgstr "ØØ§Ù„ت درون یابی(درون‌یابی روشی است برای ÛŒØ§ÙØªÙ† مقدار تابع درون یک بازه)" +msgstr "تکرار در ثانیه" #: core/bind/core_bind.cpp msgid "Target FPS" -msgstr "" +msgstr "FPS هدÙ" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "بومی" +msgstr "مقیاس زمانی" #: core/bind/core_bind.cpp main/main.cpp msgid "Physics Jitter Fix" -msgstr "" +msgstr "ØÙ„ لرزش Ùیزیک" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" -msgstr "" +msgstr "خطا" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "خطا در بارگذاری:" +msgstr "رشته خطا" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error Line" -msgstr "خطا در بارگذاری:" +msgstr "خط خطا" #: core/bind/core_bind.cpp -#, fuzzy msgid "Result" -msgstr "جستجوی راهنما" +msgstr "نتیجه" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" -msgstr "" +msgstr "مموری" #: core/command_queue_mt.cpp core/message_queue.cpp #: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -217,46 +206,43 @@ msgstr "" #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: servers/visual_server.cpp msgid "Limits" -msgstr "" +msgstr "Ù…ØØ¯ÙˆØ¯ÛŒØªâ€ŒÙ‡Ø§" #: core/command_queue_mt.cpp msgid "Command Queue" -msgstr "" +msgstr "ØµÙ ÙØ±Ù…ان" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" -msgstr "" +msgstr "انداهٔ ص٠چند رشته‌ای (کیلوبایت)" #: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Function" -msgstr "توابع" +msgstr "تابع" #: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp msgid "Data" -msgstr "" +msgstr "داده" #: core/io/file_access_network.cpp core/register_core_types.cpp #: editor/editor_file_dialog.cpp editor/editor_settings.cpp main/main.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Network" -msgstr "صدور پروژه" +msgstr "شبکه" #: core/io/file_access_network.cpp -#, fuzzy msgid "Remote FS" -msgstr "برداشتن" +msgstr "ریموت FS" #: core/io/file_access_network.cpp msgid "Page Size" -msgstr "" +msgstr "اندازهٔ ØµÙØÙ‡" #: core/io/file_access_network.cpp msgid "Page Read Ahead" @@ -264,81 +250,77 @@ msgstr "" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "" +msgstr "ØØ§Ù„ت مسدود کردن ÙØ¹Ø§Ù„ شد" #: core/io/http_client.cpp -#, fuzzy msgid "Connection" msgstr "اتصال" #: core/io/http_client.cpp +#, fuzzy msgid "Read Chunk Size" -msgstr "" +msgstr "خواندن اندازه تکه" #: core/io/marshalls.cpp msgid "Object ID" -msgstr "" +msgstr "شناسهٔ شیء" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp msgid "Allow Object Decoding" -msgstr "" +msgstr "اجازه رمزگشایی Ø´ÛŒ" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" -msgstr "" +msgstr "رد کردن اتصالات شبکه جدید" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Network Peer" -msgstr "صدور پروژه" +msgstr "همتای شبکه" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp -#, fuzzy msgid "Root Node" -msgstr "تغییر نام" +msgstr "نود ریشه ای" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Refuse New Connections" -msgstr "اتصال" +msgstr "از اتصالات جدید خودداری کنید" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Transfer Mode" -msgstr "گره جابجای" +msgstr "ØØ§Ù„ت انتقال" #: core/io/packet_peer.cpp msgid "Encode Buffer Max Size" -msgstr "" +msgstr "رمزگذاری ØØ¯Ø§Ú©Ø«Ø± اندازه Ø¨Ø§ÙØ±" #: core/io/packet_peer.cpp msgid "Input Buffer Max Size" -msgstr "" +msgstr "ورود ØØ¯Ø§Ú©Ø«Ø± اندازه Ø¨Ø§ÙØ±" #: core/io/packet_peer.cpp msgid "Output Buffer Max Size" -msgstr "" +msgstr "ØØ¯ اکثر اندازه خروجی Ø¨Ø§ÙØ±" #: core/io/packet_peer.cpp msgid "Stream Peer" -msgstr "" +msgstr "جریان همتا" #: core/io/stream_peer.cpp msgid "Big Endian" -msgstr "" +msgstr "اندیان بزرگ" #: core/io/stream_peer.cpp msgid "Data Array" -msgstr "" +msgstr "آرایه داده" #: core/io/stream_peer_ssl.cpp +#, fuzzy msgid "Blocking Handshake" -msgstr "" +msgstr "مسدود کردن دست دادن" #: core/io/udp_server.cpp -#, fuzzy msgid "Max Pending Connections" -msgstr "ویرایش اتصال:" +msgstr "ØØ¯Ø§Ú©Ø«Ø± اتصالات معلق" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -347,28 +329,27 @@ msgstr "نوع نامعتبر ورودی برای ()convertØŒ ثوابت *_TYPEâ #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "یک رشته به‌طول 1 ( یک کاراکتر) مورد انتظار است." +msgstr "یک رشته (string) به اندازه 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 "" -"تعداد بایت های مورد نظر برای رمزگشایی بایت ها کاÙÛŒ نیست،‌ Ùˆ یا ÙØ±Ù…ت نامعتبر " +"تعداد بایت‌های مورد نظر برای رمزگشایی بایت‌ها کاÙÛŒ نیست،‌ Ùˆ یا ÙØ±Ù…ت نامعتبر " "است ." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "ورودی نامعتبر i% (تایید نشده) در عبارت" +msgstr "ورودی نامعتبر %d (تایید نشده) در عبارت" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "از self نمی‌توان Ø§Ø³ØªÙØ§Ø¯Ù‡ کرد زیرا نمونه ØµÙØ± است (رد نشده است)" +msgstr "از self نمی‌توان Ø§Ø³ØªÙØ§Ø¯Ù‡ کرد زیرا نمونه null است (مقدار Ù†Ú¯Ø±ÙØªÙ‡ است)" #: 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" @@ -384,34 +365,32 @@ msgstr "آرگومان های نامعتبر برای ساخت '%s'" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "به هنگام ÙØ±Ø§Ø®ÙˆØ§Ù† تابع'%s':" +msgstr "به هنگام ÙØ±Ø§Ø®ÙˆØ§Ù† تابع '%s':" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp msgid "Seed" -msgstr "" +msgstr "دانه" #: core/math/random_number_generator.cpp -#, fuzzy msgid "State" -msgstr "وضعیت:" +msgstr "وضعیت" #: core/message_queue.cpp msgid "Message Queue" -msgstr "" +msgstr "ص٠پیام" #: core/message_queue.cpp msgid "Max Size (KB)" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± اندازه (کیلوبایت)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "انتخاب ØØ§Ù„ت" +msgstr "ØØ§Ù„ت ماوس" #: core/os/input.cpp msgid "Use Accumulated Input" -msgstr "" +msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از ورودی انباشته" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -419,105 +398,93 @@ msgid "Device" msgstr "دستگاه" #: core/os/input_event.cpp -#, fuzzy msgid "Alt" -msgstr "همه" +msgstr "آلت" #: core/os/input_event.cpp msgid "Shift" -msgstr "" +msgstr "Ø´ÛŒÙØª" #: core/os/input_event.cpp -#, fuzzy msgid "Control" -msgstr "مهار نسخه" +msgstr "کنترل" #: core/os/input_event.cpp msgid "Meta" -msgstr "" +msgstr "متا" #: core/os/input_event.cpp -#, fuzzy msgid "Command" -msgstr "جامعه" +msgstr "دستور" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "روشن" +msgstr "Ùیزیکی" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Pressed" -msgstr "بازنشانی بزرگنمایی" +msgstr "ÙØ´Ø±Ø¯Ù‡â€ŒØ´Ø¯Ù‡" #: core/os/input_event.cpp -#, fuzzy msgid "Scancode" -msgstr "پویش" +msgstr "اسکن‌کد" #: core/os/input_event.cpp msgid "Physical Scancode" -msgstr "" +msgstr "اسکن‌کد Ùیزیکی" #: core/os/input_event.cpp msgid "Unicode" -msgstr "" +msgstr "یونیکد" #: core/os/input_event.cpp msgid "Echo" -msgstr "" +msgstr "اکو" #: core/os/input_event.cpp scene/gui/base_button.cpp -#, fuzzy msgid "Button Mask" -msgstr "Button" +msgstr "ماسک دکمه" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp -#, fuzzy msgid "Global Position" -msgstr "ثابت" +msgstr "موقعیت عمومی" #: core/os/input_event.cpp msgid "Factor" -msgstr "" +msgstr "عامل" #: core/os/input_event.cpp -#, fuzzy msgid "Button Index" -msgstr "Button" +msgstr "ایندکس دکمه" #: core/os/input_event.cpp msgid "Doubleclick" -msgstr "" +msgstr "دابل‌کلیک" #: core/os/input_event.cpp msgid "Tilt" -msgstr "" +msgstr "شیب" #: core/os/input_event.cpp -#, fuzzy msgid "Pressure" -msgstr "بازنشانی بزرگنمایی" +msgstr "ÙØ´Ø§Ø±" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "قلم معکوس" #: core/os/input_event.cpp -#, fuzzy msgid "Relative" -msgstr "GDNative" +msgstr "نسبت" #: core/os/input_event.cpp scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/resources/environment.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed" -msgstr "بومی" +msgstr "سرعت" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: scene/3d/sprite_3d.cpp @@ -525,80 +492,72 @@ msgid "Axis" msgstr "Ù…ØÙˆØ±" #: core/os/input_event.cpp -#, fuzzy msgid "Axis Value" -msgstr "(مقدار)" +msgstr "مقدار Ù…ØÙˆØ±" #: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Index" -msgstr "اندیس:" +msgstr "ایندکس" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Action" -msgstr "Ø§ÙØ²ÙˆØ¯Ù† وظیÙÙ‡" +msgstr "عمل" #: core/os/input_event.cpp scene/resources/environment.cpp #: scene/resources/material.cpp msgid "Strength" -msgstr "" +msgstr "قدرت" #: core/os/input_event.cpp msgid "Delta" -msgstr "" +msgstr "دلتا" #: core/os/input_event.cpp -#, fuzzy msgid "Channel" -msgstr "تغییر بده" +msgstr "کانال" #: core/os/input_event.cpp main/main.cpp -#, fuzzy msgid "Message" -msgstr "تغییر بده" +msgstr "پیام" #: core/os/input_event.cpp -#, fuzzy msgid "Pitch" -msgstr "سوییچ" +msgstr "" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp #: scene/3d/physics_body.cpp scene/resources/particles_material.cpp msgid "Velocity" -msgstr "" +msgstr "سرعت" #: core/os/input_event.cpp +#, fuzzy msgid "Instrument" -msgstr "" +msgstr "ابزار" #: core/os/input_event.cpp -#, fuzzy msgid "Controller Number" -msgstr "شماره خط:" +msgstr "شماره کنترلر" #: core/os/input_event.cpp msgid "Controller Value" -msgstr "" +msgstr "مقدار کنترلر" #: core/project_settings.cpp editor/editor_node.cpp main/main.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Application" -msgstr "Ø§ÙØ²ÙˆØ¯Ù† وظیÙÙ‡" +msgstr "اپلیکیشن" #: core/project_settings.cpp main/main.cpp msgid "Config" -msgstr "" +msgstr "پیکربندی" #: core/project_settings.cpp -#, fuzzy msgid "Project Settings Override" -msgstr "تنظیمات طرØâ€¦" +msgstr "لغو تنظیمات پروژه" #: core/project_settings.cpp core/resource.cpp #: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp @@ -629,7 +588,7 @@ msgstr "اجرا" #: core/project_settings.cpp editor/editor_node.cpp #: editor/run_settings_dialog.cpp main/main.cpp msgid "Main Scene" -msgstr "" +msgstr "صØÙ†Ù‡Ù” اصلی" #: core/project_settings.cpp #, fuzzy @@ -643,28 +602,27 @@ msgstr "ØºÛŒØ±ÙØ¹Ø§Ù„ شده" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "" +msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از Ùهرست داده‌های پروژه پنهان" #: core/project_settings.cpp msgid "Use Custom User Dir" -msgstr "" +msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از Custom User Dir" #: core/project_settings.cpp msgid "Custom User Dir Name" -msgstr "" +msgstr "نام دلخواه برای دایرکتوری کاربر" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "نشان دادن همه" +msgstr "نمایش" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "عرض" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -673,21 +631,19 @@ msgstr "" #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp msgid "Height" -msgstr "" +msgstr "Ø§Ø±ØªÙØ§Ø¹" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "همیشه در بالا" #: core/project_settings.cpp -#, fuzzy msgid "Test Width" -msgstr "خطی" +msgstr "آزمایش عرض" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "آزمودن" +msgstr "آزمایش Ø§Ø±ØªÙØ§Ø¹" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -695,56 +651,54 @@ msgid "Audio" msgstr "صدا" #: core/project_settings.cpp -#, fuzzy msgid "Default Bus Layout" -msgstr "Ø·Ø±Ø Ù¾ÛŒØ´ ÙØ±Ø¶ اتوبوس را بارگیری کنید." +msgstr "چیدمان اتوبوس Ù¾ÛŒØ´â€ŒÙØ±Ø¶" #: core/project_settings.cpp editor/editor_export.cpp #: editor/editor_file_system.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/script_create_dialog.cpp #: scene/2d/camera_2d.cpp scene/3d/light.cpp scene/main/node.cpp msgid "Editor" -msgstr "ÙˆÛŒØ±Ø§ÛŒÙØ´Ú¯ÙŽØ±" +msgstr "ویرایشگر" #: core/project_settings.cpp +#, fuzzy msgid "Main Run Args" -msgstr "" +msgstr "آرگومان های اصلی اجرا" #: core/project_settings.cpp msgid "Scene Naming" -msgstr "" +msgstr "نام‌گذاری صØÙ†Ù‡" #: core/project_settings.cpp msgid "Search In File Extensions" -msgstr "" +msgstr "جستجو در پسوند ÙØ§ÛŒÙ„" #: core/project_settings.cpp msgid "Script Templates Search Path" -msgstr "" +msgstr "مسیر جستجوی الگوهای اسکریپت" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "مهار نسخه" +msgstr "بارگذاری خودکار نسخهٔ کنترل در هنگام راه‌اندازی" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "مهار نسخه" +msgstr "نام Ø§ÙØ²ÙˆÙ†Ù‡ کنترل نسخه" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp msgid "Input" -msgstr "" +msgstr "ورودی" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "پذیرش UI" #: core/project_settings.cpp #, fuzzy msgid "UI Select" -msgstr "انتخاب شده را ØØ°Ù Ú©Ù†" +msgstr "انتخاب رابط کاربری" #: core/project_settings.cpp #, fuzzy @@ -752,45 +706,46 @@ msgid "UI Cancel" msgstr "لغو" #: core/project_settings.cpp +#, fuzzy msgid "UI Focus Next" -msgstr "" +msgstr "تمرکز بعدی رابط کاربری" #: core/project_settings.cpp +#, fuzzy msgid "UI Focus Prev" -msgstr "" +msgstr "تمرکز قبلی رابط کاربری" #: core/project_settings.cpp msgid "UI Left" -msgstr "" +msgstr "کلید Ú†Ù¾" #: core/project_settings.cpp msgid "UI Right" -msgstr "" +msgstr "کلید راست" #: core/project_settings.cpp msgid "UI Up" -msgstr "" +msgstr "کلید بالا" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "پایین" +msgstr "UI پایین" #: core/project_settings.cpp msgid "UI Page Up" -msgstr "" +msgstr "کلید Page Up" #: core/project_settings.cpp msgid "UI Page Down" -msgstr "" +msgstr "کلید Page Down" #: core/project_settings.cpp msgid "UI Home" -msgstr "" +msgstr "UI خانه" #: core/project_settings.cpp msgid "UI End" -msgstr "" +msgstr "UI پایان" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -801,7 +756,7 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Physics" -msgstr "" +msgstr "Ùیزیک" #: core/project_settings.cpp editor/editor_settings.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -811,11 +766,11 @@ msgstr "" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "سه بعدی" #: core/project_settings.cpp msgid "Smooth Trimesh Collision" -msgstr "" +msgstr "برخورد روان مش مثلثی" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -827,7 +782,7 @@ msgstr "" #: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Rendering" -msgstr "" +msgstr "رندر کردن" #: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -837,18 +792,17 @@ msgstr "" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Ú©ÛŒÙیت" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "صاÙÛŒ:" +msgstr "Ùیلترها" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" -msgstr "" +msgstr "تیز کردن شدت" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -864,14 +818,13 @@ msgstr "اشکال یابی" #: core/project_settings.cpp main/main.cpp modules/gdscript/gdscript.cpp #: modules/visual_script/visual_script.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Settings" -msgstr "ØªØ±Ø¬ÛŒØØ§Øª" +msgstr "تنظیمات" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Profiler" -msgstr "" +msgstr "Ù¾Ø±ÙˆÙØ§ÛŒÙ„ر" #: core/project_settings.cpp #, fuzzy @@ -879,13 +832,12 @@ msgid "Max Functions" msgstr "تغییر نام نقش" #: core/project_settings.cpp scene/3d/vehicle_body.cpp -#, fuzzy msgid "Compression" -msgstr "انتقال را در انیمیشن تغییر بده" +msgstr "ÙØ´Ø±Ø¯Ù‡â€ŒØ³Ø§Ø²ÛŒ" #: core/project_settings.cpp msgid "Formats" -msgstr "" +msgstr "ÙØ±Ù…ت‌ها" #: core/project_settings.cpp msgid "Zstd" @@ -893,11 +845,11 @@ msgstr "" #: core/project_settings.cpp msgid "Long Distance Matching" -msgstr "" +msgstr "تطبیق Ù…Ø³Ø§ÙØª طولانی" #: core/project_settings.cpp msgid "Compression Level" -msgstr "" +msgstr "Ø³Ø·Ø ÙØ´Ø±Ø¯Ù‡â€ŒØ³Ø§Ø²ÛŒ" #: core/project_settings.cpp msgid "Window Log Size" @@ -913,20 +865,19 @@ msgstr "" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" -msgstr "" +msgstr "اندروید" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "ماژول‌ها" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "تی‌سی‌پی" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "اتصال به گره:" +msgstr "" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -934,11 +885,11 @@ msgstr "" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± Ø¨Ø§ÙØ± (به توان 2)" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" -msgstr "" +msgstr "SSL" #: core/register_core_types.cpp main/main.cpp #, fuzzy @@ -964,22 +915,20 @@ msgid "Path" msgstr "آدرس" #: core/script_language.cpp -#, fuzzy msgid "Source Code" -msgstr "منبع" +msgstr "کد منبع" #: core/translation.cpp editor/project_settings_editor.cpp msgid "Locale" msgstr "بومی" #: core/translation.cpp -#, fuzzy msgid "Test" -msgstr "آزمودن" +msgstr "آزمایش" #: core/translation.cpp scene/resources/font.cpp msgid "Fallback" -msgstr "" +msgstr "بازگشت" #: core/ustring.cpp scene/resources/segment_shape_2d.cpp msgid "B" @@ -1015,17 +964,19 @@ msgstr "اگزابایت" #: drivers/gles3/rasterizer_scene_gles3.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp msgid "Buffers" -msgstr "" +msgstr "Ø¨Ø§ÙØ±Ù‡Ø§" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp +#, fuzzy msgid "Canvas Polygon Buffer Size (KB)" -msgstr "" +msgstr "اندازه Ø¨Ø§ÙØ± پرده چندضعلی (کیلوبایت)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp +#, fuzzy msgid "Canvas Polygon Index Buffer Size (KB)" -msgstr "" +msgstr "اندازه Ø¨Ø§ÙØ± شاخص پرده چندضعلی (کیلوبایت)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp editor/editor_settings.cpp @@ -1037,7 +988,7 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "دو بعدی" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1047,44 +998,46 @@ msgstr "Ú†ÙØª:" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp +#, fuzzy msgid "Use GPU Pixel Snap" -msgstr "" +msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از قالب زنی پیکسل کارت گراÙیک" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Immediate Buffer Size (KB)" -msgstr "" +msgstr "اندازه Ø¨Ø§ÙØ± Ùوری (کیلوبایت)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp +#, fuzzy msgid "Lightmapping" -msgstr "" +msgstr "نقشه برداری نور" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Use Bicubic Sampling" -msgstr "" +msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از نمونه برداری دو مکعبی" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± عناصر قابل اجرا" #: drivers/gles3/rasterizer_scene_gles3.cpp +#, fuzzy msgid "Max Renderable Lights" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± نور های قابل رندر" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Max Renderable Reflections" -msgstr "انتخاب شده را ØØ°Ù Ú©Ù†" +msgstr "ØØ¯Ø§Ú©Ø«Ø± بازتاب‌های قابل رندر" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± نور ها در هر شیء" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Subsurface Scattering" -msgstr "" +msgstr "پراکندگی زیر سطØÛŒ" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1096,29 +1049,29 @@ msgstr "" #: scene/animation/animation_blend_tree.cpp scene/gui/control.cpp #: scene/main/canvas_layer.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Scale" -msgstr "بومی" +msgstr "مقیاس" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Follow Surface" -msgstr "" +msgstr "دنبال کردن سطØ" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" -msgstr "" +msgstr "نمونه‌های وزنی" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Voxel Cone Tracing" -msgstr "" +msgstr "ردیابی مخروط واکسلی" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "Ú©ÛŒÙیت بالا" #: drivers/gles3/rasterizer_storage_gles3.cpp +#, fuzzy msgid "Blend Shape Max Buffer Size (KB)" -msgstr "" +msgstr "ØØ¯Ø§Ú©Ø«Ø± اندازه Ø¨Ø§ÙØ± Ø´Ú©Ù„ ترکیبی (کیلوبایت)" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp @@ -1163,11 +1116,11 @@ 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" @@ -1192,67 +1145,63 @@ msgstr "تغییر ÙØ±Ø§Ø®ÙˆØ§Ù† Ù…ØªØØ±Ú©" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "انتخاب یک گره" +msgstr "ÙØ±ÛŒÙ…" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp #: scene/resources/particles_material.cpp servers/visual_server.cpp -#, fuzzy msgid "Time" -msgstr "زمان:" +msgstr "زمان" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" -msgstr "بومی‌سازی" +msgstr "مکان" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "وضعیت:" +msgstr "چرخش" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp msgid "Value" -msgstr "" +msgstr "مقدار" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "Ø§ÙØ²ÙˆØ¯Ù† عمل ورودی" +msgstr "تعداد Arg" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "آرگومان‌ها" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp #: modules/gltf/gltf_light.cpp modules/visual_script/visual_script_nodes.cpp #: scene/3d/physics_body.cpp scene/resources/visual_shader_nodes.cpp msgid "Type" -msgstr "" +msgstr "تایپ" #: editor/animation_track_editor.cpp +#, fuzzy msgid "In Handle" -msgstr "" +msgstr "دسته داخل" #: editor/animation_track_editor.cpp msgid "Out Handle" -msgstr "" +msgstr "دسته بیرون" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp msgid "Stream" -msgstr "" +msgstr "استریم" #: editor/animation_track_editor.cpp #, fuzzy @@ -1262,7 +1211,7 @@ msgstr "انتخاب ØØ§Ù„ت" #: editor/animation_track_editor.cpp #, fuzzy msgid "End Offset" -msgstr "ساختن گره" +msgstr "Ø§Ù†ØØ±Ø§Ù پایانی" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1275,8 +1224,9 @@ msgid "Animation" msgstr "انیمیشن" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Easing" -msgstr "" +msgstr "آسان کردن" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" @@ -1313,7 +1263,7 @@ msgstr "ویژگی مسیر" #: editor/animation_track_editor.cpp msgid "3D Transform Track" -msgstr "مسیر دگرشکل 3D" +msgstr "مسیر دگرشکل سه‌بعدی" #: editor/animation_track_editor.cpp msgid "Call Method Track" @@ -1321,7 +1271,7 @@ msgstr "ÙØ±Ø§Ø®ÙˆØ§Ù† تابع مسیر" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" -msgstr "مسیر منØÙ†ÛŒ Ø¨ÙØ²ÛŒÙر" +msgstr "مسیر منØÙ†ÛŒ Bezier" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" @@ -1329,19 +1279,19 @@ msgstr "مسیر Audio Playback" #: editor/animation_track_editor.cpp msgid "Animation Playback Track" -msgstr "مسیر پخش Animation" +msgstr "مسیر پخش انیمیشن" #: editor/animation_track_editor.cpp msgid "Animation length (frames)" -msgstr "طول انیمیشن ( frames)" +msgstr "طول انیمیشن (ÙØ±ÛŒÙ…)" #: editor/animation_track_editor.cpp msgid "Animation length (seconds)" -msgstr "طول انیمیشن (seconds)" +msgstr "طول انیمیشن (ثانیه)" #: editor/animation_track_editor.cpp msgid "Add Track" -msgstr "ترک را اضاÙÙ‡ Ú©Ù†" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† ترک" #: editor/animation_track_editor.cpp msgid "Animation Looping" @@ -1354,15 +1304,15 @@ msgstr "وظایÙ:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" -msgstr "کلیپ های صوتی:" +msgstr "کلیپ‌های صوتی:" #: editor/animation_track_editor.cpp msgid "Anim Clips:" -msgstr "کلیپ های انیمیشن:" +msgstr "کلیپ‌های انیمیشن:" #: editor/animation_track_editor.cpp msgid "Change Track Path" -msgstr "تغییرمیسر path" +msgstr "تغییرمسیر ترک" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." @@ -1370,11 +1320,11 @@ msgstr "دÙÚ¯Ø±ØØ§Ù„ت٠روشن/خاموش این قطعه." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" -msgstr "ØØ§Ù„ت بروزرسانی (Ù†ØÙˆÙ‡ تنظیم این ویژگی)" +msgstr "ØØ§Ù„ت به‌روزرسانی (Ù†ØÙˆÙ‡ تنظیم این ویژگی)" #: editor/animation_track_editor.cpp scene/resources/gradient.cpp msgid "Interpolation Mode" -msgstr "ØØ§Ù„ت درون یابی(درون‌یابی روشی است برای ÛŒØ§ÙØªÙ† مقدار تابع درون یک بازه)" +msgstr "ØØ§Ù„ت درون‌یابی" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" @@ -1385,25 +1335,22 @@ msgid "Remove this track." msgstr "این ترک را ØØ°Ù Ú©Ù†." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "زمان(s): " +msgstr "زمان:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "برداشتن موج" +msgstr "موقعیت:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rotation:" -msgstr "وضعیت:" +msgstr "چرخش:" #: editor/animation_track_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Scale:" -msgstr "" +msgstr "مقیاس:" #: editor/animation_track_editor.cpp #: editor/plugins/resource_preloader_editor_plugin.cpp @@ -1411,17 +1358,15 @@ msgstr "" #: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Type:" -msgstr "" +msgstr "نوع:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "نام دارایی ایندکس نامعتبر." +msgstr "(نامعتبر, نوع مورد انتظار: %s)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing:" -msgstr "انتقال" +msgstr "تسهیل:" #: editor/animation_track_editor.cpp msgid "In-Handle:" @@ -1432,23 +1377,20 @@ msgid "Out-Handle:" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "Ø§ÙØ²ÙˆØ¯Ù† مورد" +msgstr "استریم" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "شروع" +msgstr "شروع:" #: editor/animation_track_editor.cpp msgid "End (s):" -msgstr "" +msgstr "پایان(ها):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" -msgstr "گره انیمیشن" +msgstr "کلیپ انیمیشن:" #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -1507,7 +1449,7 @@ msgstr "اضاÙÙ‡ کردن مقدار(های) ریست" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" -msgstr "ØØ°Ù کلید(key)" +msgstr "ØØ°Ù کلید(ها)" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" @@ -1515,11 +1457,11 @@ msgstr "تغییر ØØ§Ù„ت بروزرسانی انیمیشن" #: editor/animation_track_editor.cpp msgid "Change Animation Interpolation Mode" -msgstr "تغییر ØØ§Ù„ت درون یابی(Interpolation ) انیمیشن" +msgstr "تغییر ØØ§Ù„ت درون یابی (Interpolation) انیمیشن" #: editor/animation_track_editor.cpp msgid "Change Animation Loop Mode" -msgstr "تغییر ØØ§Ù„ت تکررار (Loop) انیمیشن" +msgstr "تغییر ØØ§Ù„ت تکرار (Loop) انیمیشن" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" @@ -1532,14 +1474,12 @@ msgstr "ØØ°Ù ترک انیمشین" #: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editors" -msgstr "ویرایشگر" +msgstr "ویرایشگرها" #: editor/animation_track_editor.cpp editor/editor_settings.cpp -#, fuzzy msgid "Confirm Insert Track" -msgstr "درج ترک Ùˆ کلید در انیمیشن" +msgstr "درج آهنگ را تأیید کنید" #. TRANSLATORS: %s will be replaced by a phrase describing the target of track. #: editor/animation_track_editor.cpp @@ -1561,7 +1501,7 @@ msgstr "ساختن %d قطعه جدید Ùˆ درج کلیدها؟" #: editor/script_create_dialog.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Create" -msgstr "تولید" +msgstr "ایجاد کردن" #: editor/animation_track_editor.cpp msgid "Anim Insert" @@ -1584,7 +1524,7 @@ msgstr "انیمیشن پلیر نمی تواند خود را انیمیت Ú©Ù†Ø #. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. #: editor/animation_track_editor.cpp msgid "property '%s'" -msgstr "ویژگی \"Ùª s\"" +msgstr "ویژگی '%s'" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -1617,14 +1557,14 @@ msgid "" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" msgstr "" -"آهنگ های صوتی Ùقط Ù…ÛŒ توانند به گره های نوع (nodes) اشاره کنند\n" +"آهنگ‌های صوتی Ùقط می‌توانند به گره‌های نوع (nodes) اشاره کنند:\n" "-AudioStreamPlayer\n" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" #: editor/animation_track_editor.cpp msgid "Animation tracks can only point to AnimationPlayer nodes." -msgstr "آهنگ های انیمیشن Ùقط Ù…ÛŒ توانند به گره های انیمش پلیر اشاره کنند." +msgstr "آهنگ‌های انیمیشن Ùقط می‌توانند به گره‌های انیمیشن پلیر اشاره کنند." #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" @@ -1632,11 +1572,11 @@ 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" -msgstr "Ø§ÙØ²ÙˆØ¯Ù† مسیر Ø¨ÙØ²ÛŒÙر" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† مسیر Bezier" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." @@ -1644,7 +1584,7 @@ msgstr "مسیر قطعه نامعتبر، پس نمی‌توان یک کلید #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" -msgstr "آهنگ از نوع مکانی نیست ØŒ نمی تواند کلید را وارد کند" +msgstr "آهنگ از نوع مکانی نیست، نمی‌تواند کلید را وارد کند" #: editor/animation_track_editor.cpp msgid "Add Transform Track Key" @@ -1652,7 +1592,7 @@ msgstr "Ø§ÙØ²ÙˆØ¯Ù† کلید مسیر دگرشکل" #: editor/animation_track_editor.cpp msgid "Add Track Key" -msgstr "Ø§ÙØ²ÙˆØ¯Ù† کلید مسیر" +msgstr "Ø§ÙØ²ÙˆØ¯Ù† کلید ترک" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." @@ -1677,7 +1617,7 @@ msgstr "کلیدها را در انیمیشن جابجا Ú©Ù†" #: servers/camera/camera_feed.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Transform" -msgstr "" +msgstr "تبدیل" #: editor/animation_track_editor.cpp editor/editor_help.cpp msgid "Methods" @@ -1685,7 +1625,7 @@ msgstr "روش ها" #: editor/animation_track_editor.cpp msgid "Bezier" -msgstr "" +msgstr "بزیه" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -2275,8 +2215,9 @@ msgid "Open" msgstr "باز Ú©Ù†" #: editor/dependency_editor.cpp +#, fuzzy msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "ØµØ§ØØ¨Ø§Ù†: %s (Ú©Ù„: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2402,7 +2343,7 @@ msgstr "Ù…Ø¤Ù„ÙØ§Ù†" #: editor/editor_about.cpp msgid "Platinum Sponsors" -msgstr "ØØ§Ù…یان پلاتین" +msgstr "ØØ§Ù…یان Ø³Ø·Ø platinum" #: editor/editor_about.cpp msgid "Gold Sponsors" @@ -2418,7 +2359,7 @@ msgstr "اهداکنندگان Ø¨Ø±Ù†Ø²ÛŒØØ§Ù…یان مالی" #: editor/editor_about.cpp msgid "Mini Sponsors" -msgstr "ØØ§Ù…یان مالی Ú©ÙˆÚ†Ú©" +msgstr "ØØ§Ù…یان Ø³Ø·Ø Mini" #: editor/editor_about.cpp msgid "Gold Donors" @@ -2835,22 +2776,21 @@ msgid "Choose" msgstr "انتخاب کنید" #: editor/editor_export.cpp +#, fuzzy msgid "Project export for platform:" -msgstr "" +msgstr "خروجی پروژه برای سکو:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Ú©Ù¾ÛŒ کردن مسیر node" +msgstr "با هشدار تکمیل شد." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "بسته با موÙقیت نصب شد!" +msgstr "با موÙقیت انجام شد." #: editor/editor_export.cpp msgid "Failed." -msgstr "" +msgstr "ناموÙÙ‚." #: editor/editor_export.cpp msgid "Storing File:" @@ -2865,45 +2805,40 @@ msgid "Packing" msgstr "بسته بندی" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "ذخیره در" +msgstr "ذخیره PCk" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "ناتوان در ساختن پوشه." +msgstr "نمیتوان ÙØ§ÛŒÙ„ \"%s\" راساخت." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "نمی‌تواند یک پوشه ایجاد شود." +msgstr "نمیتوان از ÙØ§ÛŒÙ„های پروژه خروجی Ú¯Ø±ÙØª ." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "ناتوان در گشودن پروژه" +msgstr "نمیتوان ÙØ§ÛŒÙ„ را از مسیر \"%s\" برای خواندن بازکرد." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "ذخیره در" +msgstr "ذخیره ZIP" #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " "Etc' in Project Settings." msgstr "" -"Ù¾Ù„ØªÙØ±Ù… مورد نظر به ÙØ´Ø±Ø¯Ù‡ سازی تکستچر 'ETC' برای GLES2 نیاز دارد . 'واردکردن " -"ETC' را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید." +"Ù¾Ù„ØªÙØ±Ù… مورد نظر به ÙØ´Ø±Ø¯Ù‡ سازی تکستچر '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 "" -"Ù¾Ù„ØªÙØ±Ù… مورد نظر به ÙØ´Ø±Ø¯Ù‡ سازی تکستچر 'ETC' برای GLES2 نیاز دارد . 'واردکردن " -"ETC' را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید." +"Ù¾Ù„ØªÙØ±Ù… مورد نظر به ÙØ´Ø±Ø¯Ù‡ سازی تکستچر 'ETC2' برای GLES3 نیاز دارد . 'Import " +"Etc2' را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید." #: editor/editor_export.cpp msgid "" @@ -2914,8 +2849,8 @@ msgid "" msgstr "" "Ù¾Ù„ØªÙØ±Ù… هد٠به ÙØ´Ø±Ø¯Ù‡â€ŒØ³Ø§Ø²ÛŒ Ø¨Ø§ÙØª 'ETC' برای بازگرداندن درایور به GLES2 نیاز " "دارد.\n" -"'استخراج Etc' را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید یا \"Driver Fallback Enabled\" " -"را ØºÛŒØ±ÙØ¹Ø§Ù„ کنید." +"'Import Etc' را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید یا \"Driver Fallback Enabled\" را " +"ØºÛŒØ±ÙØ¹Ø§Ù„ کنید." #: editor/editor_export.cpp msgid "" @@ -2940,6 +2875,10 @@ msgid "" "Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" +"پلت ÙØ±Ù… هد٠نیاز به ÙØ´Ø±Ø¯Ù‡ سازی Ø¨Ø§ÙØª 'PVRTC' برای بازگشت درایور به GLES2 " +"دارد.\n" +"\"Import Pvrtc\" را در تنظیمات پروژه ÙØ¹Ø§Ù„ کنید یا \"Driver Fallback " +"Enabled\" را ØºÛŒØ±ÙØ¹Ø§Ù„ کنید." #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -2953,7 +2892,7 @@ msgstr "عضوها" #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/export/export.cpp msgid "Release" -msgstr "" +msgstr "انتشار" #: editor/editor_export.cpp #, fuzzy @@ -2962,11 +2901,11 @@ msgstr "انتقال را در انیمیشن تغییر بده" #: editor/editor_export.cpp msgid "64 Bits" -msgstr "" +msgstr "Û¶Û´ بیت" #: editor/editor_export.cpp msgid "Embed PCK" -msgstr "" +msgstr "جاسازی PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp #, fuzzy @@ -2979,15 +2918,15 @@ msgstr "" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "S3TC" -msgstr "" +msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC" -msgstr "" +msgstr "ای‌تی‌سی" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC2" -msgstr "" +msgstr "ای‌تی‌سی‌۲" #: editor/editor_export.cpp msgid "No BPTC Fallbacks" @@ -2997,13 +2936,13 @@ msgstr "" #: 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_plugin.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 #, fuzzy @@ -3028,15 +2967,16 @@ msgstr "نام دارایی ایندکس نامعتبر." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp msgid "PCK Embedding" -msgstr "" +msgstr "تعبیه پی‌سی‌کی" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." msgstr "" +"در خروجی های Û³Û² بیتی پی‌سی‌کی تعبیه شده نمی‌تواند از Û´ گیگابایت بزرگ‌تر باشد." #: editor/editor_export.cpp msgid "Convert Text Resources To Binary On Export" -msgstr "" +msgstr "تبدیل منابع متنی به دوتایی هنگام خروجی" #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -3053,7 +2993,7 @@ msgstr "کتابخانه دارایی" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" -msgstr "" +msgstr "ویرایش درخت صØÙ†Ù‡" #: editor/editor_feature_profile.cpp msgid "Node Dock" @@ -3070,15 +3010,15 @@ msgstr "وارد کردن لنگرگاه" #: editor/editor_feature_profile.cpp msgid "Allows to view and edit 3D scenes." -msgstr "" +msgstr "اجازه دیدن Ùˆ ویرایش صØÙ†Ù‡ های Û³ بعدی را می‌دهد." #: editor/editor_feature_profile.cpp msgid "Allows to edit scripts using the integrated script editor." -msgstr "" +msgstr "اجازهٔ ویرایش اسکریپت‌ها با Ø§Ø³ØªÙØ§Ø¯Ù‡ از ویرایشگر اسکریپت داخلی را می‌دهد." #: editor/editor_feature_profile.cpp msgid "Provides built-in access to the Asset Library." -msgstr "" +msgstr "دسترسی داخلی به کتابخانهٔ دارایی را ÙØ±Ø§Ù‡Ù… می‌کند." #: editor/editor_feature_profile.cpp msgid "Allows editing the node hierarchy in the Scene dock." @@ -3089,32 +3029,35 @@ msgid "" "Allows to work with signals and groups of the node selected in the Scene " "dock." msgstr "" +"به کار کردن با سیگنال ها Ùˆ گروه ها ÛŒ گره انتخاب شده از داک صØÙ†Ù‡ اجازه میدهد." #: editor/editor_feature_profile.cpp msgid "Allows to browse the local file system via a dedicated dock." -msgstr "" +msgstr "به مرور سیستم ÙØ§ÛŒÙ„ Ù…ØÙ„ÛŒ از طریق یک داک اختصاصی اجازه Ù…ÛŒ دهد." #: editor/editor_feature_profile.cpp msgid "" "Allows to configure import settings for individual assets. Requires the " "FileSystem dock to function." msgstr "" +"به پیکربندی تنظیمات Import برای دارایی های ÙØ±Ø¯ÛŒ اجازه Ù…ÛŒ دهد. برای عملکرد به " +"داک FileSystem نیاز دارد." #: editor/editor_feature_profile.cpp msgid "(current)" -msgstr "" +msgstr "(کنونی)" #: editor/editor_feature_profile.cpp msgid "(none)" -msgstr "" +msgstr "(هیچ)" #: editor/editor_feature_profile.cpp msgid "Remove currently selected profile, '%s'? Cannot be undone." -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." @@ -3122,7 +3065,7 @@ msgstr "نمایه با این نام در ØØ§Ù„ ØØ§Ø¶Ø± وجود دارد." #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" -msgstr "" +msgstr "(ویرایشگر ØºÛŒØ±ÙØ¹Ø§Ù„ است، ویژگی‌ها ØºÛŒØ±ÙØ¹Ø§Ù„ است)" #: editor/editor_feature_profile.cpp msgid "(Properties Disabled)" @@ -3141,52 +3084,48 @@ msgid "Enable Contextual Editor" msgstr "ÙØ¹Ø§Ù„ کردن ویرایشگر متنی" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Properties:" -msgstr "صاÙÛŒ کردن گره‌ها" +msgstr "دارایی‌های کلاس:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Main Features:" -msgstr "ویژگی‌ها" +msgstr "ویژگی‌های اصلی:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Nodes and Classes:" -msgstr "کلاس های ÙØ¹Ø§Ù„ شده:" +msgstr "نودها (Nodes) Ùˆ کلاس‌ها:" #: 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 "" +"Ù¾Ø±ÙˆÙØ§ÛŒÙ„ '%s' از قبل وجود دارد. قبل از وارد کردن، ابتدا آن را ØØ°Ù کنید، وارد " +"کردن متوق٠شد." #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." msgstr "خطای ذخیره نمایه در مسیر: '%s'." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Reset to Default" -msgstr "بارگیری پیش ÙØ±Ø¶" +msgstr "بازنشانی به Ù¾ÛŒØ´ÙØ±Ø¶" #: editor/editor_feature_profile.cpp msgid "Current Profile:" msgstr "نمایه موجود:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Create Profile" -msgstr "پاک کردن نمایه" +msgstr "ایجاد Ù¾Ø±ÙˆÙØ§ÛŒÙ„" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Remove Profile" -msgstr "ØØ°Ù قالب" +msgstr "ØØ°Ù Ù¾Ø±ÙˆÙØ§ÛŒÙ„" #: editor/editor_feature_profile.cpp msgid "Available Profiles:" @@ -3211,18 +3150,16 @@ msgid "Export" msgstr "خروجی" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Configure Selected Profile:" -msgstr "نمایه موجود:" +msgstr "پیکربندی Ù¾Ø±ÙˆÙØ§ÛŒÙ„ انتخاب شده:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Extra Options:" -msgstr "گزینه‌های کلاس:" +msgstr "گزینه‌های اضاÙÛŒ:" #: editor/editor_feature_profile.cpp msgid "Create or import a profile to edit available classes and properties." -msgstr "" +msgstr "یک Ù¾Ø±ÙˆÙØ§ÛŒÙ„ برای ویرایش کلاس‌ها Ùˆ ویژگی‌های موجود ایجاد یا وارد کنید." #: editor/editor_feature_profile.cpp msgid "New profile name:" @@ -3245,9 +3182,8 @@ msgid "Manage Editor Feature Profiles" msgstr "مدیریت ویژگی نمایه‌های ویرایشگر" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Default Feature Profile" -msgstr "ویژگی نمایه Godot" +msgstr "Ù¾Ø±ÙˆÙØ§ÛŒÙ„ ویژگی Ù¾ÛŒØ´â€ŒÙØ±Ø¶" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -3264,7 +3200,7 @@ msgstr "برگزیدن این پوشه" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "Copy Path" -msgstr "" +msgstr "Ú©Ù¾ÛŒ کردن مسیر" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "Open in File Manager" @@ -3281,7 +3217,7 @@ msgstr "ساختن پوشه..." #: editor/editor_file_dialog.cpp editor/find_in_files.cpp msgid "Refresh" -msgstr "" +msgstr "تازه‌سازی" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" @@ -3320,14 +3256,12 @@ msgid "Save a File" msgstr "یک پرونده را ذخیره Ú©Ù†" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Access" -msgstr "موÙقیت!" +msgstr "دسترسی" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp -#, fuzzy msgid "Display Mode" -msgstr "ØØ§Ù„ت صدور:" +msgstr "ØØ§Ù„ت نمایش" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3340,71 +3274,67 @@ msgstr "ØØ§Ù„ت صدور:" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/visual_shader.cpp #: servers/audio/effects/audio_effect_distortion.cpp -#, fuzzy msgid "Mode" -msgstr "انتخاب ØØ§Ù„ت" +msgstr "ØØ§Ù„ت" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Current Dir" -msgstr "نمایه موجود:" +msgstr "دایرکتوری کنونی" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current File" -msgstr "نمایه موجود:" +msgstr "ÙØ§ÛŒÙ„ ÙØ¹Ù„ÛŒ" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Path" -msgstr "نمایه موجود:" +msgstr "مسیر ÙØ¹Ù„ÛŒ" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Show Hidden Files" -msgstr "نمایش در ÙØ§ÛŒÙ„‌سیستم" +msgstr "نمایش ÙØ§ÛŒÙ„‌های پنهان شده" #: editor/editor_file_dialog.cpp msgid "Disable Overwrite Warning" -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 editor/editor_resource_picker.cpp #: scene/gui/base_button.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." @@ -3428,15 +3358,15 @@ 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:" @@ -3445,7 +3375,7 @@ msgstr "پوشه‌ها Ùˆ پرونده‌ها:" #: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp #: editor/plugins/style_box_editor_plugin.cpp editor/rename_dialog.cpp msgid "Preview:" -msgstr "" +msgstr "پیش‌نمایش:" #: editor/editor_file_dialog.cpp #: editor/plugins/version_control_editor_plugin.cpp scene/gui/file_dialog.cpp @@ -3454,27 +3384,30 @@ 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 "" +"چندین واردکننده برای انواع مختل٠وجود دارد Ú©Ù‡ به ÙØ§ÛŒÙ„ %s اشاره می‌کنند، وارد " +"کردن لغو شد" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" msgstr "(در ØØ§Ù„) وارد کردن دوباره عست ها" #: editor/editor_file_system.cpp +#, fuzzy msgid "Reimport Missing Imported Files" -msgstr "" +msgstr "وارد کردن دوباره ÙØ§ÛŒÙ„ های وارد شده ناپیدا" #: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp msgid "Top" -msgstr "" +msgstr "بالا" #: editor/editor_help.cpp msgid "Class:" @@ -3483,7 +3416,7 @@ 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:" @@ -3491,7 +3424,7 @@ msgstr "به ارث رسیده به وسیله:" #: editor/editor_help.cpp msgid "Online Tutorials" -msgstr "" +msgstr "آموزش‌های آنلاین" #: editor/editor_help.cpp msgid "Properties" @@ -3499,7 +3432,7 @@ msgstr "خصوصیات" #: editor/editor_help.cpp msgid "overrides %s:" -msgstr "" +msgstr "%s را لغو Ù…ÛŒ کند:" #: editor/editor_help.cpp msgid "default:" @@ -3513,7 +3446,7 @@ msgstr "خصوصیات زمینه" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/gradient.cpp msgid "Colors" -msgstr "" +msgstr "رنگ‌ها" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constants" @@ -3521,16 +3454,16 @@ msgstr "ثابت ها" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp msgid "Fonts" -msgstr "" +msgstr "Ùونت‌ها" #: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp #: platform/iphone/export/export.cpp msgid "Icons" -msgstr "" +msgstr "آیکون‌ها" #: editor/editor_help.cpp msgid "Styles" -msgstr "" +msgstr "استایل‌ها" #: editor/editor_help.cpp msgid "Enumerations" @@ -3565,9 +3498,8 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp #: modules/gdscript/gdscript_editor.cpp -#, fuzzy msgid "Text Editor" -msgstr "گشودن در ویرایشگر" +msgstr "ویرایشگر متن" #: editor/editor_help.cpp editor/editor_node.cpp editor/editor_settings.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3576,7 +3508,7 @@ msgstr "راهنما" #: editor/editor_help.cpp msgid "Sort Functions Alphabetically" -msgstr "" +msgstr "مرتب کردن توابع بر اساس ØØ±ÙˆÙ Ø§Ù„ÙØ¨Ø§" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -3635,7 +3567,7 @@ msgstr "روش" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Signal" -msgstr "سیگنال‌" +msgstr "سیگنال" #: editor/editor_help_search.cpp modules/visual_script/visual_script_nodes.cpp #: scene/resources/visual_shader_nodes.cpp @@ -3657,43 +3589,40 @@ msgstr "ویژگی:" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp msgid "Label" -msgstr "" +msgstr "برچسب" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Read Only" -msgstr "تنها روش‌ها" +msgstr "Ùقط مطالعه" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp msgid "Checkable" -msgstr "" +msgstr "قابل بررسی" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Checked" -msgstr "همه‌ی انتخاب ها" +msgstr "بررسی شده" #: editor/editor_inspector.cpp -#, fuzzy msgid "Draw Red" -msgstr "ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ" +msgstr "رسم قرمز" #: editor/editor_inspector.cpp -#, fuzzy msgid "Keying" -msgstr "پخش" +msgstr "کلیدزدن" #: editor/editor_inspector.cpp -#, fuzzy msgid "Pin value" -msgstr "(مقدار)" +msgstr "مقدار سنجاق" #: editor/editor_inspector.cpp msgid "" "Pinning a value forces it to be saved even if it's equal to the default." msgstr "" +"پین کردن یک مقدار آن را مجبور Ù…ÛŒ کند ØØªÛŒ اگر برابر با مقدار پیش ÙØ±Ø¶ باشد " +"ذخیره شود." #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" @@ -3714,26 +3643,23 @@ msgstr "تعیین چندگانه:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "" +msgstr "%s سنجاق شد" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "" +msgstr "سنجاق %s برداشته شد" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property" -msgstr "خصوصیات" +msgstr "Ú©Ù¾ÛŒ کردن دارایی" #: editor/editor_inspector.cpp -#, fuzzy msgid "Paste Property" -msgstr "خصوصیات" +msgstr "چسباندن دارایی" #: editor/editor_inspector.cpp -#, fuzzy msgid "Copy Property Path" -msgstr "رونوشت مسیر گره" +msgstr "Ú©Ù¾ÛŒ کردن مسیر دارایی" #: editor/editor_log.cpp msgid "Output:" @@ -3741,7 +3667,7 @@ msgstr "خروجی:" #: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Copy Selection" -msgstr "Ú©Ù¾ÛŒ برگزیده" +msgstr "Ú©Ù¾ÛŒ انتخاب" #: editor/editor_log.cpp editor/editor_network_profiler.cpp #: editor/editor_profiler.cpp editor/editor_resource_picker.cpp @@ -3786,19 +3712,19 @@ 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" @@ -3817,11 +3743,11 @@ msgstr "" #: editor/editor_node.cpp msgid "Spins when the editor window redraws." -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 #: editor/plugins/theme_editor_plugin.cpp @@ -3845,19 +3771,19 @@ 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'." @@ -3865,7 +3791,7 @@ 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." @@ -3885,7 +3811,7 @@ 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." @@ -3902,10 +3828,11 @@ msgid "" "Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " "be satisfied." msgstr "" +"صØÙ†Ù‡ ذخیره نشد. وابستگی‌های Ø§ØØªÙ…الی (نمونه‌ها یا وراثت) را نمی‌توان راضی کرد." #: editor/editor_node.cpp msgid "Could not save one or more scenes!" -msgstr "" +msgstr "نمی‌توان یک یا چند صØÙ†Ù‡ را ذخیره کرد!" #: editor/editor_node.cpp msgid "Save All Scenes" @@ -3913,15 +3840,15 @@ 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 "خطا در ذخیره MeshLibrary!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" @@ -3936,6 +3863,8 @@ msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" +"هنگام تلاش برای ذخیرهٔ چیدمان ویرایشگر خطایی روی داد.\n" +" مطمئن شوید Ú©Ù‡ مسیر داده کاربر در ویرایشگر قابل نوشتن است." #: editor/editor_node.cpp msgid "" @@ -3946,11 +3875,11 @@ msgstr "" #: editor/editor_node.cpp msgid "Layout name not found!" -msgstr "" +msgstr "نام چیدمان پیدا نشد!" #: editor/editor_node.cpp msgid "Restored the Default layout to its base settings." -msgstr "" +msgstr "طرØâ€ŒØ¨Ù†Ø¯ÛŒ Ù¾ÛŒØ´â€ŒÙØ±Ø¶ را به تنظیمات پایه آن بازگرداند." #: editor/editor_node.cpp msgid "" @@ -3970,6 +3899,8 @@ 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 "" @@ -3978,6 +3909,9 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"این صØÙ†Ù‡ وارد شده است، بنابراین تغییرات در آن ØÙظ نخواهد شد. نمونه‌برداری یا " +"به ارث بردن آن اجازه می‌دهد تا تغییراتی در آن ایجاد کنید. Ù„Ø·ÙØ§Ù‹ اسناد مربوط به " +"وارد کردن صØÙ†Ù‡â€ŒÙ‡Ø§ را بخوانید تا این گردش کار را بهتر درک کنید." #: editor/editor_node.cpp msgid "" @@ -4541,6 +4475,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "پروژه" @@ -4922,7 +4857,7 @@ msgstr "خطاهای بارگذاری" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp #: modules/visual_script/visual_script_nodes.cpp msgid "Select" -msgstr "" +msgstr "انتخاب" #: editor/editor_node.cpp #, fuzzy @@ -5089,7 +5024,7 @@ msgstr "" #: scene/3d/collision_object.cpp scene/3d/soft_body.cpp #: scene/main/canvas_layer.cpp msgid "Layer" -msgstr "" +msgstr "لایه" #: editor/editor_properties.cpp msgid "Bit %d, value %d" @@ -5101,7 +5036,7 @@ msgstr "" #: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp msgid "Assign..." -msgstr "" +msgstr "واگذار کردن..." #: editor/editor_properties.cpp #, fuzzy @@ -6847,7 +6782,7 @@ msgstr "تغییر نام" #: editor/filesystem_dock.cpp msgid "Overwrite" -msgstr "" +msgstr "بازنویسی" #: editor/filesystem_dock.cpp #, fuzzy @@ -7445,7 +7380,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -7689,7 +7625,7 @@ msgstr "" #: editor/plugin_config_dialog.cpp msgid "Subfolder:" -msgstr "" +msgstr "زیرپوشه:" #: editor/plugin_config_dialog.cpp #: editor/plugins/version_control_editor_plugin.cpp @@ -7703,7 +7639,7 @@ msgstr "نسخه:" #: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp msgid "Language:" -msgstr "" +msgstr "زبان:" #: editor/plugin_config_dialog.cpp #, fuzzy @@ -7850,7 +7786,7 @@ 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 @@ -8279,16 +8215,16 @@ 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 #: scene/animation/animation_blend_tree.cpp msgid "Sync" -msgstr "" +msgstr "همگام‌سازی" #: editor/plugins/animation_state_machine_editor.cpp msgid "At End" @@ -8298,7 +8234,7 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: scene/3d/vehicle_body.cpp msgid "Travel" -msgstr "" +msgstr "Ø³ÙØ±" #: editor/plugins/animation_state_machine_editor.cpp msgid "Start and end nodes are needed for a sub-transition." @@ -9600,7 +9536,7 @@ msgstr "" #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" -msgstr "" +msgstr "ذرات سی‌پی‌یو" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -9712,14 +9648,14 @@ msgstr "یک Breakpoint درج Ú©Ù†" #: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp #: scene/resources/primitive_meshes.cpp msgid "Text" -msgstr "" +msgstr "متن" #: editor/plugins/item_list_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp main/main.cpp #: platform/osx/export/export.cpp platform/windows/export/export.cpp #: scene/gui/button.cpp scene/gui/item_list.cpp msgid "Icon" -msgstr "" +msgstr "آیکون" #: editor/plugins/item_list_editor_plugin.cpp msgid "ID" @@ -10256,7 +10192,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp #: main/main.cpp servers/visual_server.cpp msgid "Options" -msgstr "" +msgstr "گزینه ها" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -10408,7 +10344,7 @@ msgstr "ویرایش سیگنال" #: editor/plugins/polygon_2d_editor_plugin.cpp scene/3d/skeleton.cpp msgid "Bones" -msgstr "" +msgstr "استخوان‌ها" #: editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -10467,7 +10403,7 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Radius:" -msgstr "" +msgstr "شعاع:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Copy Polygon to UV" @@ -10954,7 +10890,7 @@ msgstr "منبع" #: editor/plugins/script_text_editor.cpp platform/uwp/export/export.cpp #: scene/3d/interpolated_camera.cpp scene/animation/skeleton_ik.cpp msgid "Target" -msgstr "" +msgstr "هدÙ" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -11018,7 +10954,7 @@ 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 @@ -11180,8 +11116,9 @@ msgid "Create Rest Pose from Bones" msgstr "پخش Ø³ÙØ§Ø±Ø´ÛŒ صØÙ†Ù‡" #: editor/plugins/skeleton_2d_editor_plugin.cpp +#, fuzzy msgid "Skeleton2D" -msgstr "" +msgstr "اسکلت2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy @@ -11200,7 +11137,7 @@ msgstr "" #: modules/gltf/gltf_node.cpp modules/gltf/gltf_skin.cpp #: scene/2d/polygon_2d.cpp scene/3d/mesh_instance.cpp msgid "Skeleton" -msgstr "" +msgstr "اسکلت" #: editor/plugins/skeleton_editor_plugin.cpp #, fuzzy @@ -11303,7 +11240,7 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/resources/visual_shader.cpp msgid "None" -msgstr "" +msgstr "هیچکدام" #: editor/plugins/spatial_editor_plugin.cpp scene/2d/path_2d.cpp #, fuzzy @@ -11695,8 +11632,9 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Gizmos" -msgstr "" +msgstr "گیزمو‌ها" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" @@ -11884,7 +11822,7 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" -msgstr "" +msgstr "اسپرایت" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy @@ -12022,11 +11960,11 @@ 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 #: editor/plugins/texture_region_editor_plugin.cpp @@ -12037,7 +11975,7 @@ msgstr "شمارش ها:" #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp msgid "Offset:" -msgstr "" +msgstr "Ø§Ù†ØØ±Ø§Ù:" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -12078,11 +12016,11 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Step:" -msgstr "" +msgstr "قدم:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "TextureRegion" -msgstr "" +msgstr "ناØÛŒÙ‡ تکسچر" #: editor/plugins/theme_editor_plugin.cpp msgid "Styleboxes" @@ -12632,7 +12570,7 @@ msgstr "ØºÛŒØ±ÙØ¹Ø§Ù„ شده" #: editor/plugins/theme_editor_preview.cpp scene/resources/mesh_library.cpp msgid "Item" -msgstr "" +msgstr "مورد" #: editor/plugins/theme_editor_preview.cpp #, fuzzy @@ -12663,7 +12601,7 @@ msgstr "" #: editor/plugins/theme_editor_preview.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Submenu" -msgstr "" +msgstr "زیر‌منو" #: editor/plugins/theme_editor_preview.cpp msgid "Subitem 1" @@ -12675,11 +12613,11 @@ msgstr "" #: editor/plugins/theme_editor_preview.cpp msgid "Has" -msgstr "" +msgstr "دارد" #: editor/plugins/theme_editor_preview.cpp msgid "Many" -msgstr "" +msgstr "بسیاری" #: editor/plugins/theme_editor_preview.cpp #, fuzzy @@ -12705,11 +12643,11 @@ msgstr "ÙØ±Ø²Ù†Ø¯ قابل ویرایش" #: editor/plugins/theme_editor_preview.cpp msgid "Subtree" -msgstr "" +msgstr "زیر‌درخت" #: editor/plugins/theme_editor_preview.cpp msgid "Has,Many,Options" -msgstr "" +msgstr "دارد،بسیار،گزینه‌ها" #: editor/plugins/theme_editor_preview.cpp msgid "Invalid path, the PackedScene resource was probably moved or removed." @@ -12771,8 +12709,9 @@ msgid "Find Tile" msgstr "ÛŒØ§ÙØªÙ†" #: editor/plugins/tile_map_editor_plugin.cpp +#, fuzzy msgid "Transpose" -msgstr "" +msgstr "جا‌به‌جا کردن" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" @@ -13611,11 +13550,11 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector" -msgstr "" +msgstr "بردار" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean" -msgstr "" +msgstr "بولی" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -13715,7 +13654,7 @@ msgstr "تغییر بده" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" -msgstr "" +msgstr "رأس" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -13725,7 +13664,7 @@ msgstr "نشانوندها:" #: editor/plugins/visual_shader_editor_plugin.cpp modules/gltf/gltf_node.cpp #: scene/3d/light.cpp msgid "Light" -msgstr "" +msgstr "نور" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -14431,7 +14370,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" -msgstr "" +msgstr "شیدر دیداری" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -14445,7 +14384,7 @@ msgstr "تغییر بده" #: editor/project_export.cpp msgid "Runnable" -msgstr "" +msgstr "قابل اجرا" #: editor/project_export.cpp msgid "Export the project for all the presets defined." @@ -14472,11 +14411,11 @@ 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 "" @@ -14490,15 +14429,15 @@ 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:" @@ -14748,8 +14687,9 @@ msgid "Project Installation Path:" msgstr "مسیر پروژه:" #: editor/project_manager.cpp +#, fuzzy msgid "Renderer:" -msgstr "" +msgstr "رندرر:" #: editor/project_manager.cpp msgid "OpenGL ES 3.0" @@ -15232,7 +15172,7 @@ msgstr "تنظیمات پروژه (پروژه.گودات)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" -msgstr "Ù‡ÙŽÙ…Ùگان" +msgstr "عمومی" #: editor/project_settings_editor.cpp msgid "Override For..." @@ -15340,11 +15280,11 @@ msgstr "" #: editor/property_editor.cpp msgid "File..." -msgstr "" +msgstr "ÙØ§ÛŒÙ„..." #: editor/property_editor.cpp msgid "Dir..." -msgstr "" +msgstr "دایرکتوری..." #: editor/property_editor.cpp msgid "Assign" @@ -15405,7 +15345,7 @@ msgstr "" #: editor/rename_dialog.cpp msgid "Substitute" -msgstr "" +msgstr "جایگزین" #: editor/rename_dialog.cpp #, fuzzy @@ -15453,8 +15393,9 @@ msgid "Amount by which counter is incremented for each node" msgstr "" #: editor/rename_dialog.cpp +#, fuzzy msgid "Padding" -msgstr "" +msgstr "لایه گذاری" #: editor/rename_dialog.cpp msgid "" @@ -15464,15 +15405,16 @@ msgstr "" #: editor/rename_dialog.cpp msgid "Post-Process" -msgstr "" +msgstr "پس-پردازش" #: editor/rename_dialog.cpp msgid "Style" -msgstr "" +msgstr "شیوه" #: editor/rename_dialog.cpp +#, fuzzy msgid "Keep" -msgstr "" +msgstr "Ù†Ú¯Ù‡ داشتن" #: editor/rename_dialog.cpp msgid "PascalCase to snake_case" @@ -15699,18 +15641,19 @@ msgstr "" msgid "Make Local" msgstr "Ù…ØÙ„ÛŒ" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "نام گره:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "نام هم‌اکنون توسط تابع/متغیر/سیگنال Ø§Ø³ØªÙØ§Ø¯Ù‡ شده است:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "نام گره:" #: editor/scene_tree_dock.cpp @@ -15919,6 +15862,11 @@ msgstr "دکمه" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "نام گره:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "خطای اتصال" @@ -15983,6 +15931,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "تغییر نام گره" @@ -17913,6 +17865,21 @@ msgstr "همه‌ی انتخاب ها" msgid "Auto Update Project" msgstr "پروژه بی نام" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "نشان دادن همه" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "یک Ùهرست انتخاب کنید" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "یک Ùهرست انتخاب کنید" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19764,6 +19731,11 @@ msgstr "ساختن گره" msgid "Custom BG Color" msgstr "ساختن گره" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "خروجی" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20610,6 +20582,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "نام نامعتبر." @@ -28377,4 +28355,4 @@ msgstr "" #: servers/visual_server.cpp msgid "Shader Cache Size (MB)" -msgstr "" +msgstr "اندازه Ú©Ø´ شیدر (مگابایت)" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index db841ef48a..c560e51b01 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -4636,6 +4636,7 @@ msgstr "Sekalaiset projekti- tai kohtaustyökalut." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekti" @@ -7574,7 +7575,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15634,18 +15636,19 @@ msgstr "" msgid "Make Local" msgstr "Tee paikallinen" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Solmun nimi:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Nimi on jo toisen funktion/muuttujan/signaalin käytössä:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Solmun nimi:" #: editor/scene_tree_dock.cpp @@ -15848,6 +15851,11 @@ msgid "Button Group" msgstr "Painikeryhmä" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Solmun nimi:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Yhdistetään paikasta)" @@ -15923,6 +15931,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Virheellinen solmun nimi, seuraavat merkit eivät ole sallittuja:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Nimeä solmu uudelleen" @@ -17850,6 +17862,21 @@ msgstr "Muodosta ratkaisu" msgid "Auto Update Project" msgstr "Nimetön projekti" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Näytä kaikki" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Valitse hakemisto" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Valitse hakemisto" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Sisemmän poikkeuksen kutsupinon loppu" @@ -19718,6 +19745,11 @@ msgstr "Mukautettu solmu" msgid "Custom BG Color" msgstr "Mukautettu solmu" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Laajenna kaikki" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20615,6 +20647,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Paketin lyhyt nimi on virheellinen." diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 0a154fd6ae..e6d675f5ca 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-05-15 09:38+0000\n" +"PO-Revision-Date: 2022-08-30 03:11+0000\n" "Last-Translator: Marco Santos <enum.scima@gmail.com>\n" "Language-Team: Filipino <https://hosted.weblate.org/projects/godot-engine/" "godot/fil/>\n" @@ -21,7 +21,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 " "|| n % 10 == 6 || n % 10 == 9);\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -33,7 +33,7 @@ msgstr "Clipboard" #: core/bind/core_bind.cpp msgid "Current Screen" -msgstr "Kasalukuyang Screen" +msgstr "Screen Ngayon" #: core/bind/core_bind.cpp msgid "Exit Code" @@ -41,15 +41,15 @@ msgstr "Umalis sa Code" #: core/bind/core_bind.cpp msgid "V-Sync Enabled" -msgstr "Binuksan ang V-Sync" +msgstr "Nakabukas na ang V-Sync" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "V-Sync Via Compositor" +msgstr "V-Sync gamit Compositor" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "Delta Smoothing" +msgstr "Pagkinis sa Delta" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode" @@ -57,7 +57,7 @@ msgstr "Mababang Paggamit sa Processor" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "Mababang Paggamit sa Processor Tulog (µsec)" +msgstr "Pagtulog ng Mababang Paggamit sa Processor (µsec)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" @@ -65,15 +65,15 @@ msgstr "Panatilihing Nakabukas ang Screen" #: core/bind/core_bind.cpp msgid "Min Window Size" -msgstr "Min na Laki ng Window" +msgstr "Min na Sukat ng Window" #: core/bind/core_bind.cpp msgid "Max Window Size" -msgstr "Max na Laki ng Window" +msgstr "Max na Sukat ng Window" #: core/bind/core_bind.cpp msgid "Screen Orientation" -msgstr "Screen Orientation" +msgstr "Orientation ng Screen" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp @@ -86,7 +86,7 @@ msgstr "Walang border" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "Nakabukas ang Kada Pixel na Transparency" +msgstr "Nakabukas na ang Kada Pixel na Transparency" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Fullscreen" @@ -123,7 +123,7 @@ msgstr "Posisyon" #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp msgid "Size" -msgstr "Laki" +msgstr "Sukat" #: core/bind/core_bind.cpp msgid "Endian Swap" @@ -131,15 +131,15 @@ msgstr "Endian Swap" #: core/bind/core_bind.cpp msgid "Editor Hint" -msgstr "Editor Hint" +msgstr "Hint sa Editor" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "I-print mga Mensahe ng Error" +msgstr "I-print ang mga Mensahe ng Error" #: core/bind/core_bind.cpp msgid "Iterations Per Second" -msgstr "Ikot Kada Segundo" +msgstr "Iteration Kada Segundo" #: core/bind/core_bind.cpp msgid "Target FPS" @@ -313,9 +313,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "Kulang sa bytes para i-decode ang bytes, o invalid na format." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "Invalid na input %i (di pinasa) sa expression" +msgstr "Invalid na input na %d (di pinasa) sa expression" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -359,13 +358,12 @@ msgid "Max Size (KB)" msgstr "Max na Laki (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Kopya" +msgstr "Mouse Mode" #: core/os/input.cpp msgid "Use Accumulated Input" -msgstr "" +msgstr "Gamitin ang Nakolektang Input" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -393,9 +391,8 @@ msgid "Command" msgstr "Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "Pisika" +msgstr "Pisikal" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -425,7 +422,7 @@ msgstr "Mask ng Button" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp msgid "Global Position" -msgstr "Global na Posisyon" +msgstr "Pandaigdigang Posisyon" #: core/os/input_event.cpp msgid "Factor" @@ -441,7 +438,7 @@ msgstr "Dobleng pindot" #: core/os/input_event.cpp msgid "Tilt" -msgstr "Kiling" +msgstr "Tabingi" #: core/os/input_event.cpp msgid "Pressure" @@ -449,7 +446,7 @@ msgstr "Presyur" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Baligtad na Pen" #: core/os/input_event.cpp msgid "Relative" @@ -479,7 +476,7 @@ msgstr "Index" #: modules/visual_script/visual_script_nodes.cpp #: scene/2d/touch_screen_button.cpp msgid "Action" -msgstr "Gawain" +msgstr "Kilos" #: core/os/input_event.cpp scene/resources/environment.cpp #: scene/resources/material.cpp @@ -532,7 +529,7 @@ msgstr "Config" #: core/project_settings.cpp msgid "Project Settings Override" -msgstr "Override sa Pagsasaayos ng Proyekto" +msgstr "Override sa Pagsasaayos sa Proyekto" #: core/project_settings.cpp core/resource.cpp #: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp @@ -575,7 +572,7 @@ msgstr "Patayin ang stderr" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "Gamitin ang Hidden Project Data Directory" +msgstr "Gamitin ang Nakatagong Directory ng Data ng Proyekto" #: core/project_settings.cpp msgid "Use Custom User Dir" @@ -589,13 +586,13 @@ msgstr "Pangalan ng Sariling User Dir" #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp msgid "Display" -msgstr "" +msgstr "Pagpapakita" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Lapad" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -604,19 +601,19 @@ msgstr "" #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp msgid "Height" -msgstr "" +msgstr "Tangkad" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "Palaging Nasa Taas" #: core/project_settings.cpp msgid "Test Width" -msgstr "" +msgstr "Lapad ng Test" #: core/project_settings.cpp msgid "Test Height" -msgstr "" +msgstr "Tangkad ng Test" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -640,7 +637,7 @@ msgstr "Pangunahing Args sa Pagtakbo" #: core/project_settings.cpp msgid "Scene Naming" -msgstr "" +msgstr "Pagpangalan sa Eksena" #: core/project_settings.cpp msgid "Search In File Extensions" @@ -4358,6 +4355,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7074,7 +7072,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14797,18 +14796,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Pagbago ng Haba ng Animation" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Pagbago ng Haba ng Animation" #: editor/scene_tree_dock.cpp @@ -14998,6 +14997,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Pagbago ng Haba ng Animation" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15061,6 +15065,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16867,6 +16875,19 @@ msgstr "" msgid "Auto Update Project" msgstr "Ilipat Ang Mga Bezier Points" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Gamitin ang Nakatagong Directory ng Data ng Proyekto" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18580,6 +18601,11 @@ msgstr "Mga Functions:" msgid "Custom BG Color" msgstr "Mga Functions:" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "3D Transform Track" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19376,6 +19402,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 88c4966b54..b65ff797d7 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -102,13 +102,15 @@ # Jérémie Guegain <mirejai@orange.fr>, 2022. # cwulveryck <cwulveryck@online.fr>, 2022. # Helix Sir <vincentbarkmann@gmail.com>, 2022. +# SCHUTZ Lucas <lucas.schutz0954@gmail.com>, 2022. +# EGuillemot <Elouen.Guillemot@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-05 01:04+0000\n" -"Last-Translator: Helix Sir <vincentbarkmann@gmail.com>\n" +"PO-Revision-Date: 2022-09-02 23:49+0000\n" +"Last-Translator: DinosaurHorseSword <ewenlandry@mailfence.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -116,7 +118,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -226,7 +228,7 @@ msgstr "Échange d'Endians" #: core/bind/core_bind.cpp msgid "Editor Hint" -msgstr "Conseil(s) Éditeur" +msgstr "Suggestion d’éditeur" #: core/bind/core_bind.cpp msgid "Print Error Messages" @@ -3045,7 +3047,7 @@ msgstr "Bibliothèque d'assets" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" -msgstr "Édition de l'arbre de scène" +msgstr "Édition d'arborescence de scène" #: editor/editor_feature_profile.cpp msgid "Node Dock" @@ -3319,7 +3321,7 @@ msgstr "Accès" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp msgid "Display Mode" -msgstr "Mode d'Affichage" +msgstr "Mode d'affichage" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3876,7 +3878,7 @@ msgstr "Analyse" #: editor/editor_node.cpp msgid "Creating Thumbnail" -msgstr "Création de l'aperçu" +msgstr "Création de vignette" #: editor/editor_node.cpp msgid "This operation can't be done without a tree root." @@ -4150,7 +4152,7 @@ msgstr "Lancer une scène rapidement…" #: editor/editor_node.cpp msgid "Quit" -msgstr "Quitter" +msgstr "Fermer" #: editor/editor_node.cpp msgid "Yes" @@ -4171,13 +4173,13 @@ msgstr "" #: editor/editor_node.cpp msgid "Save & Quit" -msgstr "Sauvegarder & quitter" +msgstr "Sauvegarder & fermer" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" msgstr "" "Sauvegarder les modifications sur la (les) scène(s) suivante(s) avant de " -"quitter ?" +"fermer ?" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before opening Project Manager?" @@ -4405,7 +4407,7 @@ msgstr "Toujours fermer la sortie à l'arrêt" #: editor/editor_node.cpp msgid "Save On Focus Loss" -msgstr "Enregistrer lorsque le focus est perdu" +msgstr "Enregistrer à la perte de focus" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Save Each Scene On Quit" @@ -4413,7 +4415,7 @@ msgstr "Enregistrer toutes les scènes à la fermeture" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Quit Confirmation" -msgstr "Confirmer avant de quitter" +msgstr "Confirmation avant la fermeture" #: editor/editor_node.cpp msgid "Show Update Spinner" @@ -4421,24 +4423,23 @@ msgstr "Afficher l'indicateur d'activité" #: editor/editor_node.cpp msgid "Update Continuously" -msgstr "Mettre à jour en continu" +msgstr "Mise à jour continue" #: editor/editor_node.cpp -#, fuzzy msgid "Update Vital Only" -msgstr "Changements de matériau" +msgstr "Mise à jour uniquement si vital" #: editor/editor_node.cpp msgid "Localize Settings" -msgstr "Traduction des réglages" +msgstr "Traduction des paramètres" #: editor/editor_node.cpp msgid "Restore Scenes On Load" -msgstr "Restaurer les scènes au chargement" +msgstr "Rouvrir les scènes au chargement" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" -msgstr "Afficher l’aperçu au survol" +msgstr "Afficher vignette au survol" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Inspector" @@ -4588,6 +4589,7 @@ msgstr "Outils divers liés au projet ou à la scène." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projet" @@ -5045,7 +5047,7 @@ msgstr "Création des prévisualisations des maillages" #: editor/editor_plugin.cpp msgid "Thumbnail..." -msgstr "Aperçu…" +msgstr "Vignette…" #: editor/editor_plugin_settings.cpp msgid "Main Script:" @@ -5339,15 +5341,15 @@ msgstr "Avez-vous oublié la méthode « _run » ?" #: editor/editor_settings.cpp msgid "Editor Language" -msgstr "Langue de l'Éditeur" +msgstr "Langue de l'éditeur" #: editor/editor_settings.cpp msgid "Display Scale" -msgstr "Échelle de l'affichage" +msgstr "Échelle d'affichage" #: editor/editor_settings.cpp msgid "Custom Display Scale" -msgstr "Échelle personnalisé de l'affichage" +msgstr "Échelle personnalisée d'affichage" #: editor/editor_settings.cpp msgid "Main Font Size" @@ -5363,7 +5365,7 @@ msgstr "Police anticrénelée" #: editor/editor_settings.cpp msgid "Font Hinting" -msgstr "Indication de police" +msgstr "Optimisation de rendu de police" #: editor/editor_settings.cpp msgid "Main Font" @@ -5371,11 +5373,11 @@ msgstr "Police Principale" #: editor/editor_settings.cpp msgid "Main Font Bold" -msgstr "Principale police grasse" +msgstr "Police principale en gras" #: editor/editor_settings.cpp msgid "Code Font" -msgstr "Police du Code" +msgstr "Police du code" #: editor/editor_settings.cpp msgid "Dim Editor On Dialog Popup" @@ -5465,7 +5467,7 @@ msgstr "Scan auto du chemin du projet" #: editor/editor_settings.cpp msgid "Default Project Path" -msgstr "Chemin du Projet par Défaut" +msgstr "Chemin de projet par défaut" #: editor/editor_settings.cpp msgid "On Save" @@ -5485,15 +5487,15 @@ msgstr "Fenêtre de sélection de fichiers" #: editor/editor_settings.cpp msgid "Thumbnail Size" -msgstr "Taille de la vignette" +msgstr "Taille de vignette" #: editor/editor_settings.cpp msgid "Docks" -msgstr "S'attache" +msgstr "Docks" #: editor/editor_settings.cpp msgid "Scene Tree" -msgstr "une arborescence, arbre des scènes" +msgstr "Arborescence de scène" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" @@ -5547,7 +5549,7 @@ msgstr "Surligner les lignes à types sûrs" #: editor/editor_settings.cpp msgid "Indent" -msgstr "Indenter" +msgstr "Indentation" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Auto Indent" @@ -5574,7 +5576,7 @@ msgstr "Navigation" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Smooth Scrolling" -msgstr "Défilement Doux" +msgstr "Défilement doux" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "V Scroll Speed" @@ -5606,7 +5608,7 @@ msgstr "Apparence" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Show Line Numbers" -msgstr "Afficher les Numéros de Ligne" +msgstr "Afficher les numéros de Ligne" #: editor/editor_settings.cpp msgid "Line Numbers Zero Padded" @@ -5646,7 +5648,7 @@ msgstr "Colonne dure des guides de longueur de ligne" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Script List" -msgstr "Liste des Scripts" +msgstr "Liste de scripts" #: editor/editor_settings.cpp msgid "Show Members Overview" @@ -5666,7 +5668,7 @@ msgstr "Intervalle entre les sauvegardes automatiques (en secondes)" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Restore Scripts On Load" -msgstr "Restaurer les scripts au chargement" +msgstr "Rouvrir les scripts au chargement" #: editor/editor_settings.cpp msgid "Auto Reload And Parse Scripts On Save" @@ -5717,7 +5719,7 @@ msgstr "Complétion" #: editor/editor_settings.cpp msgid "Idle Parse Delay" -msgstr "" +msgstr "Délai du traitement passif" #: editor/editor_settings.cpp msgid "Auto Brace Complete" @@ -5757,11 +5759,11 @@ msgstr "Taille de la police de l'aide" #: editor/editor_settings.cpp msgid "Help Source Font Size" -msgstr "Taille de la police de l'aide de la source" +msgstr "Taille de police d'origine de l'aide" #: editor/editor_settings.cpp msgid "Help Title Font Size" -msgstr "Taille de la police du titre Aide" +msgstr "Taille de police du titre de l'aide" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" @@ -5773,7 +5775,7 @@ msgstr "Choisissez la distance" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Preview Size" -msgstr "Aperçu de la taille" +msgstr "Taille d'aperçu" #: editor/editor_settings.cpp msgid "Primary Grid Color" @@ -5821,7 +5823,7 @@ msgstr "Pas de la grille principale" #: editor/editor_settings.cpp msgid "Grid Size" -msgstr "Taille de la Grille" +msgstr "Taille de la grille" #: editor/editor_settings.cpp msgid "Grid Division Level Max" @@ -5833,7 +5835,7 @@ msgstr "Niveau minimal de division de la grille" #: editor/editor_settings.cpp msgid "Grid Division Level Bias" -msgstr "Niveau de biais de la division de grille" +msgstr "Niveau de biais de division de la grille" #: editor/editor_settings.cpp msgid "Grid XZ Plane" @@ -5877,11 +5879,11 @@ msgstr "Inverser l'axe X" #: editor/editor_settings.cpp msgid "Zoom Style" -msgstr "Style de Zoom" +msgstr "Style de zoom" #: editor/editor_settings.cpp msgid "Emulate Numpad" -msgstr "Émuler un pavé numérique" +msgstr "Émuler pavé numérique" #: editor/editor_settings.cpp msgid "Emulate 3 Button Mouse" @@ -5889,24 +5891,23 @@ msgstr "Émuler souris à 3 boutons" #: editor/editor_settings.cpp msgid "Orbit Modifier" -msgstr "Modificateur d'orbite" +msgstr "Touche de combinaison : Orbite" #: editor/editor_settings.cpp msgid "Pan Modifier" -msgstr "Modificateur panoramique" +msgstr "Touche de combinaison : Panoramique" #: editor/editor_settings.cpp msgid "Zoom Modifier" -msgstr "Multiplicateur de Zoom" +msgstr "Touche de combinaison : Zoom" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Warped Mouse Panning" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Feel" -msgstr "Mode Navigation" +msgstr "Préférences de navigation" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" @@ -5914,15 +5915,15 @@ msgstr "Sensibilité de l'orbite" #: editor/editor_settings.cpp msgid "Orbit Inertia" -msgstr "Inertie de l'orbite" +msgstr "Inertie d'orbite" #: editor/editor_settings.cpp msgid "Translation Inertia" -msgstr "Inertie de la Translation" +msgstr "Inertie de la translation" #: editor/editor_settings.cpp msgid "Zoom Inertia" -msgstr "Inertie du Zoom" +msgstr "Inertie du zoom" #: editor/editor_settings.cpp msgid "Freelook" @@ -5946,7 +5947,7 @@ msgstr "Vitesse de base de la vue libre" #: editor/editor_settings.cpp msgid "Freelook Activation Modifier" -msgstr "Modificateur d'activation de la vue libre" +msgstr "Touche de combinaison : Activation vue libre" #: editor/editor_settings.cpp msgid "Freelook Speed Zoom Link" @@ -5954,7 +5955,7 @@ msgstr "Lien de zoom rapide de la vue libre" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Grid Color" -msgstr "Couleur de la Grille" +msgstr "Couleur de la grille" #: editor/editor_settings.cpp msgid "Guides Color" @@ -5978,7 +5979,7 @@ msgstr "Couleur d'os 2" #: editor/editor_settings.cpp msgid "Bone Selected Color" -msgstr "Couleur de l'os sélectionnée" +msgstr "Couleur d'os sélectionné" #: editor/editor_settings.cpp msgid "Bone IK Color" @@ -5990,7 +5991,7 @@ msgstr "Couleur de contour d'os" #: editor/editor_settings.cpp msgid "Bone Outline Size" -msgstr "Taille du contour de l'os" +msgstr "Taille de contour d'os" #: editor/editor_settings.cpp msgid "Viewport Border Color" @@ -5998,7 +5999,7 @@ msgstr "Couleur de bordure de la fenêtre d'affichage" #: editor/editor_settings.cpp msgid "Constrain Editor View" -msgstr "Restreindre la fenêtre d'Éditeur" +msgstr "Restreindre la fenêtre d'éditeur" #: editor/editor_settings.cpp msgid "Simple Panning" @@ -6010,7 +6011,7 @@ msgstr "Panoramique au défilement" #: editor/editor_settings.cpp msgid "Pan Speed" -msgstr "Vitesse Panoramique" +msgstr "Vitesse panoramique" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp msgid "Poly Editor" @@ -6018,7 +6019,7 @@ msgstr "Éditeur de polygones" #: editor/editor_settings.cpp msgid "Point Grab Radius" -msgstr "Rayon de saisie par point" +msgstr "Rayon de saisie de point" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Previous Outline" @@ -6156,28 +6157,27 @@ msgstr "Couleur des chaînes de caractères" #: platform/uwp/export/export.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Background Color" -msgstr "Couleur d’Arrière-Plan" +msgstr "Couleur d’arrière-plan" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Background Color" msgstr "Couleur d'arrière-plan de complétion" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Selected Color" -msgstr "Importer la sélection" +msgstr "Couleur de la complétion sélectionnée" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Existing Color" -msgstr "" +msgstr "Couleur de la partie existante de la complétion" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Scroll Color" -msgstr "" +msgstr "Couleur de défilement de complétion" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Font Color" -msgstr "" +msgstr "Couleur de police de complétion" #: editor/editor_settings.cpp msgid "Text Color" @@ -6185,7 +6185,7 @@ msgstr "Couleur du Texte" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Line Number Color" -msgstr "Couleur du Numéro de Ligne" +msgstr "Couleur des numéros de lignes" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Safe Line Number Color" @@ -6236,9 +6236,8 @@ msgid "Member Variable Color" msgstr "Couleur des variables de membres" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mark Color" -msgstr "Prélever une couleur" +msgstr "Couleur de la marque" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Bookmark Color" @@ -6976,9 +6975,8 @@ msgid "Delimiter" msgstr "Délimiteur" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "ColorCorrect" -msgstr "Correction de Couleur" +msgstr "ColorCorrect" #: editor/import/resource_importer_layered_texture.cpp msgid "No BPTC If RGB" @@ -7140,9 +7138,8 @@ msgid "Meshes" msgstr "Maillages" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Ensure Tangents" -msgstr "Modifier la tangente de courbes" +msgstr "Vérifier les tangentes" #: editor/import/resource_importer_scene.cpp msgid "Light Baking" @@ -7378,7 +7375,8 @@ msgid "8 Bit" msgstr "8 Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -9313,7 +9311,7 @@ msgstr "Diviser le pas de la grille par 2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan View" -msgstr "Vue panoramique" +msgstr "Panoramique de vue" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom to 3.125%" @@ -10351,7 +10349,7 @@ msgstr "Paramètres de la grille" #: editor/plugins/polygon_2d_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Snap" -msgstr "Aligner" +msgstr "Magnétisme, Aimantation" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" @@ -10746,11 +10744,11 @@ msgstr "Taille de l'historique des températures de script" #: editor/plugins/script_editor_plugin.cpp msgid "Current Script Background Color" -msgstr "Couleur d'Arrière-Plan du Script Actuel" +msgstr "Couleur d'arrière-plan du script actuel" #: editor/plugins/script_editor_plugin.cpp msgid "Group Help Pages" -msgstr "Pages d'aide de groupe" +msgstr "Grouper les pages d'aide" #: editor/plugins/script_editor_plugin.cpp msgid "Sort Scripts By" @@ -11315,11 +11313,11 @@ msgstr "Vue libre bas" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "Modificateur de vitesse de la vue libre" +msgstr "Touche de combinaison : Vitesse de vue libre" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Slow Modifier" -msgstr "Ralentissement de la vue libre" +msgstr "Touche de combinaison : Ralentissement de vue libre" #: editor/plugins/spatial_editor_plugin.cpp msgid "Toggle Camera Preview" @@ -12564,9 +12562,8 @@ msgid "Palette Min Width" msgstr "Largeur minimale de la palette" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Palette Item H Separation" -msgstr "Séparateur nommé" +msgstr "Séparation horizontale des éléments de palette" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Show Tile Names" @@ -12587,7 +12584,7 @@ msgstr "Aperçu du remplissage" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Editor Side" -msgstr "Coté Éditeur" +msgstr "Coté de l'éditeur" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Display Grid" @@ -15423,16 +15420,19 @@ msgstr "" msgid "Make Local" msgstr "Rendre local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "Un autre NÅ“ud utilise ce nom unique dans la scène." - #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +#, fuzzy +msgid "Enable Scene Unique Name(s)" msgstr "Activer le nom unique de la scène" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Unique names already used by another node in the scene:" +msgstr "Un autre NÅ“ud utilise ce nom unique dans la scène." + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Désactiver le nom unique de la scène" #: editor/scene_tree_dock.cpp @@ -15634,6 +15634,10 @@ msgid "Button Group" msgstr "Bouton de groupe" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Désactiver le nom unique de la scène" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Connexion à partir de)" @@ -15712,6 +15716,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Nom de nÅ“ud invalide, les caractères suivants ne sont pas autorisés :" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Un autre NÅ“ud utilise ce nom unique dans la scène." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renommer le nÅ“ud" @@ -16082,7 +16090,7 @@ msgstr "Changer particules AABB" #: editor/spatial_editor_gizmos.cpp msgid "Reflection Probe" -msgstr "Sonde de Réflexion" +msgstr "Sonde de réflexion" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" @@ -16090,7 +16098,7 @@ msgstr "Changer les ampleurs de la sonde" #: editor/spatial_editor_gizmos.cpp msgid "GI Probe" -msgstr "Sonde GI" +msgstr "Sonde d'illumination globale" #: editor/spatial_editor_gizmos.cpp msgid "Baked Indirect Light" @@ -16162,11 +16170,11 @@ msgstr "Définir la position du point de la pièce" #: editor/spatial_editor_gizmos.cpp scene/3d/portal.cpp msgid "Portal Margin" -msgstr "Marge du portail" +msgstr "Marge de portail" #: editor/spatial_editor_gizmos.cpp msgid "Portal Edge" -msgstr "Bords du portail" +msgstr "Bord de portail" #: editor/spatial_editor_gizmos.cpp msgid "Portal Arrow" @@ -16241,7 +16249,7 @@ msgstr "Serveur à tâches parallèles" #: main/main.cpp msgid "RID Pool Prealloc" -msgstr "" +msgstr "Pré-allocation des RIDs de pool" #: main/main.cpp msgid "Debugger stdout" @@ -16300,8 +16308,9 @@ msgid "Fallback To GLES2" msgstr "Se replier sur GLES2" #: main/main.cpp +#, fuzzy msgid "Use Nvidia Rect Flicker Workaround" -msgstr "" +msgstr "Utiliser le contournement Nvidia pour éviter le clignotement" #: main/main.cpp msgid "DPI" @@ -16348,8 +16357,9 @@ msgid "Thread Model" msgstr "Modèle de Parallélisme" #: main/main.cpp +#, fuzzy msgid "Thread Safe BVH" -msgstr "" +msgstr "BVH avec Thread Sécurisés" #: main/main.cpp msgid "Handheld" @@ -16375,7 +16385,7 @@ msgstr "Forces les trames par seconde" #: main/main.cpp msgid "Enable Pause Aware Picking" -msgstr "" +msgstr "Activer la sélection prenant en compte la mise en pause" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp @@ -16385,7 +16395,7 @@ msgstr "GUI" #: main/main.cpp msgid "Drop Mouse On GUI Input Disabled" -msgstr "" +msgstr "Lâcher la souris quand le saisie GUI est désactivée" #: main/main.cpp msgid "stdout" @@ -16417,7 +16427,7 @@ msgstr "Mode Processeur Faible" #: main/main.cpp msgid "Delta Sync After Draw" -msgstr "" +msgstr "Synchroniser le Delta Après l'Affichage" #: main/main.cpp msgid "iOS" @@ -16499,7 +16509,7 @@ msgstr "Mise en mémoire tampon" #: main/main.cpp msgid "Agile Event Flushing" -msgstr "" +msgstr "Purge d'événement agile" #: main/main.cpp msgid "Emulate Touch From Mouse" @@ -16519,7 +16529,7 @@ msgstr "Image personnalisée" #: main/main.cpp msgid "Custom Image Hotspot" -msgstr "" +msgstr "Point d'accès d'image personnalisé" #: main/main.cpp msgid "Tooltip Position Offset" @@ -16568,7 +16578,7 @@ msgstr "Accepter automatiquement la fermeture" #: main/main.cpp scene/main/scene_tree.cpp msgid "Quit On Go Back" -msgstr "Quitter au retour" +msgstr "Fermer sur retour" #: main/main.cpp scene/main/viewport.cpp msgid "Snap Controls To Pixels" @@ -16584,7 +16594,7 @@ msgstr "Utiliser le suréchantillonnage" #: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp msgid "Active Soft World" -msgstr "" +msgstr "Activer le support des SoftBody par le Monde" #: modules/csg/csg_gizmos.cpp msgid "CSG" @@ -16694,9 +16704,8 @@ msgid "Path Node" msgstr "Noeud de chemin" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Interval Type" -msgstr "Créer un vertex interne" +msgstr "Type d'intervalle de chemin" #: modules/csg/csg_shape.cpp msgid "Path Interval" @@ -17016,9 +17025,8 @@ msgid "Byte Stride" msgstr "" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Indices" -msgstr "Tous les périphérique" +msgstr "Indices" #: modules/gltf/gltf_camera.cpp msgid "FOV Size" @@ -17026,12 +17034,11 @@ msgstr "Taille du FOV" #: modules/gltf/gltf_camera.cpp msgid "Zfar" -msgstr "" +msgstr "Zfar" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "Znear" -msgstr "Linéaire" +msgstr "Znear" #: modules/gltf/gltf_light.cpp scene/2d/canvas_modulate.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp scene/2d/polygon_2d.cpp @@ -17055,16 +17062,15 @@ msgstr "Plage" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" -msgstr "" +msgstr "Angle intérieur du cône" #: modules/gltf/gltf_light.cpp msgid "Outer Cone Angle" -msgstr "" +msgstr "Angle extérieur du cône" #: modules/gltf/gltf_mesh.cpp -#, fuzzy msgid "Blend Weights" -msgstr "Précalculer les lightmaps" +msgstr "Mélanger les poids" #: modules/gltf/gltf_mesh.cpp msgid "Instance Materials" @@ -17075,9 +17081,8 @@ msgid "Parent" msgstr "Parent" #: modules/gltf/gltf_node.cpp -#, fuzzy msgid "Xform" -msgstr "Plateforme" +msgstr "Xform" #: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp msgid "Skin" @@ -17469,16 +17474,15 @@ msgstr "Hauteur de l’œil" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" -msgstr "" +msgstr "Distance interoculaire" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Display Width" msgstr "Afficher la largeur" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "Display To Lens" -msgstr "Afficher sans ombrage" +msgstr "Distance affichage-lentille" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" @@ -17504,6 +17508,21 @@ msgstr "Compiler la solution" msgid "Auto Update Project" msgstr "Mettre à jour le projet automatiquement" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Afficher le nom" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Choisir un répertoire" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Choisir un répertoire" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Fin de la trace d'appel (stack trace) intrinsèque" @@ -18454,13 +18473,14 @@ msgid "Optional Features" msgstr "Fonctionnalités Optionnelles" #: modules/webxr/webxr_interface.cpp +#, fuzzy msgid "Requested Reference Space Types" -msgstr "" +msgstr "Type d'espace référence requis" #: modules/webxr/webxr_interface.cpp #, fuzzy msgid "Reference Space Type" -msgstr "Type de référentiel spatial" +msgstr "Type d'espace référence" #: modules/webxr/webxr_interface.cpp msgid "Visibility State" @@ -18473,24 +18493,23 @@ msgstr "Géométrie des limites" #: modules/webxr/webxr_interface.cpp #, fuzzy msgid "XR Standard Mapping" -msgstr "Magnétisme intelligent" +msgstr "Mapping Standard AR/VR" #: platform/android/export/export.cpp msgid "Android SDK Path" msgstr "Chemin du SDK Android" #: platform/android/export/export.cpp -#, fuzzy msgid "Debug Keystore" -msgstr "Débogueur" +msgstr "Keystore de débogage" #: platform/android/export/export.cpp msgid "Debug Keystore User" -msgstr "" +msgstr "Utilisateur du Keystore de débogage" #: platform/android/export/export.cpp msgid "Debug Keystore Pass" -msgstr "" +msgstr "Passe du Keystore de débogage" #: platform/android/export/export.cpp msgid "Force System User" @@ -18570,9 +18589,8 @@ msgid "Architectures" msgstr "Architectures" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Keystore" -msgstr "Débogueur" +msgstr "Keystore" #: platform/android/export/export_plugin.cpp msgid "Debug User" @@ -19292,6 +19310,11 @@ msgstr "Utiliser la couleur d'arrière-plan personnalisée" msgid "Custom BG Color" msgstr "Couleur d'arrière-plan personnalisée" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Icône d'exportation" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19597,8 +19620,9 @@ msgid "Allow JIT Code Execution" msgstr "Autoriser l'exécution du code JIT" #: platform/osx/export/export.cpp +#, fuzzy msgid "Allow Unsigned Executable Memory" -msgstr "" +msgstr "Autoriser la mémoire exécutable non signée" #: platform/osx/export/export.cpp msgid "Allow Dyld Environment Variables" @@ -20126,6 +20150,12 @@ msgid "Show Name On Square 310 X 310" msgstr "Afficher le nom sur le carré 310 X 310" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nom abrégé du paquet invalide." @@ -20147,7 +20177,7 @@ msgstr "GUID éditeur invalide." #: platform/uwp/export/export.cpp msgid "Invalid background color." -msgstr "Couleur de fond invalide." +msgstr "Couleur d'arrière-plan invalide." #: platform/uwp/export/export.cpp msgid "Invalid Store Logo image dimensions (should be 50x50)." @@ -22224,8 +22254,9 @@ msgid "Include In Bound" msgstr "" #: scene/3d/cull_instance.cpp +#, fuzzy msgid "Allow Merging" -msgstr "" +msgstr "Autoriser la fusion" #: scene/3d/cull_instance.cpp msgid "Autoplace Priority" @@ -22956,7 +22987,7 @@ msgstr "" #: scene/3d/proximity_group.cpp msgid "Grid Radius" -msgstr "Rayon de la Grille" +msgstr "Rayon de la grille" #: scene/3d/ray_cast.cpp msgid "Debug Shape" @@ -22972,7 +23003,7 @@ msgstr "Mode de mise à jour" #: scene/3d/reflection_probe.cpp msgid "Origin Offset" -msgstr "Décalage de la Grille" +msgstr "Décalage de l'origine" #: scene/3d/reflection_probe.cpp msgid "Box Projection" @@ -23131,9 +23162,8 @@ msgid "Overlap Warning Threshold" msgstr "" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Preview Camera" -msgstr "Aperçu" +msgstr "Aperçu de caméra" #: scene/3d/room_manager.cpp msgid "Portal Depth Limit" @@ -23261,8 +23291,9 @@ msgid "Volume Stiffness" msgstr "" #: scene/3d/soft_body.cpp +#, fuzzy msgid "Pressure Coefficient" -msgstr "" +msgstr "Coefficient de pression" #: scene/3d/soft_body.cpp msgid "Damping Coefficient" @@ -23297,12 +23328,11 @@ msgstr "Transformation Globale" #: scene/3d/spatial.cpp msgid "Matrix" -msgstr "" +msgstr "Matrice" #: scene/3d/spatial.cpp -#, fuzzy msgid "Gizmo" -msgstr "Gadgets" +msgstr "Gizmo" #: scene/3d/spatial_velocity_tracker.cpp #, fuzzy @@ -23311,16 +23341,15 @@ msgstr "Image physique %" #: scene/3d/spring_arm.cpp msgid "Spring Length" -msgstr "" +msgstr "Longueur du ressort" #: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp msgid "Opacity" -msgstr "" +msgstr "Opacité" #: scene/3d/sprite_3d.cpp scene/resources/material.cpp -#, fuzzy msgid "Transparent" -msgstr "Transposer" +msgstr "Transparent" #: scene/3d/sprite_3d.cpp msgid "" @@ -23339,26 +23368,24 @@ msgstr "" "l'utiliser comme enfant d'un VehicleBody." #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Per-Wheel Motion" -msgstr "Molette vers le bas" +msgstr "Mouvement par roue" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Engine Force" -msgstr "Documentation en ligne" +msgstr "Force du moteur" #: scene/3d/vehicle_body.cpp msgid "Brake" -msgstr "" +msgstr "Frein" #: scene/3d/vehicle_body.cpp msgid "Steering" -msgstr "" +msgstr "Direction" #: scene/3d/vehicle_body.cpp msgid "VehicleBody Motion" -msgstr "" +msgstr "Mouvement du VehicleBody" #: scene/3d/vehicle_body.cpp msgid "Use As Traction" @@ -23366,7 +23393,7 @@ msgstr "Utiliser comme traction" #: scene/3d/vehicle_body.cpp msgid "Use As Steering" -msgstr "" +msgstr "Utiliser comme direction" #: scene/3d/vehicle_body.cpp msgid "Wheel" @@ -23374,68 +23401,59 @@ msgstr "Molette" #: scene/3d/vehicle_body.cpp msgid "Roll Influence" -msgstr "" +msgstr "Influence de rotation" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Friction Slip" -msgstr "Fonction" +msgstr "Glissement par friction" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Suspension" -msgstr "Expression" +msgstr "Suspension" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Max Force" -msgstr "Erreur" +msgstr "Force max" #: scene/3d/visibility_notifier.cpp msgid "AABB" -msgstr "" +msgstr "AABB" #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Geometry" -msgstr "Réessayer" +msgstr "Géométrie" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Material Override" -msgstr "Redéfinition" +msgstr "Redéfinition du matériau" #: scene/3d/visual_instance.cpp msgid "Material Overlay" msgstr "Superposition de Matériau" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Cast Shadow" -msgstr "Créer un nÅ“ud Shader" +msgstr "Projeter des ombres" #: scene/3d/visual_instance.cpp msgid "Extra Cull Margin" msgstr "Marge supplémentaire de détermination des faces cachées" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Baked Light" -msgstr "Précalculer les lightmaps" +msgstr "Lumières pré-calculées" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Generate Lightmap" -msgstr "Génération des lightmaps" +msgstr "Générer des lightmaps" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Lightmap Scale" -msgstr "LightMap Bake" +msgstr "Échelle de Lightmap" #: scene/3d/visual_instance.cpp msgid "LOD" -msgstr "" +msgstr "Niveau de détail (LOD)" #: scene/3d/visual_instance.cpp scene/animation/skeleton_ik.cpp #: scene/resources/material.cpp @@ -23444,11 +23462,11 @@ msgstr "Distance Minimale" #: scene/3d/visual_instance.cpp msgid "Min Hysteresis" -msgstr "" +msgstr "Hystérèse min" #: scene/3d/visual_instance.cpp msgid "Max Hysteresis" -msgstr "" +msgstr "Hystérèse max" #: scene/3d/world_environment.cpp msgid "" @@ -23483,9 +23501,8 @@ msgid "Animation not found: '%s'" msgstr "Animation introuvable : « %s »" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Mix Mode" -msgstr "Mélanger le nÅ“ud" +msgstr "Mode de mélange" #: scene/animation/animation_blend_tree.cpp msgid "Fadein Time" @@ -23505,30 +23522,27 @@ msgstr "Redémarrage Automatique" #: scene/animation/animation_blend_tree.cpp msgid "Delay" -msgstr "" +msgstr "Délai" #: scene/animation/animation_blend_tree.cpp msgid "Random Delay" msgstr "Retard aléatoire" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Add Amount" -msgstr "Quantité" +msgstr "Ajouter une quantité" #: scene/animation/animation_blend_tree.cpp msgid "Blend Amount" msgstr "Quantité de mélange" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Seek Position" -msgstr "Définir position d'entrée de la courbe" +msgstr "Chercher la position" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Input Count" -msgstr "Ajouter un port d'entrée" +msgstr "Nombre d'entrées" #: scene/animation/animation_blend_tree.cpp #: scene/animation/animation_node_state_machine.cpp @@ -23538,58 +23552,51 @@ msgstr "Durée du fondu croisé" #: scene/animation/animation_node_state_machine.cpp #, fuzzy msgid "Switch Mode" -msgstr "Switch" +msgstr "Mode de Switch" #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Auto Advance" -msgstr "Définir la progression automatique" +msgstr "Progression automatique" #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Advance Condition" -msgstr "Options avancées" +msgstr "Condition de progression" #: scene/animation/animation_player.cpp msgid "Anim Apply Reset" msgstr "Animer Appliquer Réinitialiser" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Current Animation" -msgstr "Définir l'animation" +msgstr "Animation actuelle" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Assigned Animation" -msgstr "Ajouter une Animation" +msgstr "Animation assignée" #: scene/animation/animation_player.cpp msgid "Reset On Save" -msgstr "" +msgstr "Réinitialiser en sauvegardant" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Current Animation Length" -msgstr "Modifier la durée de l’animation" +msgstr "Durée de l’animation actuelle" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Current Animation Position" -msgstr "Ajouter un point d'animation" +msgstr "Position dans l'animation actuelle" #: scene/animation/animation_player.cpp msgid "Playback Options" msgstr "Options de Lecture" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Default Blend Time" -msgstr "Thème par défaut" +msgstr "Temps de fondu par défaut" #: scene/animation/animation_player.cpp msgid "Method Call Mode" -msgstr "" +msgstr "Mode d'appel de méthode" #: scene/animation/animation_tree.cpp msgid "In node '%s', invalid animation: '%s'." @@ -23627,18 +23634,16 @@ msgid "Tree Root" msgstr "Racine de l’Arbre" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Anim Player" -msgstr "Épingler AnimationPlayer" +msgstr "Animation Player" #: scene/animation/animation_tree.cpp msgid "Root Motion" -msgstr "" +msgstr "Mouvement de racine" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Track" -msgstr "Ajouter une piste" +msgstr "Piste" #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." @@ -23655,66 +23660,56 @@ msgid "Master Player" msgstr "Coller les paramètres" #: scene/animation/animation_tree_player.cpp -#, fuzzy msgid "Base Path" -msgstr "Chemin d'exportation" +msgstr "Chemin de base" #: scene/animation/root_motion_view.cpp -#, fuzzy msgid "Animation Path" -msgstr "Animation" +msgstr "Chemin d'animation" #: scene/animation/root_motion_view.cpp -#, fuzzy msgid "Zero Y" -msgstr "Zéro" +msgstr "Mettre Y à zéro" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Root Bone" -msgstr "Nom de nÅ“ud racine" +msgstr "Os racine" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Tip Bone" -msgstr "Os" +msgstr "Os d'extrémité" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Interpolation" -msgstr "Mode d’interpolation" +msgstr "Interpolation" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Override Tip Basis" -msgstr "Redéfinition" +msgstr "Redéfinir la base d’extrémité" #: scene/animation/skeleton_ik.cpp msgid "Use Magnet" -msgstr "" +msgstr "Utiliser le magnétisme" #: scene/animation/skeleton_ik.cpp msgid "Magnet" -msgstr "" +msgstr "Magnétisme" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Target Node" -msgstr "Re-parenter le nÅ“ud" +msgstr "NÅ“ud cible" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Max Iterations" -msgstr "Faire fonction" +msgstr "Itérations max" #: scene/animation/tween.cpp msgid "Playback Process Mode" -msgstr "" +msgstr "Mode du processus de lecture" #: scene/animation/tween.cpp -#, fuzzy msgid "Playback Speed" -msgstr "Lancer la scène" +msgstr "Vitesse de lecture" #: scene/audio/audio_stream_player.cpp #, fuzzy @@ -23723,29 +23718,25 @@ msgstr "Cible" #: scene/gui/aspect_ratio_container.cpp scene/gui/range.cpp #: servers/audio/effects/audio_effect_compressor.cpp -#, fuzzy msgid "Ratio" -msgstr "Conserver les Proportions" +msgstr "Ratio" #: scene/gui/aspect_ratio_container.cpp scene/gui/texture_button.cpp #: scene/gui/texture_rect.cpp -#, fuzzy msgid "Stretch Mode" -msgstr "Mode sélection" +msgstr "Mode d’étirement" #: scene/gui/aspect_ratio_container.cpp scene/gui/box_container.cpp msgid "Alignment" -msgstr "" +msgstr "Alignement" #: scene/gui/base_button.cpp -#, fuzzy msgid "Shortcut In Tooltip" -msgstr "Afficher l'origine" +msgstr "Raccourci dans l'info-bulle" #: scene/gui/base_button.cpp -#, fuzzy msgid "Action Mode" -msgstr "Mode Icône" +msgstr "Mode d'action" #: scene/gui/base_button.cpp msgid "Enabled Focus Mode" @@ -23756,14 +23747,12 @@ msgid "Keep Pressed Outside" msgstr "" #: scene/gui/base_button.cpp scene/gui/shortcut.cpp -#, fuzzy msgid "Shortcut" -msgstr "Raccourcis" +msgstr "Raccourci" #: scene/gui/base_button.cpp -#, fuzzy msgid "Group" -msgstr "Groupes" +msgstr "Groupe" #: scene/gui/button.cpp scene/gui/label.cpp #, fuzzy @@ -23773,11 +23762,11 @@ msgstr "Copier le texte" #: scene/gui/button.cpp scene/gui/label.cpp scene/gui/line_edit.cpp #: scene/gui/spin_box.cpp msgid "Align" -msgstr "" +msgstr "Aligner" #: scene/gui/button.cpp msgid "Icon Align" -msgstr "" +msgstr "Aligner l'icône" #: scene/gui/button.cpp #, fuzzy @@ -23785,9 +23774,8 @@ msgid "Expand Icon" msgstr "Développer tout" #: scene/gui/center_container.cpp -#, fuzzy msgid "Use Top Left" -msgstr "En haut à gauche" +msgstr "Utiliser haut à gauche" #: scene/gui/color_picker.cpp msgid "" @@ -23800,34 +23788,28 @@ msgstr "" "Clic droit : Supprimer le préréglage" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Edit Alpha" -msgstr "Modifier le polygone" +msgstr "Modifier alpha" #: scene/gui/color_picker.cpp -#, fuzzy msgid "HSV Mode" -msgstr "Mode sélection" +msgstr "Mode HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw Mode" -msgstr "Mode navigation" +msgstr "Mode brut" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Deferred Mode" -msgstr "Différé" +msgstr "Mode différé" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Presets Enabled" -msgstr "Préréglages" +msgstr "Préréglages activés" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Presets Visible" -msgstr "Rendre visible" +msgstr "Préréglages visibles" #: scene/gui/color_picker.cpp msgid "Pick a color from the editor window." @@ -23857,9 +23839,8 @@ msgstr "" "Control." #: scene/gui/control.cpp -#, fuzzy msgid "Theme Overrides" -msgstr "Redéfinition" +msgstr "Redéfinitions de thème" #: scene/gui/control.cpp msgid "" @@ -23871,14 +23852,12 @@ msgstr "" "souris sur \"Stop\" ou \"Pass\"." #: scene/gui/control.cpp -#, fuzzy msgid "Anchor" -msgstr "Uniquement les ancres" +msgstr "Ancre" #: scene/gui/control.cpp -#, fuzzy msgid "Grow Direction" -msgstr "Directions" +msgstr "Direction d'expansion" #: scene/gui/control.cpp scene/resources/navigation_mesh.cpp msgid "Min Size" @@ -23895,12 +23874,11 @@ msgstr "Constante de classe" #: scene/gui/control.cpp scene/resources/visual_shader_nodes.cpp msgid "Hint" -msgstr "" +msgstr "Suggestion" #: scene/gui/control.cpp -#, fuzzy msgid "Tooltip" -msgstr "Outils" +msgstr "Info-bulle" #: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -23909,20 +23887,19 @@ msgstr "Focaliser le chemin" #: scene/gui/control.cpp msgid "Neighbour Left" -msgstr "" +msgstr "Voisin gauche" #: scene/gui/control.cpp msgid "Neighbour Top" -msgstr "" +msgstr "Voisin au dessus" #: scene/gui/control.cpp msgid "Neighbour Right" -msgstr "" +msgstr "Voisin à droite" #: scene/gui/control.cpp -#, fuzzy msgid "Neighbour Bottom" -msgstr "Centrée en bas" +msgstr "Voisin en dessous" #: scene/gui/control.cpp msgid "Next" @@ -23934,7 +23911,7 @@ msgstr "Précédent" #: scene/gui/control.cpp msgid "Mouse" -msgstr "" +msgstr "Souris" #: scene/gui/control.cpp msgid "Default Cursor Shape" @@ -23949,9 +23926,8 @@ msgid "Size Flags" msgstr "Drapeaux de Taille" #: scene/gui/control.cpp -#, fuzzy msgid "Stretch Ratio" -msgstr "Mode sélection" +msgstr "Ratio d’étirement" #: scene/gui/control.cpp #, fuzzy @@ -23960,12 +23936,11 @@ msgstr "Propriétés du thème" #: scene/gui/dialogs.cpp msgid "Window Title" -msgstr "" +msgstr "Titre de la fenêtre" #: scene/gui/dialogs.cpp -#, fuzzy msgid "Dialog" -msgstr "Dialogue XForm" +msgstr "Boîte de dialogue" #: scene/gui/dialogs.cpp msgid "Hide On OK" @@ -24501,7 +24476,7 @@ msgstr "" #: scene/gui/tabs.cpp msgid "Scrolling Enabled" -msgstr "" +msgstr "Défilement activé" #: scene/gui/text_edit.cpp msgid "Readonly" @@ -24815,44 +24790,40 @@ msgstr "Nouvelle racine de scène" #: scene/main/scene_tree.cpp msgid "Root" -msgstr "" +msgstr "Racine" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Multiplayer Poll" -msgstr "Multiplier %s" +msgstr "Poll d'attente active (polling) multijoueur" #: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp #: scene/resources/shape_2d.cpp msgid "Shapes" -msgstr "" +msgstr "Formes" #: scene/main/scene_tree.cpp msgid "Shape Color" -msgstr "" +msgstr "Couleur de forme" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Contact Color" -msgstr "Prélever une couleur" +msgstr "Couleur de contact" #: scene/main/scene_tree.cpp msgid "Geometry Color" -msgstr "" +msgstr "Couleur de géométrie" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Disabled Geometry Color" -msgstr "Item désactivé" +msgstr "Couleur des géométries désactivées" #: scene/main/scene_tree.cpp msgid "Max Contacts Displayed" -msgstr "" +msgstr "Maximum de contacts affichés" #: scene/main/scene_tree.cpp scene/resources/shape_2d.cpp -#, fuzzy msgid "Draw 2D Outlines" -msgstr "Créer le contour" +msgstr "Dessiner les contours 2D" #: scene/main/scene_tree.cpp servers/visual_server.cpp msgid "Reflections" @@ -24864,15 +24835,15 @@ msgstr "Taille de l'Atlas" #: scene/main/scene_tree.cpp msgid "Atlas Subdiv" -msgstr "" +msgstr "Subdivision d'atlas" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "MSAA" -msgstr "" +msgstr "MSAA" #: scene/main/scene_tree.cpp msgid "Use FXAA" -msgstr "" +msgstr "Utiliser FXAA" #: scene/main/scene_tree.cpp msgid "Use Debanding" @@ -24880,16 +24851,15 @@ msgstr "" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "HDR" -msgstr "" +msgstr "HDR (High Dynamic Range)" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "Use 32 BPC Depth" -msgstr "" +msgstr "Utiliser profondeur de couleur 32 bits" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Default Environment" -msgstr "Voir environnement" +msgstr "Environnement par défaut" #: scene/main/scene_tree.cpp msgid "" @@ -24921,9 +24891,8 @@ msgid "Autostart" msgstr "Démarrage Automatique" #: scene/main/viewport.cpp -#, fuzzy msgid "Viewport Path" -msgstr "Chemin d'exportation" +msgstr "Chemin de la fenêtre d'affichage" #: scene/main/viewport.cpp msgid "" @@ -24941,10 +24910,15 @@ msgid "" "Effects.\n" "HDR will be disabled for this Viewport." msgstr "" +"Cette fenêtre d'affichage utilise le HDR mais son Utilisation est 2D ou 2D " +"No-Sampling.\n" +"Le HDR est supporte uniquement sur les fenêtres d'affichage avec une " +"Utilisation 3D ou 3D No-Effects.\n" +"Le HDR sera désactivé pour cette fenêtre d'affichage." #: scene/main/viewport.cpp msgid "ARVR" -msgstr "" +msgstr "ARVR" #: scene/main/viewport.cpp #, fuzzy @@ -24952,30 +24926,29 @@ msgid "Size Override Stretch" msgstr "Remplacer l'item" #: scene/main/viewport.cpp +#, fuzzy msgid "Own World" -msgstr "" +msgstr "Propre Monde" #: scene/main/viewport.cpp scene/resources/world_2d.cpp msgid "World" -msgstr "" +msgstr "Monde" #: scene/main/viewport.cpp msgid "World 2D" -msgstr "" +msgstr "Monde 2D" #: scene/main/viewport.cpp -#, fuzzy msgid "Transparent BG" -msgstr "Transposer" +msgstr "Arrière-plan transparent" #: scene/main/viewport.cpp -#, fuzzy msgid "Handle Input Locally" -msgstr "Changer nom de l'entrée" +msgstr "Gérer les entrées localement" #: scene/main/viewport.cpp msgid "FXAA" -msgstr "" +msgstr "FXAA" #: scene/main/viewport.cpp #, fuzzy @@ -24983,23 +24956,20 @@ msgid "Debanding" msgstr "Liaison" #: scene/main/viewport.cpp -#, fuzzy msgid "Disable 3D" -msgstr "Item désactivé" +msgstr "Désactiver 3D" #: scene/main/viewport.cpp -#, fuzzy msgid "Keep 3D Linear" -msgstr "Linéaire gauche" +msgstr "Garder 3D linéaire" #: scene/main/viewport.cpp msgid "Render Direct To Screen" -msgstr "" +msgstr "Rendre directement vers l’écran" #: scene/main/viewport.cpp -#, fuzzy msgid "Debug Draw" -msgstr "Débogage" +msgstr "Déboguer appel de dessin" #: scene/main/viewport.cpp msgid "Render Target" @@ -25007,7 +24977,7 @@ msgstr "Rendre la cible" #: scene/main/viewport.cpp msgid "V Flip" -msgstr "" +msgstr "Miroir V" #: scene/main/viewport.cpp #, fuzzy @@ -25015,14 +24985,12 @@ msgid "Clear Mode" msgstr "Mode Règle" #: scene/main/viewport.cpp -#, fuzzy msgid "Enable 2D" -msgstr "Activer" +msgstr "Activer 2D" #: scene/main/viewport.cpp -#, fuzzy msgid "Enable 3D" -msgstr "Activer" +msgstr "Activer 3D" #: scene/main/viewport.cpp #, fuzzy @@ -25030,9 +24998,8 @@ msgid "Object Picking" msgstr "Activer l'effet « pelure d'oignon »" #: scene/main/viewport.cpp -#, fuzzy msgid "Disable Input" -msgstr "Item désactivé" +msgstr "Désactiver entrées" #: scene/main/viewport.cpp servers/visual_server.cpp #, fuzzy @@ -25041,97 +25008,84 @@ msgstr "Nouvel Atlas" #: scene/main/viewport.cpp msgid "Quad 0" -msgstr "" +msgstr "Quad 0" #: scene/main/viewport.cpp msgid "Quad 1" -msgstr "" +msgstr "Quad 1" #: scene/main/viewport.cpp msgid "Quad 2" -msgstr "" +msgstr "Quad 2" #: scene/main/viewport.cpp msgid "Quad 3" -msgstr "" +msgstr "Quad 3" #: scene/main/viewport.cpp -#, fuzzy msgid "Canvas Transform" -msgstr "Supprimer la transformation" +msgstr "Transformation du canevas" #: scene/main/viewport.cpp -#, fuzzy msgid "Global Canvas Transform" -msgstr "Conserver la transformation globale" +msgstr "Transformation du canevas global" #: scene/main/viewport.cpp msgid "Tooltip Delay (sec)" -msgstr "" +msgstr "Délai de l'info-bulle (sec)" #: scene/register_scene_types.cpp -#, fuzzy msgid "Swap OK Cancel" -msgstr "Annuler" +msgstr "Inverser OK et Annuler" #: scene/register_scene_types.cpp -#, fuzzy msgid "Layer Names" -msgstr "Nom" +msgstr "Noms des couches" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Render" -msgstr "Rendu" +msgstr "Rendu 2D" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Render" -msgstr "Rendu" +msgstr "Rendu 3D" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Physics" -msgstr "Physique" +msgstr "Physique 2D" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Physics" -msgstr "Physique" +msgstr "Physique 3D" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Navigation" -msgstr "Navigation" +msgstr "Navigation 2D" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Navigation" -msgstr "Navigation" +msgstr "Navigation 3D" #: scene/register_scene_types.cpp msgid "Use hiDPI" -msgstr "" +msgstr "Utiliser hiDPI" #: scene/register_scene_types.cpp -#, fuzzy msgid "Custom" -msgstr "NÅ“ud Personnalisé" +msgstr "Personnalisé" #: scene/register_scene_types.cpp -#, fuzzy msgid "Custom Font" -msgstr "NÅ“ud Personnalisé" +msgstr "Police personnalisée" #: scene/resources/audio_stream_sample.cpp #: servers/audio/effects/audio_stream_generator.cpp servers/audio_server.cpp -#, fuzzy msgid "Mix Rate" -msgstr "Mélanger le nÅ“ud" +msgstr "Taux de mélange" #: scene/resources/audio_stream_sample.cpp msgid "Stereo" -msgstr "" +msgstr "Stéréo" #: scene/resources/concave_polygon_shape_2d.cpp msgid "Segments" @@ -25148,121 +25102,103 @@ msgstr "" #: scene/resources/default_theme/default_theme.cpp msgid "Panel" -msgstr "" +msgstr "Panneau" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color" -msgstr "Prélever une couleur" +msgstr "Couleur de police" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Pressed" -msgstr "Renommer l'item de couleur" +msgstr "Couleur de police quand pressé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Hover" -msgstr "Renommer l'item de couleur" +msgstr "Couleur de police au survol" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Focus" -msgstr "Remplir la surface" +msgstr "Couleur de police quand actif" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Disabled" -msgstr "Âgrafe désactivée" +msgstr "Couleur de police quand désactivé" #: scene/resources/default_theme/default_theme.cpp msgid "H Separation" -msgstr "Séparation H" +msgstr "Séparation horizontale" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Underline Spacing" -msgstr "Bouclage de l’animation" +msgstr "Espacement du soulignage" #: scene/resources/default_theme/default_theme.cpp msgid "Arrow" -msgstr "" +msgstr "Flèche" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Arrow Margin" -msgstr "Définir la marge" +msgstr "Marge de flèche" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Hover Pressed" -msgstr "Pressé" +msgstr "Survol pressé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Checked Disabled" -msgstr "Item à cocher" +msgstr "Coché désactivé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Unchecked" -msgstr "Item coché" +msgstr "Non coché" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Unchecked Disabled" -msgstr "Item désactivé" +msgstr "Non coché désactivé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Radio Checked" -msgstr "Item coché" +msgstr "Radio coché" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Radio Checked Disabled" -msgstr "(Éditeur désactivé)" +msgstr "Radio coché désactivé" #: scene/resources/default_theme/default_theme.cpp msgid "Radio Unchecked" -msgstr "" +msgstr "Radio non coché" #: scene/resources/default_theme/default_theme.cpp msgid "Radio Unchecked Disabled" -msgstr "" +msgstr "Radio non coché désactivé" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Hover Pressed" -msgstr "" +msgstr "Couleur de police au survol pressé" #: scene/resources/default_theme/default_theme.cpp msgid "Check V Adjust" -msgstr "" +msgstr "Ajustement V de la case à cocher" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "On Disabled" -msgstr "Item désactivé" +msgstr "Quand désactivé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Off" -msgstr "Décalage" +msgstr "Éteint" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Off Disabled" -msgstr "Item désactivé" +msgstr "Éteint désactivé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Shadow" -msgstr "Renommer l'item de couleur" +msgstr "Couleur de police de l'ombre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Outline Modulate" -msgstr "Forcer la modulation blanche" +msgstr "Moduler le contour de la police" #: scene/resources/default_theme/default_theme.cpp msgid "Shadow Offset X" @@ -25273,23 +25209,20 @@ msgid "Shadow Offset Y" msgstr "Décalage Y de l'ombre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow As Outline" -msgstr "Plan précédent" +msgstr "Ombre comme contour" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Selected" -msgstr "Déverrouillage Sélectionné" +msgstr "Couleur de police quand sélectionné" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Uneditable" -msgstr "" +msgstr "Couleur de police quand non-éditable" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Cursor Color" -msgstr "NÅ“ud Personnalisé" +msgstr "Couleur du curseur" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25307,25 +25240,22 @@ msgid "Minimum Spaces" msgstr "Scène principale" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "BG" -msgstr "o" +msgstr "Arrière-plan" #: scene/resources/default_theme/default_theme.cpp msgid "FG" -msgstr "" +msgstr "Premier plan" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab" -msgstr "Onglet 1" +msgstr "Onglet" #: scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/world.cpp #: scene/resources/world_2d.cpp -#, fuzzy msgid "Space" -msgstr "Scène principale" +msgstr "Espace" #: scene/resources/default_theme/default_theme.cpp msgid "Folded" @@ -25337,86 +25267,75 @@ msgstr "Replier" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Readonly" -msgstr "" +msgstr "Couleur de police quand en lecture seule" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Lines" -msgstr "Complétion" +msgstr "Lignes de complétion" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Max Width" -msgstr "Complétion" +msgstr "Largeur maximale de complétion" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Scroll Width" -msgstr "Importer la sélection" +msgstr "Largeur de la barre de défilement de complétion" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Focus" -msgstr "Remplir la surface" +msgstr "Arrière de la barre quand active" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber" -msgstr "" +msgstr "Poignée" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grabber Highlight" -msgstr "Coloration syntaxique" +msgstr "Poignée au survol" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grabber Pressed" -msgstr "Pressé" +msgstr "Poignée quand pressée" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Increment" -msgstr "Voir environnement" +msgstr "Incrémenteur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Increment Highlight" -msgstr "Coloration syntaxique" +msgstr "Incrémenteur au survol" #: scene/resources/default_theme/default_theme.cpp msgid "Increment Pressed" -msgstr "" +msgstr "Incrémenteur quand pressé" #: scene/resources/default_theme/default_theme.cpp msgid "Decrement" -msgstr "" +msgstr "Décrémenteur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Decrement Highlight" -msgstr "Coloration syntaxique" +msgstr "Décrémenteur au survol" #: scene/resources/default_theme/default_theme.cpp msgid "Decrement Pressed" -msgstr "" +msgstr "Décrémenteur quand pressé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Slider" -msgstr "Mode collision" +msgstr "Arrière de la barre" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber Area" -msgstr "" +msgstr "Zone de la poignée" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber Area Highlight" -msgstr "" +msgstr "Zone de la poignée au survol" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grabber Disabled" -msgstr "Item désactivé" +msgstr "Poignée quand désactivée" #: scene/resources/default_theme/default_theme.cpp msgid "Tick" @@ -25432,24 +25351,20 @@ msgid "Scaleborder Size" msgstr "Pixels de bordure" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Font" -msgstr "Police du Code" +msgstr "Police du titre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Color" -msgstr "Couleur du Texte" +msgstr "Couleur du titre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Height" -msgstr "En période de test" +msgstr "Hauteur du titre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Highlight" -msgstr "Éclairage direct" +msgstr "\"Fermer\" au survol" #: scene/resources/default_theme/default_theme.cpp msgid "Close H Offset" @@ -25460,29 +25375,24 @@ msgid "Close V Offset" msgstr "Fermer décalage V" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Parent Folder" -msgstr "Créer un dossier" +msgstr "Dossier parent" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Toggle Hidden" -msgstr "Basculer les fichiers cachés" +msgstr "Cacher/Montrer" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Panel Disabled" -msgstr "Âgrafe désactivée" +msgstr "Panneau désactivé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Labeled Separator Left" -msgstr "Séparateur nommé" +msgstr "Séparateur nommé gauche" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Labeled Separator Right" -msgstr "Séparateur nommé" +msgstr "Séparateur nommé droit" #: scene/resources/default_theme/default_theme.cpp msgid "Font Separator" @@ -25502,14 +25412,12 @@ msgid "V Separation" msgstr "Séparation V" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selected Frame" -msgstr "Sélectionner des Trames" +msgstr "Trame sélectionnée" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Default Frame" -msgstr "Défaut" +msgstr "Trame par défaut" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25522,38 +25430,32 @@ msgid "Comment Focus" msgstr "Enregistrer" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Breakpoint" -msgstr "Point d'arrêts" +msgstr "Point d'arrêt" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Resizer" -msgstr "Redimensionnable" +msgstr "Redimensionneur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Color" -msgstr "Couleurs" +msgstr "Couleur du bouton Fermer" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Resizer Color" -msgstr "Couleurs" +msgstr "Couleur du redimensionneur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Offset" -msgstr "Décalage d’Octet" +msgstr "Décalage du titre" #: scene/resources/default_theme/default_theme.cpp msgid "Close Offset" msgstr "Fermer de décalage" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Port Offset" -msgstr "Décalage du Pivot" +msgstr "Décalage du port" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25567,12 +25469,11 @@ msgstr "Sélectionner" #: scene/resources/default_theme/default_theme.cpp msgid "Cursor Unfocused" -msgstr "" +msgstr "Curseur quand inactif" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Button Pressed" -msgstr "Pressé" +msgstr "Bouton quand pressé" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25590,19 +25491,16 @@ msgid "Title Button Hover" msgstr "Bouton à bascule (toggle)" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button" -msgstr "NÅ“ud Personnalisé" +msgstr "Bouton personnalisé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button Pressed" -msgstr "Options de bus" +msgstr "Bouton personnalisé quand pressé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Custom Button Hover" -msgstr "NÅ“ud Personnalisé" +msgstr "Bouton personnalisé au survol" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25625,9 +25523,8 @@ msgid "Title Button Color" msgstr "Couleur de la Sélection" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Guide Color" -msgstr "Prélever une couleur" +msgstr "Couleur des guides" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25635,75 +25532,64 @@ msgid "Drop Position Color" msgstr "Position du dock" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Relationship Line Color" -msgstr "Couleur de la Ligne Actuelle" +msgstr "Couleur des lignes de relation" #: scene/resources/default_theme/default_theme.cpp msgid "Custom Button Font Highlight" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Item Margin" -msgstr "Définir la marge" +msgstr "Marge d'élément" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Button Margin" -msgstr "Bouton" +msgstr "Marge de bouton" #: scene/resources/default_theme/default_theme.cpp msgid "Draw Relationship Lines" -msgstr "" +msgstr "Afficher les lignes de relation" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Draw Guides" msgstr "Afficher les guides" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Border" -msgstr "Défilement Vertical" +msgstr "Bordure de la barre de défilement" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Speed" -msgstr "Décalage du Défilement" +msgstr "Vitesse de défilement" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Icon Margin" -msgstr "Définir la marge" +msgstr "Marge d’icône" #: scene/resources/default_theme/default_theme.cpp msgid "Line Separation" msgstr "Séparation de line" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab FG" -msgstr "Onglet 1" +msgstr "Premier plan d'onglet" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab BG" -msgstr "Onglet 1" +msgstr "Arrière-plan d'onglet" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab Disabled" -msgstr "Item désactivé" +msgstr "Onglet désactivé" #: scene/resources/default_theme/default_theme.cpp msgid "Menu" -msgstr "" +msgstr "Menu" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Menu Highlight" -msgstr "Éclairage direct" +msgstr "Menu au survol" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25716,14 +25602,12 @@ msgid "Font Color BG" msgstr "Renommer l'item de couleur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Side Margin" -msgstr "Définir la marge" +msgstr "Marge de coté" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Top Margin" -msgstr "Définir la marge" +msgstr "Marge en haut" #: scene/resources/default_theme/default_theme.cpp msgid "Label V Align FG" @@ -25734,28 +25618,24 @@ msgid "Label V Align BG" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Large" -msgstr "Cible" +msgstr "Grand" #: scene/resources/default_theme/default_theme.cpp msgid "Folder" msgstr "Dossier" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folder Icon Modulate" -msgstr "Forcer la modulation blanche" +msgstr "Moduler l’icône du dossier" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "File Icon Modulate" -msgstr "Mode Icône" +msgstr "Moduler l'icône du fichier" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Files Disabled" -msgstr "Âgrafe désactivée" +msgstr "Fichiers désactivés" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25773,71 +25653,60 @@ msgid "H Width" msgstr "Étendu à Gauche" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Label Width" -msgstr "Étendu à Gauche" +msgstr "Largeur du label" #: scene/resources/default_theme/default_theme.cpp msgid "Screen Picker" msgstr "Sélecteur d'écran" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Add Preset" -msgstr "Charger un préréglage" +msgstr "Ajouter préréglage" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Color Hue" -msgstr "Thème de l'éditeur" +msgstr "Teinte de couleur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Color Sample" -msgstr "Couleurs" +msgstr "Échantillon de couleur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG" -msgstr "Préréglage" +msgstr "Préréglage arrière-plan" #: scene/resources/default_theme/default_theme.cpp msgid "Overbright Indicator" -msgstr "" +msgstr "Indicateur de surluminosité" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset FG" -msgstr "Préréglage" +msgstr "Préréglage avant-plan" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG Icon" -msgstr "Préréglage" +msgstr "Préréglage icône d'arrière-plan" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Normal Font" -msgstr "Format" +msgstr "Police normale" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bold Font" -msgstr "Police du Code" +msgstr "Police en gras" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Italics Font" -msgstr "Police Principale" +msgstr "Police italique" #: scene/resources/default_theme/default_theme.cpp msgid "Bold Italics Font" -msgstr "" +msgstr "Police italique grasse" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mono Font" -msgstr "Police Principale" +msgstr "Police monospace" #: scene/resources/default_theme/default_theme.cpp msgid "Table H Separation" @@ -25848,62 +25717,52 @@ msgid "Table V Separation" msgstr "Séparation V de table" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Margin Left" -msgstr "Définir la marge" +msgstr "Marge à gauche" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Margin Top" -msgstr "Définir la marge" +msgstr "Marge en haut" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Margin Right" -msgstr "Indenter vers la droite" +msgstr "Marge à droite" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Margin Bottom" -msgstr "Mode sélection" +msgstr "Marge en bas" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Autohide" -msgstr "Coupe automatique" +msgstr "Cacher automatiquement" #: scene/resources/default_theme/default_theme.cpp msgid "Minus" -msgstr "" +msgstr "Moins" #: scene/resources/default_theme/default_theme.cpp msgid "More" -msgstr "" +msgstr "Plus" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grid Minor" -msgstr "Couleur de la Grille" +msgstr "Grille secondaire" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Grid Major" -msgstr "Grille" +msgstr "Grille principale" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Fill" -msgstr "Sélection uniquement" +msgstr "Remplissage de la sélection" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Stroke" -msgstr "Sélectionnez une propriété" +msgstr "Trait de la sélection" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Activity" -msgstr "Action" +msgstr "Activité" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25916,40 +25775,35 @@ msgstr "" #: scene/resources/default_theme/default_theme.cpp msgid "Port Grab Distance Horizontal" -msgstr "" +msgstr "Distance horizontale de capture de port" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Port Grab Distance Vertical" -msgstr "WaitInstanceSignal" +msgstr "Distance verticale de capture de port" #: scene/resources/dynamic_font.cpp msgid "Hinting" -msgstr "" +msgstr "Optimisation de rendu (hinting)" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Override Oversampling" -msgstr "Remplacer l'item" +msgstr "Remplacer le suréchantillonnage" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Font Path" -msgstr "Focaliser le chemin" +msgstr "Chemin de la police" #: scene/resources/dynamic_font.cpp msgid "Outline Size" msgstr "Taille de Contour" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Outline Color" -msgstr "Fonction" +msgstr "Couleur de contour" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Use Mipmaps" -msgstr "Signaux" +msgstr "Utiliser les Mipmaps" #: scene/resources/dynamic_font.cpp msgid "Extra Spacing" @@ -25960,27 +25814,24 @@ msgid "Char" msgstr "Char" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Font Data" -msgstr "Avec données" +msgstr "Données de police" #: scene/resources/environment.cpp msgid "Background" -msgstr "" +msgstr "Arrière-plan" #: scene/resources/environment.cpp scene/resources/sky.cpp msgid "Sky" -msgstr "" +msgstr "Ciel" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Custom FOV" -msgstr "NÅ“ud Personnalisé" +msgstr "Champ de vision personnalisé du ciel" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Orientation" -msgstr "Documentation en ligne" +msgstr "Orientation du ciel" #: scene/resources/environment.cpp msgid "Sky Rotation" @@ -25996,17 +25847,15 @@ msgstr "" #: scene/resources/environment.cpp scene/resources/texture.cpp msgid "Camera Feed ID" -msgstr "" +msgstr "ID de flux de la caméra" #: scene/resources/environment.cpp -#, fuzzy msgid "Ambient Light" -msgstr "Indenter vers la droite" +msgstr "Lumière ambiante" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Contribution" -msgstr "Condition" +msgstr "Contribution du ciel" #: scene/resources/environment.cpp msgid "Fog" @@ -26021,79 +25870,68 @@ msgid "Sun Amount" msgstr "Quantité de Soleil" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Enabled" -msgstr "Profondeur" +msgstr "Profondeur activée" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Begin" -msgstr "Profondeur" +msgstr "Départ de la profondeur" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth End" -msgstr "Profondeur" +msgstr "Fin de la profondeur" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Curve" -msgstr "Scinder la courbe" +msgstr "Courbe de profondeur" #: scene/resources/environment.cpp -#, fuzzy msgid "Transmit Enabled" -msgstr "Filtrer les signaux" +msgstr "Transmission activée" #: scene/resources/environment.cpp -#, fuzzy msgid "Transmit Curve" -msgstr "Scinder la courbe" +msgstr "Courbe de transmission" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Enabled" -msgstr "Filtrer les signaux" +msgstr "Hauteur activée" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Min" -msgstr "Lumière" +msgstr "Hauteur minimum" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Max" -msgstr "Lumière" +msgstr "Hauteur maximum" #: scene/resources/environment.cpp -#, fuzzy msgid "Height Curve" -msgstr "Scinder la courbe" +msgstr "Courbe de hauteur" #: scene/resources/environment.cpp msgid "Tonemap" msgstr "Tonemap" #: scene/resources/environment.cpp -#, fuzzy msgid "Exposure" -msgstr "Exporter" +msgstr "Exposition" #: scene/resources/environment.cpp msgid "White" -msgstr "" +msgstr "Blanc" #: scene/resources/environment.cpp msgid "Auto Exposure" -msgstr "" +msgstr "Exposition auto" #: scene/resources/environment.cpp msgid "Min Luma" -msgstr "" +msgstr "Lumen minimum" #: scene/resources/environment.cpp msgid "Max Luma" -msgstr "" +msgstr "Lumen maximum" #: scene/resources/environment.cpp #, fuzzy @@ -26101,9 +25939,8 @@ msgid "SS Reflections" msgstr "Mettre à l'échelle la sélection" #: scene/resources/environment.cpp -#, fuzzy msgid "Max Steps" -msgstr "Pas" +msgstr "Pas maximum" #: scene/resources/environment.cpp msgid "Fade In" @@ -26114,17 +25951,16 @@ msgid "Fade Out" msgstr "Fondu sortant" #: scene/resources/environment.cpp -#, fuzzy msgid "Depth Tolerance" -msgstr "Profondeur" +msgstr "Tolérance de profondeur" #: scene/resources/environment.cpp scene/resources/material.cpp msgid "Roughness" -msgstr "" +msgstr "Dureté" #: scene/resources/environment.cpp msgid "SSAO" -msgstr "" +msgstr "SSAO" #: scene/resources/environment.cpp msgid "Radius 2" @@ -26132,7 +25968,7 @@ msgstr "Rayon 2" #: scene/resources/environment.cpp msgid "Intensity 2" -msgstr "" +msgstr "Intensité 2" #: scene/resources/environment.cpp scene/resources/material.cpp #, fuzzy @@ -26146,15 +25982,15 @@ msgstr "Débogage du canal UV" #: scene/resources/environment.cpp msgid "Blur" -msgstr "" +msgstr "Flou" #: scene/resources/environment.cpp msgid "Edge Sharpness" -msgstr "" +msgstr "Netteté des bords" #: scene/resources/environment.cpp msgid "DOF Far Blur" -msgstr "" +msgstr "Flou d'éloigné de la profondeur de champ" #: scene/resources/environment.cpp scene/resources/material.cpp msgid "Distance" @@ -26166,21 +26002,20 @@ msgstr "Transition" #: scene/resources/environment.cpp msgid "DOF Near Blur" -msgstr "" +msgstr "Flou de rapproché de la profondeur de champ" #: scene/resources/environment.cpp msgid "Glow" -msgstr "" +msgstr "Luisance" #: scene/resources/environment.cpp -#, fuzzy msgid "Levels" -msgstr "Développeurs" +msgstr "Niveaux" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp msgid "1" -msgstr "" +msgstr "1" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp @@ -26378,19 +26213,16 @@ msgid "Use Alpha Scissor" msgstr "Utiliser la découpe alpha" #: scene/resources/material.cpp -#, fuzzy msgid "Particles Anim" -msgstr "Particules" +msgstr "Animation de particules" #: scene/resources/material.cpp -#, fuzzy msgid "H Frames" -msgstr "Image %" +msgstr "Trames H" #: scene/resources/material.cpp -#, fuzzy msgid "V Frames" -msgstr "Image %" +msgstr "Trames V" #: scene/resources/material.cpp msgid "Albedo" @@ -26398,25 +26230,23 @@ msgstr "Albédo" #: scene/resources/material.cpp msgid "Metallic" -msgstr "" +msgstr "Métallique" #: scene/resources/material.cpp -#, fuzzy msgid "Texture Channel" -msgstr "RegionDeTexture" +msgstr "Canal de texture" #: scene/resources/material.cpp -#, fuzzy msgid "Emission" -msgstr "Masque d'émission" +msgstr "Émission" #: scene/resources/material.cpp msgid "On UV2" -msgstr "" +msgstr "Sur UV2" #: scene/resources/material.cpp msgid "NormalMap" -msgstr "" +msgstr "NormalMap" #: scene/resources/material.cpp msgid "Rim" @@ -26429,20 +26259,19 @@ msgstr "Effacer" #: scene/resources/material.cpp msgid "Gloss" -msgstr "" +msgstr "Éclat" #: scene/resources/material.cpp msgid "Anisotropy" -msgstr "" +msgstr "Anisotropie" #: scene/resources/material.cpp msgid "Flowmap" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Ambient Occlusion" -msgstr "Occlusion" +msgstr "Occlusion ambiante" #: scene/resources/material.cpp msgid "Deep Parallax" @@ -26469,7 +26298,7 @@ msgstr "Retourner le Portal" #: scene/resources/material.cpp msgid "Subsurf Scatter" -msgstr "" +msgstr "Transluminescence" #: scene/resources/material.cpp msgid "Transmission" @@ -26481,30 +26310,27 @@ msgstr "Réfraction" #: scene/resources/material.cpp msgid "Detail" -msgstr "" +msgstr "Détail" #: scene/resources/material.cpp -#, fuzzy msgid "UV Layer" -msgstr "Calque" +msgstr "Couche UV" #: scene/resources/material.cpp -#, fuzzy msgid "UV1" -msgstr "UV" +msgstr "UV1" #: scene/resources/material.cpp msgid "Triplanar" -msgstr "" +msgstr "Triplanaire" #: scene/resources/material.cpp msgid "Triplanar Sharpness" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "UV2" -msgstr "UV" +msgstr "UV2" #: scene/resources/material.cpp #, fuzzy @@ -26516,9 +26342,8 @@ msgid "Distance Fade" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Async Mode" -msgstr "Mode navigation" +msgstr "Mode asynchrone" #: scene/resources/mesh.cpp #, fuzzy @@ -26530,14 +26355,12 @@ msgid "Custom AABB" msgstr "" #: scene/resources/mesh_library.cpp -#, fuzzy msgid "Mesh Transform" -msgstr "Transformation" +msgstr "Transformation de Mesh" #: scene/resources/mesh_library.cpp -#, fuzzy msgid "NavMesh Transform" -msgstr "Supprimer la transformation" +msgstr "Transformation de NavMesh" #: scene/resources/multimesh.cpp msgid "Color Format" @@ -26552,22 +26375,20 @@ msgid "Custom Data Format" msgstr "" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Instance Count" -msgstr "Instance" +msgstr "Nombre d'instances" #: scene/resources/multimesh.cpp msgid "Visible Instance Count" -msgstr "" +msgstr "Nombre d'instances visibles" #: scene/resources/navigation_mesh.cpp msgid "Sampling" msgstr "Échantillonnage" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Partition Type" -msgstr "Définir type de variable" +msgstr "Type de partition" #: scene/resources/navigation_mesh.cpp msgid "Parsed Geometry Type" @@ -26584,12 +26405,11 @@ msgstr "Source" #: scene/resources/navigation_mesh.cpp msgid "Cells" -msgstr "" +msgstr "Cellules" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Agents" -msgstr "Segments" +msgstr "Agents" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" @@ -26597,12 +26417,11 @@ msgstr "" #: scene/resources/navigation_mesh.cpp msgid "Max Slope" -msgstr "" +msgstr "Pente maximale" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Regions" -msgstr "Région" +msgstr "Régions" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26611,7 +26430,7 @@ msgstr "Fusionner depuis la scène" #: scene/resources/navigation_mesh.cpp msgid "Edges" -msgstr "" +msgstr "Arêtes" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26623,9 +26442,8 @@ msgid "Verts Per Poly" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Details" -msgstr "Afficher par défaut" +msgstr "Détails" #: scene/resources/navigation_mesh.cpp msgid "Sample Distance" @@ -26660,34 +26478,31 @@ msgstr "Décalage :" #: scene/resources/occluder_shape.cpp msgid "Spheres" -msgstr "" +msgstr "Sphères" #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" msgstr "Définir les sphères pour OccluderShapeSphere" #: scene/resources/occluder_shape_polygon.cpp -#, fuzzy msgid "Polygon Points" -msgstr "Polygones" +msgstr "Points de polygone" #: scene/resources/occluder_shape_polygon.cpp -#, fuzzy msgid "Hole Points" -msgstr "Déplacer de points" +msgstr "Points de trou" #: scene/resources/packed_scene.cpp msgid "Bundled" -msgstr "" +msgstr "Empaqueté" #: scene/resources/particles_material.cpp msgid "Trail" -msgstr "" +msgstr "Traînée" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Divisor" -msgstr "Diviser %s" +msgstr "Diviseur" #: scene/resources/particles_material.cpp #, fuzzy @@ -26713,9 +26528,8 @@ msgid "Color Texture" msgstr "Thème de l'éditeur" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Point Count" -msgstr "Ajouter un port d'entrée" +msgstr "Nombre de points" #: scene/resources/particles_material.cpp msgid "Scale Random" @@ -26732,16 +26546,15 @@ msgstr "" #: scene/resources/physics_material.cpp msgid "Absorbent" -msgstr "" +msgstr "Absorbant" #: scene/resources/plane_shape.cpp msgid "Plane" msgstr "Plan" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Flip Faces" -msgstr "Retourner les Portals" +msgstr "Retourner les faces" #: scene/resources/primitive_meshes.cpp msgid "Mid Height" @@ -26749,15 +26562,15 @@ msgstr "" #: scene/resources/primitive_meshes.cpp msgid "Subdivide Width" -msgstr "" +msgstr "Largeur de subdivision" #: scene/resources/primitive_meshes.cpp msgid "Subdivide Height" -msgstr "" +msgstr "Hauteur de subdivision" #: scene/resources/primitive_meshes.cpp msgid "Subdivide Depth" -msgstr "" +msgstr "Profondeur de subdivision" #: scene/resources/primitive_meshes.cpp msgid "Top Radius" @@ -26769,43 +26582,38 @@ msgid "Bottom Radius" msgstr "En bas à droite" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Left To Right" -msgstr "En haut à droite" +msgstr "Gauche à droite" #: scene/resources/primitive_meshes.cpp msgid "Is Hemisphere" -msgstr "" +msgstr "Est une hémisphère" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Curve Step" -msgstr "Scinder la courbe" +msgstr "Pas de la courbe" #: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp msgid "Slips On Slope" -msgstr "" +msgstr "Glisse sur pente" #: scene/resources/segment_shape_2d.cpp msgid "A" -msgstr "" +msgstr "A" #: scene/resources/shape_2d.cpp msgid "Custom Solver Bias" msgstr "" #: scene/resources/skin.cpp -#, fuzzy msgid "Bind Count" -msgstr "Ajouter un port d'entrée" +msgstr "Nombre de liaisons" #: scene/resources/skin.cpp -#, fuzzy msgid "Bind" msgstr "Liaison" #: scene/resources/skin.cpp -#, fuzzy msgid "Bone" msgstr "Os" @@ -26815,53 +26623,47 @@ msgstr "Taille du rayonnement" #: scene/resources/sky.cpp msgid "Panorama" -msgstr "" +msgstr "Panorama" #: scene/resources/sky.cpp -#, fuzzy msgid "Top Color" -msgstr "Étage suivant" +msgstr "Couleur du haut" #: scene/resources/sky.cpp msgid "Horizon Color" msgstr "Couleur de l’Horizon" #: scene/resources/sky.cpp -#, fuzzy msgid "Ground" -msgstr "Groupé" +msgstr "Sol" #: scene/resources/sky.cpp -#, fuzzy msgid "Bottom Color" -msgstr "Signets" +msgstr "Couleur du bas" #: scene/resources/sky.cpp -#, fuzzy msgid "Sun" -msgstr "Lancer" +msgstr "Soleil" #: scene/resources/sky.cpp -#, fuzzy msgid "Latitude" -msgstr "Remplacer" +msgstr "Latitude" #: scene/resources/sky.cpp msgid "Longitude" -msgstr "" +msgstr "Longitude" #: scene/resources/sky.cpp msgid "Angle Min" -msgstr "" +msgstr "Angle min" #: scene/resources/sky.cpp msgid "Angle Max" -msgstr "" +msgstr "Angle max" #: scene/resources/style_box.cpp -#, fuzzy msgid "Content Margin" -msgstr "Définir la marge" +msgstr "Marge de contenu" #: scene/resources/style_box.cpp #, fuzzy @@ -26870,7 +26672,7 @@ msgstr "Développer tout" #: scene/resources/style_box.cpp msgid "Skew" -msgstr "" +msgstr "Biseau" #: scene/resources/style_box.cpp #, fuzzy @@ -26883,7 +26685,7 @@ msgstr "" #: scene/resources/style_box.cpp msgid "Anti Aliasing" -msgstr "" +msgstr "Anticrénelage" #: scene/resources/style_box.cpp msgid "Grow Begin" @@ -26899,81 +26701,68 @@ msgid "Load Path" msgstr "Charger un préréglage" #: scene/resources/texture.cpp -#, fuzzy msgid "Base Texture" -msgstr "Supprimer la texture" +msgstr "Texture de base" #: scene/resources/texture.cpp msgid "Image Size" msgstr "Taille de l'image" #: scene/resources/texture.cpp -#, fuzzy msgid "Side" -msgstr "Afficher les guides" +msgstr "Coté" #: scene/resources/texture.cpp -#, fuzzy msgid "Front" -msgstr "Vue de devant" +msgstr "Avant" #: scene/resources/texture.cpp -#, fuzzy msgid "Back" -msgstr "Retourner" +msgstr "Arrière" #: scene/resources/texture.cpp -#, fuzzy msgid "Storage Mode" -msgstr "Mode mise à l'échelle" +msgstr "Mode de stockage" #: scene/resources/texture.cpp -#, fuzzy msgid "Lossy Storage Quality" -msgstr "Capturer" +msgstr "Qualité de stockage avec pertes" #: scene/resources/texture.cpp -#, fuzzy msgid "From" -msgstr "Remplir à Partir de" +msgstr "De" #: scene/resources/texture.cpp -#, fuzzy msgid "To" -msgstr "Dessus" +msgstr "À" #: scene/resources/texture.cpp -#, fuzzy msgid "Base" -msgstr "Changer le type de base" +msgstr "Base" #: scene/resources/texture.cpp -#, fuzzy msgid "Current Frame" -msgstr "Nom de la scène courante" +msgstr "Trame actuelle" #: scene/resources/texture.cpp -#, fuzzy msgid "Pause" -msgstr "Mode navigation" +msgstr "Pause" #: scene/resources/texture.cpp msgid "Which Feed" msgstr "" #: scene/resources/texture.cpp -#, fuzzy msgid "Camera Is Active" -msgstr "Sensible à la casse" +msgstr "La caméra est active" #: scene/resources/theme.cpp -#, fuzzy msgid "Default Font" -msgstr "Défaut" +msgstr "Police par défaut" #: scene/resources/visual_shader.cpp msgid "Output Port For Preview" -msgstr "" +msgstr "Port de sortie de l'aperçu" #: scene/resources/visual_shader.cpp #, fuzzy @@ -26986,29 +26775,24 @@ msgid "Cull" msgstr "Mode Règle" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Diffuse" -msgstr "Mode navigation" +msgstr "Diffus" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Async" -msgstr "Mode navigation" +msgstr "Asynchrone" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Modes" -msgstr "Mode" +msgstr "Modes" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Input Name" -msgstr "Contrôles" +msgstr "Nom de l'entrée" #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Uniform Name" -msgstr "Définir le nom de l'uniforme" +msgstr "Nom de l'uniforme" #: scene/resources/visual_shader_nodes.cpp msgid "" @@ -27024,16 +26808,15 @@ msgstr "Source invalide pour la prévisualisation." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." -msgstr "Source invalide pour la forme." +msgstr "Source invalide pour le shader." #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Texture Type" -msgstr "RegionDeTexture" +msgstr "Type de texture" #: scene/resources/visual_shader_nodes.cpp msgid "Cube Map" -msgstr "" +msgstr "Textures en cube" #: scene/resources/visual_shader_nodes.cpp #, fuzzy @@ -27041,42 +26824,36 @@ msgid "Default Value Enabled" msgstr "Profil des fonctionnalités de Godot" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Default Value" -msgstr "Changer nom de l'entrée" +msgstr "Valeur par défaut" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Color Default" -msgstr "Charger défaut" +msgstr "Couleur par défaut" #: scene/resources/visual_shader_nodes.cpp msgid "Invalid comparison function for that type." msgstr "Fonction de comparaison invalide pour ce type." #: scene/resources/world.cpp -#, fuzzy msgid "Fallback Environment" -msgstr "Voir environnement" +msgstr "Environnement de repli" #: scene/resources/world.cpp -#, fuzzy msgid "Scenario" -msgstr "Scène" +msgstr "Scénario" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Navigation Map" -msgstr "Navigation" +msgstr "Carte de navigation" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Direct Space State" msgstr "" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Gravity Vector" -msgstr "Aperçu par défaut" +msgstr "Vecteur de gravité par défaut" #: scene/resources/world.cpp scene/resources/world_2d.cpp #, fuzzy @@ -27093,14 +26870,12 @@ msgid "Default Map Up" msgstr "Défaut" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Size" -msgstr "Aperçu par défaut" +msgstr "Taille de cellule par défaut" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Height" -msgstr "En période de test" +msgstr "Hauteur de cellule par défaut" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Default Edge Connection Margin" @@ -27108,34 +26883,31 @@ msgstr "Marge de connexion des bords par défaut" #: scene/resources/world_2d.cpp msgid "Canvas" -msgstr "" +msgstr "Canevas" #: servers/arvr/arvr_interface.cpp msgid "Is Primary" -msgstr "" +msgstr "Est primaire" #: servers/arvr/arvr_interface.cpp -#, fuzzy msgid "Is Initialized" -msgstr "Initialiser" +msgstr "Est initialisé" #: servers/arvr/arvr_interface.cpp msgid "AR" -msgstr "" +msgstr "AR" #: servers/arvr/arvr_interface.cpp msgid "Is Anchor Detection Enabled" msgstr "" #: servers/arvr_server.cpp -#, fuzzy msgid "Primary Interface" -msgstr "Interface utilisateur" +msgstr "Interface primaire" #: servers/audio/audio_stream.cpp -#, fuzzy msgid "Audio Stream" -msgstr "Item radio" +msgstr "Flux audio" #: servers/audio/audio_stream.cpp msgid "Random Pitch" @@ -27145,46 +26917,45 @@ msgstr "Pitch Aléatoire" #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp #: servers/audio/effects/audio_stream_generator.cpp msgid "Buffer Length" -msgstr "" +msgstr "Taille du tampon" #: servers/audio/effects/audio_effect_chorus.cpp msgid "Voice Count" -msgstr "" +msgstr "Nombre de voix" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Dry" -msgstr "" +msgstr "Sec" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Wet" -msgstr "" +msgstr "Humide" #: servers/audio/effects/audio_effect_chorus.cpp msgid "Voice" -msgstr "" +msgstr "Voix" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp msgid "Delay (ms)" -msgstr "" +msgstr "Délai (ms)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_phaser.cpp msgid "Rate Hz" -msgstr "" +msgstr "Débit (Hz)" #: servers/audio/effects/audio_effect_chorus.cpp -#, fuzzy msgid "Depth (ms)" -msgstr "Profondeur" +msgstr "Profondeur (ms)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp msgid "Level dB" -msgstr "" +msgstr "Niveau (dB)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp @@ -27195,16 +26966,15 @@ msgstr "Pan" #: servers/audio/effects/audio_effect_compressor.cpp #: servers/audio/effects/audio_effect_filter.cpp msgid "Gain" -msgstr "" +msgstr "Gain" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Attack (µs)" -msgstr "" +msgstr "Attaque (µs)" #: servers/audio/effects/audio_effect_compressor.cpp -#, fuzzy msgid "Release (ms)" -msgstr "Publication (release)" +msgstr "Relâche (ms)" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Mix" @@ -27225,36 +26995,32 @@ msgstr "" #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_phaser.cpp #: servers/audio/effects/audio_effect_reverb.cpp -#, fuzzy msgid "Feedback" -msgstr "Envoyez vos retours sur la documentation" +msgstr "Larsen" #: servers/audio/effects/audio_effect_delay.cpp -#, fuzzy msgid "Low-pass" -msgstr "Contourner" +msgstr "Passe-bas" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Pre Gain" -msgstr "" +msgstr "Pré-gain" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Keep Hf Hz" -msgstr "" +msgstr "Garder haute fréquences (Hz)" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Drive" msgstr "" #: servers/audio/effects/audio_effect_distortion.cpp -#, fuzzy msgid "Post Gain" -msgstr "Post" +msgstr "Post-gain" #: servers/audio/effects/audio_effect_filter.cpp -#, fuzzy msgid "Resonance" -msgstr "Ressource" +msgstr "Résonance" #: servers/audio/effects/audio_effect_limiter.cpp msgid "Ceiling dB" @@ -27424,22 +27190,19 @@ msgstr "Collisions avec les zones" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Motion Remainder" -msgstr "" +msgstr "Reste de mouvement" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Point" -msgstr "Mode collision" +msgstr "Point de collision" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Normal" -msgstr "Mode collision" +msgstr "Normale de collision" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Depth" -msgstr "Mode collision" +msgstr "Profondeur de collision" #: servers/physics_2d_server.cpp servers/physics_server.cpp #, fuzzy @@ -27452,18 +27215,16 @@ msgid "Collision Unsafe Fraction" msgstr "Mode collision" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Physics Engine" -msgstr "Image physique %" +msgstr "Moteur physique" #: servers/physics_server.cpp -#, fuzzy msgid "Center Of Mass" -msgstr "Centré à Gauche" +msgstr "Centre de la masse" #: servers/physics_server.cpp msgid "Principal Inertia Axes" -msgstr "" +msgstr "Axes principaux d'inertie" #: servers/visual/shader_language.cpp msgid "Varying may not be assigned in the '%s' function." @@ -27509,47 +27270,40 @@ msgid "Render Loop Enabled" msgstr "Filtrer les signaux" #: servers/visual_server.cpp -#, fuzzy msgid "VRAM Compression" -msgstr "Expression" +msgstr "Compression VRAM" #: servers/visual_server.cpp -#, fuzzy msgid "Import BPTC" -msgstr "Importation" +msgstr "Importer BPTC" #: servers/visual_server.cpp -#, fuzzy msgid "Import S3TC" -msgstr "Importation" +msgstr "Importer S3TC" #: servers/visual_server.cpp -#, fuzzy msgid "Import ETC" -msgstr "Importation" +msgstr "Importer ETC" #: servers/visual_server.cpp -#, fuzzy msgid "Import ETC2" -msgstr "Importation" +msgstr "Importer ETC2" #: servers/visual_server.cpp -#, fuzzy msgid "Import PVRTC" -msgstr "Importer un thème" +msgstr "Importer PVRTC" #: servers/visual_server.cpp msgid "Lossless Compression" -msgstr "" +msgstr "Compression sans perte" #: servers/visual_server.cpp -#, fuzzy msgid "Force PNG" -msgstr "Force-pousser" +msgstr "Forcer PNG" #: servers/visual_server.cpp msgid "WebP Compression Level" -msgstr "" +msgstr "Niveau de compression WebP" #: servers/visual_server.cpp msgid "Time Rollover Secs" @@ -27577,14 +27331,12 @@ msgid "Quadrant 3 Subdiv" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shadows" -msgstr "Ombrage" +msgstr "Ombres" #: servers/visual_server.cpp -#, fuzzy msgid "Filter Mode" -msgstr "Filtrer les nÅ“uds" +msgstr "Mode de filtrage" #: servers/visual_server.cpp #, fuzzy @@ -27593,16 +27345,15 @@ msgstr "Centrer sur la sélection" #: servers/visual_server.cpp msgid "High Quality GGX" -msgstr "" +msgstr "GGX haute qualité" #: servers/visual_server.cpp msgid "Irradiance Max Size" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shading" -msgstr "Remplissage(Padding)" +msgstr "Ombrage" #: servers/visual_server.cpp msgid "Force Vertex Shading" @@ -27610,11 +27361,11 @@ msgstr "" #: servers/visual_server.cpp msgid "Force Lambert Over Burley" -msgstr "" +msgstr "Forcer Lambert au lieu de Burley" #: servers/visual_server.cpp msgid "Force Blinn Over GGX" -msgstr "" +msgstr "Forcer Blinn au lieu de GGX" #: servers/visual_server.cpp msgid "Mesh Storage" @@ -27639,15 +27390,15 @@ msgstr "" #: servers/visual_server.cpp msgid "Anisotropic Filter Level" -msgstr "" +msgstr "Niveau de filtrage anisotropique" #: servers/visual_server.cpp msgid "Use Nearest Mipmap Filter" -msgstr "" +msgstr "Utiliser le filtre Mipmap le plus proche" #: servers/visual_server.cpp msgid "Skinning" -msgstr "" +msgstr "Enveloppement" #: servers/visual_server.cpp msgid "Software Skinning Fallback" @@ -27674,9 +27425,8 @@ msgid "Batching Send Null" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Batching Stream" -msgstr "Renommer par lot" +msgstr "Flux de traitement en lot" #: servers/visual_server.cpp msgid "Legacy Orphan Buffers" @@ -27724,7 +27474,7 @@ msgstr "Taille de tampon des lots" #: servers/visual_server.cpp msgid "Item Reordering Lookahead" -msgstr "" +msgstr "Anticipation de réorganisation d’éléments" #: servers/visual_server.cpp msgid "Flash Batching" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index 87e005f5f3..246c04dc63 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -4360,6 +4360,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7057,7 +7058,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14756,18 +14758,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nód Beochana" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nód Beochana" #: editor/scene_tree_dock.cpp @@ -14957,6 +14959,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nód Beochana" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15020,6 +15027,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16823,6 +16834,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18530,6 +18553,10 @@ msgstr "Cruthaigh" msgid "Custom BG Color" msgstr "Cruthaigh" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19326,6 +19353,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/gl.po b/editor/translations/gl.po index 29db0e8063..2445ec4783 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -4631,6 +4631,7 @@ msgstr "Ferramentas varias do proxecto ou escena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proxecto" @@ -7532,7 +7533,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15575,18 +15577,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nome do Nodo:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nome do Nodo:" #: editor/scene_tree_dock.cpp @@ -15779,6 +15781,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nome do Nodo:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15842,6 +15849,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renomear Nodo" @@ -17741,6 +17752,21 @@ msgstr "Resolución á Metade" msgid "Auto Update Project" msgstr "Proxecto Sen Nome" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Amosar Todo" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Elixir un Directorio" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Elixir un Directorio" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19565,6 +19591,11 @@ msgstr "Cortar Nodos" msgid "Custom BG Color" msgstr "Cortar Nodos" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Expandir Todo" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20414,6 +20445,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/he.po b/editor/translations/he.po index abaada7880..e0a690c9b4 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -22,13 +22,14 @@ # Ram Tourgeman <ramtorgeman@gmail.com>, 2021. # Shailee Eliyahu <dev.sle.il@gmail.com>, 2021. # Mati Borlak <matiborlak@gmail.com>, 2022. +# Tamir Livneh <fkeyzuwu@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-08 06:48+0000\n" -"Last-Translator: Mati Borlak <matiborlak@gmail.com>\n" +"PO-Revision-Date: 2022-09-05 11:17+0000\n" +"Last-Translator: Tamir Livneh <fkeyzuwu@gmail.com>\n" "Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/" "godot/he/>\n" "Language: he\n" @@ -37,7 +38,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -4545,6 +4546,7 @@ msgstr "×›×œ×™× ×©×•× ×™× ×œ×ž×™×–× ×ו למגוון ×¡×¦× ×•×ª." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "מיז×" @@ -5026,7 +5028,7 @@ msgstr "יוצרי×" #: editor/editor_plugin_settings.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Status" -msgstr "" +msgstr "מצב" #: editor/editor_profiler.cpp msgid "Measure:" @@ -5091,9 +5093,8 @@ msgid "Profiler Frame Max Functions" msgstr "×©×™× ×•×™ ×©× ×¤×•× ×§×¦×™×”" #: editor/editor_properties.cpp -#, fuzzy msgid "Edit Text:" -msgstr "חברי×" +msgstr "ערוך טקסט:" #: editor/editor_properties.cpp editor/script_create_dialog.cpp #: scene/resources/default_theme/default_theme.cpp @@ -5105,7 +5106,7 @@ msgstr "" #: scene/3d/collision_object.cpp scene/3d/soft_body.cpp #: scene/main/canvas_layer.cpp msgid "Layer" -msgstr "" +msgstr "שכבה" #: editor/editor_properties.cpp msgid "Bit %d, value %d" @@ -5160,19 +5161,19 @@ 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_resource_picker.cpp msgid "" @@ -5186,7 +5187,7 @@ msgstr "" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "Make Unique" -msgstr "" +msgstr "הפוך לייחודי" #: editor/editor_resource_picker.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp @@ -5200,7 +5201,7 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp #: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" -msgstr "הדבקה" +msgstr "הדבק" #: editor/editor_resource_picker.cpp editor/property_editor.cpp #, fuzzy @@ -5233,7 +5234,7 @@ msgstr "הפעלה" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "New Script" -msgstr "" +msgstr "סקריפט חדש" #: editor/editor_resource_picker.cpp editor/scene_tree_dock.cpp #, fuzzy @@ -7474,7 +7475,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15677,18 +15679,19 @@ msgstr "" msgid "Make Local" msgstr "הפיכה למקומי" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "×©× ×”×ž×¤×¨×§:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "×”×©× ×›×‘×¨ בשימוש של ×¤×•× ×§×¦×™×”/×ž×©×ª× ×”/×ות ×חר:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "×©× ×”×ž×¤×¨×§:" #: editor/scene_tree_dock.cpp @@ -15882,6 +15885,11 @@ msgid "Button Group" msgstr "קבוצת ×œ×—×¦× ×™×" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "×©× ×”×ž×¤×¨×§:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(מתחבר מ)" @@ -15957,6 +15965,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "×©× ×ž×¤×¨×§ ×œ× ×—×•×§×™, ×”×ª×•×•×™× ×”×‘××™× ××™× × ×ž×•×ª×¨×™×:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "×©×™× ×•×™ ×©× ×ž×¤×¨×§" @@ -17864,6 +17876,21 @@ msgstr "מילוי הבחירה" msgid "Auto Update Project" msgstr "×™×™×¦×•× ×ž×™×–×" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "הצג הכל" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "× × ×œ×‘×—×•×¨ תיקייה" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "× × ×œ×‘×—×•×¨ תיקייה" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "סוף ×ž×—×¡× ×™×ª מעקב לחריגה ×¤× ×™×ž×™×ª" @@ -19716,6 +19743,11 @@ msgstr "גזירת מפרקי×" msgid "Custom BG Color" msgstr "גזירת מפרקי×" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "להרחיב הכול" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20567,6 +20599,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "×©× ×§×¦×¨ של חבילה ×œ× ×—×•×§×™." diff --git a/editor/translations/hi.po b/editor/translations/hi.po index e5a41404d0..5e3b28ff79 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -4549,6 +4549,7 @@ msgstr "विविध परियोजना या दृशà¥à¤¯-वà¥à¤ #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "परियोजना" @@ -7430,7 +7431,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15380,18 +15382,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "नोड का नाम:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "नोड का नाम:" #: editor/scene_tree_dock.cpp @@ -15588,6 +15590,11 @@ msgstr "" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "नोड का नाम:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "कनेकà¥à¤Ÿ करने के लिठसंकेत:" @@ -15652,6 +15659,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17527,6 +17538,21 @@ msgstr "सà¤à¥€ खंड" msgid "Auto Update Project" msgstr "परियोजना" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "सब दिखाइà¤" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "डायरेकà¥à¤Ÿà¤°à¥€ चà¥à¤¨à¥‡à¤‚" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "डायरेकà¥à¤Ÿà¤°à¥€ चà¥à¤¨à¥‡à¤‚" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19330,6 +19356,11 @@ msgstr "पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿" msgid "Custom BG Color" msgstr "पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "सà¤à¥€ बढाय" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20171,6 +20202,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "गलत फॉणà¥à¤Ÿ का आकार |" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index e473c6556c..b634136191 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -4437,6 +4437,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7213,7 +7214,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15012,18 +15014,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Naziv ÄŒvora(node):" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Naziv ÄŒvora(node):" #: editor/scene_tree_dock.cpp @@ -15213,6 +15215,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Naziv ÄŒvora(node):" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15276,6 +15283,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17118,6 +17129,21 @@ msgstr "" msgid "Auto Update Project" msgstr "Uredi vezu:" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "NaÄin reprodukcije:" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Otvori direktorij" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Otvori direktorij" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18871,6 +18897,11 @@ msgstr "Funkcije" msgid "Custom BG Color" msgstr "Funkcije" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Izvoz" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19686,6 +19717,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index b35be76368..996249e619 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -4662,6 +4662,7 @@ msgstr "Egyéb projekt- vagy Scene-szintű eszközök." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7570,7 +7571,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15520,18 +15522,19 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Node neve:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "A nevet már használja egy függvény/változó/jelzés:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Node neve:" #: editor/scene_tree_dock.cpp @@ -15723,6 +15726,11 @@ msgid "Button Group" msgstr "Gombcsoport" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Node neve:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Csatlakozás Innen)" @@ -15786,6 +15794,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17698,6 +17710,21 @@ msgstr "Kijelölés kitöltése" msgid "Auto Update Project" msgstr "Névtelen projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Az összes megjelenÃtése" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Válasszon egy Könyvtárat" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Válasszon egy Könyvtárat" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19524,6 +19551,11 @@ msgstr "Node-ok kivágása" msgid "Custom BG Color" msgstr "Node-ok kivágása" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Összes kinyitása" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20374,6 +20406,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Érvénytelen rövid csomagnév." diff --git a/editor/translations/id.po b/editor/translations/id.po index 7d839357cd..696799d370 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -4576,6 +4576,7 @@ msgstr "Perkakas macam-macam proyek atau lingkup skena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proyek" @@ -7470,7 +7471,8 @@ msgid "8 Bit" msgstr "8 Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15624,18 +15626,19 @@ msgstr "" msgid "Make Local" msgstr "Jadikan Local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nama Unik" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Nama telah digunakan oleh fungsi/variabel/sinyal yang lain:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Nama Unik" #: editor/scene_tree_dock.cpp @@ -15839,6 +15842,11 @@ msgid "Button Group" msgstr "Tombol Grup" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nama Unik" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Menghubungkan dari)" @@ -15914,6 +15922,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Nama node tidak valid, karakter berikut tidak diperbolehkan:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Ubah Nama Node" @@ -17795,6 +17807,21 @@ msgstr "Isi Pilihan" msgid "Auto Update Project" msgstr "Proyek Tanpa Nama" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Nama Tampilan" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Pilih sebuah Direktori" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Pilih sebuah Direktori" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Akhir dari inner exception stack trace" @@ -19648,6 +19675,11 @@ msgstr "Potong Node" msgid "Custom BG Color" msgstr "Potong Node" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Ikon Ekspor" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20510,6 +20542,12 @@ msgid "Show Name On Square 310 X 310" msgstr "Tampilkan Nama Pada Persegi 310 X 310" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nama pendek paket tidak valid." diff --git a/editor/translations/ig.po b/editor/translations/ig.po new file mode 100644 index 0000000000..8d96de35f3 --- /dev/null +++ b/editor/translations/ig.po @@ -0,0 +1,26106 @@ +# Igbo translation of the Godot Engine editor. +# Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. +# Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). +# This file is distributed under the same license as the Godot source code. +# +# Chenny <optimusdev12@gmail.com>, 2022. +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine editor\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" +"PO-Revision-Date: 2022-08-07 18:37+0000\n" +"Last-Translator: Chenny <optimusdev12@gmail.com>\n" +"Language-Team: Igbo <https://hosted.weblate.org/projects/godot-engine/godot/" +"ig/>\n" +"Language: ig\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.14-dev\n" + +#: core/bind/core_bind.cpp main/main.cpp +msgid "Tablet Driver" +msgstr "Onye na-anya mbadamba mbadamba" + +#: core/bind/core_bind.cpp +msgid "Clipboard" +msgstr "Klipbá»á»dụ" + +#: core/bind/core_bind.cpp +msgid "Current Screen" +msgstr "Ihuenyo dị ugbu a" + +#: core/bind/core_bind.cpp +msgid "Exit Code" +msgstr "Koodu á»pụpụ" + +#: core/bind/core_bind.cpp +msgid "V-Sync Enabled" +msgstr "Agbanyere V-mmeká»rịta" + +#: core/bind/core_bind.cpp main/main.cpp +msgid "V-Sync Via Compositor" +msgstr "V-mmeká»rịta Site na ihe mejupụtara" + +#: core/bind/core_bind.cpp main/main.cpp +msgid "Delta Smoothing" +msgstr "Delta na-ehi ụra" + +#: core/bind/core_bind.cpp +msgid "Low Processor Usage Mode" +msgstr "Ụdị ojiji Processor dị ala" + +#: core/bind/core_bind.cpp +msgid "Low Processor Usage Mode Sleep (µsec)" +msgstr "Ụdị ihi ụra dị ala (µ sec)" + +#: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp +msgid "Keep Screen On" +msgstr "Debe ihuenyo" + +#: core/bind/core_bind.cpp +msgid "Min Window Size" +msgstr "Ogo Obere Obere" + +#: core/bind/core_bind.cpp +msgid "Max Window Size" +msgstr "Oke windo kacha" + +#: core/bind/core_bind.cpp +msgid "Screen Orientation" +msgstr "Usoro ihuenyo" + +#: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp +#: platform/uwp/os_uwp.cpp +msgid "Window" +msgstr "Ohere" + +#: core/bind/core_bind.cpp core/project_settings.cpp +msgid "Borderless" +msgstr "Enweghị oke" + +#: core/bind/core_bind.cpp +msgid "Per Pixel Transparency Enabled" +msgstr "Agbanyere nghá»ta kwa Pixel" + +#: core/bind/core_bind.cpp core/project_settings.cpp +msgid "Fullscreen" +msgstr "Ihuenyo zuru oke" + +#: core/bind/core_bind.cpp +msgid "Maximized" +msgstr "Oke kachasị" + +#: core/bind/core_bind.cpp +msgid "Minimized" +msgstr "Ebelatala" + +#: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp +#: scene/gui/graph_node.cpp +msgid "Resizable" +msgstr "Enwere ike ịgbanwe" + +#: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp +#: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp +#: scene/3d/physics_body.cpp scene/3d/remote_transform.cpp +#: scene/gui/control.cpp scene/gui/line_edit.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Position" +msgstr "Ọná»dụ" + +#: core/bind/core_bind.cpp core/project_settings.cpp editor/editor_settings.cpp +#: main/main.cpp modules/gridmap/grid_map.cpp +#: modules/visual_script/visual_script_nodes.cpp scene/2d/tile_map.cpp +#: scene/3d/camera.cpp scene/3d/light.cpp scene/gui/control.cpp +#: scene/gui/graph_edit.cpp scene/main/viewport.cpp +#: scene/resources/dynamic_font.cpp scene/resources/navigation_mesh.cpp +#: scene/resources/primitive_meshes.cpp scene/resources/sky.cpp +#: scene/resources/style_box.cpp scene/resources/texture.cpp +#: scene/resources/visual_shader.cpp servers/visual_server.cpp +msgid "Size" +msgstr "Nha" + +#: core/bind/core_bind.cpp +msgid "Endian Swap" +msgstr "Endian gbanwere" + +#: core/bind/core_bind.cpp +msgid "Editor Hint" +msgstr "Ntuziaka nchịká»ta akụká»" + +#: core/bind/core_bind.cpp +msgid "Print Error Messages" +msgstr "Bipụta ozi mperi" + +#: core/bind/core_bind.cpp +msgid "Iterations Per Second" +msgstr "Nkwagharị kwa nkeji" + +#: core/bind/core_bind.cpp +msgid "Target FPS" +msgstr "Ebumnuche FPS" + +#: core/bind/core_bind.cpp +msgid "Time Scale" +msgstr "Ogologo oge" + +#: core/bind/core_bind.cpp main/main.cpp +msgid "Physics Jitter Fix" +msgstr "" + +#: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Error" +msgstr "Njehie" + +#: core/bind/core_bind.cpp +msgid "Error String" +msgstr "Eriri mperi" + +#: core/bind/core_bind.cpp +msgid "Error Line" +msgstr "Ahịrị mperi" + +#: core/bind/core_bind.cpp +msgid "Result" +msgstr "Nsonaazụ" + +#: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp +msgid "Memory" +msgstr "Ebe nchekwa" + +#: core/command_queue_mt.cpp core/message_queue.cpp +#: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles2/rasterizer_scene_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +#: drivers/gles3/rasterizer_scene_gles3.cpp +#: drivers/gles3/rasterizer_storage_gles3.cpp main/main.cpp +#: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h +#: servers/visual_server.cpp +msgid "Limits" +msgstr "Oke" + +#: core/command_queue_mt.cpp +msgid "Command Queue" +msgstr "Queue iwu" + +#: core/command_queue_mt.cpp +msgid "Multithreading Queue Size (KB)" +msgstr "Ogo Queue Multithreading (KB)" + +#: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_nodes.cpp +#: scene/resources/visual_shader_nodes.cpp +msgid "Function" +msgstr "Ọrụ" + +#: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp +#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp +msgid "Data" +msgstr "Data" + +#: core/io/file_access_network.cpp core/register_core_types.cpp +#: editor/editor_file_dialog.cpp editor/editor_settings.cpp main/main.cpp +#: modules/gdscript/language_server/gdscript_language_server.cpp +#: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h +#: scene/gui/file_dialog.cpp +msgid "Network" +msgstr "Netwá»k" + +#: core/io/file_access_network.cpp +msgid "Remote FS" +msgstr "FS dịpụrụ adịpụ" + +#: core/io/file_access_network.cpp +msgid "Page Size" +msgstr "Nha ibe" + +#: core/io/file_access_network.cpp +msgid "Page Read Ahead" +msgstr "Ibe GụỠn'ihu" + +#: core/io/http_client.cpp +msgid "Blocking Mode Enabled" +msgstr "Agbanyere á»ná»dụ mgbochi" + +#: core/io/http_client.cpp +msgid "Connection" +msgstr "Njiká»" + +#: core/io/http_client.cpp +msgid "Read Chunk Size" +msgstr "GụỠnha nha" + +#: core/io/marshalls.cpp +msgid "Object ID" +msgstr "NJ ihe" + +#: core/io/multiplayer_api.cpp core/io/packet_peer.cpp +msgid "Allow Object Decoding" +msgstr "Kwe ka Nhazi ihe" + +#: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp +msgid "Refuse New Network Connections" +msgstr "Jụ njiká» netwá»kụ á»hụrụ" + +#: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp +msgid "Network Peer" +msgstr "Ndị á»gbá» netwá»k" + +#: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp +msgid "Root Node" +msgstr "Mgbá»rá»gwụ Node" + +#: core/io/networked_multiplayer_peer.cpp +msgid "Refuse New Connections" +msgstr "Jụ njiká» á»hụrụ" + +#: core/io/networked_multiplayer_peer.cpp +msgid "Transfer Mode" +msgstr "Ụdị nnyefe" + +#: core/io/packet_peer.cpp +msgid "Encode Buffer Max Size" +msgstr "Gbanye ihe nchekwa oke nha" + +#: core/io/packet_peer.cpp +msgid "Input Buffer Max Size" +msgstr "Ntinye ihe nchekwa oke oke" + +#: core/io/packet_peer.cpp +msgid "Output Buffer Max Size" +msgstr "" + +#: core/io/packet_peer.cpp +msgid "Stream Peer" +msgstr "" + +#: core/io/stream_peer.cpp +msgid "Big Endian" +msgstr "" + +#: core/io/stream_peer.cpp +msgid "Data Array" +msgstr "" + +#: core/io/stream_peer_ssl.cpp +msgid "Blocking Handshake" +msgstr "" + +#: core/io/udp_server.cpp +msgid "Max Pending Connections" +msgstr "" + +#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Invalid type argument to convert(), use TYPE_* constants." +msgstr "" + +#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp +msgid "Expected a string of length 1 (a character)." +msgstr "" + +#: 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 "" + +#: core/math/expression.cpp +msgid "Invalid input %d (not passed) in expression" +msgstr "" + +#: core/math/expression.cpp +msgid "self can't be used because instance is null (not passed)" +msgstr "" + +#: core/math/expression.cpp +msgid "Invalid operands to operator %s, %s and %s." +msgstr "" + +#: core/math/expression.cpp +msgid "Invalid index of type %s for base type %s" +msgstr "" + +#: core/math/expression.cpp +msgid "Invalid named index '%s' for base type %s" +msgstr "" + +#: core/math/expression.cpp +msgid "Invalid arguments to construct '%s'" +msgstr "" + +#: core/math/expression.cpp +msgid "On call to '%s':" +msgstr "" + +#: core/math/random_number_generator.cpp +#: modules/opensimplex/open_simplex_noise.cpp +msgid "Seed" +msgstr "" + +#: core/math/random_number_generator.cpp +msgid "State" +msgstr "" + +#: core/message_queue.cpp +msgid "Message Queue" +msgstr "" + +#: core/message_queue.cpp +msgid "Max Size (KB)" +msgstr "" + +#: core/os/input.cpp +msgid "Mouse Mode" +msgstr "" + +#: core/os/input.cpp +msgid "Use Accumulated Input" +msgstr "" + +#: core/os/input_event.cpp editor/project_settings_editor.cpp +#: servers/audio_server.cpp +msgid "Device" +msgstr "" + +#: core/os/input_event.cpp +msgid "Alt" +msgstr "" + +#: core/os/input_event.cpp +msgid "Shift" +msgstr "" + +#: core/os/input_event.cpp +msgid "Control" +msgstr "" + +#: core/os/input_event.cpp +msgid "Meta" +msgstr "" + +#: core/os/input_event.cpp +msgid "Command" +msgstr "" + +#: core/os/input_event.cpp +msgid "Physical" +msgstr "" + +#: core/os/input_event.cpp scene/2d/touch_screen_button.cpp +#: scene/gui/base_button.cpp scene/gui/texture_button.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Pressed" +msgstr "" + +#: core/os/input_event.cpp +msgid "Scancode" +msgstr "" + +#: core/os/input_event.cpp +msgid "Physical Scancode" +msgstr "" + +#: core/os/input_event.cpp +msgid "Unicode" +msgstr "" + +#: core/os/input_event.cpp +msgid "Echo" +msgstr "" + +#: core/os/input_event.cpp scene/gui/base_button.cpp +msgid "Button Mask" +msgstr "" + +#: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp +msgid "Global Position" +msgstr "" + +#: core/os/input_event.cpp +msgid "Factor" +msgstr "" + +#: core/os/input_event.cpp +msgid "Button Index" +msgstr "" + +#: core/os/input_event.cpp +msgid "Doubleclick" +msgstr "" + +#: core/os/input_event.cpp +msgid "Tilt" +msgstr "" + +#: core/os/input_event.cpp +msgid "Pressure" +msgstr "" + +#: core/os/input_event.cpp +msgid "Pen Inverted" +msgstr "" + +#: core/os/input_event.cpp +msgid "Relative" +msgstr "" + +#: core/os/input_event.cpp scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp +#: scene/animation/animation_player.cpp scene/resources/environment.cpp +#: scene/resources/particles_material.cpp +msgid "Speed" +msgstr "" + +#: core/os/input_event.cpp editor/project_settings_editor.cpp +#: scene/3d/sprite_3d.cpp +msgid "Axis" +msgstr "" + +#: core/os/input_event.cpp +msgid "Axis Value" +msgstr "" + +#: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp +msgid "Index" +msgstr "" + +#: core/os/input_event.cpp editor/project_settings_editor.cpp +#: modules/visual_script/visual_script_nodes.cpp +#: scene/2d/touch_screen_button.cpp +msgid "Action" +msgstr "" + +#: core/os/input_event.cpp scene/resources/environment.cpp +#: scene/resources/material.cpp +msgid "Strength" +msgstr "" + +#: core/os/input_event.cpp +msgid "Delta" +msgstr "" + +#: core/os/input_event.cpp +msgid "Channel" +msgstr "" + +#: core/os/input_event.cpp main/main.cpp +msgid "Message" +msgstr "" + +#: core/os/input_event.cpp +msgid "Pitch" +msgstr "" + +#: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp +#: scene/3d/physics_body.cpp scene/resources/particles_material.cpp +msgid "Velocity" +msgstr "" + +#: core/os/input_event.cpp +msgid "Instrument" +msgstr "" + +#: core/os/input_event.cpp +msgid "Controller Number" +msgstr "" + +#: core/os/input_event.cpp +msgid "Controller Value" +msgstr "" + +#: core/project_settings.cpp editor/editor_node.cpp main/main.cpp +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +#: platform/windows/export/export.cpp +msgid "Application" +msgstr "" + +#: core/project_settings.cpp main/main.cpp +msgid "Config" +msgstr "" + +#: core/project_settings.cpp +msgid "Project Settings Override" +msgstr "" + +#: core/project_settings.cpp core/resource.cpp +#: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp +#: editor/editor_help_search.cpp editor/editor_plugin_settings.cpp +#: editor/editor_profiler.cpp editor/plugins/tile_set_editor_plugin.cpp +#: editor/project_manager.cpp editor/settings_config_dialog.cpp +#: modules/gdnative/nativescript/nativescript.cpp +#: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp +#: platform/osx/export/export.cpp scene/2d/area_2d.cpp scene/3d/area.cpp +#: scene/3d/skeleton.cpp scene/main/node.cpp scene/resources/mesh_library.cpp +#: scene/resources/skin.cpp +msgid "Name" +msgstr "" + +#: core/project_settings.cpp editor/editor_help.cpp +#: modules/visual_script/visual_script_nodes.cpp platform/uwp/export/export.cpp +#: platform/windows/export/export.cpp +msgid "Description" +msgstr "" + +#: core/project_settings.cpp editor/editor_node.cpp editor/editor_settings.cpp +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +#: main/main.cpp platform/android/export/export_plugin.cpp +#: platform/javascript/export/export.cpp +msgid "Run" +msgstr "" + +#: core/project_settings.cpp editor/editor_node.cpp +#: editor/run_settings_dialog.cpp main/main.cpp +msgid "Main Scene" +msgstr "" + +#: core/project_settings.cpp +msgid "Disable stdout" +msgstr "" + +#: core/project_settings.cpp +msgid "Disable stderr" +msgstr "" + +#: core/project_settings.cpp +msgid "Use Hidden Project Data Directory" +msgstr "" + +#: core/project_settings.cpp +msgid "Use Custom User Dir" +msgstr "" + +#: core/project_settings.cpp +msgid "Custom User Dir Name" +msgstr "" + +#: core/project_settings.cpp main/main.cpp +#: platform/javascript/export/export.cpp platform/osx/export/export.cpp +#: platform/uwp/os_uwp.cpp +msgid "Display" +msgstr "" + +#: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp +#: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp +#: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp +msgid "Width" +msgstr "" + +#: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp +#: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp +#: scene/2d/light_2d.cpp scene/resources/capsule_shape.cpp +#: scene/resources/capsule_shape_2d.cpp scene/resources/cylinder_shape.cpp +#: scene/resources/font.cpp scene/resources/navigation_mesh.cpp +#: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp +msgid "Height" +msgstr "" + +#: core/project_settings.cpp +msgid "Always On Top" +msgstr "" + +#: core/project_settings.cpp +msgid "Test Width" +msgstr "" + +#: core/project_settings.cpp +msgid "Test Height" +msgstr "" + +#: core/project_settings.cpp editor/animation_track_editor.cpp +#: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp +msgid "Audio" +msgstr "" + +#: core/project_settings.cpp +msgid "Default Bus Layout" +msgstr "" + +#: core/project_settings.cpp editor/editor_export.cpp +#: editor/editor_file_system.cpp editor/editor_node.cpp +#: editor/editor_settings.cpp editor/script_create_dialog.cpp +#: scene/2d/camera_2d.cpp scene/3d/light.cpp scene/main/node.cpp +msgid "Editor" +msgstr "" + +#: core/project_settings.cpp +msgid "Main Run Args" +msgstr "" + +#: core/project_settings.cpp +msgid "Scene Naming" +msgstr "" + +#: core/project_settings.cpp +msgid "Search In File Extensions" +msgstr "" + +#: core/project_settings.cpp +msgid "Script Templates Search Path" +msgstr "" + +#: core/project_settings.cpp +msgid "Version Control Autoload On Startup" +msgstr "" + +#: core/project_settings.cpp +msgid "Version Control Plugin Name" +msgstr "" + +#: core/project_settings.cpp scene/2d/collision_object_2d.cpp +#: scene/3d/collision_object.cpp scene/gui/control.cpp +msgid "Input" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Accept" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Select" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Cancel" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Focus Next" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Focus Prev" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Left" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Right" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Up" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Down" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Page Up" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Page Down" +msgstr "" + +#: core/project_settings.cpp +msgid "UI Home" +msgstr "" + +#: core/project_settings.cpp +msgid "UI End" +msgstr "" + +#: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp +#: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp +#: scene/3d/physics_body.cpp scene/main/scene_tree.cpp scene/main/viewport.cpp +#: scene/resources/world.cpp scene/resources/world_2d.cpp +#: servers/physics/space_sw.cpp servers/physics_2d/physics_2d_server_sw.cpp +#: servers/physics_2d/physics_2d_server_wrap_mt.h +#: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp +#: servers/physics_server.cpp +msgid "Physics" +msgstr "" + +#: core/project_settings.cpp editor/editor_settings.cpp +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp +#: editor/plugins/spatial_editor_plugin.cpp main/main.cpp +#: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp +#: scene/3d/physics_body.cpp scene/resources/world.cpp +#: servers/physics/space_sw.cpp servers/physics_server.cpp +msgid "3D" +msgstr "" + +#: core/project_settings.cpp +msgid "Smooth Trimesh Collision" +msgstr "" + +#: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles2/rasterizer_scene_gles2.cpp +#: drivers/gles2/rasterizer_storage_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +#: drivers/gles3/rasterizer_scene_gles3.cpp +#: drivers/gles3/rasterizer_storage_gles3.cpp main/main.cpp +#: modules/lightmapper_cpu/register_types.cpp scene/main/scene_tree.cpp +#: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp +#: servers/visual_server.cpp +msgid "Rendering" +msgstr "" + +#: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp +#: drivers/gles3/rasterizer_scene_gles3.cpp +#: drivers/gles3/rasterizer_storage_gles3.cpp main/main.cpp +#: modules/lightmapper_cpu/register_types.cpp scene/3d/baked_lightmap.cpp +#: scene/main/scene_tree.cpp scene/resources/environment.cpp +#: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp +#: servers/visual_server.cpp +msgid "Quality" +msgstr "" + +#: core/project_settings.cpp scene/gui/file_dialog.cpp +#: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp +#: servers/visual_server.cpp +msgid "Filters" +msgstr "" + +#: core/project_settings.cpp scene/main/viewport.cpp +msgid "Sharpen Intensity" +msgstr "" + +#: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp +#: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp +#: editor/project_export.cpp main/main.cpp modules/gdscript/gdscript.cpp +#: modules/visual_script/visual_script.cpp +#: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp +#: platform/javascript/export/export.cpp platform/osx/export/export.cpp +#: platform/uwp/export/export.cpp scene/3d/room_manager.cpp +#: scene/main/scene_tree.cpp scene/resources/shape_2d.cpp +#: servers/visual_server.cpp +msgid "Debug" +msgstr "" + +#: core/project_settings.cpp main/main.cpp modules/gdscript/gdscript.cpp +#: modules/visual_script/visual_script.cpp scene/resources/dynamic_font.cpp +msgid "Settings" +msgstr "" + +#: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp +#: modules/mono/mono_gd/gd_mono.cpp +msgid "Profiler" +msgstr "" + +#: core/project_settings.cpp +msgid "Max Functions" +msgstr "" + +#: core/project_settings.cpp scene/3d/vehicle_body.cpp +msgid "Compression" +msgstr "" + +#: core/project_settings.cpp +msgid "Formats" +msgstr "" + +#: core/project_settings.cpp +msgid "Zstd" +msgstr "" + +#: core/project_settings.cpp +msgid "Long Distance Matching" +msgstr "" + +#: core/project_settings.cpp +msgid "Compression Level" +msgstr "" + +#: core/project_settings.cpp +msgid "Window Log Size" +msgstr "" + +#: core/project_settings.cpp +msgid "Zlib" +msgstr "" + +#: core/project_settings.cpp +msgid "Gzip" +msgstr "" + +#: core/project_settings.cpp platform/android/export/export.cpp +msgid "Android" +msgstr "" + +#: core/project_settings.cpp +msgid "Modules" +msgstr "" + +#: core/register_core_types.cpp +msgid "TCP" +msgstr "" + +#: core/register_core_types.cpp +msgid "Connect Timeout Seconds" +msgstr "" + +#: core/register_core_types.cpp +msgid "Packet Peer Stream" +msgstr "" + +#: core/register_core_types.cpp +msgid "Max Buffer (Power of 2)" +msgstr "" + +#: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp +msgid "SSL" +msgstr "" + +#: core/register_core_types.cpp main/main.cpp +msgid "Certificates" +msgstr "" + +#: core/resource.cpp editor/dependency_editor.cpp +#: editor/editor_resource_picker.cpp +#: modules/visual_script/visual_script_nodes.cpp +msgid "Resource" +msgstr "" + +#: core/resource.cpp +msgid "Local To Scene" +msgstr "" + +#: core/resource.cpp editor/dependency_editor.cpp +#: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp +#: editor/project_manager.cpp editor/project_settings_editor.cpp +#: modules/visual_script/visual_script_nodes.cpp +msgid "Path" +msgstr "" + +#: core/script_language.cpp +msgid "Source Code" +msgstr "" + +#: core/translation.cpp editor/project_settings_editor.cpp +msgid "Locale" +msgstr "" + +#: core/translation.cpp +msgid "Test" +msgstr "" + +#: core/translation.cpp scene/resources/font.cpp +msgid "Fallback" +msgstr "" + +#: core/ustring.cpp scene/resources/segment_shape_2d.cpp +msgid "B" +msgstr "" + +#: core/ustring.cpp +msgid "KiB" +msgstr "" + +#: core/ustring.cpp +msgid "MiB" +msgstr "" + +#: core/ustring.cpp +msgid "GiB" +msgstr "" + +#: core/ustring.cpp +msgid "TiB" +msgstr "" + +#: core/ustring.cpp +msgid "PiB" +msgstr "" + +#: core/ustring.cpp +msgid "EiB" +msgstr "" + +#: drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles2/rasterizer_scene_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +#: drivers/gles3/rasterizer_scene_gles3.cpp +#: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp +msgid "Buffers" +msgstr "" + +#: drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +msgid "Canvas Polygon Buffer Size (KB)" +msgstr "" + +#: drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +msgid "Canvas Polygon Index Buffer Size (KB)" +msgstr "" + +#: drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp editor/editor_settings.cpp +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp main/main.cpp +#: scene/2d/physics_body_2d.cpp scene/resources/world_2d.cpp +#: servers/physics_2d/physics_2d_server_sw.cpp +#: servers/physics_2d/physics_2d_server_wrap_mt.h +#: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp +#: servers/visual_server.cpp +msgid "2D" +msgstr "" + +#: drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +msgid "Snapping" +msgstr "" + +#: drivers/gles2/rasterizer_canvas_base_gles2.cpp +#: drivers/gles3/rasterizer_canvas_base_gles3.cpp +msgid "Use GPU Pixel Snap" +msgstr "" + +#: drivers/gles2/rasterizer_scene_gles2.cpp +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Immediate Buffer Size (KB)" +msgstr "" + +#: drivers/gles2/rasterizer_storage_gles2.cpp +#: drivers/gles3/rasterizer_storage_gles3.cpp +msgid "Lightmapping" +msgstr "" + +#: drivers/gles2/rasterizer_storage_gles2.cpp +#: drivers/gles3/rasterizer_storage_gles3.cpp +msgid "Use Bicubic Sampling" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Max Renderable Elements" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Max Renderable Lights" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Max Renderable Reflections" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Max Lights Per Object" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Subsurface Scattering" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp +#: editor/import/resource_importer_texture.cpp +#: editor/plugins/spatial_editor_plugin.cpp modules/gltf/gltf_node.cpp +#: modules/gridmap/grid_map.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/node_2d.cpp scene/2d/parallax_layer.cpp scene/2d/polygon_2d.cpp +#: scene/2d/remote_transform_2d.cpp scene/3d/cpu_particles.cpp +#: scene/3d/remote_transform.cpp scene/3d/spatial.cpp +#: scene/animation/animation_blend_tree.cpp scene/gui/control.cpp +#: scene/main/canvas_layer.cpp scene/resources/environment.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +msgid "Scale" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Follow Surface" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Weight Samples" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp +msgid "Voxel Cone Tracing" +msgstr "" + +#: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp +msgid "High Quality" +msgstr "" + +#: drivers/gles3/rasterizer_storage_gles3.cpp +msgid "Blend Shape Max Buffer Size (KB)" +msgstr "" + +#. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). +#: editor/animation_bezier_editor.cpp +msgid "Free" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Balanced" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Mirror" +msgstr "" + +#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp +msgid "Time:" +msgstr "" + +#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +msgid "Value:" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Insert Key Here" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Duplicate Selected Key(s)" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Delete Selected Key(s)" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Add Bezier Point" +msgstr "" + +#: editor/animation_bezier_editor.cpp +msgid "Move Bezier Points" +msgstr "" + +#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +msgid "Anim Duplicate Keys" +msgstr "" + +#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +msgid "Anim Delete Keys" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp +#: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Frame" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_profiler.cpp +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +#: scene/resources/particles_material.cpp servers/visual_server.cpp +msgid "Time" +msgstr "" + +#: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp +#: platform/osx/export/export.cpp +msgid "Location" +msgstr "" + +#: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp +#: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp +#: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp +msgid "Rotation" +msgstr "" + +#: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp +#: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp +msgid "Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Arg Count" +msgstr "" + +#: editor/animation_track_editor.cpp main/main.cpp +#: modules/mono/mono_gd/gd_mono.cpp +msgid "Args" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_settings.cpp +#: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp +#: modules/gltf/gltf_light.cpp modules/visual_script/visual_script_nodes.cpp +#: scene/3d/physics_body.cpp scene/resources/visual_shader_nodes.cpp +msgid "Type" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "In Handle" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Out Handle" +msgstr "" + +#: editor/animation_track_editor.cpp +#: editor/import/resource_importer_texture.cpp +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp +msgid "Stream" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Start Offset" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "End Offset" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_settings.cpp +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +#: scene/2d/animated_sprite.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/sprite.cpp scene/3d/cpu_particles.cpp scene/3d/sprite_3d.cpp +#: scene/animation/animation_blend_tree.cpp +#: scene/resources/particles_material.cpp +msgid "Animation" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Easing" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Length" +msgstr "" + +#: editor/animation_track_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation Loop" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Property Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "3D Transform Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Call Method Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Bezier Curve Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Audio Playback Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation Playback Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation length (frames)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation length (seconds)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Add Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation Looping" +msgstr "" + +#: editor/animation_track_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Functions:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Audio Clips:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Clips:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Track Path" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Toggle this track on/off." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Update Mode (How this property is set)" +msgstr "" + +#: editor/animation_track_editor.cpp scene/resources/gradient.cpp +msgid "Interpolation Mode" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Remove this track." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Time (s):" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Position:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Rotation:" +msgstr "" + +#: editor/animation_track_editor.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Scale:" +msgstr "" + +#: editor/animation_track_editor.cpp +#: 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 "" + +#: editor/animation_track_editor.cpp +msgid "(Invalid, expected type: %s)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Easing:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "In-Handle:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Out-Handle:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Stream:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Start (s):" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "End (s):" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation Clip:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Toggle Track Enabled" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Continuous" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Discrete" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Trigger" +msgstr "" + +#: editor/animation_track_editor.cpp scene/3d/baked_lightmap.cpp +msgid "Capture" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Nearest" +msgstr "" + +#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp +#: editor/property_editor.cpp scene/2d/physics_body_2d.cpp +#: scene/3d/physics_body.cpp +msgid "Linear" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Cubic" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clamp Loop Interp" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Wrap Loop Interp" +msgstr "" + +#: editor/animation_track_editor.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Duplicate Key(s)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Add RESET Value(s)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Delete Key(s)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Update Mode" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Interpolation Mode" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Loop Mode" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Remove Anim Track" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_settings.cpp +#: editor/plugins/path_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Editors" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_settings.cpp +msgid "Confirm Insert Track" +msgstr "" + +#. TRANSLATORS: %s will be replaced by a phrase describing the target of track. +#: editor/animation_track_editor.cpp +msgid "Create NEW track for %s and insert key?" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Create %d NEW tracks and insert keys?" +msgstr "" + +#: editor/animation_track_editor.cpp editor/create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/mesh_instance_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/version_control_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/script_create_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Create" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Insert" +msgstr "" + +#. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. +#: editor/animation_track_editor.cpp +msgid "node '%s'" +msgstr "" + +#. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. +#: editor/animation_track_editor.cpp +msgid "animation" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "AnimationPlayer can't animate itself, only other players." +msgstr "" + +#. TRANSLATORS: This describes the target of new animation track, will be inserted into another string. +#: editor/animation_track_editor.cpp +msgid "property '%s'" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Create & Insert" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Insert Track & Key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Insert Key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Step" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Rearrange Tracks" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Transform tracks only apply to Spatial-based nodes." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "" +"Audio tracks can only point to nodes of type:\n" +"-AudioStreamPlayer\n" +"-AudioStreamPlayer2D\n" +"-AudioStreamPlayer3D" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation tracks can only point to AnimationPlayer nodes." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Not possible to add a new track without a root" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Invalid track for Bezier (no suitable sub-properties)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Add Bezier Track" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Track path is invalid, so can't add a key." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Track is not of type Spatial, can't insert key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Add Transform Track Key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Add Track Key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Track path is invalid, so can't add a method key." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Add Method Track Key" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Method not found in object:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Move Keys" +msgstr "" + +#: editor/animation_track_editor.cpp editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp scene/2d/node_2d.cpp +#: scene/3d/spatial.cpp scene/main/canvas_layer.cpp +#: servers/camera/camera_feed.cpp servers/physics_2d_server.cpp +#: servers/physics_server.cpp +msgid "Transform" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_help.cpp +msgid "Methods" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Bezier" +msgstr "" + +#: editor/animation_track_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Paste Tracks" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Scale Keys" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "" +"This option does not work for Bezier editing, as it's only a single track." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Add RESET Keys" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "" +"This animation belongs to an imported scene, so changes to imported tracks " +"will not be saved.\n" +"\n" +"To enable the ability to add custom tracks, navigate to the scene's import " +"settings and set\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom " +"Tracks\", then re-import.\n" +"Alternatively, use an import preset that imports animations to separate " +"files." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Warning: Editing imported animation" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Select an AnimationPlayer node to create and edit animations." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Only show tracks from nodes selected in tree." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Group tracks by node or display them as plain list." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Snap:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation step value." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "" + +#: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp main/main.cpp +#: scene/resources/texture.cpp +msgid "FPS" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_plugin_settings.cpp +#: editor/editor_resource_picker.cpp editor/import/resource_importer_wav.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/tile_set_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Animation properties." +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Copy Tracks" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Scale Selection" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Scale From Cursor" +msgstr "" + +#: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Duplicate Selection" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Duplicate Transposed" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Delete Selection" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Go to Next Step" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Go to Previous Step" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Apply Reset" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Optimize Animation" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clean-Up Animation" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Pick the node that will be animated:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Use Bezier Curves" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Create RESET Track(s)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim. Optimizer" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Max. Linear Error:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Max. Angular Error:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Max Optimizable Angle:" +msgstr "" + +#: editor/animation_track_editor.cpp scene/3d/room_manager.cpp +#: servers/visual_server.cpp +msgid "Optimize" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Remove invalid keys" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Remove unresolved and empty tracks" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clean-up all animations" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Clean-Up" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Scale Ratio:" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Select Tracks to Copy" +msgstr "" + +#: editor/animation_track_editor.cpp editor/editor_log.cpp +#: editor/editor_resource_picker.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Copy" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Select All/None" +msgstr "" + +#: editor/animation_track_editor_plugins.cpp +msgid "Add Audio Track Clip" +msgstr "" + +#: editor/animation_track_editor_plugins.cpp +msgid "Change Audio Track Clip Start Offset" +msgstr "" + +#: editor/animation_track_editor_plugins.cpp +msgid "Change Audio Track Clip End Offset" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Resize Array" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Change Array Value Type" +msgstr "" + +#: editor/array_property_edit.cpp +msgid "Change Array Value" +msgstr "" + +#: editor/code_editor.cpp +msgid "Go to Line" +msgstr "" + +#: editor/code_editor.cpp +msgid "Line Number:" +msgstr "" + +#: editor/code_editor.cpp +msgid "%d replaced." +msgstr "" + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "%d match." +msgstr "" + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "%d matches." +msgstr "" + +#: editor/code_editor.cpp editor/find_in_files.cpp +msgid "Match Case" +msgstr "" + +#: editor/code_editor.cpp editor/find_in_files.cpp +msgid "Whole Words" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace" +msgstr "" + +#: editor/code_editor.cpp +msgid "Replace All" +msgstr "" + +#: editor/code_editor.cpp +msgid "Selection Only" +msgstr "" + +#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp +#: editor/plugins/text_editor.cpp +msgid "Standard" +msgstr "" + +#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp +msgid "Toggle Scripts Panel" +msgstr "" + +#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/sprite_frames_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 "" + +#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/sprite_frames_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 "" + +#: editor/code_editor.cpp +msgid "Reset Zoom" +msgstr "" + +#: editor/code_editor.cpp modules/gdscript/gdscript.cpp +msgid "Warnings" +msgstr "" + +#: editor/code_editor.cpp +msgid "Line and column numbers." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Method in target node must be specified." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Method name must be a valid identifier." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "" +"Target method not found. Specify a valid method or attach a script to the " +"target node." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect to Node:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect to Script:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "From Signal:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Scene does not contain any script." +msgstr "" + +#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp +#: editor/groups_editor.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Add" +msgstr "" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/version_control_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp +msgid "Remove" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Add Extra Call Argument:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Extra Call Arguments:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Receiver Method:" +msgstr "" + +#: editor/connections_dialog.cpp scene/3d/room_manager.cpp +#: servers/visual_server.cpp +msgid "Advanced" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Deferred" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "" +"Defers the signal, storing it in a queue and only firing it at idle time." +msgstr "" + +#: editor/connections_dialog.cpp scene/resources/texture.cpp +msgid "Oneshot" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Disconnects the signal after its first emission." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Cannot connect signal" +msgstr "" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/export_template_manager.cpp editor/groups_editor.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Close" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect '%s' to '%s'" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Disconnect '%s' from '%s'" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Disconnect all from signal: '%s'" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect..." +msgstr "" + +#: editor/connections_dialog.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Disconnect" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect a Signal to a Method" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Edit Connection:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Are you sure you want to remove all connections from the \"%s\" signal?" +msgstr "" + +#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp +msgid "Signals" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Filter signals" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Are you sure you want to remove all connections from this signal?" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Disconnect All" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Edit..." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Go to Method" +msgstr "" + +#: editor/create_dialog.cpp +msgid "Change %s Type" +msgstr "" + +#: editor/create_dialog.cpp editor/project_settings_editor.cpp +msgid "Change" +msgstr "" + +#: editor/create_dialog.cpp +msgid "Create New %s" +msgstr "" + +#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp +msgid "No results for \"%s\"." +msgstr "" + +#: editor/create_dialog.cpp editor/property_selector.cpp +msgid "No description available for %s." +msgstr "" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp +msgid "Favorites:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +msgid "Recent:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_quick_open.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/rename_dialog.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Search:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_quick_open.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Matches:" +msgstr "" + +#: editor/create_dialog.cpp editor/editor_feature_profile.cpp +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Description:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Search Replacement For:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependencies For:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will only take effect when reloaded." +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"Resource '%s' is in use.\n" +"Changes will only take effect when reloaded." +msgstr "" + +#: editor/dependency_editor.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Dependencies" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependencies:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Fix Broken" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Dependency Editor" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Search Replacement Resource:" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp +#: editor/editor_help_search.cpp editor/editor_node.cpp +#: editor/editor_quick_open.cpp editor/filesystem_dock.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/script_create_dialog.cpp +#: modules/visual_script/visual_script_property_selector.cpp +#: scene/gui/file_dialog.cpp +msgid "Open" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Owners of: %s (Total: %d)" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"Remove the selected files from the project? (Cannot be undone.)\n" +"Depending on your filesystem configuration, the files will either be moved " +"to the system trash or deleted permanently." +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"The files being removed are required by other resources in order for them to " +"work.\n" +"Remove them anyway? (Cannot be undone.)\n" +"Depending on your filesystem configuration, the files will either be moved " +"to the system trash or deleted permanently." +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Cannot remove:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Error loading:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Load failed due to missing dependencies:" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Open Anyway" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Which action should be taken?" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Fix Dependencies" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Errors loading!" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Show Dependencies" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Orphan Resource Explorer" +msgstr "" + +#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp +msgid "Delete" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Owns" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Resources Without Explicit Ownership:" +msgstr "" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Key" +msgstr "" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Value" +msgstr "" + +#: editor/editor_about.cpp +msgid "Thanks from the Godot community!" +msgstr "" + +#: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp +msgid "Click to copy." +msgstr "" + +#: editor/editor_about.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Project Founders" +msgstr "" + +#: editor/editor_about.cpp +msgid "Lead Developer" +msgstr "" + +#. TRANSLATORS: This refers to a job title. +#: editor/editor_about.cpp +msgctxt "Job Title" +msgid "Project Manager" +msgstr "" + +#: editor/editor_about.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_about.cpp +msgid "Authors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Platinum Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Gold Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Silver Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Bronze Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Mini Sponsors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Gold Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Silver Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Bronze Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "Donors" +msgstr "" + +#: editor/editor_about.cpp +msgid "License" +msgstr "" + +#: editor/editor_about.cpp +msgid "Third-party Licenses" +msgstr "" + +#: editor/editor_about.cpp +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 " +"is an exhaustive list of all such third-party components with their " +"respective copyright statements and license terms." +msgstr "" + +#: editor/editor_about.cpp +msgid "All Components" +msgstr "" + +#: editor/editor_about.cpp +msgid "Components" +msgstr "" + +#: editor/editor_about.cpp +msgid "Licenses" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Error opening asset file for \"%s\" (not in ZIP format)." +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "%s (already exists)" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Contents of asset \"%s\" - No files conflict with your project:" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Uncompressing Assets" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "The following files failed extraction from asset \"%s\":" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "(and %s more files)" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Asset \"%s\" installed successfully!" +msgstr "" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Success!" +msgstr "" + +#: editor/editor_asset_installer.cpp editor/editor_node.cpp +msgid "Install" +msgstr "" + +#: editor/editor_asset_installer.cpp +msgid "Asset Installer" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Speakers" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Rename Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Change Audio Bus Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Solo" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Mute" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Bypass Effects" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Select Audio Bus Send" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Move Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Bus Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Drag & drop to rearrange." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Solo" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Mute" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Bypass" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Bus Options" +msgstr "" + +#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp +#: editor/project_export.cpp editor/scene_tree_dock.cpp +msgid "Duplicate" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Reset Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Effect" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Master bus can't be deleted!" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Delete Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Duplicate Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Reset Bus Volume" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Move Audio Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save Audio Bus Layout As..." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Location for New Layout..." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Open Audio Bus Layout" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "There is no '%s' file." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Layout:" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Invalid file, not an audio bus layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Error saving file: %s" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Bus" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add a new Audio Bus to this layout." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/editor_resource_picker.cpp +#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Load" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Load an existing Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save As" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Save this Bus Layout to a file." +msgstr "" + +#: editor/editor_audio_buses.cpp editor/import_dock.cpp +msgid "Load Default" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Load the default Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Create a new Bus Layout." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Audio Bus Layout" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Cannot begin with a digit." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Valid characters:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Must not collide with an existing engine class name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Must not collide with an existing built-in type name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Must not collide with an existing global constant name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Keyword cannot be used as an autoload name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Autoload '%s' already exists!" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rename Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Toggle AutoLoad Globals" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Move Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Remove Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp +#: modules/gdscript/gdscript.cpp platform/android/export/export_plugin.cpp +#: platform/osx/export/export.cpp platform/windows/export/export.cpp +#: scene/2d/polygon_2d.cpp scene/3d/area.cpp scene/3d/physics_joint.cpp +#: scene/3d/reflection_probe.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp servers/visual_server.cpp +msgid "Enable" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rearrange Autoloads" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Can't add autoload:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "%s is an invalid path. File does not exist." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "%s is an invalid path. Not in resource path (res://)." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Add AutoLoad" +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 "" + +#: editor/editor_autoload_settings.cpp +msgid "Node Name:" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Global Variable" +msgstr "" + +#: editor/editor_data.cpp +msgid "Paste Params" +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating Scene" +msgstr "" + +#: editor/editor_data.cpp +msgid "Storing local changes..." +msgstr "" + +#: editor/editor_data.cpp +msgid "Updating scene..." +msgstr "" + +#: editor/editor_data.cpp editor/editor_resource_picker.cpp +msgid "[empty]" +msgstr "" + +#: editor/editor_data.cpp editor/plugins/script_text_editor.cpp +#: editor/plugins/text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "[unsaved]" +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Please select a base directory first." +msgstr "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose a Directory" +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 "" + +#: 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 +#: editor/script_create_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp +msgid "Name:" +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 "" + +#: editor/editor_dir_dialog.cpp +msgid "Choose" +msgstr "" + +#: editor/editor_export.cpp +msgid "Project export for platform:" +msgstr "" + +#: editor/editor_export.cpp +msgid "Completed with warnings." +msgstr "" + +#: editor/editor_export.cpp +msgid "Completed successfully." +msgstr "" + +#: editor/editor_export.cpp +msgid "Failed." +msgstr "" + +#: editor/editor_export.cpp +msgid "Storing File:" +msgstr "" + +#: editor/editor_export.cpp +msgid "No export template found at the expected path:" +msgstr "" + +#: editor/editor_export.cpp +msgid "Packing" +msgstr "" + +#: editor/editor_export.cpp +msgid "Save PCK" +msgstr "" + +#: editor/editor_export.cpp +msgid "Cannot create file \"%s\"." +msgstr "" + +#: editor/editor_export.cpp +msgid "Failed to export project files." +msgstr "" + +#: editor/editor_export.cpp +msgid "Can't open file to read from path \"%s\"." +msgstr "" + +#: editor/editor_export.cpp +msgid "Save ZIP" +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " +"Etc' in Project Settings." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC2' texture compression for GLES3. Enable " +"'Import Etc 2' in Project Settings." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC' texture compression for the driver fallback " +"to GLES2.\n" +"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " +"Enabled'." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'PVRTC' texture compression for GLES2. Enable " +"'Import Pvrtc' in Project Settings." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC2' or 'PVRTC' texture compression for GLES3. " +"Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." +msgstr "" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'PVRTC' texture compression for the driver fallback " +"to GLES2.\n" +"Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " +"Enabled'." +msgstr "" + +#: editor/editor_export.cpp platform/android/export/export_plugin.cpp +#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp +#: platform/osx/export/export.cpp platform/uwp/export/export.cpp +msgid "Custom Template" +msgstr "" + +#: editor/editor_export.cpp editor/project_export.cpp +#: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp +#: platform/javascript/export/export.cpp platform/osx/export/export.cpp +#: platform/uwp/export/export.cpp +msgid "Release" +msgstr "" + +#: editor/editor_export.cpp +msgid "Binary Format" +msgstr "" + +#: editor/editor_export.cpp +msgid "64 Bits" +msgstr "" + +#: editor/editor_export.cpp +msgid "Embed PCK" +msgstr "" + +#: editor/editor_export.cpp platform/osx/export/export.cpp +msgid "Texture Format" +msgstr "" + +#: editor/editor_export.cpp +msgid "BPTC" +msgstr "" + +#: editor/editor_export.cpp platform/osx/export/export.cpp +msgid "S3TC" +msgstr "" + +#: editor/editor_export.cpp platform/osx/export/export.cpp +msgid "ETC" +msgstr "" + +#: editor/editor_export.cpp platform/osx/export/export.cpp +msgid "ETC2" +msgstr "" + +#: editor/editor_export.cpp +msgid "No BPTC Fallbacks" +msgstr "" + +#: editor/editor_export.cpp platform/android/export/export_plugin.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 "" + +#: editor/editor_export.cpp platform/android/export/export_plugin.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 "" + +#: editor/editor_export.cpp +msgid "Prepare Template" +msgstr "" + +#: editor/editor_export.cpp platform/osx/export/export.cpp +msgid "The given export path doesn't exist." +msgstr "" + +#: editor/editor_export.cpp platform/javascript/export/export.cpp +msgid "Template file not found: \"%s\"." +msgstr "" + +#: editor/editor_export.cpp +msgid "Failed to copy export template." +msgstr "" + +#: editor/editor_export.cpp platform/windows/export/export.cpp +#: platform/x11/export/export.cpp +msgid "PCK Embedding" +msgstr "" + +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + +#: editor/editor_export.cpp +msgid "Convert Text Resources To Binary On Export" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "3D Editor" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Script Editor" +msgstr "" + +#: editor/editor_feature_profile.cpp +#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Asset Library" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Scene Tree Editing" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Node Dock" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "FileSystem Dock" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Import Dock" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Allows to view and edit 3D scenes." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Allows to edit scripts using the integrated script editor." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Provides built-in access to the Asset Library." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Allows editing the node hierarchy in the Scene dock." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "" +"Allows to work with signals and groups of the node selected in the Scene " +"dock." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Allows to browse the local file system via a dedicated dock." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "" +"Allows to configure import settings for individual assets. Requires the " +"FileSystem dock to function." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "(current)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "(none)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Remove currently selected profile, '%s'? Cannot be undone." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Profile must be a valid filename and must not contain '.'" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Profile with this name already exists." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "(Editor Disabled, Properties Disabled)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "(Properties Disabled)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "(Editor Disabled)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Class Options:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Enable Contextual Editor" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Class Properties:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Main Features:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Nodes and Classes:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "File '%s' format is invalid, import aborted." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "" +"Profile '%s' already exists. Remove it first before importing, import " +"aborted." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Error saving profile to path: '%s'." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Reset to Default" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Current Profile:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Create Profile" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Remove Profile" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Available Profiles:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Make Current" +msgstr "" + +#: editor/editor_feature_profile.cpp editor/editor_node.cpp +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: modules/fbx/editor_scene_importer_fbx.cpp +msgid "Import" +msgstr "" + +#: editor/editor_feature_profile.cpp editor/project_export.cpp +#: platform/android/export/export.cpp platform/android/export/export_plugin.cpp +#: platform/javascript/export/export.cpp platform/osx/export/export.cpp +#: platform/uwp/export/export.cpp platform/windows/export/export.cpp +msgid "Export" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Configure Selected Profile:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Extra Options:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Create or import a profile to edit available classes and properties." +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "New profile name:" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Godot Feature Profile" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Import Profile(s)" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Export Profile" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Manage Editor Feature Profiles" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Default Feature Profile" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select Current Folder" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "File exists, overwrite?" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select This Folder" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "Copy Path" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "Open in File Manager" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/filesystem_dock.cpp editor/project_manager.cpp +msgid "Show in File Manager" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "New Folder..." +msgstr "" + +#: editor/editor_file_dialog.cpp editor/find_in_files.cpp +msgid "Refresh" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Recognized" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Files (*)" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open File(s)" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a Directory" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File or Directory" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/editor_resource_picker.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "Save" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Save a File" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Access" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_settings.cpp +msgid "Display Mode" +msgstr "" + +#: editor/editor_file_dialog.cpp +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp +#: editor/import/resource_importer_wav.cpp main/main.cpp +#: modules/csg/csg_shape.cpp modules/visual_script/visual_script_nodes.cpp +#: scene/2d/light_2d.cpp scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp +#: scene/3d/baked_lightmap.cpp scene/3d/light.cpp scene/3d/physics_body.cpp +#: scene/gui/control.cpp scene/gui/file_dialog.cpp +#: scene/resources/environment.cpp scene/resources/material.cpp +#: scene/resources/visual_shader.cpp +#: servers/audio/effects/audio_effect_distortion.cpp +msgid "Mode" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Current Dir" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Current File" +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Current Path" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_settings.cpp +#: scene/gui/file_dialog.cpp +msgid "Show Hidden Files" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Disable Overwrite Warning" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Back" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Forward" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go Up" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Hidden Files" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Favorite" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/editor_resource_picker.cpp +#: scene/gui/base_button.cpp +msgid "Toggle Mode" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Focus Path" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Up" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Down" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go to previous folder." +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Go to next folder." +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Go to parent folder." +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "(Un)favorite current folder." +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." +msgstr "" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "View items as a grid of thumbnails." +msgstr "" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "View items as a list." +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Directories & Files:" +msgstr "" + +#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp +#: editor/plugins/style_box_editor_plugin.cpp editor/rename_dialog.cpp +msgid "Preview:" +msgstr "" + +#: editor/editor_file_dialog.cpp +#: editor/plugins/version_control_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "File:" +msgstr "" + +#: editor/editor_file_system.cpp +msgid "ScanSources" +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 "" + +#: editor/editor_file_system.cpp +msgid "Reimport Missing Imported Files" +msgstr "" + +#: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp +#: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp +#: scene/resources/style_box.cpp scene/resources/texture.cpp +msgid "Top" +msgstr "" + +#: editor/editor_help.cpp +msgid "Class:" +msgstr "" + +#: editor/editor_help.cpp editor/scene_tree_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Inherits:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Inherited by:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Online Tutorials" +msgstr "" + +#: editor/editor_help.cpp +msgid "Properties" +msgstr "" + +#: editor/editor_help.cpp +msgid "overrides %s:" +msgstr "" + +#: editor/editor_help.cpp +msgid "default:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Theme Properties" +msgstr "" + +#: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/gradient.cpp +msgid "Colors" +msgstr "" + +#: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Constants" +msgstr "" + +#: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Fonts" +msgstr "" + +#: editor/editor_help.cpp editor/plugins/theme_editor_plugin.cpp +#: platform/iphone/export/export.cpp +msgid "Icons" +msgstr "" + +#: editor/editor_help.cpp +msgid "Styles" +msgstr "" + +#: editor/editor_help.cpp +msgid "Enumerations" +msgstr "" + +#: editor/editor_help.cpp +msgid "Property Descriptions" +msgstr "" + +#: editor/editor_help.cpp +msgid "(value)" +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 "" + +#: editor/editor_help.cpp +msgid "Method Descriptions" +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 "" + +#: editor/editor_help.cpp editor/editor_settings.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: modules/gdscript/editor/gdscript_highlighter.cpp +#: modules/gdscript/gdscript_editor.cpp +msgid "Text Editor" +msgstr "" + +#: editor/editor_help.cpp editor/editor_node.cpp editor/editor_settings.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Help" +msgstr "" + +#: editor/editor_help.cpp +msgid "Sort Functions Alphabetically" +msgstr "" + +#: editor/editor_help_search.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Help" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Case Sensitive" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Show Hierarchy" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Display All" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Classes Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Methods Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Signals Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Constants Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Properties Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Theme Properties Only" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Member Type" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Class" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Method" +msgstr "" + +#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Signal" +msgstr "" + +#: editor/editor_help_search.cpp modules/visual_script/visual_script_nodes.cpp +#: scene/resources/visual_shader_nodes.cpp +msgid "Constant" +msgstr "" + +#: editor/editor_help_search.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Property" +msgstr "" + +#: editor/editor_help_search.cpp +msgid "Theme Property" +msgstr "" + +#: editor/editor_inspector.cpp editor/project_settings_editor.cpp +msgid "Property:" +msgstr "" + +#: editor/editor_inspector.cpp editor/editor_spin_slider.cpp +msgid "Label" +msgstr "" + +#: editor/editor_inspector.cpp editor/editor_spin_slider.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Read Only" +msgstr "" + +#: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp +msgid "Checkable" +msgstr "" + +#: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Checked" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Draw Red" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Keying" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Pin value" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "" +"Pinning a value forces it to be saved even if it's equal to the default." +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Pin value [Disabled because '%s' is editor-only]" +msgstr "" + +#: editor/editor_inspector.cpp +#: editor/plugins/gradient_texture_2d_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_nodes.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Set %s" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Set Multiple:" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Pinned %s" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Unpinned %s" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Copy Property" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Paste Property" +msgstr "" + +#: editor/editor_inspector.cpp +msgid "Copy Property Path" +msgstr "" + +#: editor/editor_log.cpp +msgid "Output:" +msgstr "" + +#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Copy Selection" +msgstr "" + +#: editor/editor_log.cpp editor/editor_network_profiler.cpp +#: editor/editor_profiler.cpp editor/editor_resource_picker.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/property_editor.cpp editor/scene_tree_dock.cpp +#: editor/script_editor_debugger.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp scene/resources/default_theme/default_theme.cpp +msgid "Clear" +msgstr "" + +#: editor/editor_log.cpp +msgid "Clear Output" +msgstr "" + +#: editor/editor_network_profiler.cpp editor/editor_node.cpp +#: editor/editor_profiler.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp +#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp +msgid "Start" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "%s/s" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Down" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Up" +msgstr "" + +#: editor/editor_network_profiler.cpp editor/editor_node.cpp +#: scene/main/node.cpp scene/resources/default_theme/default_theme.cpp +msgid "Node" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Incoming RPC" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Incoming RSET" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Outgoing RPC" +msgstr "" + +#: editor/editor_network_profiler.cpp +msgid "Outgoing RSET" +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "New Window" +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "Unnamed Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Spins when the editor window redraws.\n" +"Update Continuously is enabled, which can increase power usage. Click to " +"disable it." +msgstr "" + +#: editor/editor_node.cpp +msgid "Spins when the editor window redraws." +msgstr "" + +#: editor/editor_node.cpp +msgid "Imported resources can't be saved." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +#: modules/gltf/editor_scene_exporter_gltf_plugin.cpp scene/gui/dialogs.cpp +msgid "OK" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Error saving resource!" +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 "" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Save Resource As..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't open file for writing:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Requested file format unknown:" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while saving." +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 "" + +#: editor/editor_node.cpp +msgid "Error while parsing '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unexpected end of file '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Missing '%s' or its dependencies." +msgstr "" + +#: editor/editor_node.cpp +msgid "Error while loading '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Saving Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Analyzing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Creating Thumbnail" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a tree root." +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 "" + +#: editor/editor_node.cpp +msgid "" +"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " +"be satisfied." +msgstr "" + +#: editor/editor_node.cpp +msgid "Could not save one or more scenes!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "" + +#: editor/editor_node.cpp editor/scene_tree_dock.cpp +msgid "Can't overwrite scene that is still open!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load MeshLibrary for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving MeshLibrary!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load TileSet for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving TileSet!" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"An error occurred while trying to save the editor layout.\n" +"Make sure the editor's user data path is writable." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Default editor layout overridden.\n" +"To restore the Default layout to its base settings, use the Delete Layout " +"option and delete the Default layout." +msgstr "" + +#: editor/editor_node.cpp +msgid "Layout name not found!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Restored the Default layout to its base settings." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was imported, so it's not editable.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: 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 "" + +#: 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 "" +"This scene was imported, so changes to it won't be kept.\n" +"Instancing it or inheriting will allow making changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This is a remote object, so changes to it won't be kept.\n" +"Please read the documentation relevant to debugging to better understand " +"this workflow." +msgstr "" + +#: editor/editor_node.cpp +msgid "There is no defined scene to run." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save scene before running..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Could not start subprocess!" +msgstr "" + +#: editor/editor_node.cpp editor/filesystem_dock.cpp +msgid "Open Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Base Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Scene..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Script..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Reload" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to '%s' before reloading?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Close" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to '%s' before closing?" +msgstr "" + +#: editor/editor_node.cpp +msgid "%s no longer exists! Please specify a new save location." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"The current scene has no root node, but %d modified external resource(s) " +"were saved anyway." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"A root node is required to save the scene. You can add a root node using the " +"Scene tree dock." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene As..." +msgstr "" + +#: editor/editor_node.cpp modules/gltf/editor_scene_exporter_gltf_plugin.cpp +msgid "This operation can't be done without a scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Mesh Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a root node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Tile Set" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a selected node." +msgstr "" + +#: editor/editor_node.cpp +msgid "Current scene not saved. Open anyway?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't undo while mouse buttons are pressed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Nothing to undo." +msgstr "" + +#: editor/editor_node.cpp +msgid "Undo: %s" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't redo while mouse buttons are pressed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Nothing to redo." +msgstr "" + +#: editor/editor_node.cpp +msgid "Redo: %s" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't reload a scene that was never saved." +msgstr "" + +#: editor/editor_node.cpp +msgid "Reload Saved Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"The current scene has unsaved changes.\n" +"Reload the saved scene anyway? This action cannot be undone." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Run Scene..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Yes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Exit the editor?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Project Manager?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before reloading?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save & Quit" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before quitting?" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before opening Project Manager?" +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 "" + +#: editor/editor_node.cpp +msgid "Close Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Reopen Closed Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to enable addon plugin at: '%s' parsing of config failed." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s'." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s'. This might be due to a code " +"error in that script.\n" +"Disabling the addon at '%s' to prevent further errors." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s' Base type is not EditorPlugin." +msgstr "" + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s' Script is not in tool mode." +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 "" + +#: 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 "" + +#: editor/editor_node.cpp +msgid "Clear Recent Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"No main scene has ever been defined, select one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' does not exist, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' is not a scene file, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Delete Layout" +msgstr "" + +#: editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp +msgid "Default" +msgstr "" + +#: editor/editor_node.cpp editor/editor_resource_picker.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp +msgid "Show in FileSystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play This Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Close Tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Undo Close Tab" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Close Other Tabs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Close Tabs to the Right" +msgstr "" + +#: editor/editor_node.cpp +msgid "Close All Tabs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Switch Scene Tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files or folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more folders" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Unable to write to file '%s', file in use, locked or lacking permissions." +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp +#: servers/arvr/arvr_interface.cpp +msgid "Interface" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Scene Tabs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Always Show Close Button" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Resize If Many Tabs" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Minimum Width" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Output" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Always Clear Output On Play" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Always Open Output On Play" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Always Close Output On Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save On Focus Loss" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Save Each Scene On Quit" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Quit Confirmation" +msgstr "" + +#: editor/editor_node.cpp +msgid "Show Update Spinner" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Continuously" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Only" +msgstr "" + +#: editor/editor_node.cpp +msgid "Localize Settings" +msgstr "" + +#: editor/editor_node.cpp +msgid "Restore Scenes On Load" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Show Thumbnail On Hover" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +msgid "Inspector" +msgstr "" + +#: editor/editor_node.cpp +msgid "Default Property Name Style" +msgstr "" + +#: editor/editor_node.cpp +msgid "Default Float Step" +msgstr "" + +#: editor/editor_node.cpp scene/gui/tree.cpp +msgid "Disable Folding" +msgstr "" + +#: editor/editor_node.cpp +msgid "Auto Unfold Foreign Scenes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Horizontal Vector2 Editing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Horizontal Vector Types Editing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Resources In Current Inspector" +msgstr "" + +#: editor/editor_node.cpp +msgid "Resources To Open In New Inspector" +msgstr "" + +#: editor/editor_node.cpp +msgid "Default Color Picker Mode" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Username" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "SSH Public Key Path" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "SSH Private Key Path" +msgstr "" + +#: editor/editor_node.cpp +msgid "Dock Position" +msgstr "" + +#: editor/editor_node.cpp editor/editor_plugin.cpp +msgid "Distraction Free Mode" +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle distraction-free mode." +msgstr "" + +#: editor/editor_node.cpp +msgid "Add a new scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to previously opened scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Text" +msgstr "" + +#: editor/editor_node.cpp +msgid "Next tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Previous tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "Filter Files..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Operations with scene files." +msgstr "" + +#: editor/editor_node.cpp +msgid "New Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited Scene..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Scene..." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Open Recent" +msgstr "" + +#: editor/editor_node.cpp +msgid "Save Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Convert To..." +msgstr "" + +#: editor/editor_node.cpp +msgid "MeshLibrary..." +msgstr "" + +#: editor/editor_node.cpp +msgid "TileSet..." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Undo" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Redo" +msgstr "" + +#: editor/editor_node.cpp +msgid "Miscellaneous project or scene-wide tools." +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +#: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp +msgid "Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Project Settings..." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Set Up Version Control" +msgstr "" + +#: editor/editor_node.cpp +msgid "Shut Down Version Control" +msgstr "" + +#: editor/editor_node.cpp +msgid "Export..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Install Android Build Template..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Open User Data Folder" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Tools" +msgstr "" + +#: editor/editor_node.cpp +msgid "Orphan Resource Explorer..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Reload Current Project" +msgstr "" + +#: editor/editor_node.cpp +msgid "Quit to Project List" +msgstr "" + +#: editor/editor_node.cpp +msgid "Deploy with Remote Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, using one-click deploy will make the executable " +"attempt to connect to this computer's IP so the running project can be " +"debugged.\n" +"This option is intended to be used for remote debugging (typically with a " +"mobile device).\n" +"You don't need to enable it to use the GDScript debugger locally." +msgstr "" + +#: editor/editor_node.cpp +msgid "Small Deploy with Network Filesystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, using one-click deploy for Android will only " +"export an executable without the project data.\n" +"The filesystem will be provided from the project by the editor over the " +"network.\n" +"On Android, deploying will use the USB cable for faster performance. This " +"option speeds up testing for projects with large assets." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Collision Shapes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, collision shapes and raycast nodes (for 2D and " +"3D) will be visible in the running project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Navigation" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, navigation meshes and polygons will be visible " +"in the running project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Force Shader Fallbacks" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, shaders will be used in their fallback form " +"(either visible via an ubershader or hidden) during all the run time.\n" +"This is useful for verifying the look and performance of fallbacks, which " +"are normally displayed briefly.\n" +"Asynchronous shader compilation must be enabled in the project settings for " +"this option to make a difference." +msgstr "" + +#: editor/editor_node.cpp +msgid "Synchronize Scene Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, any changes made to the scene in the editor " +"will be replicated in the running project.\n" +"When used remotely on a device, this is more efficient when the network " +"filesystem option is enabled." +msgstr "" + +#: editor/editor_node.cpp +msgid "Synchronize Script Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, any script that is saved will be reloaded in " +"the running project.\n" +"When used remotely on a device, this is more efficient when the network " +"filesystem option is enabled." +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor Settings..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Editor Layout" +msgstr "" + +#: editor/editor_node.cpp +msgid "Take Screenshot" +msgstr "" + +#: editor/editor_node.cpp +msgid "Screenshots are stored in the Editor Data/Settings Folder." +msgstr "" + +#: editor/editor_node.cpp +msgid "Toggle Fullscreen" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Editor Data/Settings Folder" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Editor Data Folder" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Editor Settings Folder" +msgstr "" + +#: editor/editor_node.cpp +msgid "Manage Editor Features..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Manage Export Templates..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Online Documentation" +msgstr "" + +#: editor/editor_node.cpp +msgid "Questions & Answers" +msgstr "" + +#: editor/editor_node.cpp +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Suggest a Feature" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +msgid "Community" +msgstr "" + +#: editor/editor_node.cpp +msgid "About Godot" +msgstr "" + +#: editor/editor_node.cpp +msgid "Support Godot Development" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene execution for debugging." +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Changing the video driver requires restarting the editor." +msgstr "" + +#: editor/editor_node.cpp editor/project_settings_editor.cpp +#: editor/settings_config_dialog.cpp +msgid "Save & Restart" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update All Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Vital Changes" +msgstr "" + +#: editor/editor_node.cpp +msgid "Hide Update Spinner" +msgstr "" + +#: editor/editor_node.cpp editor/editor_settings.cpp +#: editor/fileserver/editor_file_server.cpp +#: modules/fbx/editor_scene_importer_fbx.cpp +msgid "FileSystem" +msgstr "" + +#: editor/editor_node.cpp +msgid "Expand Bottom Panel" +msgstr "" + +#: editor/editor_node.cpp +msgid "Don't Save" +msgstr "" + +#: editor/editor_node.cpp +msgid "Android build template is missing, please install relevant templates." +msgstr "" + +#: editor/editor_node.cpp +msgid "Manage Templates" +msgstr "" + +#: editor/editor_node.cpp +msgid "Install from file" +msgstr "" + +#: editor/editor_node.cpp +msgid "Select android sources file" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This will set up your project for custom Android builds by installing the " +"source template to \"res://android/build\".\n" +"You can then apply modifications and build your own custom APK on export " +"(adding modules, changing the AndroidManifest.xml, etc.).\n" +"Note that in order to make custom builds instead of using pre-built APKs, " +"the \"Use Custom Build\" option should be enabled in the Android export " +"preset." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"The Android build template is already installed in this project and it won't " +"be overwritten.\n" +"Remove the \"res://android/build\" directory manually before attempting this " +"operation again." +msgstr "" + +#: editor/editor_node.cpp +msgid "Import Templates From ZIP File" +msgstr "" + +#: editor/editor_node.cpp +msgid "Template Package" +msgstr "" + +#: editor/editor_node.cpp modules/gltf/editor_scene_exporter_gltf_plugin.cpp +msgid "Export Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Merge With Existing" +msgstr "" + +#: editor/editor_node.cpp +msgid "Apply MeshInstance Transforms" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open & Run a Script" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp +msgid "New Inherited" +msgstr "" + +#: editor/editor_node.cpp +msgid "Load Errors" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp +#: modules/visual_script/visual_script_nodes.cpp +msgid "Select" +msgstr "" + +#: editor/editor_node.cpp +msgid "Select Current" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + +#: editor/editor_node.h +msgid "Warning!" +msgstr "" + +#: editor/editor_path.cpp +msgid "No sub-resources found." +msgstr "" + +#: editor/editor_path.cpp +msgid "Open a list of sub-resources." +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Creating Mesh Previews" +msgstr "" + +#: editor/editor_plugin.cpp +msgid "Thumbnail..." +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Main Script:" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Edit Plugin" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Installed Plugins:" +msgstr "" + +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +#: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp +msgid "Update" +msgstr "" + +#: editor/editor_plugin_settings.cpp platform/android/export/export_plugin.cpp +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +#: platform/uwp/export/export.cpp +msgid "Version" +msgstr "" + +#: editor/editor_plugin_settings.cpp +msgid "Author" +msgstr "" + +#: editor/editor_plugin_settings.cpp +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Status" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Measure:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame Time (ms)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Average Time (ms)" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame %" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Physics Frame %" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Inclusive" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Self" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "" +"Inclusive: Includes time from other functions called by this function.\n" +"Use this to spot bottlenecks.\n" +"\n" +"Self: Only count the time spent in the function itself, not in other " +"functions called by that function.\n" +"Use this to find individual functions to optimize." +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Frame #:" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Calls" +msgstr "" + +#: editor/editor_profiler.cpp editor/plugins/script_editor_plugin.cpp +#: editor/script_editor_debugger.cpp +msgid "Debugger" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Profiler Frame History Size" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Profiler Frame Max Functions" +msgstr "" + +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "On" +msgstr "" + +#: editor/editor_properties.cpp modules/gridmap/grid_map.cpp +#: scene/2d/collision_object_2d.cpp scene/2d/tile_map.cpp +#: scene/3d/collision_object.cpp scene/3d/soft_body.cpp +#: scene/main/canvas_layer.cpp +msgid "Layer" +msgstr "" + +#: editor/editor_properties.cpp +msgid "Bit %d, value %d" +msgstr "" + +#: editor/editor_properties.cpp +msgid "[Empty]" +msgstr "" + +#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp +msgid "Assign..." +msgstr "" + +#: editor/editor_properties.cpp +msgid "Invalid RID" +msgstr "" + +#: 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 "" + +#: editor/editor_properties.cpp +msgid "" +"Can't create a ViewportTexture on this resource because it's not set as " +"local to scene.\n" +"Please switch on the 'local to scene' property on it (and all resources " +"containing it up to a node)." +msgstr "" + +#: editor/editor_properties.cpp editor/property_editor.cpp +msgid "Pick a Viewport" +msgstr "" + +#: editor/editor_properties.cpp editor/property_editor.cpp +msgid "Selected node is not a Viewport!" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +#: editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Size:" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +msgid "Page:" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Item" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +msgid "New Key:" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +msgid "New Value:" +msgstr "" + +#: editor/editor_properties_array_dict.cpp +msgid "Add Key/Value Pair" +msgstr "" + +#: editor/editor_resource_picker.cpp +msgid "" +"The selected resource (%s) does not match any type expected for this " +"property (%s)." +msgstr "" + +#: editor/editor_resource_picker.cpp +msgid "Quick Load" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/property_editor.cpp +msgid "Make Unique" +msgstr "" + +#: editor/editor_resource_picker.cpp +#: 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_player_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Paste" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/property_editor.cpp +msgid "Convert to %s" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/property_editor.cpp +msgid "New %s" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/plugins/theme_editor_plugin.cpp +#: modules/visual_script/visual_script_flow_control.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_nodes.cpp +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Base Type" +msgstr "" + +#: editor/editor_resource_picker.cpp +msgid "Edited Resource" +msgstr "" + +#: editor/editor_resource_picker.cpp scene/gui/line_edit.cpp +#: scene/gui/slider.cpp scene/gui/spin_box.cpp +msgid "Editable" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/property_editor.cpp +msgid "New Script" +msgstr "" + +#: editor/editor_resource_picker.cpp editor/scene_tree_dock.cpp +msgid "Extend Script" +msgstr "" + +#: editor/editor_resource_picker.cpp +msgid "Script Owner" +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 or define an existing preset " +"as runnable." +msgstr "" + +#: editor/editor_run_native.cpp +msgid "Project Run" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Write your logic in the _run() method." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "There is an edited scene already." +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't instance script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the 'tool' keyword?" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Couldn't run script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the '_run' method?" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Editor Language" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Display Scale" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Custom Display Scale" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Main Font Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Code Font Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Font Antialiased" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Font Hinting" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Main Font" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Main Font Bold" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Code Font" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Dim Editor On Dialog Popup" +msgstr "" + +#: editor/editor_settings.cpp main/main.cpp +msgid "Low Processor Mode Sleep (µsec)" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Unfocused Low Processor Mode Sleep (µsec)" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Separate Distraction Mode" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Automatically Open Screenshots" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Max Array Dictionary Items Per Page" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp +#: scene/register_scene_types.cpp +msgid "Theme" +msgstr "" + +#: editor/editor_settings.cpp editor/import_dock.cpp +msgid "Preset" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Icon And Font Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Base Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Accent Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/environment.cpp +msgid "Contrast" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Relationship Line Opacity" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Highlight Tabs" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Border Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Use Graph Node Headers" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Additional Spacing" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Custom Theme" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Script Button" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Directories" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Autoscan Project Path" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default Project Path" +msgstr "" + +#: editor/editor_settings.cpp +msgid "On Save" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Compress Binary Resources" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Safe Save On Backup Then Rename" +msgstr "" + +#: editor/editor_settings.cpp +msgid "File Dialog" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Thumbnail Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Docks" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Scene Tree" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Start Create Dialog Fully Expanded" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Always Show Folders" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Property Editor" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Auto Refresh Interval" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Subresource Hue Tint" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Color Theme" +msgstr "" + +#: editor/editor_settings.cpp scene/3d/label_3d.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Line Spacing" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp +#: modules/gdscript/editor/gdscript_highlighter.cpp +msgid "Highlighting" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Syntax Highlighting" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Highlight All Occurrences" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Highlight Current Line" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp +msgid "Highlight Type Safe Lines" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Indent" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp +msgid "Auto Indent" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Convert Indent On Save" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Draw Tabs" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Draw Spaces" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/tile_map.cpp +#: scene/main/scene_tree.cpp scene/resources/world.cpp +#: scene/resources/world_2d.cpp +msgid "Navigation" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Smooth Scrolling" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "V Scroll Speed" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Minimap" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Minimap Width" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Mouse Extra Buttons Navigate History" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Drag And Drop Selection" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Stay In Script Editor On Node Selected" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Appearance" +msgstr "" + +#: editor/editor_settings.cpp scene/gui/text_edit.cpp +msgid "Show Line Numbers" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Line Numbers Zero Padded" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Bookmark Gutter" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Breakpoint Gutter" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Info Gutter" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Code Folding" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Word Wrap" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Line Length Guidelines" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Line Length Guideline Soft Column" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Line Length Guideline Hard Column" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp +msgid "Script List" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Members Overview" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp +msgid "Files" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Trim Trailing Whitespace On Save" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Autosave Interval Secs" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp +msgid "Restore Scripts On Load" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Auto Reload And Parse Scripts On Save" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Auto Reload Scripts On External Change" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Create Signal Callbacks" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Sort Members Outline Alphabetically" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Cursor" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Scroll Past End Of File" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Block Caret" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Caret Blink" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Caret Blink Speed" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Right Click Moves Caret" +msgstr "" + +#: editor/editor_settings.cpp modules/gdscript/gdscript.cpp +#: modules/gdscript/gdscript_editor.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Completion" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Idle Parse Delay" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Auto Brace Complete" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Code Complete Delay" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Put Callhint Tooltip Below Current Line" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Callhint Tooltip Offset" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Complete File Paths" +msgstr "" + +#: editor/editor_settings.cpp modules/gdscript/gdscript_editor.cpp +msgid "Add Type Hints" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Use Single Quotes" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Show Help Index" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Help Font Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Help Source Font Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Help Title Font Size" +msgstr "" + +#: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp +msgid "Grid Map" +msgstr "" + +#: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp +msgid "Pick Distance" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Preview Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Primary Grid Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Secondary Grid Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Selection Box Color" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +msgid "3D Gizmos" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +msgid "Gizmo Colors" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Instanced" +msgstr "" + +#: editor/editor_settings.cpp modules/gltf/gltf_node.cpp +#: scene/3d/physics_body.cpp +msgid "Joint" +msgstr "" + +#: editor/editor_settings.cpp scene/2d/collision_shape_2d.cpp +#: scene/2d/cpu_particles_2d.cpp scene/2d/touch_screen_button.cpp +#: scene/3d/collision_shape.cpp scene/3d/cpu_particles.cpp +#: scene/3d/occluder.cpp scene/3d/spring_arm.cpp +#: scene/resources/particles_material.cpp servers/physics_2d_server.cpp +#: servers/physics_server.cpp +msgid "Shape" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Primary Grid Steps" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid Division Level Max" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid Division Level Min" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid Division Level Bias" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid XZ Plane" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid XY Plane" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Grid YZ Plane" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default FOV" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default Z Near" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default Z Far" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Lightmap Baking Number Of CPU Threads" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Navigation Scheme" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Invert Y Axis" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Invert X Axis" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Zoom Style" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Emulate Numpad" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Emulate 3 Button Mouse" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Orbit Modifier" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Pan Modifier" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Zoom Modifier" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp +msgid "Warped Mouse Panning" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Navigation Feel" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Orbit Sensitivity" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Orbit Inertia" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Translation Inertia" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Zoom Inertia" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook Navigation Scheme" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook Sensitivity" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook Inertia" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook Base Speed" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook Activation Modifier" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Freelook Speed Zoom Link" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Grid Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Guides Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Smart Snapping Line Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone Width" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone Color 1" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone Color 2" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone Selected Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone IK Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone Outline Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Bone Outline Size" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Viewport Border Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Constrain Editor View" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Simple Panning" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Scroll To Pan" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Pan Speed" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Poly Editor" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Point Grab Radius" +msgstr "" + +#: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Previous Outline" +msgstr "" + +#: editor/editor_settings.cpp editor/scene_tree_dock.cpp +msgid "Autorename Animation Tracks" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default Create Bezier Tracks" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Default Create Reset Tracks" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Onion Layers Past Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Onion Layers Future Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Visual Editors" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Minimap Opacity" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Window Placement" +msgstr "" + +#: editor/editor_settings.cpp scene/2d/back_buffer_copy.cpp scene/2d/sprite.cpp +#: scene/2d/visibility_notifier_2d.cpp scene/3d/sprite_3d.cpp +#: scene/gui/control.cpp +msgid "Rect" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Rect Custom Position" +msgstr "" + +#: editor/editor_settings.cpp platform/android/export/export_plugin.cpp +msgid "Screen" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Auto Save" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Save Before Running" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Font Size" +msgstr "" + +#: editor/editor_settings.cpp +#: modules/gdscript/language_server/gdscript_language_server.cpp +msgid "Remote Host" +msgstr "" + +#: editor/editor_settings.cpp +#: modules/gdscript/language_server/gdscript_language_server.cpp +msgid "Remote Port" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Editor SSL Certificates" +msgstr "" + +#: editor/editor_settings.cpp +msgid "HTTP Proxy" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Host" +msgstr "" + +#: editor/editor_settings.cpp editor/fileserver/editor_file_server.cpp +#: main/main.cpp modules/mono/mono_gd/gd_mono.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Port" +msgstr "" + +#. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. +#: editor/editor_settings.cpp +msgid "Project Manager" +msgstr "" + +#. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. +#: editor/editor_settings.cpp +msgid "Sorting Order" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Symbol Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Keyword Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Control Flow Keyword Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Base Type Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Engine Type Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "User Type Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Comment Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "String Color" +msgstr "" + +#: editor/editor_settings.cpp platform/javascript/export/export.cpp +#: platform/uwp/export/export.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Background Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Completion Background Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Completion Selected Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Completion Existing Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Completion Scroll Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Completion Font Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Text Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Line Number Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Safe Line Number Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Caret Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Caret Background Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Text Selected Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Selection Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Brace Mismatch Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Current Line Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Line Length Guideline Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Word Highlighted Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Number Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Function Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Member Variable Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Mark Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Bookmark Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Breakpoint Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Executing Line Color" +msgstr "" + +#: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +msgid "Code Folding Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Search Result Color" +msgstr "" + +#: editor/editor_settings.cpp +msgid "Search Result Border Color" +msgstr "" + +#: editor/editor_spin_slider.cpp +msgid "Hold %s to round to integers. Hold Shift for more precise changes." +msgstr "" + +#: editor/editor_spin_slider.cpp scene/gui/button.cpp +msgid "Flat" +msgstr "" + +#: editor/editor_spin_slider.cpp +msgid "Hide Slider" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Select Node(s) to Import" +msgstr "" + +#: editor/editor_sub_scene.cpp editor/project_manager.cpp +msgid "Browse" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Scene Path:" +msgstr "" + +#: editor/editor_sub_scene.cpp +msgid "Import From Node:" +msgstr "" + +#. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). +#: editor/editor_vcs_interface.cpp +msgid "%s Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Open the folder containing these templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall these templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "There are no mirrors available." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Retrieving the mirror list..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Starting the download..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error requesting URL:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connecting to the mirror..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't resolve the requested address." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't connect to the mirror." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No response from the mirror." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Request ended up in a redirect loop." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Request failed:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download complete; extracting templates..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Cannot remove temporary file:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Templates installation failed.\n" +"The problematic templates archives can be found at '%s'." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error getting the list of mirrors." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error parsing JSON with the list of mirrors. Please report this issue!" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Best available mirror" +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 +msgid "Disconnected" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Resolving" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Resolve" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connecting..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't Connect" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connected" +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Requesting..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Downloading" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Connection Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "SSL Handshake Error" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't open the export templates file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Invalid version.txt format inside the export templates file: %s." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No version.txt found inside the export templates file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error creating path for extracting templates:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Extracting Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Importing:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove templates for the version '%s'?" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uncompressing Android Build Sources" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export Template Manager" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Current Version:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export templates are missing. Download them or install from a file." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export templates are installed and ready to be used." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Open Folder" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Open the folder containing installed templates for the current version." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall templates for the current version." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download from:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Open in Web Browser" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Copy Mirror URL" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download and Install" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Download and install templates for the current version from the best " +"possible mirror." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Official export templates aren't available for development builds." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Install from File" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Install templates from a local file." +msgstr "" + +#: editor/export_template_manager.cpp editor/find_in_files.cpp +#: editor/progress_dialog.cpp scene/gui/dialogs.cpp +msgid "Cancel" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Cancel the download of the templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Other Installed Versions:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Uninstall Template" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select Template File" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Godot Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"The templates will continue to download.\n" +"You may experience a short editor freeze when they finish." +msgstr "" + +#: editor/fileserver/editor_file_server.cpp +msgid "File Server" +msgstr "" + +#: editor/fileserver/editor_file_server.cpp +#: editor/plugins/version_control_editor_plugin.cpp +#: platform/uwp/export/export.cpp platform/windows/export/export.cpp +msgid "Password" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Favorites" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Status: Import of file failed. Please fix file and reimport manually." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"Importing has been disabled for this file, so it can't be opened for editing." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move/rename resources root." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move a folder into itself." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Error moving:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Error duplicating:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Unable to update dependencies:" +msgstr "" + +#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp +msgid "No name provided." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Provided name contains invalid characters." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "A file or folder with this name already exists." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Name contains invalid characters." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"This file extension is not recognized by the editor.\n" +"If you want to rename it anyway, use your operating system's file manager.\n" +"After renaming to an unknown extension, the file won't be shown in the " +"editor anymore." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"The following files or folders conflict with items in the target location " +"'%s':\n" +"\n" +"%s\n" +"\n" +"Do you wish to overwrite them?" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming file:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Renaming folder:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Duplicating file:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Duplicating folder:" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Inherited Scene" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Open Scenes" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Add to Favorites" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Remove from Favorites" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Edit Dependencies..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "View Owners..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move To..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Scene..." +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp +msgid "New Script..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "New Resource..." +msgstr "" + +#: editor/filesystem_dock.cpp editor/inspector_dock.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/script_editor_debugger.cpp +msgid "Expand All" +msgstr "" + +#: editor/filesystem_dock.cpp editor/inspector_dock.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/script_editor_debugger.cpp +msgid "Collapse All" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort files" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Name (Ascending)" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Name (Descending)" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Type (Ascending)" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Type (Descending)" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by Last Modified" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Sort by First Modified" +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate..." +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Rename..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Focus the search box" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Previous Folder/File" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Next Folder/File" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Re-Scan Filesystem" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Toggle Split Mode" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Search files" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "" +"Scanning Files,\n" +"Please Wait..." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move" +msgstr "" + +#: editor/filesystem_dock.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/project_manager.cpp editor/rename_dialog.cpp +#: editor/scene_tree_dock.cpp +msgid "Rename" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Overwrite" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Create Scene" +msgstr "" + +#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp +msgid "Create Script" +msgstr "" + +#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp +msgid "Find in Files" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Find:" +msgstr "" + +#: editor/find_in_files.cpp editor/rename_dialog.cpp +msgid "Replace:" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Folder:" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Filters:" +msgstr "" + +#: editor/find_in_files.cpp +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 "" + +#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp +msgid "Replace..." +msgstr "" + +#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp +msgid "Replace in Files" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Replace All (NO UNDO)" +msgstr "" + +#: editor/find_in_files.cpp +msgid "Searching..." +msgstr "" + +#: editor/find_in_files.cpp +msgid "%d match in %d file." +msgstr "" + +#: editor/find_in_files.cpp +msgid "%d matches in %d file." +msgstr "" + +#: editor/find_in_files.cpp +msgid "%d matches in %d files." +msgstr "" + +#: editor/groups_editor.cpp +msgid "Add to Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Remove from Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Group name already exists." +msgstr "" + +#: editor/groups_editor.cpp +msgid "Invalid group name." +msgstr "" + +#: editor/groups_editor.cpp +msgid "Rename Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Delete Group" +msgstr "" + +#: editor/groups_editor.cpp editor/node_dock.cpp +msgid "Groups" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Nodes Not in Group" +msgstr "" + +#: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp +msgid "Filter nodes" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Nodes in Group" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Empty groups will be automatically removed." +msgstr "" + +#: editor/groups_editor.cpp +msgid "Group Editor" +msgstr "" + +#: editor/groups_editor.cpp +msgid "Manage Groups" +msgstr "" + +#: editor/import/editor_import_collada.cpp +msgid "Collada" +msgstr "" + +#: editor/import/editor_import_collada.cpp +msgid "Use Ambient" +msgstr "" + +#: editor/import/resource_importer_bitmask.cpp +msgid "Create From" +msgstr "" + +#: editor/import/resource_importer_bitmask.cpp +#: servers/audio/effects/audio_effect_compressor.cpp +msgid "Threshold" +msgstr "" + +#: editor/import/resource_importer_csv_translation.cpp +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_scene.cpp +#: editor/import/resource_importer_texture.cpp +#: editor/import/resource_importer_wav.cpp scene/3d/gi_probe.cpp +msgid "Compress" +msgstr "" + +#: editor/import/resource_importer_csv_translation.cpp +msgid "Delimiter" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +msgid "ColorCorrect" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +msgid "No BPTC If RGB" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp scene/2d/cpu_particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/texture.cpp scene/resources/visual_shader.cpp +msgid "Flags" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp scene/animation/tween.cpp +#: scene/resources/texture.cpp +msgid "Repeat" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp +#: scene/gui/control.cpp +msgid "Filter" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp +msgid "Mipmaps" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp +msgid "Anisotropic" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: editor/import/resource_importer_texture.cpp +msgid "sRGB" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +msgid "Slices" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp +#: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp +#: scene/resources/style_box.cpp +msgid "Horizontal" +msgstr "" + +#: editor/import/resource_importer_layered_texture.cpp +#: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp +#: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp +#: scene/resources/style_box.cpp +msgid "Vertical" +msgstr "" + +#: editor/import/resource_importer_obj.cpp +msgid "Generate Tangents" +msgstr "" + +#: editor/import/resource_importer_obj.cpp +msgid "Scale Mesh" +msgstr "" + +#: editor/import/resource_importer_obj.cpp +msgid "Offset Mesh" +msgstr "" + +#: editor/import/resource_importer_obj.cpp +#: editor/import/resource_importer_scene.cpp +msgid "Octahedral Compression" +msgstr "" + +#: editor/import/resource_importer_obj.cpp +msgid "Optimize Mesh Flags" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Single Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials+Animations" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes+Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp +#: scene/3d/physics_joint.cpp +msgid "Nodes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Root Type" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Root Name" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Root Scale" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Custom Script" +msgstr "" + +#: editor/import/resource_importer_scene.cpp scene/resources/texture.cpp +msgid "Storage" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Use Legacy Names" +msgstr "" + +#: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp +msgid "Materials" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Keep On Reimport" +msgstr "" + +#: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp +msgid "Meshes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Ensure Tangents" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Light Baking" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Lightmap Texel Size" +msgstr "" + +#: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp +msgid "Skins" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Use Named Skins" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "External Files" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Store In Subdir" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Filter Script" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Keep Custom Tracks" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Optimizer" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/item_list_editor_plugin.cpp main/main.cpp +#: modules/mono/mono_gd/gd_mono.cpp platform/javascript/export/export.cpp +#: platform/osx/export/export.cpp scene/2d/camera_2d.cpp scene/2d/light_2d.cpp +#: scene/2d/navigation_polygon.cpp scene/2d/ray_cast_2d.cpp scene/2d/sprite.cpp +#: scene/2d/y_sort.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/3d/baked_lightmap.cpp scene/3d/interpolated_camera.cpp +#: scene/3d/light.cpp scene/3d/navigation_mesh_instance.cpp +#: scene/3d/physics_joint.cpp scene/3d/ray_cast.cpp scene/3d/skeleton.cpp +#: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp +#: scene/gui/rich_text_label.cpp scene/resources/curve.cpp +#: scene/resources/environment.cpp scene/resources/material.cpp +msgid "Enabled" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Max Linear Error" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Max Angular Error" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Max Angle" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Remove Unused Tracks" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Clips" +msgstr "" + +#: editor/import/resource_importer_scene.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/particles_2d.cpp scene/3d/area.cpp scene/3d/cpu_particles.cpp +#: scene/3d/particles.cpp scene/resources/environment.cpp +msgid "Amount" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Import Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Importing Scene..." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Generating Lightmaps" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Generating for Mesh:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Running Custom Script..." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Couldn't load post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Invalid/broken script for post-import (check console):" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Error running post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Did you return a Node-derived object in the `post_import()` method?" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Saving..." +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "" +"%s: Texture detected as used as a normal map in 3D. Enabling red-green " +"texture compression to reduce memory usage (blue channel is discarded)." +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "" +"%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " +"generation and VRAM texture compression." +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "2D, Detect 3D" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "2D Pixel" +msgstr "" + +#: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp +msgid "Lossy Quality" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "HDR Mode" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "BPTC LDR" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp +#: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp +msgid "Normal Map" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Process" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Fix Alpha Border" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Premult Alpha" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Hdr As Srgb" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Invert Color" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Normal Map Invert Y" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Size Limit" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "Detect 3D" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "SVG" +msgstr "" + +#: editor/import/resource_importer_texture.cpp +msgid "" +"Warning, no suitable PC VRAM compression enabled in Project Settings. This " +"texture will not display correctly on PC." +msgstr "" + +#: editor/import/resource_importer_texture_atlas.cpp +msgid "Atlas File" +msgstr "" + +#: editor/import/resource_importer_texture_atlas.cpp +msgid "Import Mode" +msgstr "" + +#: editor/import/resource_importer_texture_atlas.cpp +msgid "Crop To Region" +msgstr "" + +#: editor/import/resource_importer_texture_atlas.cpp +msgid "Trim Alpha Border From Region" +msgstr "" + +#: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp +msgid "Force" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +msgid "8 Bit" +msgstr "" + +#: editor/import/resource_importer_wav.cpp main/main.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp +msgid "Mono" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +msgid "Max Rate" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +msgid "Max Rate Hz" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +msgid "Trim" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +msgid "Normalize" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +#: scene/resources/audio_stream_sample.cpp +msgid "Loop Mode" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +#: scene/resources/audio_stream_sample.cpp +msgid "Loop Begin" +msgstr "" + +#: editor/import/resource_importer_wav.cpp +#: scene/resources/audio_stream_sample.cpp +msgid "Loop End" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + +#: editor/import_dock.cpp +msgid "Keep File (No Import)" +msgstr "" + +#: editor/import_dock.cpp +msgid "%d Files" +msgstr "" + +#: editor/import_dock.cpp +msgid "Set as Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Clear Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Reimport" +msgstr "" + +#: editor/import_dock.cpp +msgid "" +"You have pending changes that haven't been applied yet. Click Reimport to " +"apply changes made to the import options.\n" +"Selecting another resource in the FileSystem dock without clicking Reimport " +"first will discard changes made in the Import dock." +msgstr "" + +#: editor/import_dock.cpp +msgid "Import As:" +msgstr "" + +#: editor/import_dock.cpp +msgid "Save Scenes, Re-Import, and Restart" +msgstr "" + +#: editor/import_dock.cpp +msgid "Changing the type of an imported file requires editor restart." +msgstr "" + +#: editor/import_dock.cpp +msgid "" +"WARNING: Assets exist that use this resource, they may stop loading properly." +msgstr "" + +#: editor/import_dock.cpp +msgid "" +"Select a resource file in the filesystem or in the inspector to adjust " +"import settings." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Failed to load resource." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Property Name Style" +msgstr "" + +#: editor/inspector_dock.cpp scene/gui/color_picker.cpp +msgid "Raw" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Capitalized" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Localized" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Localization not available for current language." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Copy Properties" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Paste Properties" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Make Sub-Resources Unique" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Create a new resource in memory and edit it." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Load an existing resource from disk and edit it." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Save the currently edited resource." +msgstr "" + +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +msgid "Save As..." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Extra resource options." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Edit Resource from Clipboard" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Copy Resource" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Make Resource Built-In" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Go to the previous edited object in history." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Go to the next edited object in history." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "History of recently edited objects." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Open documentation for this object." +msgstr "" + +#: editor/inspector_dock.cpp editor/scene_tree_dock.cpp +msgid "Open Documentation" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Filter properties" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Manage object properties." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Changes may be lost!" +msgstr "" + +#: editor/multi_node_edit.cpp +msgid "MultiNode Set" +msgstr "" + +#: editor/node_dock.cpp +msgid "Select a single node to edit its signals and groups." +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Edit a Plugin" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Create a Plugin" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Plugin Name:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Subfolder:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Author:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Version:" +msgstr "" + +#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp +msgid "Language:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Script Name:" +msgstr "" + +#: editor/plugin_config_dialog.cpp +msgid "Activate now?" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create Polygon" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Create points." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "" +"Edit points.\n" +"LMB: Move Point\n" +"RMB: Erase Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Erase points." +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Edit Polygon" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Insert Point" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Edit Polygon (Remove Point)" +msgstr "" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Remove Polygon And Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Animation" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_state_machine_editor.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Add %s" +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 +msgid "Load..." +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Move Node Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Change BlendSpace1D Limits" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Change BlendSpace1D Labels" +msgstr "" + +#: 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 "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Add Node Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Add Animation Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Remove BlendSpace1D Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Move BlendSpace1D Node Point" +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 +msgid "" +"AnimationTree is inactive.\n" +"Activate to enable playback, check node warnings if activation fails." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Point" +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 +msgid "Open Editor" +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 +msgid "Open Animation Node" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Triangle already exists." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Add Triangle" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Change BlendSpace2D Limits" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Change BlendSpace2D Labels" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Remove BlendSpace2D Point" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Remove BlendSpace2D Triangle" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "BlendSpace2D does not belong to an AnimationTree node." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "No triangles exist, so no blending can take place." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Toggle Auto Triangles" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Create triangles by connecting points." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Erase points and triangles." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Generate blend triangles automatically (instead of manually)" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend:" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Parameter Changed:" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Edit Filters" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Output node can't be added to the blend tree." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Add Node to BlendTree" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Node Moved" +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 +msgid "Nodes Connected" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Nodes Disconnected" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Set Animation" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Node" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Toggle Filter On/Off" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Change Filter" +msgstr "" + +#: 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 "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "" +"Animation player has no valid root node path, so unable to retrieve track " +"names." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Node Renamed" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add Node..." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "Edit Filtered Tracks:" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Enable Filtering" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Toggle Autoplay" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Anim" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Animation?" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Remove Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Invalid animation name!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation name already exists!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Next Changed" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Blend Time" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "No animation resource on clipboard!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pasted Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from current pos. (A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from end. (Shift+A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Stop animation playback. (S)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from start. (Shift+D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from current pos. (D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation position (in seconds)." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Scale animation playback globally for the node." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Tools" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/version_control_editor_plugin.cpp +msgid "New" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste As Reference" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Edit Transitions..." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Open in Inspector" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Display list of animations in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Autoplay on Load" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning Options" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Directions" +msgstr "" + +#. TRANSLATORS: Opposite of "Future", refers to a direction in animation onion skinning. +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "" + +#. TRANSLATORS: Opposite of "Past", refers to a direction in animation onion skinning. +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp modules/csg/csg_shape.cpp +#: scene/3d/collision_polygon.cpp scene/main/scene_tree.cpp +#: scene/resources/material.cpp scene/resources/primitive_meshes.cpp +#: servers/audio/effects/audio_effect_phaser.cpp +msgid "Depth" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pin AnimationPlayer" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +msgid "Error!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Times:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Next (Auto Queue):" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Cross-Animation Blend Times" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Move Node" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Transition exists!" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Add Transition" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "End" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Immediate" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +#: scene/animation/animation_blend_tree.cpp +msgid "Sync" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "At End" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: scene/3d/vehicle_body.cpp +msgid "Travel" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Start and end nodes are needed for a sub-transition." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "No playback resource set at path: %s." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Node Removed" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Transition Removed" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Set Start Node (Autoplay)" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "" +"Select and move nodes.\n" +"RMB to add new nodes.\n" +"Shift+LMB to create connections." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Create new nodes." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Connect nodes." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Remove selected node or transition." +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 +msgid "Transition:" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Play Mode:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "AnimationTree" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "New name:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Fade In (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Fade Out (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: scene/resources/style_box.cpp scene/resources/visual_shader.cpp +msgid "Blend" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Auto Restart:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Random Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Start!" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Amount:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend 0:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend 1:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "X-Fade Time (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Input" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Clear Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Set Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Delete Input" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Animation tree is valid." +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Animation tree is invalid." +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Animation Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "OneShot Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Mix Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend2 Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend3 Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend4 Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "TimeScale Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "TimeSeek Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Transition Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Import Animations..." +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Edit Node Filters" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Filters..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp +msgid "Use Threads" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Contents:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "View Files" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connection error, please try again." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect to host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response from host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve hostname:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, return code:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Cannot save response to:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Write error." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, too many redirects" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Redirect loop." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, timeout" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Timeout." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Bad download hash, assuming file has been tampered with." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Expected:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Got:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed SHA-256 hash check" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Asset Download Error:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Downloading (%s / %s)..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Downloading..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Resolving..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Error making request" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Idle" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Retry" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download Error" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Available URLs" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download for this asset is already in progress!" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Recently Updated" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Least Recently Updated" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Name (A-Z)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Name (Z-A)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "License (A-Z)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "License (Z-A)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Loading..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgctxt "Pagination" +msgid "First" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgctxt "Pagination" +msgid "Previous" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgctxt "Pagination" +msgid "Next" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgctxt "Pagination" +msgid "Last" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "All" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Search templates, projects, and demos" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Search assets (excluding templates, projects, and demos)" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Import..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Plugins..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Sort:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Category:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Site:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Support" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Official" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Testing" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed to get repository configuration." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Assets ZIP File" +msgstr "" + +#: editor/plugins/audio_stream_editor_plugin.cpp +msgid "Audio Preview Play/Pause" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"Can't determine a save path for lightmap images.\n" +"Save your scene and try again." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"No meshes to bake. Make sure they contain an UV2 channel and that the 'Use " +"In Baked Light' and 'Generate Lightmap' flags are on." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Failed creating lightmap images, make sure path is writable." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Failed determining lightmap size. Maximum lightmap size too small?" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"Some mesh is invalid. Make sure the UV2 channel values are contained within " +"the [0.0,1.0] square region." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"Godot editor was built without ray tracing support, lightmaps can't be baked." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Bake Lightmaps" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "LightMap Bake" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Select lightmap bake file:" +msgstr "" + +#: editor/plugins/camera_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp scene/resources/mesh_library.cpp +msgid "Preview" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Grid Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Grid Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Vertical Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Vertical Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove Vertical Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Horizontal Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Horizontal Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove Horizontal Guide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Horizontal and Vertical Guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate %d CanvasItems" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate CanvasItem \"%s\" to %d degrees" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move CanvasItem \"%s\" Anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Node2D \"%s\" to (%s, %s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Resize Control \"%s\" to (%d, %d)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale %d CanvasItems" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale CanvasItem \"%s\" to (%s, %s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move %d CanvasItems" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move CanvasItem \"%s\" to (%d, %d)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Locked" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Grouped" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Children of containers have their anchors and margins values overridden by " +"their parent." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Presets for the anchors and margins values of a Control node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"When active, moving Control nodes changes their anchors instead of their " +"margins." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp scene/resources/style_box.cpp +msgid "Top Left" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp scene/resources/style_box.cpp +msgid "Top Right" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp scene/resources/style_box.cpp +msgid "Bottom Right" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp scene/resources/style_box.cpp +msgid "Bottom Left" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Left" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Top" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Right" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Bottom" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Left Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Top Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Right Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Bottom Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "VCenter Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "HCenter Wide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Full Rect" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Keep Ratio" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Anchors only" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors and Margins" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Project Camera Override\n" +"Overrides the running project's camera with the editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Project Camera Override\n" +"No project instance running. Run the project from the editor to use this " +"feature." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Group Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Ungroup Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Paste Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Custom Bone(s) from Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Warning: Children of a container get their position and size determined only " +"by their parent." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp +msgid "Zoom Reset" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp scene/gui/item_list.cpp +#: scene/gui/tree.cpp +msgid "Select Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Drag: Rotate selected node around pivot." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Move selected node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Scale selected node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "V: Set selected node's pivot position." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Alt+RMB: Show list of all nodes at position clicked, including locked." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "RMB: Add node at position clicked." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Move Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Shift: Scale proportionally." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Show a list of all objects at the position clicked\n" +"(same as Alt+RMB in select mode)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Click to change object's rotation pivot." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Ruler Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggle smart snapping." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Smart Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggle grid snapping." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Grid Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snapping Options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Rotation Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap Relative" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Pixel Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Smart Snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Configure Snap..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Parent" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Node Anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Node Sides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Node Center" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Other Nodes" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock the selected object in place (can't be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock Selected Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock the selected object (can be moved)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock Selected Node(s)" +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 "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Group Selected Node(s)" +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 "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Ungroup Selected Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Skeleton Options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make Custom Bone(s) from Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Custom Bones" +msgstr "" + +#. TRANSLATORS: Noun, name of the 2D/3D View menus. +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show When Snapping" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Hide" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggle Grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Helpers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Rulers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Guides" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Origin" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Viewport" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Group And Lock Icons" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Frame Selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Preview Canvas Scale" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Layout" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated or scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Animation Key and Pose Options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Copy Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Add Node Here" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Instance Scene Here" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Multiply grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Divide grid step by 2" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan View" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 3.125%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 6.25%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 12.5%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 25%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 50%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 100%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 200%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 400%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 800%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom to 1600%" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Adding %s..." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Cannot instantiate multiple nodes without root." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Create Node" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Error instancing scene from %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Default Type" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Drag & drop + Shift : Add node as sibling\n" +"Drag & drop + Alt : Change node type" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Create Polygon3D" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Edit Poly" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Edit Poly (Remove Point)" +msgstr "" + +#: editor/plugins/collision_shape_2d_editor_plugin.cpp +msgid "Set Handle" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/cpu_particles_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Restart" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp editor/spatial_editor_gizmos.cpp +msgid "Particles" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Solid Pixels" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Border Pixels" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Directed Border Pixels" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + +#: editor/plugins/cpu_particles_editor_plugin.cpp +msgid "CPUParticles" +msgstr "" + +#: editor/plugins/cpu_particles_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Mesh" +msgstr "" + +#: editor/plugins/cpu_particles_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Node" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat 0" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat 1" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp +msgid "Ease In" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp +msgid "Ease Out" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Smoothstep" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Curve Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Add Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Left Linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right Linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Toggle Curve Linear Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Hold Shift to edit tangents individually" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right click to add point" +msgstr "" + +#: editor/plugins/gi_probe_editor_plugin.cpp +msgid "Bake GI Probe" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Gradient Edited" +msgstr "" + +#: editor/plugins/gradient_texture_2d_editor_plugin.cpp +msgid "Swap GradientTexture2D Fill Points" +msgstr "" + +#: editor/plugins/gradient_texture_2d_editor_plugin.cpp +msgid "Swap Gradient Fill Points" +msgstr "" + +#: editor/plugins/gradient_texture_2d_editor_plugin.cpp +msgid "Toggle Grid Snap" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp +#: scene/3d/label_3d.cpp scene/gui/button.cpp scene/gui/dialogs.cpp +#: scene/gui/label.cpp scene/gui/line_edit.cpp scene/gui/link_button.cpp +#: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp +#: scene/resources/primitive_meshes.cpp +msgid "Text" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp main/main.cpp +#: platform/osx/export/export.cpp platform/windows/export/export.cpp +#: scene/gui/button.cpp scene/gui/item_list.cpp +msgid "Icon" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "ID" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Separator" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item %d" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Items" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item List Editor" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Occluder Polygon" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh is empty!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Couldn't create a Trimesh collision shape." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Trimesh Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "This doesn't work on scene root!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Shape" +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 "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Simplified Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Single Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Can't create multiple convex collision shapes for the scene root." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Couldn't create any collision shapes." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Multiple Convex Shapes" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Navigation Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Contained Mesh is not of type ArrayMesh." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "UV Unwrap failed, mesh may not be manifold?" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "No mesh to debug." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has no UV in layer %d." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "MeshInstance lacks a Mesh!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has not surface to create outlines from!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Could not create outline!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp modules/csg/csg_shape.cpp +#: modules/gltf/gltf_mesh.cpp modules/gltf/gltf_node.cpp +#: scene/2d/mesh_instance_2d.cpp scene/3d/cpu_particles.cpp +#: scene/3d/mesh_instance.cpp scene/resources/mesh_library.cpp +#: scene/resources/multimesh.cpp scene/resources/primitive_meshes.cpp +#: scene/resources/texture.cpp +msgid "Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a StaticBody and assigns a polygon-based collision shape to it " +"automatically.\n" +"This is the most accurate (but slowest) option for collision detection." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a polygon-based collision shape.\n" +"This is the most accurate (but slowest) option for collision detection." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Single Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a single convex collision shape.\n" +"This is the fastest (but least accurate) option for collision detection." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Simplified Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a simplified convex collision shape.\n" +"This is similar to single collision shape, but can result in a simpler " +"geometry in some cases, at the cost of accuracy." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Multiple Convex Collision Siblings" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a polygon-based collision shape.\n" +"This is a performance middle-ground between a single convex collision and a " +"polygon-based collision." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh..." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +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 "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "View UV1" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "View UV2" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Unwrap UV2 for Lightmap/AO" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Outline Size:" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "UV Channel Debug" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Remove item %d?" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "" +"Update from existing scene?:\n" +"%s" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "MeshLibrary" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Add Item" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Remove Selected Item" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Import from Scene (Ignore Transforms)" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Import from Scene (Apply Transforms)" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Update from Scene" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Apply without Transforms" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Apply with Transforms" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and no MultiMesh set in node)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and MultiMesh contains no Mesh)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (not a MeshInstance)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (contains no Mesh resource)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No surface source specified." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no geometry)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no faces)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate Surface" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate MultiMesh" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "X-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Y-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Z-Axis" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh Up Axis:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Rotation:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Tilt:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Scale:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate" +msgstr "" + +#: editor/plugins/navigation_polygon_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Navigation Polygon" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Convert to CPUParticles" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generating Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generate Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Convert to CPUParticles2D" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "The geometry's faces don't contain any area." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "The geometry doesn't contain any faces." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "\"%s\" doesn't inherit from Spatial." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "\"%s\" doesn't contain geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "\"%s\" doesn't contain face geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Points:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points+Normal (Directed)" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp scene/gui/video_player.cpp +msgid "Volume" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Source:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "A processor material of type 'ParticlesMaterial' is required." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate Visibility AABB" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point to Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Split Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Point in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move In-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Out-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Select Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Shift+Drag: Select Control Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Click: Add Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Left Click: Split Segment (in curve)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Right Click: Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Control Points (Shift+Drag)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point (in empty space)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Close Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +#: editor/plugins/theme_editor_preview.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp +#: main/main.cpp servers/visual_server.cpp +msgid "Options" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Mirror Handle Angles" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Mirror Handle Lengths" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Curve Point #" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Point Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve In Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Out Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Path" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Path Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Segment (in curve)" +msgstr "" + +#: editor/plugins/physical_bone_plugin.cpp +msgid "Move Joint" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"The skeleton property of the Polygon2D does not point to a Skeleton2D node" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Sync Bones" +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 "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create UV Map" +msgstr "" + +#: 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 +msgid "Create Polygon & UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create Internal Vertex" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Remove Internal Vertex" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Invalid Polygon (need 3 different vertices)" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Add Custom Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Remove Custom Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Paint Bone Weights" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Open Polygon 2D UV editor." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon 2D UV Editor" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp scene/2d/polygon_2d.cpp +msgid "UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/line_2d.cpp scene/3d/cpu_particles.cpp scene/3d/portal.cpp +#: scene/3d/room.cpp scene/resources/convex_polygon_shape.cpp +#: scene/resources/convex_polygon_shape_2d.cpp +msgid "Points" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp scene/2d/polygon_2d.cpp +#: scene/resources/navigation_mesh.cpp +msgid "Polygons" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp scene/3d/skeleton.cpp +msgid "Bones" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Points" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Command: Rotate" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift: Move All" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Command: Scale" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Ctrl: Rotate" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Ctrl: Scale" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Rotate Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Scale Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create a custom polygon. Enables custom polygon rendering." +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 "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Unpaint weights with specified intensity." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Radius:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Copy Polygon to UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Copy UV to Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Clear UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Settings" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp modules/csg/csg_shape.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Enable Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Grid" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Configure Grid:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset X:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset Y:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step X:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step Y:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Sync Bones to Polygon" +msgstr "" + +#: editor/plugins/ray_cast_2d_editor_plugin.cpp +msgid "Set cast_to" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ERROR: Couldn't load resource!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Add Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Rename Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Resource clipboard is empty!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Paste Resource" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/scene_tree_editor.cpp +msgid "Instance:" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +msgid "Open in Editor" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Load Resource" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Flip Portals" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Room Generate Points" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Generate Points" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Flip Portal" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Occluder Set Transform" +msgstr "" + +#: editor/plugins/room_manager_editor_plugin.cpp +msgid "Center Node" +msgstr "" + +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "AnimationTree has no path set to an AnimationPlayer" +msgstr "" + +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "Path to AnimationPlayer is invalid" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close and save changes?" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error writing TextFile:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Could not load file at:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving file!" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error Saving" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing theme." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error Importing" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "New Text File..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open File" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save File As..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Can't obtain the script for running." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Script failed reloading, check console for errors." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Script is not in tool mode, will not be able to run." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"To run this script, it must inherit EditorScript and be set to tool mode." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "%s Class Reference" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Previous" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Filter scripts" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Toggle alphabetical sorting of the method list." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Filter methods" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp scene/2d/y_sort.cpp +msgid "Sort" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Move Up" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Move Down" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Next Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Previous Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "File" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reopen Closed Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Soft Reload Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Copy Script Path" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Previous" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close All" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Docs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Into" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Over" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Break" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_editor_debugger.cpp +msgid "Continue" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Keep Debugger Open" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Debug with External Editor" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Godot online documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the reference documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to previous edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to next edited document." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Discard" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Results" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Dominant Script On Scene Change" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "External" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Use External Editor" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Exec Path" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Script Temperature Enabled" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Highlight Current Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Script Temperature History Size" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Current Script Background Color" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Group Help Pages" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Sort Scripts By" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "List Script Names As" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Exec Flags" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Scripts" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Connections to method:" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp +#: scene/resources/visual_shader_nodes.cpp +msgid "Source" +msgstr "" + +#: editor/plugins/script_text_editor.cpp platform/uwp/export/export.cpp +#: scene/3d/interpolated_camera.cpp scene/animation/skeleton_ik.cpp +msgid "Target" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "" +"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "[Ignore]" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Function" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Only resources from filesystem can be dropped." +msgstr "" + +#: 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 "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lookup Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Pick Color" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +#: scene/3d/label_3d.cpp scene/gui/label.cpp +#: scene/resources/primitive_meshes.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Syntax Highlighter" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +msgid "Bookmarks" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Cut" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/plugins/theme_editor_plugin.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Select All" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Delete Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Left" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Right" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Comment" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold/Unfold Line" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold All Lines" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Complete Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Evaluate Selection" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Trim Trailing Whitespace" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent to Spaces" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent to Tabs" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Find in Files..." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Replace in Files..." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Contextual Help" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Bookmark" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Next Bookmark" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Previous Bookmark" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Bookmarks" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Function..." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Line..." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Toggle Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Next Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Previous Breakpoint" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "" +"This shader has been modified on on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp scene/resources/material.cpp +msgid "Shader" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "This skeleton has no bones, create some children Bone2D nodes." +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Skeleton2D" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Reset to Rest Pose" +msgstr "" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Overwrite Rest Pose" +msgstr "" + +#: editor/plugins/skeleton_editor_plugin.cpp +msgid "Create physical bones" +msgstr "" + +#: editor/plugins/skeleton_editor_plugin.cpp editor/spatial_editor_gizmos.cpp +#: modules/gltf/gltf_node.cpp modules/gltf/gltf_skin.cpp +#: scene/2d/polygon_2d.cpp scene/3d/mesh_instance.cpp +msgid "Skeleton" +msgstr "" + +#: editor/plugins/skeleton_editor_plugin.cpp +msgid "Create physical skeleton" +msgstr "" + +#: editor/plugins/skeleton_ik_editor_plugin.cpp +msgid "Play IK" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp modules/gltf/gltf_camera.cpp +msgid "Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front Perspective" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear Orthogonal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear Perspective" +msgstr "" + +#. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. +#: editor/plugins/spatial_editor_plugin.cpp +msgid " [auto]" +msgstr "" + +#. TRANSLATORS: This will be appended to the view name when Portal Occulusion is enabled. +#: editor/plugins/spatial_editor_plugin.cpp +msgid " [portals active]" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Aborted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "X-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Y-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Z-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Plane Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp scene/resources/visual_shader.cpp +msgid "None" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp scene/2d/path_2d.cpp +msgid "Rotate" +msgstr "" + +#. TRANSLATORS: This refers to the movement that changes the position of an object. +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate" +msgstr "" + +#. TRANSLATORS: Refers to changing the scale of a node in the 3D editor. +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scaling:" +msgstr "" + +#. TRANSLATORS: Refers to changing the position of a node in the 3D editor. +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translating:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotating %s degrees." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Keying is disabled (no key inserted)." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Animation Key Inserted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pitch:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Yaw:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "FPS: %d (%s ms)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "No parent to instance a child at." +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 "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View FPS" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Half Resolution" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp scene/main/viewport.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Enable Doppler" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Cinematic Preview" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "(Not in GLES2)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Debug draw modes are only available when using the GLES3 renderer, not GLES2." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Slow Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Camera Preview" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"To zoom further, change the camera's clipping planes (View -> Settings...)" +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 "Convert Rooms" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Click to toggle between visibility states.\n" +"\n" +"Open eye: Gizmo is visible.\n" +"Closed eye: Gizmo is hidden.\n" +"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Nodes to Floor" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Couldn't find a solid floor to snap the selection to." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Local Space" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp scene/gui/graph_edit.cpp +msgid "Use Snap" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Converts rooms for portal culling." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orbit View 180" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Switch Perspective/Orthogonal View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Insert Animation Key" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Freelook" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Decrease Field of View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Increase Field of View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Reset Field of View to Default" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Object to Floor" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog..." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "1 Viewport" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "4 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Grid" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Portal Culling" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Occlusion Culling" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Settings..." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate Snap:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Snap (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Snap (%):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Viewport Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective FOV (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Near:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Far:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Change" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale (ratio):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Type" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pre" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Post" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Manipulator Gizmo Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Manipulator Gizmo Opacity" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Show Viewport Rotation Gizmo" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unnamed Gizmo" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Mesh2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Polygon2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "CollisionPolygon2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "LightOccluder2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Sprite is empty!" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Can't convert a sprite using animation frames to mesh." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't replace by mesh." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to MeshInstance2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Sprite" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Simplification:" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Shrink (Pixels):" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Grow (Pixels):" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Update Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Settings:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "No Frames Selected" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add %d Frame(s)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Unable to load images" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "ERROR: Couldn't load frame resource!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Resource clipboard is empty or not a texture!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Paste Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Empty" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation FPS" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "(empty)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animations:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "New Animation" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Filter animations" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Speed:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: modules/gltf/gltf_animation.cpp modules/minimp3/audio_stream_mp3.cpp +#: modules/minimp3/resource_importer_mp3.cpp +#: modules/stb_vorbis/audio_stream_ogg_vorbis.cpp +#: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp scene/2d/path_2d.cpp +#: scene/3d/path.cpp scene/resources/animation.cpp scene/resources/material.cpp +msgid "Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animation Frames:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add a Texture from File" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frames from a Sprite Sheet" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Select Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Horizontal:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Vertical:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Separation:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Offset:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Select/Clear All Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Create Frames from Sprite Sheet" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "SpriteFrames" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Region Rect" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Margin" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Snap Mode:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Pixel Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Grid Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Auto Slice" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Step:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "TextureRegion" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Styleboxes" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} color(s)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No colors found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} constant(s)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No constants found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} font(s)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No fonts found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} icon(s)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No icons found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} stylebox(es)" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "No styleboxes found." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "{num} currently selected" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Nothing was selected for the import." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Importing Theme Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Importing items {n}/{n}" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Updating the editor" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Finalizing" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Filter:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "With Data" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select by data type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible color items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible color items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible color items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible constant items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible constant items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible constant items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible font items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible font items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible font items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible icon items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible icon items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible icon items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible stylebox items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all visible stylebox items and their data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all visible stylebox items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"Caution: Adding icon data may considerably increase the size of your Theme " +"resource." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Collapse types." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Expand types." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all Theme items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select With Data" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select all Theme items with item data." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Deselect all Theme items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Import Selected" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"Import Items tab has some items selected. Selection will be lost upon " +"closing this window.\n" +"Close anyway?" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"Select a theme type from the list to edit its items.\n" +"You can add a custom type or import a type with its items from another theme." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Color Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Constant Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Font Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Icon Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All StyleBox Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"This theme type is empty.\n" +"Add more items to it manually or by importing from another theme." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Theme Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Theme Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Color Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Constant Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Font Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Icon Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Stylebox Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Color Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Constant Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Font Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Icon Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Rename Stylebox Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Invalid file, not a Theme resource." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Invalid file, same as the edited Theme resource." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Manage Theme Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Edit Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Types:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Item:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add StyleBox Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Items:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Custom Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Theme Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Old Name:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Import Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Default Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Editor Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select Another Theme Resource:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme Resource" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Another Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Filter the list of types or create a new custom type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Available Node-based types:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Type name is empty!" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Are you sure you want to create an empty type?" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Confirm Item Rename" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Cancel Item Rename" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Override Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Unpin this StyleBox as a main style." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"Pin this StyleBox as a main style. Editing its properties will update the " +"same properties in all other StyleBoxes of this type." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Item Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Set Variation Base Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Set Base Type" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Show Default" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Show default type items alongside items that have been overridden." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Override All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Override all default type items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select the variation base type from a list of available types." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "" +"A type associated with a built-in class cannot be marked as a variation of " +"another type." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Manage Items..." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add, remove, organize and import Theme items." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Preview" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Default Preview" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Select UI Scene:" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "" +"Toggle the control picker, allowing to visually select control types for " +"edit." +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Toggle Button" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Disabled Button" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp scene/resources/mesh_library.cpp +msgid "Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Disabled Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Check Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Checked Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Radio Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Checked Radio Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Named Separator" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Submenu" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Subitem 1" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Subitem 2" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Has" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Many" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Disabled LineEdit" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Tab 1" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Tab 2" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Tab 3" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Editable Item" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Subtree" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Has,Many,Options" +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Invalid path, the PackedScene resource was probably moved or removed." +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Invalid PackedScene resource, must have a Control node at its root." +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Invalid file, not a PackedScene resource." +msgstr "" + +#: editor/plugins/theme_editor_preview.cpp +msgid "Reload the scene to reflect its most actual state." +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Fix Invalid Tiles" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cut Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Line Draw" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket Fill" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Find Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Transpose" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Disable Autotile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Enable Priority" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Filter tiles" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Give a TileSet resource to this TileMap to use its tiles." +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "" +"Shift+LMB: Line Draw\n" +"Shift+Command+LMB: Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "" +"Shift+LMB: Line Draw\n" +"Shift+Ctrl+LMB: Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Pick Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate Left" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate Right" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Flip Horizontally" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Flip Vertically" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Clear Transform" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Tile Map" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Palette Min Width" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Palette Item H Separation" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Show Tile Names" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Show Tile Ids" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Sort Tiles By Name" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket Fill Preview" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Editor Side" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Display Grid" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Axis Color" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Add Texture(s) to TileSet." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove selected Texture from TileSet." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Single Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Autotile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Atlas" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Next Coordinate" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Select the next shape, subtile, or Tile." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Previous Coordinate" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Select the previous shape, subtile, or Tile." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/sprite.cpp +#: scene/3d/sprite_3d.cpp scene/resources/texture.cpp +msgid "Region" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp +#: modules/gridmap/grid_map.cpp scene/2d/collision_object_2d.cpp +#: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp +#: scene/3d/collision_object.cpp scene/3d/physics_body.cpp +#: scene/3d/physics_joint.cpp scene/3d/soft_body.cpp scene/main/scene_tree.cpp +#: scene/resources/shape_2d.cpp +msgid "Collision" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Occlusion" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/touch_screen_button.cpp +msgid "Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/area_2d.cpp +#: scene/3d/area.cpp scene/3d/physics_joint.cpp +#: scene/animation/animation_node_state_machine.cpp +msgid "Priority" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/node_2d.cpp +msgid "Z Index" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Region Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Collision Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Occlusion Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Navigation Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Bitmask Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Priority Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/item_list.cpp +msgid "Icon Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Z Index Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Copy bitmask." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Paste bitmask." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Erase bitmask." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create a new rectangle." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Rectangle" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create a new polygon." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Delete Selected Shape" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Keep polygon inside region Rect." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Enable snap and show grid (configurable via the Inspector)." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Display Tile Names (Hold Alt Key)" +msgstr "" + +#: 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 "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove selected texture? This will remove all tiles which use it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "You haven't selected a texture to remove." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from scene? This will overwrite all current tiles." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Texture" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "%s file(s) were not added because was already on the list." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Drag handles to edit Rect.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Delete selected Rect." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select current edited sub-tile.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Delete polygon." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +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 "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select sub-tile to use as icon, this will be also used on invalid autotile " +"bindings.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select sub-tile to change its priority.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select sub-tile to change its z index.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Set Tile Region" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Set Tile Icon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Tile Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Collision Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Occlusion Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Navigation Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Paste Tile Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Clear Tile Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Polygon Concave" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Polygon Convex" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Collision Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Occlusion Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Navigation Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Tile Priority" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Tile Z Index" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Convex" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Concave" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Collision Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Occlusion Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "This property can't be changed." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Snap Options" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/animated_sprite.cpp +#: scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp +#: scene/2d/parallax_background.cpp scene/2d/parallax_layer.cpp +#: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp +#: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp +#: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp +#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp +#: scene/main/canvas_layer.cpp scene/resources/material.cpp +#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +msgid "Offset" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp editor/rename_dialog.cpp +#: scene/gui/range.cpp scene/resources/animation.cpp +#: scene/resources/visual_shader_nodes.cpp servers/physics_2d_server.cpp +#: servers/physics_server.cpp +msgid "Step" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Separation" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Selected Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/light_2d.cpp scene/2d/line_2d.cpp scene/2d/mesh_instance_2d.cpp +#: scene/2d/multimesh_instance_2d.cpp scene/2d/particles_2d.cpp +#: scene/2d/polygon_2d.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +#: scene/gui/nine_patch_rect.cpp scene/gui/texture_rect.cpp +#: scene/resources/material.cpp scene/resources/sky.cpp +#: scene/resources/style_box.cpp scene/resources/visual_shader_nodes.cpp +msgid "Texture" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Tex Offset" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp +#: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp +#: scene/3d/mesh_instance.cpp scene/resources/primitive_meshes.cpp +msgid "Material" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp +msgid "Modulate" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Tile Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Autotile Bitmask Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Subtile Size" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Subtile Spacing" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Occluder Offset" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Navigation Offset" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Shape Offset" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Shape Transform" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Selected Collision" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Selected Collision One Way" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Selected Collision One Way Margin" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Selected Navigation" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Selected Occlusion" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Tileset Script" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "TileSet" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "No VCS plugins are available." +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "" +"Remote settings are empty. VCS features that use the network may not work." +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "No commit message was provided." +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Staged Changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Unstaged Changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit:" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Date:" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Subtitle:" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Do you want to remove the %s branch?" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Do you want to remove the %s remote?" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Apply" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control System" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Initialize" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Remote Login" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Select SSH public key path" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Select SSH private key path" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "SSH Passphrase" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Detect new changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Discard all changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Stage all changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Unstage all changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit Message" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit Changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit List" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit list size" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Branches" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Create New Branch" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Remove Branch" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Branch Name" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Remotes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Create New Remote" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Remove Remote" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Remote Name" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Remote URL" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Fetch" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Pull" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Push" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Force Push" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Modified" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Renamed" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Deleted" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Typechange" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Unmerged" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "View:" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Split" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Unified" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add Output" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Boolean" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Sampler" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add input port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add output port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change input port type" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change output port type" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change input port name" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change output port name" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Remove input port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Remove output port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Set expression" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Resize VisualShader node" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Set Uniform Name" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Set Input Default Port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add Node to Visual Shader" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Node(s) Moved" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Duplicate Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Nodes" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Visual Shader Input Type Changed" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "UniformRef Name Changed" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vertex" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Fragment" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp modules/gltf/gltf_node.cpp +#: scene/3d/light.cpp +msgid "Light" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Show resulted shader code." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Create Shader Node" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Grayscale function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts HSV vector to RGB equivalent." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts RGB vector to HSV equivalent." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Sepia function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Burn operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Darken operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Difference operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Dodge operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "HardLight operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Lighten operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Overlay operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Screen operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "SoftLight operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated vector if the provided scalars are equal, greater or " +"less." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated vector if the provided boolean value is true or false." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated scalar if the provided boolean value is true or false." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Boolean constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Boolean uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for all shader modes." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Input parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for vertex and fragment shader modes." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for fragment and light shader modes." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for fragment shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for light shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for vertex shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for vertex and fragment shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "E constant (2.718282). Represents the base of the natural logarithm." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Epsilon constant (0.00001). Smallest possible scalar number." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Phi constant (1.618034). Golden ratio." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Pi/4 constant (0.785398) or 45 degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Pi/2 constant (1.570796) or 90 degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Pi constant (3.141593) or 180 degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Tau constant (6.283185) or 360 degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Sqrt2 constant (1.414214). Square root of 2." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the absolute value of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-tangent of the parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Finds the nearest integer that is greater than or equal to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Constrains a value to lie between two further values." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts a quantity in radians to degrees." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Base-e Exponential." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Base-2 Exponential." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the nearest integer less than or equal to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Computes the fractional part of the argument." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse of the square root of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Natural logarithm." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Base-2 logarithm." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the greater of two values." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the lesser of two values." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Linear interpolation between two scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the opposite value of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 - scalar" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the value of the first parameter raised to the power of the second." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts a quantity in degrees to radians." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 / scalar" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the nearest integer to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the nearest even integer to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Clamps the value between 0.0 and 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Extracts the sign of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the hyperbolic sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the square root of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than " +"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " +"using Hermite polynomials." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Step function( scalar(edge), scalar(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the truncated value of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Adds scalar to scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Divides scalar by scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies scalar by scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the remainder of the two scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Subtracts scalar from scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Perform the cubic texture lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Perform the texture lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Calculate the outer product of a pair of vectors.\n" +"\n" +"OuterProduct treats the first parameter 'c' as a column vector (matrix with " +"one column) and the second parameter 'r' as a row vector (matrix with one " +"row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix " +"whose number of rows is the number of components in 'c' and whose number of " +"columns is the number of components in 'r'." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Composes transform from four vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Decomposes transform to four vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the determinant of a transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the inverse of a transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the transpose of a transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies transform by transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies vector by transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Composes vector from three scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Decomposes vector to three scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the cross product of two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the distance between two points." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the dot product of two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the vector that points in the same direction as a reference vector. " +"The function has three vector parameters : N, the vector to orient, I, the " +"incident vector, and Nref, the reference vector. If the dot product of I and " +"Nref is smaller than zero the return value is N. Otherwise -N is returned." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the length of a vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Linear interpolation between two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Linear interpolation between two vectors using scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the normalize product of vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 - vector" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 / vector" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the vector that points in the direction of reflection ( a : incident " +"vector, b : normal vector )." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the vector that points in the direction of refraction." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than " +"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " +"using Hermite polynomials." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than " +"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " +"using Hermite polynomials." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Step function( vector(edge), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Step function( scalar(edge), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Adds vector to vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Divides vector by vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies vector by vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the remainder of the two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Subtracts vector from vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Custom Godot Shader Language expression, with custom amount of input and " +"output ports. This is a direct injection of code into the vertex/fragment/" +"light function, do not use it to write the function declarations inside." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns falloff based on the dot product of surface normal and view " +"direction of camera (pass associated inputs to it)." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"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 "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "A reference to an existing uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "VisualShader" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Edit Visual Property:" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Visual Shader Mode Changed" +msgstr "" + +#: editor/project_export.cpp +msgid "Runnable" +msgstr "" + +#: editor/project_export.cpp +msgid "Export the project for all the presets defined." +msgstr "" + +#: editor/project_export.cpp +msgid "All presets must have an export path defined for Export All to work." +msgstr "" + +#: editor/project_export.cpp +msgid "Delete preset '%s'?" +msgstr "" + +#: editor/project_export.cpp +msgid "Exporting All" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Path" +msgstr "" + +#: editor/project_export.cpp +msgid "Presets" +msgstr "" + +#: editor/project_export.cpp editor/project_settings_editor.cpp +msgid "Add..." +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 "" + +#: editor/project_export.cpp +msgid "Resources" +msgstr "" + +#: editor/project_export.cpp +msgid "Export all resources in the project" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected scenes (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected resources (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources to export:" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to export non-resource files/folders\n" +"(comma-separated, e.g: *.json, *.txt, docs/*)" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to exclude files/folders from project\n" +"(comma-separated, e.g: *.json, *.txt, docs/*)" +msgstr "" + +#: editor/project_export.cpp +msgid "Features" +msgstr "" + +#: editor/project_export.cpp +msgid "Custom (comma-separated):" +msgstr "" + +#: editor/project_export.cpp +msgid "Feature List:" +msgstr "" + +#: editor/project_export.cpp +msgid "Script" +msgstr "" + +#: editor/project_export.cpp +msgid "GDScript Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Compiled Bytecode (Faster Loading)" +msgstr "" + +#: editor/project_export.cpp +msgid "Encrypted (Provide Key Below)" +msgstr "" + +#: editor/project_export.cpp +msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)" +msgstr "" + +#: editor/project_export.cpp +msgid "GDScript Encryption Key (256-bits as hexadecimal):" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Note: Encryption key needs to be stored in the binary,\n" +"you need to build the export templates from source." +msgstr "" + +#: editor/project_export.cpp +msgid "More Info..." +msgstr "" + +#: editor/project_export.cpp +msgid "Export PCK/Zip..." +msgstr "" + +#: editor/project_export.cpp +msgid "Export Project..." +msgstr "" + +#: editor/project_export.cpp +msgid "Export All" +msgstr "" + +#: editor/project_export.cpp +msgid "Choose an export mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export All..." +msgstr "" + +#: editor/project_export.cpp editor/project_manager.cpp +msgid "ZIP File" +msgstr "" + +#: editor/project_export.cpp +msgid "Godot Project Pack" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing:" +msgstr "" + +#: editor/project_export.cpp +msgid "Project Export" +msgstr "" + +#: editor/project_export.cpp +msgid "Manage Export Templates" +msgstr "" + +#: editor/project_export.cpp +msgid "Export With Debug" +msgstr "" + +#: editor/project_manager.cpp +msgid "The path specified doesn't exist." +msgstr "" + +#: editor/project_manager.cpp +msgid "Error opening package file (it's not in ZIP format)." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose an empty folder." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a \"project.godot\" or \".zip\" file." +msgstr "" + +#: editor/project_manager.cpp +msgid "This directory already contains a Godot project." +msgstr "" + +#: editor/project_manager.cpp +msgid "New Game Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Imported Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Invalid project name." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't create folder." +msgstr "" + +#: editor/project_manager.cpp +msgid "There is already a folder in this path with the specified name." +msgstr "" + +#: editor/project_manager.cpp +msgid "It would be a good idea to name your project." +msgstr "" + +#: editor/project_manager.cpp +msgid "Invalid project path (changed anything?)." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Couldn't load project.godot in project path (error %d). It may be missing or " +"corrupted." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't edit project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Couldn't create project.godot in project path." +msgstr "" + +#: editor/project_manager.cpp +msgid "Error opening package file, not in ZIP format." +msgstr "" + +#: editor/project_manager.cpp +msgid "The following files failed extraction from package:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Package installed successfully!" +msgstr "" + +#: editor/project_manager.cpp +msgid "Rename Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import Existing Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import & Edit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Create & Edit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Install Project:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Install & Edit" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Name:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Path:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Installation Path:" +msgstr "" + +#: editor/project_manager.cpp +msgid "Renderer:" +msgstr "" + +#: editor/project_manager.cpp +msgid "OpenGL ES 3.0" +msgstr "" + +#: editor/project_manager.cpp +msgid "Not supported by your GPU drivers." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Higher visual quality\n" +"All features available\n" +"Incompatible with older hardware\n" +"Not recommended for web games" +msgstr "" + +#: editor/project_manager.cpp +msgid "OpenGL ES 2.0" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Lower visual quality\n" +"Some features not available\n" +"Works on most hardware\n" +"Recommended for web games" +msgstr "" + +#: editor/project_manager.cpp +msgid "Renderer can be changed later, but scenes may need to be adjusted." +msgstr "" + +#: editor/project_manager.cpp +msgid "Missing Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Error: Project is missing on the filesystem." +msgstr "" + +#: editor/project_manager.cpp editor/scene_tree_dock.cpp +msgid "Local" +msgstr "" + +#: editor/project_manager.cpp +msgid "Local Projects" +msgstr "" + +#: editor/project_manager.cpp +msgid "Asset Library Projects" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't open project at '%s'." +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to open more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"The following project settings file does not specify the version of Godot " +"through which it was created.\n" +"\n" +"%s\n" +"\n" +"If you proceed with opening it, it will be converted to Godot's current " +"configuration file format.\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"The following project settings file was generated by an older engine " +"version, and needs to be converted for this version:\n" +"\n" +"%s\n" +"\n" +"Do you want to convert it?\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"The project settings were created by a newer engine version, whose settings " +"are not compatible with this version." +msgstr "" + +#: editor/project_manager.cpp +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 "" + +#: 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 "" + +#: editor/project_manager.cpp +msgid "Are you sure to run %d projects at once?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove %d projects from the list?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove this project from the list?" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Remove all missing projects from the list?\n" +"The project folders' contents won't be modified." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Language changed.\n" +"The interface will update after restarting the editor or project manager." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Are you sure to scan %s folders for existing Godot projects?\n" +"This could take a while." +msgstr "" + +#. TRANSLATORS: This refers to the application where users manage their Godot projects. +#: editor/project_manager.cpp +msgctxt "Application" +msgid "Project Manager" +msgstr "" + +#: editor/project_manager.cpp +msgid "Last Modified" +msgstr "" + +#: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp +msgid "Edit Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Run Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "Scan Projects" +msgstr "" + +#: editor/project_manager.cpp +msgid "Select a Folder to Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "New Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Import Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove Project" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove Missing" +msgstr "" + +#: editor/project_manager.cpp +msgid "About" +msgstr "" + +#: editor/project_manager.cpp +msgid "Restart Now" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove All" +msgstr "" + +#: editor/project_manager.cpp +msgid "Also delete project contents (no undo!)" +msgstr "" + +#: editor/project_manager.cpp +msgid "Can't run project" +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 "" + +#: editor/project_manager.cpp +msgid "Filter projects" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"This field filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Physical Key" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Key " +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joy Axis" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button" +msgstr "" + +#: editor/project_settings_editor.cpp +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." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Rename Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Action deadzone" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "All Devices" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid " (Physical)" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Press a Key..." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Left Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Right Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "X Button 1" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "X Button 2" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Axis Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Joypad Button Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Event" +msgstr "" + +#: editor/project_settings_editor.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Button" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Left Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Right Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Middle Button." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Global Property" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Select a setting item first!" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "No property '%s' exists." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Setting '%s' is internal, and it can't be deleted." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Delete Item" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "" +"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " +"'\"'." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Error saving settings." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Settings saved OK." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Moved Input Action Event" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override for Feature" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add %d Translations" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Translation" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translation Resource Remap: Add %d Path(s)" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translation Resource Remap: Add %d Remap(s)" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Resource Remap Language" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap Option" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter Mode" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Project Settings (project.godot)" +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "General" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Override For..." +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "The editor must be restarted for changes to take effect." +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Input Map" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Action:" +msgstr "" + +#: editor/project_settings_editor.cpp scene/gui/scroll_container.cpp +msgid "Deadzone" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Index:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Localization" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Translations:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resources:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remaps by Locale:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show All Locales" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Show Selected Locales Only" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Filter mode:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locales:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "AutoLoad" +msgstr "" + +#: editor/project_settings_editor.cpp platform/android/export/export_plugin.cpp +#: platform/iphone/export/export.cpp +msgid "Plugins" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + +#: editor/property_editor.cpp +msgid "Preset..." +msgstr "" + +#: editor/property_editor.cpp +msgid "Zero" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing In-Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing Out-In" +msgstr "" + +#: editor/property_editor.cpp +msgid "File..." +msgstr "" + +#: editor/property_editor.cpp +msgid "Dir..." +msgstr "" + +#: editor/property_editor.cpp +msgid "Assign" +msgstr "" + +#: editor/property_editor.cpp +msgid "Select Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "Error loading file: Not a resource!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Node" +msgstr "" + +#: editor/property_editor.cpp +msgid "Bit %d, val %d." +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Property" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Virtual Method" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Method" +msgstr "" + +#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp +msgid "Batch Rename" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Prefix:" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Suffix:" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Use Regular Expressions" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Advanced Options" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Substitute" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Node name" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Node's parent name, if available" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Node type" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Current scene name" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Root node name" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "" +"Sequential integer counter.\n" +"Compare counter options." +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Per-level Counter" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "If set, the counter restarts for each group of child nodes." +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Initial value for the counter" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Amount by which counter is incremented for each node" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Padding" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "" +"Minimum number of digits for the counter.\n" +"Missing digits are padded with leading zeros." +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Post-Process" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Style" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Keep" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "PascalCase to snake_case" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "snake_case to PascalCase" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Case" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "To Lowercase" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "To Uppercase" +msgstr "" + +#: editor/rename_dialog.cpp scene/resources/default_theme/default_theme.cpp +msgid "Reset" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Regular Expression Error:" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "At character %s" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent Node" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Reparent Location (Select new Parent):" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Keep Global Transform" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Run Mode:" +msgstr "" + +#: editor/run_settings_dialog.cpp scene/main/scene_tree.cpp +msgid "Current Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene Arguments:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Scene Run Settings" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "No parent to instance the scenes at." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error loading scene from %s" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot instance the scene '%s' because the current scene exists within one " +"of its nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Scene(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Replace with Branch Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Child Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Detach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on the tree root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Node In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Nodes In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Duplicate Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't reparent nodes in inherited scenes, order of nodes can't change." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Node must belong to the edited scene to become root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instantiated scenes can't become root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Make node as Root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete %d nodes and any children?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete %d nodes?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete the root node \"%s\"?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete node \"%s\" and its children?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete node \"%s\"?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Saving the branch as a scene requires having a scene open in the editor." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Saving the branch as a scene requires selecting only one node, but you have " +"selected %d nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Can't save the root node branch as an instanced scene.\n" +"To create an editable copy of the current scene, duplicate it using the " +"FileSystem dock context menu\n" +"or create an inherited scene using Scene > New Inherited Scene... instead." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Can't save the branch of an already instanced scene.\n" +"To create a variation of a scene, you can make an inherited scene based on " +"the instanced scene using Scene > New Inherited Scene... instead." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Can't save a branch which is a child of an already instantiated scene.\n" +"To save this branch into its own scene, open the original scene, right click " +"on this branch, and select \"Save Branch as Scene\"." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Can't save a branch which is part of an inherited scene.\n" +"To save this branch into its own scene, open the original scene, right click " +"on this branch, and select \"Save Branch as Scene\"." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save New Scene As..." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Disabling \"editable_instance\" will cause all properties of the node to be " +"reverted to their default." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " +"cause all properties of the node to be reverted to their default." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Make Local" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Enable Scene Unique Name(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "New Scene Root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Create Root Node:" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "2D Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "3D Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "User Interface" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Other Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes from a foreign scene!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes the current scene inherits from!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on instanced scenes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remove Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change type of node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Couldn't save new scene. Likely dependencies (instances) couldn't be " +"satisfied." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error saving scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error duplicating scene to save it." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Sub-Resources" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Access as Scene Unique Name" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Editable Children" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Load As Placeholder" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot attach a script: there are no languages registered.\n" +"This is probably because this editor was built with all language modules " +"disabled." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add Child Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Expand/Collapse All" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change Type" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Make Scene Root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Merge From Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp +msgid "Save Branch as Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp +msgid "Copy Node Path" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete (No Confirm)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add/Create a New Node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Instance a scene file as a Node. Creates an inherited scene if no root node " +"exists." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach a new or existing script to the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Detach the script from the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remote" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"If selected, the Remote scene tree dock will cause the project to stutter " +"every time it updates.\n" +"Switch back to the Local scene tree dock to improve performance." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance? (No Undo!)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Show Scene Tree Root Selection" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Derive Script Globals By Name" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Use Favorites Root Selection" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Unlock Node" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Button Group" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "(Connecting From)" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"This node can be accessed from within anywhere in the scene by preceding it " +"with the '%s' prefix in a node path.\n" +"Click to disable this." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has %s connection(s) and %s group(s).\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has %s connection(s).\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in %s group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Open Script:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock it." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"AnimationPlayer is pinned.\n" +"Click to unpin." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Rename Node" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Scene Tree (Nodes):" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node Configuration Warning!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Select a Node" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is empty." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Filename is empty." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Path is not local." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid base path." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "A directory with the same name exists." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "File does not exist." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid extension." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Wrong extension chosen." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading template '%s'" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error - Could not create script in filesystem." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Error loading script from %s" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Overrides" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "N/A" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Open Script / Choose Location" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Open Script" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "File exists, it will be reused." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid path." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid class name." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid inherited parent name or path." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Script path/name is valid." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Allowed: a-z, A-Z, 0-9, _ and ." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in script (into scene file)." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Will create a new script file." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Will load an existing script file." +msgstr "" + +#: editor/script_create_dialog.cpp +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 "" +"Warning: Having the script name be the same as a built-in type is usually " +"not desired." +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Class Name:" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Template:" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script:" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Attach Node Script" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote %s:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Bytes:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Warning:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Error:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "C++ Error" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "C++ Error:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "C++ Source" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Source:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "C++ Source:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Trace" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Child process connected." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Copy Error" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Open C++ Source on GitHub" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Video RAM" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Skip Breakpoints" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Previous Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Next Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Frames" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Filter stack variables" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Auto Switch To Remote Scene Tree" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote Scene Tree Refresh Interval" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote Inspect Refresh Interval" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Network Profiler" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitor" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Pick one or more items from the list to display the graph." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "List of Video Memory Usage by Resource:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Total:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp +#: modules/visual_script/visual_script_nodes.cpp +msgid "Resource Path" +msgstr "" + +#: editor/script_editor_debugger.cpp scene/resources/audio_stream_sample.cpp +#: servers/audio/effects/audio_effect_record.cpp +msgid "Format" +msgstr "" + +#: editor/script_editor_debugger.cpp scene/main/viewport.cpp +msgid "Usage" +msgstr "" + +#: editor/script_editor_debugger.cpp servers/visual_server.cpp +msgid "Misc" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control Type:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Live Edit Root:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Set From Tree" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Export measures as CSV" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Erase Shortcut" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Restore Shortcut" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Change Shortcut" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Editor Settings" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Shortcuts" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Binding" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Light Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Stream Player 3D" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change AudioStreamPlayer3D Emission Angle" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp modules/gltf/gltf_node.cpp +#: platform/osx/export/export.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Camera" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera FOV" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera Size" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Visibility Notifier" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Notifier AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Particles AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Reflection Probe" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Probe Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "GI Probe" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Baked Indirect Light" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +msgid "Change Sphere Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +msgid "Change Box Shape Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Cylinder Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Cylinder Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Ray Shape Length" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Navigation Edge" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Navigation Edge Disabled" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Navigation Solid" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Navigation Solid Disabled" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Joint Body A" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Joint Body B" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Room Edge" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Room Overlap" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Room Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp scene/3d/portal.cpp +msgid "Portal Margin" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Portal Edge" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Portal Arrow" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Portal Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Portal Front" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Portal Back" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp scene/2d/light_occluder_2d.cpp +#: scene/2d/tile_map.cpp +msgid "Occluder" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Sphere Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Sphere Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Polygon Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Set Occluder Hole Point Position" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Occluder Polygon Front" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Occluder Polygon Back" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Occluder Hole" +msgstr "" + +#: main/main.cpp +msgid "Godot Physics" +msgstr "" + +#: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp +#: servers/visual/visual_server_scene.cpp +msgid "Use BVH" +msgstr "" + +#: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp +#: servers/visual/visual_server_scene.cpp +msgid "BVH Collision Margin" +msgstr "" + +#: main/main.cpp +msgid "Crash Handler" +msgstr "" + +#: main/main.cpp +msgid "Multithreaded Server" +msgstr "" + +#: main/main.cpp +msgid "RID Pool Prealloc" +msgstr "" + +#: main/main.cpp +msgid "Debugger stdout" +msgstr "" + +#: main/main.cpp +msgid "Max Chars Per Second" +msgstr "" + +#: main/main.cpp +msgid "Max Messages Per Frame" +msgstr "" + +#: main/main.cpp +msgid "Max Errors Per Second" +msgstr "" + +#: main/main.cpp +msgid "Max Warnings Per Second" +msgstr "" + +#: main/main.cpp +msgid "Flush stdout On Print" +msgstr "" + +#: main/main.cpp servers/visual_server.cpp +msgid "Logging" +msgstr "" + +#: main/main.cpp +msgid "File Logging" +msgstr "" + +#: main/main.cpp +msgid "Enable File Logging" +msgstr "" + +#: main/main.cpp +msgid "Log Path" +msgstr "" + +#: main/main.cpp +msgid "Max Log Files" +msgstr "" + +#: main/main.cpp +msgid "Driver" +msgstr "" + +#: main/main.cpp +msgid "Driver Name" +msgstr "" + +#: main/main.cpp +msgid "Fallback To GLES2" +msgstr "" + +#: main/main.cpp +msgid "Use Nvidia Rect Flicker Workaround" +msgstr "" + +#: main/main.cpp +msgid "DPI" +msgstr "" + +#: main/main.cpp +msgid "Allow hiDPI" +msgstr "" + +#: main/main.cpp +msgid "V-Sync" +msgstr "" + +#: main/main.cpp +msgid "Use V-Sync" +msgstr "" + +#: main/main.cpp +msgid "Per Pixel Transparency" +msgstr "" + +#: main/main.cpp +msgid "Allowed" +msgstr "" + +#: main/main.cpp +msgid "Intended Usage" +msgstr "" + +#: main/main.cpp +msgid "Framebuffer Allocation" +msgstr "" + +#: main/main.cpp platform/uwp/os_uwp.cpp +msgid "Energy Saving" +msgstr "" + +#: main/main.cpp +msgid "Threads" +msgstr "" + +#: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h +msgid "Thread Model" +msgstr "" + +#: main/main.cpp +msgid "Thread Safe BVH" +msgstr "" + +#: main/main.cpp +msgid "Handheld" +msgstr "" + +#: main/main.cpp platform/javascript/export/export.cpp +#: platform/uwp/export/export.cpp +msgid "Orientation" +msgstr "" + +#: main/main.cpp scene/gui/scroll_container.cpp scene/gui/text_edit.cpp +#: scene/main/scene_tree.cpp scene/register_scene_types.cpp +msgid "Common" +msgstr "" + +#: main/main.cpp +msgid "Physics FPS" +msgstr "" + +#: main/main.cpp +msgid "Force FPS" +msgstr "" + +#: main/main.cpp +msgid "Enable Pause Aware Picking" +msgstr "" + +#: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp +#: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp +#: scene/main/viewport.cpp scene/register_scene_types.cpp +msgid "GUI" +msgstr "" + +#: main/main.cpp +msgid "Drop Mouse On GUI Input Disabled" +msgstr "" + +#: main/main.cpp +msgid "stdout" +msgstr "" + +#: main/main.cpp +msgid "Print FPS" +msgstr "" + +#: main/main.cpp +msgid "Verbose stdout" +msgstr "" + +#: main/main.cpp scene/main/scene_tree.cpp scene/resources/multimesh.cpp +msgid "Physics Interpolation" +msgstr "" + +#: main/main.cpp +msgid "Enable Warnings" +msgstr "" + +#: main/main.cpp +msgid "Frame Delay Msec" +msgstr "" + +#: main/main.cpp +msgid "Low Processor Mode" +msgstr "" + +#: main/main.cpp +msgid "Delta Sync After Draw" +msgstr "" + +#: main/main.cpp +msgid "iOS" +msgstr "" + +#: main/main.cpp +msgid "Hide Home Indicator" +msgstr "" + +#: main/main.cpp +msgid "Input Devices" +msgstr "" + +#: main/main.cpp +msgid "Pointing" +msgstr "" + +#: main/main.cpp +msgid "Touch Delay" +msgstr "" + +#: main/main.cpp servers/visual_server.cpp +msgid "GLES3" +msgstr "" + +#: main/main.cpp servers/visual_server.cpp +msgid "Shaders" +msgstr "" + +#: main/main.cpp +msgid "Debug Shader Fallbacks" +msgstr "" + +#: main/main.cpp scene/3d/baked_lightmap.cpp scene/3d/camera.cpp +#: scene/3d/world_environment.cpp scene/main/scene_tree.cpp +#: scene/resources/world.cpp +msgid "Environment" +msgstr "" + +#: main/main.cpp +msgid "Default Clear Color" +msgstr "" + +#: main/main.cpp +msgid "Boot Splash" +msgstr "" + +#: main/main.cpp +msgid "Show Image" +msgstr "" + +#: main/main.cpp +msgid "Image" +msgstr "" + +#: main/main.cpp +msgid "Fullsize" +msgstr "" + +#: main/main.cpp scene/resources/dynamic_font.cpp +msgid "Use Filter" +msgstr "" + +#: main/main.cpp scene/resources/style_box.cpp +msgid "BG Color" +msgstr "" + +#: main/main.cpp +msgid "macOS Native Icon" +msgstr "" + +#: main/main.cpp +msgid "Windows Native Icon" +msgstr "" + +#: main/main.cpp +msgid "Buffering" +msgstr "" + +#: main/main.cpp +msgid "Agile Event Flushing" +msgstr "" + +#: main/main.cpp +msgid "Emulate Touch From Mouse" +msgstr "" + +#: main/main.cpp +msgid "Emulate Mouse From Touch" +msgstr "" + +#: main/main.cpp +msgid "Mouse Cursor" +msgstr "" + +#: main/main.cpp +msgid "Custom Image" +msgstr "" + +#: main/main.cpp +msgid "Custom Image Hotspot" +msgstr "" + +#: main/main.cpp +msgid "Tooltip Position Offset" +msgstr "" + +#: main/main.cpp modules/mono/mono_gd/gd_mono.cpp +msgid "Debugger Agent" +msgstr "" + +#: main/main.cpp modules/mono/mono_gd/gd_mono.cpp +msgid "Wait For Debugger" +msgstr "" + +#: main/main.cpp modules/mono/mono_gd/gd_mono.cpp +msgid "Wait Timeout" +msgstr "" + +#: main/main.cpp +msgid "Runtime" +msgstr "" + +#: main/main.cpp +msgid "Unhandled Exception Policy" +msgstr "" + +#: main/main.cpp +msgid "Main Loop Type" +msgstr "" + +#: main/main.cpp scene/gui/texture_progress.cpp +#: scene/gui/viewport_container.cpp +msgid "Stretch" +msgstr "" + +#: main/main.cpp +msgid "Aspect" +msgstr "" + +#: main/main.cpp +msgid "Shrink" +msgstr "" + +#: main/main.cpp scene/main/scene_tree.cpp +msgid "Auto Accept Quit" +msgstr "" + +#: main/main.cpp scene/main/scene_tree.cpp +msgid "Quit On Go Back" +msgstr "" + +#: main/main.cpp scene/main/viewport.cpp +msgid "Snap Controls To Pixels" +msgstr "" + +#: main/main.cpp +msgid "Dynamic Fonts" +msgstr "" + +#: main/main.cpp +msgid "Use Oversampling" +msgstr "" + +#: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp +msgid "Active Soft World" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "CSG" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Cylinder Radius" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Cylinder Height" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Torus Inner Radius" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Torus Outer Radius" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Operation" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Calculate Tangents" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Use Collision" +msgstr "" + +#: modules/csg/csg_shape.cpp servers/physics_2d_server.cpp +msgid "Collision Layer" +msgstr "" + +#: modules/csg/csg_shape.cpp scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp +#: scene/3d/ray_cast.cpp scene/3d/spring_arm.cpp +#: scene/resources/navigation_mesh.cpp servers/physics_server.cpp +msgid "Collision Mask" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Invert Faces" +msgstr "" + +#: modules/csg/csg_shape.cpp scene/2d/navigation_agent_2d.cpp +#: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_agent.cpp +#: scene/3d/navigation_obstacle.cpp scene/3d/vehicle_body.cpp +#: scene/animation/root_motion_view.cpp scene/resources/capsule_shape.cpp +#: scene/resources/capsule_shape_2d.cpp scene/resources/circle_shape_2d.cpp +#: scene/resources/cylinder_shape.cpp scene/resources/environment.cpp +#: scene/resources/navigation_mesh.cpp scene/resources/primitive_meshes.cpp +#: scene/resources/sphere_shape.cpp +msgid "Radius" +msgstr "" + +#: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp +msgid "Radial Segments" +msgstr "" + +#: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp +msgid "Rings" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Smooth Faces" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Sides" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Cone" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Inner Radius" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Outer Radius" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Ring Sides" +msgstr "" + +#: modules/csg/csg_shape.cpp scene/2d/collision_polygon_2d.cpp +#: scene/2d/light_occluder_2d.cpp scene/2d/polygon_2d.cpp +#: scene/3d/collision_polygon.cpp +msgid "Polygon" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Spin Degrees" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Spin Sides" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Node" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Interval Type" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Interval" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Simplify Angle" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Rotation" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Local" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Continuous U" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path U Distance" +msgstr "" + +#: modules/csg/csg_shape.cpp +msgid "Path Joined" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "Compression Mode" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "Transfer Channel" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "Channel Count" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "Always Ordered" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "Server Relay" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "DTLS Verify" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "DTLS Hostname" +msgstr "" + +#: modules/enet/networked_multiplayer_enet.cpp +msgid "Use DTLS" +msgstr "" + +#: modules/fbx/editor_scene_importer_fbx.cpp +msgid "FBX" +msgstr "" + +#: modules/fbx/editor_scene_importer_fbx.cpp +msgid "Use FBX" +msgstr "" + +#: modules/gdnative/gdnative.cpp +msgid "Config File" +msgstr "" + +#: modules/gdnative/gdnative.cpp +msgid "Load Once" +msgstr "" + +#: modules/gdnative/gdnative.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Singleton" +msgstr "" + +#: modules/gdnative/gdnative.cpp +msgid "Symbol Prefix" +msgstr "" + +#: modules/gdnative/gdnative.cpp +msgid "Reloadable" +msgstr "" + +#: modules/gdnative/gdnative.cpp +#: modules/gdnative/gdnative_library_singleton_editor.cpp +#: modules/gdnative/nativescript/nativescript.cpp +msgid "Library" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Select the dynamic library for this entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Select dependencies of the library for this entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Remove current entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Double click to create a new entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Platform:" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Platform" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Dynamic Library" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Add an architecture entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "GDNativeLibrary" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Enabled GDNative Singleton" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Disabled GDNative Singleton" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Libraries:" +msgstr "" + +#: modules/gdnative/nativescript/nativescript.cpp +msgid "Class Name" +msgstr "" + +#: modules/gdnative/nativescript/nativescript.cpp +msgid "Script Class" +msgstr "" + +#: modules/gdnative/nativescript/nativescript.cpp +msgid "Icon Path" +msgstr "" + +#: modules/gdnative/register_types.cpp +msgid "GDNative" +msgstr "" + +#: modules/gdscript/editor/gdscript_highlighter.cpp +#: modules/gdscript/gdscript.cpp +msgid "GDScript" +msgstr "" + +#: modules/gdscript/editor/gdscript_highlighter.cpp +msgid "Function Definition Color" +msgstr "" + +#: modules/gdscript/editor/gdscript_highlighter.cpp +msgid "Node Path Color" +msgstr "" + +#: modules/gdscript/gdscript.cpp modules/visual_script/visual_script.cpp +msgid "Max Call Stack" +msgstr "" + +#: modules/gdscript/gdscript.cpp +msgid "Treat Warnings As Errors" +msgstr "" + +#: modules/gdscript/gdscript.cpp +msgid "Exclude Addons" +msgstr "" + +#: modules/gdscript/gdscript.cpp +msgid "Autocomplete Setters And Getters" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Step argument is zero!" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not a script with an instance" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a script" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a resource file" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (missing @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (can't load script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (invalid script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary (invalid subclasses)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Object can't provide a length." +msgstr "" + +#: modules/gdscript/language_server/gdscript_language_server.cpp +msgid "Language Server" +msgstr "" + +#: modules/gdscript/language_server/gdscript_language_server.cpp +msgid "Enable Smart Resolve" +msgstr "" + +#: modules/gdscript/language_server/gdscript_language_server.cpp +msgid "Show Native Symbols In Editor" +msgstr "" + +#: modules/gdscript/language_server/gdscript_language_server.cpp +msgid "Use Thread" +msgstr "" + +#: modules/gltf/editor_scene_exporter_gltf_plugin.cpp +msgid "Export Mesh GLTF2" +msgstr "" + +#: modules/gltf/editor_scene_exporter_gltf_plugin.cpp +msgid "Export GLTF..." +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Buffer View" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp +msgid "Byte Offset" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Component Type" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Normalized" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Count" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp +msgid "Min" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp +msgid "Max" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Sparse Count" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Sparse Indices Buffer View" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Sparse Indices Byte Offset" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Sparse Indices Component Type" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Sparse Values Buffer View" +msgstr "" + +#: modules/gltf/gltf_accessor.cpp +msgid "Sparse Values Byte Offset" +msgstr "" + +#: modules/gltf/gltf_buffer_view.cpp +msgid "Buffer" +msgstr "" + +#: modules/gltf/gltf_buffer_view.cpp +msgid "Byte Length" +msgstr "" + +#: modules/gltf/gltf_buffer_view.cpp +msgid "Byte Stride" +msgstr "" + +#: modules/gltf/gltf_buffer_view.cpp +msgid "Indices" +msgstr "" + +#: modules/gltf/gltf_camera.cpp +msgid "FOV Size" +msgstr "" + +#: modules/gltf/gltf_camera.cpp +msgid "Zfar" +msgstr "" + +#: modules/gltf/gltf_camera.cpp +msgid "Znear" +msgstr "" + +#: modules/gltf/gltf_light.cpp scene/2d/canvas_modulate.cpp +#: scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp scene/2d/polygon_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/light.cpp +#: scene/animation/root_motion_view.cpp scene/gui/color_picker.cpp +#: scene/gui/color_rect.cpp scene/gui/rich_text_effect.cpp +#: scene/resources/environment.cpp scene/resources/material.cpp +#: scene/resources/particles_material.cpp scene/resources/sky.cpp +#: scene/resources/style_box.cpp +msgid "Color" +msgstr "" + +#: modules/gltf/gltf_light.cpp scene/3d/reflection_probe.cpp +#: scene/resources/environment.cpp +msgid "Intensity" +msgstr "" + +#: modules/gltf/gltf_light.cpp scene/2d/light_2d.cpp scene/3d/light.cpp +msgid "Range" +msgstr "" + +#: modules/gltf/gltf_light.cpp +msgid "Inner Cone Angle" +msgstr "" + +#: modules/gltf/gltf_light.cpp +msgid "Outer Cone Angle" +msgstr "" + +#: modules/gltf/gltf_mesh.cpp +msgid "Blend Weights" +msgstr "" + +#: modules/gltf/gltf_mesh.cpp +msgid "Instance Materials" +msgstr "" + +#: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp +msgid "Parent" +msgstr "" + +#: modules/gltf/gltf_node.cpp +msgid "Xform" +msgstr "" + +#: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp +msgid "Skin" +msgstr "" + +#: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp +msgid "Translation" +msgstr "" + +#: modules/gltf/gltf_node.cpp +msgid "Children" +msgstr "" + +#: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp +msgid "Joints" +msgstr "" + +#: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp +msgid "Roots" +msgstr "" + +#: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_state.cpp +msgid "Unique Names" +msgstr "" + +#: modules/gltf/gltf_skeleton.cpp +msgid "Godot Bone Node" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Skin Root" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Joints Original" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Inverse Binds" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Non Joints" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Joint I To Bone I" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Joint I To Name" +msgstr "" + +#: modules/gltf/gltf_skin.cpp +msgid "Godot Skin" +msgstr "" + +#: modules/gltf/gltf_spec_gloss.cpp +msgid "Diffuse Img" +msgstr "" + +#: modules/gltf/gltf_spec_gloss.cpp +msgid "Diffuse Factor" +msgstr "" + +#: modules/gltf/gltf_spec_gloss.cpp +msgid "Gloss Factor" +msgstr "" + +#: modules/gltf/gltf_spec_gloss.cpp +msgid "Specular Factor" +msgstr "" + +#: modules/gltf/gltf_spec_gloss.cpp +msgid "Spec Gloss Img" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Json" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Major Version" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Minor Version" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "GLB Data" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Use Named Skin Binds" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Buffer Views" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Accessors" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Scene Name" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Root Nodes" +msgstr "" + +#: modules/gltf/gltf_state.cpp scene/2d/particles_2d.cpp +#: scene/gui/texture_button.cpp scene/gui/texture_progress.cpp +msgid "Textures" +msgstr "" + +#: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp +msgid "Images" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Cameras" +msgstr "" + +#: modules/gltf/gltf_state.cpp servers/visual_server.cpp +msgid "Lights" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Unique Animation Names" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Skeletons" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Skeleton To Node" +msgstr "" + +#: modules/gltf/gltf_state.cpp +msgid "Animations" +msgstr "" + +#: modules/gltf/gltf_texture.cpp +msgid "Src Image" +msgstr "" + +#: modules/gridmap/grid_map.cpp +msgid "Mesh Library" +msgstr "" + +#: modules/gridmap/grid_map.cpp +msgid "Physics Material" +msgstr "" + +#: modules/gridmap/grid_map.cpp scene/3d/visual_instance.cpp +msgid "Use In Baked Light" +msgstr "" + +#: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp +msgid "Cell" +msgstr "" + +#: modules/gridmap/grid_map.cpp +msgid "Octant Size" +msgstr "" + +#: modules/gridmap/grid_map.cpp +msgid "Center X" +msgstr "" + +#: modules/gridmap/grid_map.cpp +msgid "Center Y" +msgstr "" + +#: modules/gridmap/grid_map.cpp +msgid "Center Z" +msgstr "" + +#: modules/gridmap/grid_map.cpp scene/2d/collision_object_2d.cpp +#: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp +#: scene/resources/material.cpp +msgid "Mask" +msgstr "" + +#: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp +msgid "Bake Navigation" +msgstr "" + +#: modules/gridmap/grid_map.cpp scene/2d/navigation_2d.cpp +#: scene/2d/navigation_agent_2d.cpp scene/2d/navigation_polygon.cpp +#: scene/2d/tile_map.cpp scene/3d/navigation.cpp scene/3d/navigation_agent.cpp +#: scene/3d/navigation_mesh_instance.cpp +msgid "Navigation Layers" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Plane" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Plane" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Plane:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Floor:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Delete Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Fill Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Paste Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Paint" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Snap View" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Disabled" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Above" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Below" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit X Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Y Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Z Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Clear Rotation" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Paste Selects" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clear Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Fill Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Settings" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Pick Distance:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Filter meshes" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Give a MeshLibrary resource to this GridMap to use its meshes." +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Begin Bake" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Preparing data structures" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Generate buffers" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Direct lighting" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Indirect lighting" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Post processing" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Plotting lightmaps" +msgstr "" + +#: modules/lightmapper_cpu/register_types.cpp +msgid "CPU Lightmapper" +msgstr "" + +#: modules/lightmapper_cpu/register_types.cpp +msgid "Low Quality Ray Count" +msgstr "" + +#: modules/lightmapper_cpu/register_types.cpp +msgid "Medium Quality Ray Count" +msgstr "" + +#: modules/lightmapper_cpu/register_types.cpp +msgid "High Quality Ray Count" +msgstr "" + +#: modules/lightmapper_cpu/register_types.cpp +msgid "Ultra Quality Ray Count" +msgstr "" + +#: modules/minimp3/audio_stream_mp3.cpp +#: modules/minimp3/resource_importer_mp3.cpp +#: modules/stb_vorbis/audio_stream_ogg_vorbis.cpp +#: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp +msgid "Loop Offset" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "Eye Height" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "IOD" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "Display Width" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "Display To Lens" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "Oversample" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "K1" +msgstr "" + +#: modules/mobile_vr/mobile_vr_interface.cpp +msgid "K2" +msgstr "" + +#: modules/mono/csharp_script.cpp +msgid "Class name can't be a reserved keyword" +msgstr "" + +#: modules/mono/csharp_script.cpp +msgid "Build Solution" +msgstr "" + +#: modules/mono/editor/csharp_project.cpp +msgid "Auto Update Project" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + +#: modules/mono/mono_gd/gd_mono_utils.cpp +msgid "End of inner exception stack trace" +msgstr "" + +#: modules/navigation/navigation_mesh_editor_plugin.cpp +#: scene/3d/navigation_mesh_instance.cpp +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "" + +#: modules/navigation/navigation_mesh_editor_plugin.cpp +msgid "Bake NavMesh" +msgstr "" + +#: modules/navigation/navigation_mesh_editor_plugin.cpp +msgid "Clear the navigation mesh." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Setting up Configuration..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Calculating grid size..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Creating heightfield..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Marking walkable triangles..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Constructing compact heightfield..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Eroding walkable area..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Partitioning..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Creating contours..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Creating polymesh..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Converting to native navigation mesh..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Navigation Mesh Generator Setup:" +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Parsing Geometry..." +msgstr "" + +#: modules/navigation/navigation_mesh_generator.cpp +msgid "Done!" +msgstr "" + +#: modules/opensimplex/noise_texture.cpp +msgid "Seamless" +msgstr "" + +#: modules/opensimplex/noise_texture.cpp +msgid "As Normal Map" +msgstr "" + +#: modules/opensimplex/noise_texture.cpp +msgid "Bump Strength" +msgstr "" + +#: modules/opensimplex/noise_texture.cpp +msgid "Noise" +msgstr "" + +#: modules/opensimplex/noise_texture.cpp +msgid "Noise Offset" +msgstr "" + +#: modules/opensimplex/open_simplex_noise.cpp +msgid "Octaves" +msgstr "" + +#: modules/opensimplex/open_simplex_noise.cpp +msgid "Period" +msgstr "" + +#: modules/opensimplex/open_simplex_noise.cpp +msgid "Persistence" +msgstr "" + +#: modules/opensimplex/open_simplex_noise.cpp +msgid "Lacunarity" +msgstr "" + +#: modules/regex/regex.cpp +msgid "Subject" +msgstr "" + +#: modules/regex/regex.cpp +msgid "Names" +msgstr "" + +#: modules/regex/regex.cpp +msgid "Strings" +msgstr "" + +#: modules/upnp/upnp.cpp +msgid "Discover Multicast If" +msgstr "" + +#: modules/upnp/upnp.cpp +msgid "Discover Local Port" +msgstr "" + +#: modules/upnp/upnp.cpp +msgid "Discover IPv6" +msgstr "" + +#: modules/upnp/upnp_device.cpp +msgid "Description URL" +msgstr "" + +#: modules/upnp/upnp_device.cpp +msgid "Service Type" +msgstr "" + +#: modules/upnp/upnp_device.cpp +msgid "IGD Control URL" +msgstr "" + +#: modules/upnp/upnp_device.cpp +msgid "IGD Service Type" +msgstr "" + +#: modules/upnp/upnp_device.cpp +msgid "IGD Our Addr" +msgstr "" + +#: modules/upnp/upnp_device.cpp +msgid "IGD Status" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"A node yielded without working memory, please read the docs on how to yield " +"properly!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Node yielded, but did not return a function state in the first working " +"memory." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Return value must be assigned to first element of node working memory! Fix " +"your node please." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Node returned an invalid sequence output:" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Found sequence bit but not the node in the stack, report bug!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Stack overflow with stack depth:" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Visual Script" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Signal Arguments" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Default Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Input Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Output Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Port Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Port Name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Override an existing built-in function." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create a new function." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Variables:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create a new variable." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Signals:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create a new signal." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name is not a valid identifier:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name already in use by another func/var/signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete input port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Input Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Output Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Expression" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't copy the function node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Duplicate VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Preload Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s)" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s) From Tree" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "" +"Can't drop properties because script '%s' is not used in this scene.\n" +"Drop holding 'Shift' to just copy the signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Getter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Setter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Move Node(s)" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Disconnect Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Node Data" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Node Sequence" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Script already has function '%s'" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Input Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Resize Comment" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't create function with a function node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't create function of nodes from nodes of multiple functions." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select at least one node with sequence port." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Try to only have one sequence input in selection." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Variable:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Make Tool:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Members:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Nodes..." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function..." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "function_name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select or create a function to edit its graph." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete Selected" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Find Node Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Copy Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Cut Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Make Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Refresh Graph" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Member" +msgstr "" + +#: modules/visual_script/visual_script_expression.cpp +#: scene/resources/visual_shader.cpp +msgid "Expression" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Return" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Return Enabled" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Return Type" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +#: scene/resources/visual_shader_nodes.cpp +msgid "Condition" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "if (cond) is:" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "While" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "while (cond):" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "for (elem) in (input):" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Input type not iterable:" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid:" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Sequence" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "in order:" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Steps" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Switch" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "'input' is:" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Type Cast" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Is %s?" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base Script" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "On %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "On Self" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Call Mode" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_nodes.cpp +msgid "Basic Type" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_nodes.cpp +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Node Path" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Use Default Args" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Validate" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "RPC Call Mode" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Subtract %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Multiply %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Divide %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Mod %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "ShiftLeft %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "ShiftRight %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "BitAnd %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "BitOr %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "BitXor %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Set Mode" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Assign Op" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +#: modules/visual_script/visual_script_nodes.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Get %s" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base object is not a Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Path does not lead to Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name '%s' in node %s." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Emit %s" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Compose Array" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp +#: scene/resources/visual_shader_nodes.cpp +msgid "Operator" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Invalid argument of type:" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Invalid arguments:" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "a if cond, else b" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Var Name" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableGet not found in script:" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableSet not found in script:" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Preload" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Get Index" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Set Index" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Global Constant" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Class Constant" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Basic Constant" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Math Constant" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Get Engine Singleton" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Get Scene Node" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Get Scene Tree" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Get Self" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "CustomNode" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Custom node has no _step() method, can't process graph." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "" +"Invalid return value from _step(), must be integer (seq out), or string " +"(error)." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "SubCall" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp scene/gui/graph_node.cpp +msgid "Title" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Construct %s" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Get Local Var" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Set Local Var" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Action %s" +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Deconstruct %s" +msgstr "" + +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Search VisualScript" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Yield" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Wait" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Next Frame" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "Next Physics Frame" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "%s sec(s)" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp scene/main/timer.cpp +msgid "Wait Time" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "WaitSignal" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "WaitNodeSignal" +msgstr "" + +#: modules/visual_script/visual_script_yield_nodes.cpp +msgid "WaitInstanceSignal" +msgstr "" + +#: modules/webrtc/webrtc_data_channel.cpp +msgid "Write Mode" +msgstr "" + +#: modules/webrtc/webrtc_data_channel.h +msgid "WebRTC" +msgstr "" + +#: modules/webrtc/webrtc_data_channel.h +msgid "Max Channel In Buffer (KB)" +msgstr "" + +#: modules/websocket/websocket_client.cpp +msgid "Verify SSL" +msgstr "" + +#: modules/websocket/websocket_client.cpp +msgid "Trusted SSL Certificate" +msgstr "" + +#: modules/websocket/websocket_macros.h +msgid "WebSocket Client" +msgstr "" + +#: modules/websocket/websocket_macros.h +msgid "Max In Buffer (KB)" +msgstr "" + +#: modules/websocket/websocket_macros.h +msgid "Max In Packets" +msgstr "" + +#: modules/websocket/websocket_macros.h +msgid "Max Out Buffer (KB)" +msgstr "" + +#: modules/websocket/websocket_macros.h +msgid "Max Out Packets" +msgstr "" + +#: modules/websocket/websocket_macros.h +msgid "WebSocket Server" +msgstr "" + +#: modules/websocket/websocket_server.cpp +msgid "Bind IP" +msgstr "" + +#: modules/websocket/websocket_server.cpp +msgid "Private Key" +msgstr "" + +#: modules/websocket/websocket_server.cpp platform/javascript/export/export.cpp +msgid "SSL Certificate" +msgstr "" + +#: modules/websocket/websocket_server.cpp +msgid "CA Chain" +msgstr "" + +#: modules/websocket/websocket_server.cpp +msgid "Handshake Timeout" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Session Mode" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Required Features" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Optional Features" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Requested Reference Space Types" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Reference Space Type" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Visibility State" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "Bounds Geometry" +msgstr "" + +#: modules/webxr/webxr_interface.cpp +msgid "XR Standard Mapping" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Android SDK Path" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Debug Keystore" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Debug Keystore User" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Debug Keystore Pass" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Force System User" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Shutdown ADB On Exit" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Launcher Icons" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Main 192 X 192" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Adaptive Foreground 432 X 432" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Adaptive Background 432 X 432" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Package name is missing." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Package segments must be of non-zero length." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "The character '%s' is not allowed in Android application package names." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "A digit cannot be the first character in a package segment." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "The character '%s' cannot be the first character in a package segment." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "The package must have at least one '.' separator." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Custom Build" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Use Custom Build" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Export Format" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Min SDK" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Target SDK" +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp +msgid "Architectures" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Keystore" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Debug User" +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp +msgid "Debug Password" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Release User" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Release Password" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "One Click Deploy" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Clear Previous Install" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Code" +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp +msgid "Package" +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp +msgid "Unique Name" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Signed" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Classify As Game" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Retain Data On Uninstall" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Exclude From Recents" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Graphics" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "OpenGL Debug" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "XR Features" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "XR Mode" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Hand Tracking" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Hand Tracking Frequency" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Passthrough" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Immersive Mode" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Support Small" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Support Normal" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Support Large" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Support Xlarge" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "User Data Backup" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Allow" +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp +msgid "Command Line" +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp +msgid "Extra Args" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "APK Expansion" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Salt" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Public Key" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Permissions" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Custom Permissions" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Select device from the list" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Running on %s" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Exporting APK..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Uninstalling..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Installing to device, please wait..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not install to device: %s" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Running on device..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not execute on device." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Android build template not installed in the project. Install it from the " +"Project menu." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Either Debug Keystore, Debug User AND Debug Password settings must be " +"configured OR none of them." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Debug keystore not configured in the Editor Settings nor in the preset." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Either Release Keystore, Release User AND Release Password settings must be " +"configured OR none of them." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Release keystore incorrectly configured in the export preset." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "A valid Android SDK path is required in Editor Settings." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid Android SDK path in Editor Settings." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Missing 'platform-tools' directory!" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Unable to find Android SDK platform-tools' adb command." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Please check in the Android SDK directory specified in Editor Settings." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Missing 'build-tools' directory!" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Unable to find Android SDK build-tools' apksigner command." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid public key for APK expansion." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid package name:" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" " +"project setting (changed in Godot 3.2.2).\n" +"Replace it with the first-party \"GodotGooglePlayBilling\" plugin.\n" +"Note that the singleton was also renamed from \"GodotPayments\" to " +"\"GodotGooglePlayBilling\"." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "\"Use Custom Build\" must be enabled to use the plugins." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Hand Tracking\" is only valid when \"XR Mode\" is \"Oculus Mobile VrApi\" " +"or \"OpenXR\"." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Min SDK\" cannot be lower than %d, which is the version needed by the " +"Godot library." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"\"Target SDK\" %d is higher than the default version %d. This may work, but " +"wasn't tested and may be unstable." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "\"Target SDK\" version must be greater or equal to \"Min SDK\" version." +msgstr "" + +#: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp +#: platform/windows/export/export.cpp +msgid "Code Signing" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"'apksigner' could not be found. Please check that the command is available " +"in the Android SDK build-tools directory. The resulting %s is unsigned." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Signing debug %s..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Signing release %s..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not find keystore, unable to export." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not start apksigner executable." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "'apksigner' returned with error #%d" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Verifying %s..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "'apksigner' verification of %s failed." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Exporting for Android" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid filename! Android App Bundle requires the *.aab extension." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "APK Expansion not compatible with Android App Bundle." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Invalid filename! Android APK requires the *.apk extension." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Unsupported export format!" +msgstr "" + +#: platform/android/export/export_plugin.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_plugin.cpp +msgid "" +"Android build version mismatch: Template installed: %s, Godot version: %s. " +"Please reinstall Android build template from 'Project' menu." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Unable to overwrite res://android/build/res/*.xml files with project name." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not export project files to gradle project." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not write expansion package file!" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Building Android Project (gradle)" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Building of Android project failed, check output for the error. " +"Alternatively visit docs.godotengine.org for Android build documentation." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Moving output" +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Unable to copy and rename export file, check gradle project directory for " +"outputs." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Package not found: \"%s\"." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Creating APK..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not find template APK to export: \"%s\"." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "" +"Missing libraries in the export template for the selected architectures: %s. " +"Please build a template with all required libraries, or uncheck the missing " +"architectures in the export preset." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Adding files..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not export project files." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Aligning APK..." +msgstr "" + +#: platform/android/export/export_plugin.cpp +msgid "Could not unzip temporary unaligned APK." +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Identifier is missing." +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "The character '%s' is not allowed in Identifier." +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Landscape Launch Screens" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 2436 X 1125" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 2208 X 1242" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 1024 X 768" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 2048 X 1536" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Portrait Launch Screens" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 640 X 960" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 640 X 1136" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 750 X 1334" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 1125 X 2436" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 768 X 1024" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 1536 X 2048" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 1242 X 2208" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "App Store Team ID" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Provisioning Profile UUID Debug" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Code Sign Identity Debug" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Export Method Debug" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Provisioning Profile UUID Release" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Code Sign Identity Release" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Export Method Release" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Targeted Device Family" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Info" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Identifier" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Signature" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Short Version" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +#: platform/windows/export/export.cpp +msgid "Copyright" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Capabilities" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Access Wi-Fi" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Push Notifications" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "User Data" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Accessible From Files App" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Accessible From iTunes Sharing" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Privacy" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Camera Usage Description" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Microphone Usage Description" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Photolibrary Usage Description" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 120 X 120" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPhone 180 X 180" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 76 X 76" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 152 X 152" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "iPad 167 X 167" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "App Store 1024 X 1024" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Spotlight 40 X 40" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Spotlight 80 X 80" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Storyboard" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Use Launch Screen Storyboard" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Image Scale Mode" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Custom Image @2x" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Custom Image @3x" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Use Custom BG Color" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Custom BG Color" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + +#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp +#: platform/osx/export/export.cpp +msgid "Prepare Templates" +msgstr "" + +#: platform/iphone/export/export.cpp platform/osx/export/export.cpp +msgid "Export template not found." +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "App Store Team ID not specified - cannot configure the project." +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Invalid Identifier:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Stop HTTP Server" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run in Browser" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run exported HTML in the system's default browser." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not open template for export: \"%s\"." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Invalid export template: \"%s\"." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not write file: \"%s\"." +msgstr "" + +#: platform/javascript/export/export.cpp platform/osx/export/export.cpp +msgid "Icon Creation" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read file: \"%s\"." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "PWA" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Variant" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Export Type" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "VRAM Texture Compression" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "For Desktop" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "For Mobile" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "HTML" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Export Icon" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Custom HTML Shell" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Head Include" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Canvas Resize Policy" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Focus Canvas On Start" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Experimental Virtual Keyboard" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Progressive Web App" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Offline Page" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Icon 144 X 144" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Icon 180 X 180" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Icon 512 X 512" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read HTML shell: \"%s\"." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not create HTTP server directory: %s." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Error starting HTTP server: %d." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Web" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "HTTP Host" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "HTTP Port" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Use SSL" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "SSL Key" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't get filesystem access." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get Info.plist hash." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no exe name." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, no bundle id." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid Info.plist, can't load." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create \"%s\" subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to extract thin binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid binary format." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Already signed!" +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to process nested resources." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create _CodeSignature subfolder." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to get CodeResources hash." +msgstr "" + +#: platform/osx/export/codesign.cpp platform/osx/export/export.cpp +msgid "Invalid entitlements file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Invalid executable file." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Can't resize signature load command." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Failed to create fat binary." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown bundle type." +msgstr "" + +#: platform/osx/export/codesign.cpp +msgid "Unknown object type." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "App Category" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "High Res" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Location Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Address Book Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Calendar Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Photos Library Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Desktop Folder Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Documents Folder Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Downloads Folder Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Network Volumes Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Removable Volumes Usage Description" +msgstr "" + +#: platform/osx/export/export.cpp platform/windows/export/export.cpp +msgid "Codesign" +msgstr "" + +#: platform/osx/export/export.cpp platform/uwp/export/export.cpp +#: platform/windows/export/export.cpp +msgid "Identity" +msgstr "" + +#: platform/osx/export/export.cpp platform/windows/export/export.cpp +msgid "Timestamp" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Hardened Runtime" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Replace Existing Signature" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Entitlements" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Custom File" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Allow JIT Code Execution" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Allow Unsigned Executable Memory" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Allow Dyld Environment Variables" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Disable Library Validation" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Audio Input" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Address Book" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Calendars" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Photos Library" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Apple Events" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Debugging" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "App Sandbox" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Network Server" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Network Client" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Device USB" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Device Bluetooth" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Files Downloads" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Files Pictures" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Files Music" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Files Movies" +msgstr "" + +#: platform/osx/export/export.cpp platform/windows/export/export.cpp +msgid "Custom Options" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Apple ID Name" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Apple ID Password" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Apple Team ID" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not open icon file \"%s\"." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not start xcrun executable." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization failed." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization request UUID: \"%s\"" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"The notarization process generally takes less than an hour. When the process " +"is completed, you'll receive an email." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"You can check progress manually by opening a Terminal and running the " +"following command:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Run the following command to staple the notarization ticket to the exported " +"application (optional):" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Timestamping is not compatible with ad-hoc signature, and was disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and was disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Built-in CodeSign failed with error \"%s\"." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Built-in CodeSign require regex module." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Could not start codesign executable, make sure Xcode command line tools are " +"installed." +msgstr "" + +#: platform/osx/export/export.cpp platform/windows/export/export.cpp +msgid "No identity found." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Cannot sign file %s." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "DMG Creation" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not start hdiutil executable." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "`hdiutil create` failed - file exists." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "`hdiutil create` failed." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Creating app bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not find template app to export: \"%s\"." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Invalid export format." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Relative symlinks are not supported on this OS, the exported project might " +"be broken!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Requested template binary \"%s\" not found. It might be missing from your " +"template archive." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making PKG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing bundle" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Code signing DMG" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Making ZIP" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Notarization requires the app to be archived first, select the DMG or ZIP " +"export format instead." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Sending archive for notarization" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "ZIP Creation" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Could not open file to read from path \"%s\"." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Invalid bundle identifier:" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " +"signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Xcode command line tools are not installed, using built-in " +"\"codesign\". Code signing is limited to ad-hoc signature only." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Notarization with an ad-hoc signature is not supported." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Code signing is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Hardened runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Timestamp runtime is required for notarization." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Apple ID name not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Notarization: Apple ID password not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Code signing is disabled. The exported project will not run on Macs with " +"enabled Gatekeeper and Apple Silicon powered Macs." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Hardened Runtime is not compatible with ad-hoc signature, and will be " +"disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Timestamping is not compatible with ad-hoc signature, and will be disabled!" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Warning: Notarization is not supported from this OS. The exported project " +"will be blocked by Gatekeeper if it's downloaded from an unknown source." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Microphone access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Camera access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Location information access is enabled, but usage description is " +"not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Address book access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Calendar access is enabled, but usage description is not specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "" +"Privacy: Photo library access is enabled, but usage description is not " +"specified." +msgstr "" + +#: platform/osx/export/export.cpp +msgid "macOS" +msgstr "" + +#: platform/osx/export/export.cpp +msgid "Force Builtin Codesign" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Architecture" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Display Name" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Short Name" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Publisher" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Publisher Display Name" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Product GUID" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Publisher GUID" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Signing" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Certificate" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Algorithm" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Major" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Minor" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Build" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Revision" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Landscape" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Portrait" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Landscape Flipped" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Portrait Flipped" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Store Logo" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Square 44 X 44 Logo" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Square 71 X 71 Logo" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Square 150 X 150 Logo" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Square 310 X 310 Logo" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Wide 310 X 150 Logo" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Splash Screen" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Tiles" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Show Name On Square 150 X 150" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Show Name On Wide 310 X 150" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Show Name On Square 310 X 310" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid package unique name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid product GUID." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid publisher GUID." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid background color." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid Store Logo image dimensions (should be 50x50)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid splash screen image dimensions (should be 620x300)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "UWP" +msgstr "" + +#: platform/uwp/export/export.cpp platform/windows/export/export.cpp +msgid "Signtool" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Debug Certificate" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Debug Algorithm" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Failed to rename temporary file \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Identity Type" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Timestamp Server URL" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Digest Algorithm" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Modify Resources" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "File Version" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Product Version" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Company Name" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Product Name" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "File Description" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Trademarks" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Resources Modification" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Could not find rcedit executable at \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Could not find wine executable at \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "" +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "rcedit failed to modify executable: %s." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Could not find signtool executable at \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Could not find osslsigncode executable at \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid identity type." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid timestamp server." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "" +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Signtool failed to sign executable: %s." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Failed to remove temporary file \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> Rcedit) to change the icon or app information data." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid icon path:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid file version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Invalid product version:" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Windows executables cannot be >= 4 GiB." +msgstr "" + +#: platform/windows/export/export.cpp platform/x11/export/export.cpp +msgid "Failed to open executable file \"%s\"." +msgstr "" + +#: platform/windows/export/export.cpp platform/x11/export/export.cpp +msgid "Executable file header corrupted." +msgstr "" + +#: platform/windows/export/export.cpp platform/x11/export/export.cpp +msgid "Executable \"pck\" section not found." +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Windows" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Rcedit" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Osslsigncode" +msgstr "" + +#: platform/windows/export/export.cpp +msgid "Wine" +msgstr "" + +#: platform/x11/export/export.cpp +msgid "32-bit executables cannot have embedded data >= 4 GiB." +msgstr "" + +#: scene/2d/animated_sprite.cpp scene/3d/sprite_3d.cpp +#: scene/resources/texture.cpp +msgid "Frames" +msgstr "" + +#: scene/2d/animated_sprite.cpp +msgid "" +"A SpriteFrames resource must be created or set in the \"Frames\" property in " +"order for AnimatedSprite to display frames." +msgstr "" + +#: scene/2d/animated_sprite.cpp scene/2d/cpu_particles_2d.cpp +#: scene/2d/particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Speed Scale" +msgstr "" + +#: scene/2d/animated_sprite.cpp scene/2d/audio_stream_player_2d.cpp +#: scene/3d/audio_stream_player_3d.cpp scene/3d/sprite_3d.cpp +#: scene/audio/audio_stream_player.cpp +msgid "Playing" +msgstr "" + +#: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +msgid "Centered" +msgstr "" + +#: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +#: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp +msgid "Flip H" +msgstr "" + +#: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +#: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp +msgid "Flip V" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Monitoring" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Monitorable" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Physics Overrides" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Space Override" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Gravity Point" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Gravity Distance Scale" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Gravity Vec" +msgstr "" + +#: scene/2d/area_2d.cpp scene/2d/cpu_particles_2d.cpp scene/3d/area.cpp +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Gravity" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Linear Damp" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Angular Damp" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Audio Bus" +msgstr "" + +#: scene/2d/area_2d.cpp scene/3d/area.cpp +msgid "Override" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/audio/audio_stream_player.cpp +#: scene/gui/video_player.cpp servers/audio/effects/audio_effect_amplify.cpp +msgid "Volume dB" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/audio/audio_stream_player.cpp +#: servers/audio/effects/audio_effect_pitch_shift.cpp +msgid "Pitch Scale" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp +msgid "Autoplay" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/audio/audio_stream_player.cpp +msgid "Stream Paused" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/3d/light.cpp scene/3d/reflection_probe.cpp +#: scene/3d/visibility_notifier.cpp scene/3d/visual_instance.cpp +#: scene/resources/material.cpp +msgid "Max Distance" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/light.cpp +msgid "Attenuation" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +#: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp +msgid "Bus" +msgstr "" + +#: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp +msgid "Area Mask" +msgstr "" + +#: scene/2d/back_buffer_copy.cpp +msgid "Copy Mode" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Anchor Mode" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Rotating" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/2d/listener_2d.cpp scene/3d/camera.cpp +#: scene/3d/listener.cpp scene/animation/animation_blend_tree.cpp +msgid "Current" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/gui/graph_edit.cpp +msgid "Zoom" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/main/canvas_layer.cpp +msgid "Custom Viewport" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/3d/camera.cpp scene/3d/interpolated_camera.cpp +#: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp +#: scene/animation/animation_tree_player.cpp scene/main/timer.cpp +msgid "Process Mode" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Limit" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp +#: scene/resources/style_box.cpp scene/resources/texture.cpp +msgid "Left" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp +#: scene/resources/style_box.cpp scene/resources/texture.cpp +msgid "Right" +msgstr "" + +#: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp +#: scene/resources/dynamic_font.cpp scene/resources/style_box.cpp +#: scene/resources/texture.cpp +msgid "Bottom" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Smoothed" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Draw Margin" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Drag Margin H Enabled" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Drag Margin V Enabled" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Smoothing" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "H" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "V" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Drag Margin" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Draw Screen" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Draw Limits" +msgstr "" + +#: scene/2d/camera_2d.cpp +msgid "Draw Drag Margin" +msgstr "" + +#: scene/2d/canvas_item.cpp scene/resources/environment.cpp +#: scene/resources/material.cpp +msgid "Blend Mode" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Light Mode" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Particles Animation" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Particles Anim H Frames" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Particles Anim V Frames" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Particles Anim Loop" +msgstr "" + +#: scene/2d/canvas_item.cpp scene/3d/spatial.cpp +msgid "Visibility" +msgstr "" + +#: scene/2d/canvas_item.cpp scene/3d/spatial.cpp scene/gui/progress_bar.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +msgid "Visible" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Self Modulate" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Show Behind Parent" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Show On Top" +msgstr "" + +#: scene/2d/canvas_item.cpp scene/2d/light_occluder_2d.cpp +#: scene/2d/tile_map.cpp +msgid "Light Mask" +msgstr "" + +#: scene/2d/canvas_item.cpp +msgid "Use Parent Material" +msgstr "" + +#: scene/2d/canvas_modulate.cpp +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 "" + +#: scene/2d/collision_object_2d.cpp +msgid "" +"This node has no shape, so it can't collide or interact with other objects.\n" +"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to " +"define its shape." +msgstr "" + +#: scene/2d/collision_object_2d.cpp +msgid "Pickable" +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "" +"CollisionPolygon2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp +msgid "" +"The One Way Collision property will be ignored when the parent is an Area2D." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Build Mode" +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp +#: scene/3d/collision_polygon.cpp scene/3d/collision_shape.cpp +#: scene/animation/animation_node_state_machine.cpp scene/gui/base_button.cpp +#: scene/gui/texture_button.cpp scene/resources/default_theme/default_theme.cpp +msgid "Disabled" +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp +msgid "One Way Collision" +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp +msgid "One Way Collision Margin" +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"CollisionShape2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"Polygon-based shapes are not meant be used nor edited directly through the " +"CollisionShape2D node. Please use the CollisionPolygon2D node instead." +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp +msgid "" +"CPUParticles2D animation requires the usage of a CanvasItemMaterial with " +"\"Particles Animation\" enabled." +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Emitting" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Lifetime" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp scene/main/timer.cpp +msgid "One Shot" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Preprocess" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Explosiveness" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Randomness" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Lifetime Randomness" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Fixed FPS" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Fract Delta" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Drawing" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Local Coords" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/particles.cpp +msgid "Draw Order" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Emission Shape" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Sphere Radius" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp +msgid "Rect Extents" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +msgid "Normals" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Align Y" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Direction" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Spread" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Initial Velocity" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Velocity Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp servers/physics_2d_server.cpp +#: servers/physics_server.cpp +msgid "Angular Velocity" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Velocity Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Orbit Velocity" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Linear Accel" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Accel" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Accel Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Accel Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Radial Accel" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Tangential Accel" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/2d/joints_2d.cpp +#: scene/3d/cpu_particles.cpp scene/3d/physics_body.cpp +#: scene/3d/physics_joint.cpp scene/3d/vehicle_body.cpp +#: scene/resources/particles_material.cpp +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Damping" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Damping Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Damping Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/light.cpp +#: scene/resources/particles_material.cpp +msgid "Angle" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Angle Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Angle Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +msgid "Scale Amount" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +msgid "Scale Amount Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +msgid "Scale Amount Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Color Ramp" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Color Initial Ramp" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Hue Variation" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Variation" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Variation Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Variation Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Speed Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Speed Curve" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Offset Random" +msgstr "" + +#: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#: scene/resources/particles_material.cpp +msgid "Offset Curve" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node A and Node B must be PhysicsBody2Ds" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node A must be a PhysicsBody2D" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node B must be a PhysicsBody2D" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Joint is not connected to two PhysicsBody2Ds" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node A and Node B must be different PhysicsBody2Ds" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp +msgid "Node A" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp +msgid "Node B" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp +#: scene/3d/light.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +#: scene/resources/environment.cpp +msgid "Bias" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Disable Collision" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +msgid "Softness" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/resources/animation.cpp +#: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp +msgid "Length" +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Initial Offset" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/3d/vehicle_body.cpp +msgid "Rest Length" +msgstr "" + +#: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp scene/3d/vehicle_body.cpp +msgid "Stiffness" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "" +"A texture with the shape of the light must be supplied to the \"Texture\" " +"property." +msgstr "" + +#: scene/2d/light_2d.cpp scene/3d/light.cpp scene/gui/reference_rect.cpp +msgid "Editor Only" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Texture Scale" +msgstr "" + +#: scene/2d/light_2d.cpp scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp +#: scene/3d/light.cpp scene/resources/environment.cpp +#: scene/resources/material.cpp scene/resources/sky.cpp +msgid "Energy" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Z Min" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Z Max" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Layer Min" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Layer Max" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Item Cull Mask" +msgstr "" + +#: scene/2d/light_2d.cpp scene/3d/light.cpp scene/resources/style_box.cpp +msgid "Shadow" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Buffer Size" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Gradient Length" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "Filter Smooth" +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "Closed" +msgstr "" + +#: scene/2d/light_occluder_2d.cpp scene/resources/material.cpp +msgid "Cull Mode" +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Width Curve" +msgstr "" + +#: scene/2d/line_2d.cpp scene/resources/default_theme/default_theme.cpp +msgid "Default Color" +msgstr "" + +#: scene/2d/line_2d.cpp scene/resources/texture.cpp +msgid "Fill" +msgstr "" + +#: scene/2d/line_2d.cpp scene/resources/texture.cpp +msgid "Gradient" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Texture Mode" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Capping" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Joint Mode" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Begin Cap Mode" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "End Cap Mode" +msgstr "" + +#: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp scene/resources/style_box.cpp +msgid "Border" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Sharp Limit" +msgstr "" + +#: scene/2d/line_2d.cpp +msgid "Round Precision" +msgstr "" + +#: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp +#: scene/resources/dynamic_font.cpp +msgid "Antialiased" +msgstr "" + +#: scene/2d/multimesh_instance_2d.cpp scene/3d/multimesh_instance.cpp +msgid "Multimesh" +msgstr "" + +#: scene/2d/navigation_2d.cpp scene/3d/baked_lightmap.cpp +#: scene/3d/navigation.cpp scene/animation/root_motion_view.cpp +#: scene/resources/world_2d.cpp servers/physics_2d/physics_2d_server_sw.cpp +msgid "Cell Size" +msgstr "" + +#: scene/2d/navigation_2d.cpp scene/3d/navigation.cpp +msgid "Edge Connection Margin" +msgstr "" + +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Pathfinding" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Target Desired Distance" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Max Distance" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Avoidance" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Avoidance Enabled" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Neighbor Dist" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Max Neighbors" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Time Horizon" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Max Speed" +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp +msgid "" +"The NavigationAgent2D can be used only under a Node2D inheriting parent node." +msgstr "" + +#: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_obstacle.cpp +msgid "Estimate Radius" +msgstr "" + +#: scene/2d/navigation_obstacle_2d.cpp +msgid "" +"The NavigationObstacle2D only serves to provide collision avoidance to a " +"Node2D object." +msgstr "" + +#: scene/2d/navigation_polygon.cpp +msgid "" +"A NavigationPolygon resource must be set or created for this node to work. " +"Please set a property or draw a polygon." +msgstr "" + +#: scene/2d/navigation_polygon.cpp +msgid "Navpoly" +msgstr "" + +#: scene/2d/navigation_polygon.cpp scene/3d/navigation_mesh_instance.cpp +msgid "Enter Cost" +msgstr "" + +#: scene/2d/navigation_polygon.cpp scene/3d/navigation_mesh_instance.cpp +msgid "Travel Cost" +msgstr "" + +#: scene/2d/node_2d.cpp scene/2d/polygon_2d.cpp scene/3d/spatial.cpp +#: scene/main/canvas_layer.cpp +msgid "Rotation Degrees" +msgstr "" + +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp +msgid "Global Rotation" +msgstr "" + +#: scene/2d/node_2d.cpp +msgid "Global Rotation Degrees" +msgstr "" + +#: scene/2d/node_2d.cpp +msgid "Global Scale" +msgstr "" + +#: scene/2d/node_2d.cpp scene/3d/spatial.cpp +msgid "Global Transform" +msgstr "" + +#: scene/2d/node_2d.cpp +msgid "Z As Relative" +msgstr "" + +#: scene/2d/parallax_background.cpp scene/gui/scroll_container.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Scroll" +msgstr "" + +#: scene/2d/parallax_background.cpp +msgid "Base Offset" +msgstr "" + +#: scene/2d/parallax_background.cpp +msgid "Base Scale" +msgstr "" + +#: scene/2d/parallax_background.cpp +msgid "Limit Begin" +msgstr "" + +#: scene/2d/parallax_background.cpp +msgid "Limit End" +msgstr "" + +#: scene/2d/parallax_background.cpp +msgid "Ignore Camera Zoom" +msgstr "" + +#: scene/2d/parallax_layer.cpp +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" + +#: scene/2d/parallax_layer.cpp scene/2d/physics_body_2d.cpp +#: scene/3d/physics_body.cpp scene/3d/vehicle_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Motion" +msgstr "" + +#: scene/2d/parallax_layer.cpp +msgid "Mirroring" +msgstr "" + +#: scene/2d/particles_2d.cpp +msgid "" +"GPU-based particles are not supported by the GLES2 video driver.\n" +"Use the CPUParticles2D node instead. You can use the \"Convert to " +"CPUParticles2D\" toolbar option for this purpose." +msgstr "" + +#: scene/2d/particles_2d.cpp +msgid "" +"On macOS, Particles2D rendering is much slower than CPUParticles2D due to " +"transform feedback being implemented on the CPU instead of the GPU.\n" +"Consider using CPUParticles2D instead when targeting macOS.\n" +"You can use the \"Convert to CPUParticles2D\" toolbar option for this " +"purpose." +msgstr "" + +#: 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 "" + +#: scene/2d/particles_2d.cpp +msgid "" +"Particles2D animation requires the usage of a CanvasItemMaterial with " +"\"Particles Animation\" enabled." +msgstr "" + +#: scene/2d/particles_2d.cpp +msgid "Visibility Rect" +msgstr "" + +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "Process Material" +msgstr "" + +#: scene/2d/path_2d.cpp scene/3d/path.cpp scene/resources/sky.cpp +#: scene/resources/texture.cpp +msgid "Curve" +msgstr "" + +#: scene/2d/path_2d.cpp +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" + +#: scene/2d/path_2d.cpp scene/3d/path.cpp +msgid "Unit Offset" +msgstr "" + +#: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp +msgid "H Offset" +msgstr "" + +#: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp +msgid "V Offset" +msgstr "" + +#: scene/2d/path_2d.cpp scene/3d/path.cpp +msgid "Cubic Interp" +msgstr "" + +#: scene/2d/path_2d.cpp +msgid "Lookahead" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/visual_instance.cpp +msgid "Layers" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Constant Linear Velocity" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Constant Angular Velocity" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp +#: scene/resources/physics_material.cpp +msgid "Friction" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp +#: scene/resources/physics_material.cpp +msgid "Bounce" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Physics Material Override" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Gravity" +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "" +"Size changes to RigidBody2D (in character or rigid modes) will be overridden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Mass" +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "Inertia" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Weight" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Gravity Scale" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Custom Integrator" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Continuous CD" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Contacts Reported" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Contact Monitor" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Sleeping" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Can Sleep" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Damp" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Angular" +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "Applied Forces" +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "Torque" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Safe Margin" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Sync To Physics" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Moving Platform" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Apply Velocity On Leave" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/2d/touch_screen_button.cpp +#: scene/3d/physics_body.cpp scene/gui/texture_button.cpp +#: scene/resources/default_theme/default_theme.cpp +#: scene/resources/line_shape_2d.cpp scene/resources/material.cpp +msgid "Normal" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Remainder" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Local Shape" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collider" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collider ID" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collider RID" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collider Shape" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Collider Shape Index" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collider Velocity" +msgstr "" + +#: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp +msgid "Collider Metadata" +msgstr "" + +#: scene/2d/polygon_2d.cpp +msgid "Invert" +msgstr "" + +#: scene/2d/polygon_2d.cpp +msgid "Vertex Colors" +msgstr "" + +#: scene/2d/polygon_2d.cpp +msgid "Internal Vertex Count" +msgstr "" + +#: scene/2d/position_2d.cpp +msgid "Gizmo Extents" +msgstr "" + +#: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp +msgid "Exclude Parent" +msgstr "" + +#: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp +msgid "Cast To" +msgstr "" + +#: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp +msgid "Collide With" +msgstr "" + +#: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp +msgid "Areas" +msgstr "" + +#: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp +msgid "Bodies" +msgstr "" + +#: scene/2d/remote_transform_2d.cpp +msgid "Path property must point to a valid Node2D node to work." +msgstr "" + +#: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp +msgid "Remote Path" +msgstr "" + +#: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp +msgid "Use Global Coordinates" +msgstr "" + +#: scene/2d/skeleton_2d.cpp scene/3d/skeleton.cpp +msgid "Rest" +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "Default Length" +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "This Bone2D chain should end at a Skeleton2D node." +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node." +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "" +"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one." +msgstr "" + +#: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +msgid "Hframes" +msgstr "" + +#: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +msgid "Vframes" +msgstr "" + +#: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp +msgid "Frame Coords" +msgstr "" + +#: scene/2d/sprite.cpp scene/resources/texture.cpp +msgid "Filter Clip" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "" +"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " +"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " +"KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Tile Set" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Quadrant Size" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Custom Transform" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Half Offset" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Tile Origin" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Y Sort" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Show Collision" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Compatibility Mode" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Centered Textures" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Cell Clip UV" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Use Parent" +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "Use Kinematic" +msgstr "" + +#: scene/2d/touch_screen_button.cpp +msgid "Shape Centered" +msgstr "" + +#: scene/2d/touch_screen_button.cpp +msgid "Shape Visible" +msgstr "" + +#: scene/2d/touch_screen_button.cpp +msgid "Passby Press" +msgstr "" + +#: scene/2d/touch_screen_button.cpp +msgid "Visibility Mode" +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "" +"VisibilityEnabler2D works best when used with the edited scene root directly " +"as parent." +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp +msgid "Pause Animations" +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp +msgid "Freeze Bodies" +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "Pause Particles" +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "Pause Animated Sprites" +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "Process Parent" +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "Physics Process Parent" +msgstr "" + +#: scene/3d/area.cpp +msgid "Reverb Bus" +msgstr "" + +#: scene/3d/area.cpp +msgid "Uniformity" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "Controller ID" +msgstr "" + +#: scene/3d/arvr_nodes.cpp servers/arvr/arvr_positional_tracker.cpp +msgid "Rumble" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRController must have an ARVROrigin node as its parent." +msgstr "" + +#: 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 "" + +#: scene/3d/arvr_nodes.cpp +msgid "Anchor ID" +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRAnchor must have an ARVROrigin node as its parent." +msgstr "" + +#: 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 "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVROrigin requires an ARVRCamera child node." +msgstr "" + +#: scene/3d/arvr_nodes.cpp servers/arvr_server.cpp +msgid "World Scale" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Attenuation Model" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Unit dB" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Unit Size" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Max dB" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Out Of Range Mode" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Emission Angle" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Degrees" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Filter Attenuation dB" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Attenuation Filter" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_filter.cpp +msgid "Cutoff Hz" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +#: servers/audio/effects/audio_effect_filter.cpp +msgid "dB" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Doppler" +msgstr "" + +#: scene/3d/audio_stream_player_3d.cpp +msgid "Tracking" +msgstr "" + +#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp +#: scene/3d/reflection_probe.cpp +msgid "Interior" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Finding meshes and lights" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Preparing geometry (%d/%d)" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Preparing environment" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Generating capture" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Saving lightmaps" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Done" +msgstr "" + +#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp +#: scene/3d/reflection_probe.cpp scene/resources/box_shape.cpp +#: scene/resources/rectangle_shape_2d.cpp +msgid "Extents" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Tweaks" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Bounces" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Bounce Indirect Energy" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Use Denoiser" +msgstr "" + +#: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp +msgid "Use HDR" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Use Color" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Default Texels Per Unit" +msgstr "" + +#: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp +msgid "Atlas" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Generate" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Max Size" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Custom Sky" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Custom Sky Rotation Degrees" +msgstr "" + +#: scene/3d/baked_lightmap.cpp scene/3d/ray_cast.cpp +msgid "Custom Color" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Custom Energy" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Min Light" +msgstr "" + +#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp +msgid "Propagation" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Image Path" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Light Data" +msgstr "" + +#: scene/3d/bone_attachment.cpp scene/3d/physics_body.cpp +msgid "Bone Name" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Keep Aspect" +msgstr "" + +#: scene/3d/camera.cpp scene/3d/light.cpp scene/3d/reflection_probe.cpp +msgid "Cull Mask" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Doppler Tracking" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Projection" +msgstr "" + +#: scene/3d/camera.cpp +msgid "FOV" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Frustum Offset" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Near" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Far" +msgstr "" + +#: scene/3d/camera.cpp scene/3d/collision_polygon.cpp scene/3d/spring_arm.cpp +#: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp +#: scene/resources/shape.cpp scene/resources/style_box.cpp +#: scene/resources/texture.cpp servers/physics_2d_server.cpp +#: servers/physics_server.cpp +msgid "Margin" +msgstr "" + +#: scene/3d/camera.cpp +msgid "Clip To" +msgstr "" + +#: scene/3d/collision_object.cpp scene/3d/soft_body.cpp +msgid "Ray Pickable" +msgstr "" + +#: scene/3d/collision_object.cpp +msgid "Capture On Drag" +msgstr "" + +#: scene/3d/collision_object.cpp +msgid "" +"This node has no shape, so it can't collide or interact with other objects.\n" +"Consider adding a CollisionShape or CollisionPolygon as a child to define " +"its shape." +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "" +"CollisionPolygon only serves to provide a collision shape to a " +"CollisionObject derived node. Please only use it as a child of Area, " +"StaticBody, RigidBody, KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "An empty CollisionPolygon has no effect on collision." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"CollisionShape only serves to provide a collision shape to a CollisionObject " +"derived node. Please only use it as a child of Area, StaticBody, RigidBody, " +"KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"A shape must be provided for CollisionShape to function. Please create a " +"shape resource for it." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"Plane shapes don't work well and will be removed in future versions. Please " +"don't use them." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"ConcavePolygonShape doesn't support RigidBody in another mode than static." +msgstr "" + +#: scene/3d/cpu_particles.cpp +msgid "Nothing is visible because no mesh has been assigned." +msgstr "" + +#: scene/3d/cpu_particles.cpp +msgid "" +"CPUParticles animation requires the usage of a SpatialMaterial whose " +"Billboard Mode is set to \"Particle Billboard\"." +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Box Extents" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Ring Radius" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Ring Inner Radius" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Ring Height" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Ring Axis" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Rotate Y" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Disable Z" +msgstr "" + +#: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp +msgid "Flatness" +msgstr "" + +#: scene/3d/cull_instance.cpp servers/visual_server.cpp +msgid "Portals" +msgstr "" + +#: scene/3d/cull_instance.cpp +msgid "Portal Mode" +msgstr "" + +#: scene/3d/cull_instance.cpp +msgid "Include In Bound" +msgstr "" + +#: scene/3d/cull_instance.cpp +msgid "Allow Merging" +msgstr "" + +#: scene/3d/cull_instance.cpp +msgid "Autoplace Priority" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Plotting Meshes" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Finishing Plot" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "" +"GIProbes are not supported by the GLES2 video driver.\n" +"Use a BakedLightmap instead." +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "" +"The GIProbe Compress property has been deprecated due to known bugs and no " +"longer has any effect.\n" +"To remove this warning, disable the GIProbe's Compress property." +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Subdiv" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Dynamic Range" +msgstr "" + +#: scene/3d/gi_probe.cpp scene/3d/light.cpp +msgid "Normal Bias" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp +#: scene/resources/primitive_meshes.cpp +msgid "Pixel Size" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp +msgid "Billboard" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp +msgid "Shaded" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp +msgid "Double Sided" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp +msgid "No Depth Test" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp +msgid "Fixed Size" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp +msgid "Alpha Cut" +msgstr "" + +#: scene/3d/label_3d.cpp scene/resources/material.cpp +msgid "Alpha Scissor Threshold" +msgstr "" + +#: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp +msgid "Render Priority" +msgstr "" + +#: scene/3d/label_3d.cpp +msgid "Outline Render Priority" +msgstr "" + +#: scene/3d/label_3d.cpp +msgid "Outline Modulate" +msgstr "" + +#: scene/3d/label_3d.cpp scene/resources/default_theme/default_theme.cpp +#: scene/resources/dynamic_font.cpp scene/resources/primitive_meshes.cpp +msgid "Font" +msgstr "" + +#: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp +msgid "Horizontal Alignment" +msgstr "" + +#: scene/3d/label_3d.cpp +msgid "Vertical Alignment" +msgstr "" + +#: scene/3d/label_3d.cpp scene/gui/dialogs.cpp scene/gui/label.cpp +msgid "Autowrap" +msgstr "" + +#: scene/3d/light.cpp +msgid "Indirect Energy" +msgstr "" + +#: scene/3d/light.cpp +msgid "Negative" +msgstr "" + +#: scene/3d/light.cpp scene/resources/material.cpp +#: scene/resources/visual_shader.cpp +msgid "Specular" +msgstr "" + +#: scene/3d/light.cpp +msgid "Bake Mode" +msgstr "" + +#: scene/3d/light.cpp +msgid "Contact" +msgstr "" + +#: scene/3d/light.cpp +msgid "Reverse Cull Face" +msgstr "" + +#: scene/3d/light.cpp servers/visual_server.cpp +msgid "Directional Shadow" +msgstr "" + +#: scene/3d/light.cpp +msgid "Split 1" +msgstr "" + +#: scene/3d/light.cpp +msgid "Split 2" +msgstr "" + +#: scene/3d/light.cpp +msgid "Split 3" +msgstr "" + +#: scene/3d/light.cpp +msgid "Blend Splits" +msgstr "" + +#: scene/3d/light.cpp +msgid "Bias Split Scale" +msgstr "" + +#: scene/3d/light.cpp +msgid "Depth Range" +msgstr "" + +#: scene/3d/light.cpp +msgid "Omni" +msgstr "" + +#: scene/3d/light.cpp +msgid "Shadow Mode" +msgstr "" + +#: scene/3d/light.cpp +msgid "Shadow Detail" +msgstr "" + +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + +#: scene/3d/light.cpp +msgid "Spot" +msgstr "" + +#: scene/3d/light.cpp +msgid "Angle Attenuation" +msgstr "" + +#: scene/3d/mesh_instance.cpp +msgid "Software Skinning" +msgstr "" + +#: scene/3d/mesh_instance.cpp +msgid "Transform Normals" +msgstr "" + +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/3d/navigation.cpp scene/resources/curve.cpp +msgid "Up Vector" +msgstr "" + +#: scene/3d/navigation.cpp +msgid "Cell Height" +msgstr "" + +#: scene/3d/navigation_agent.cpp +msgid "Agent Height Offset" +msgstr "" + +#: scene/3d/navigation_agent.cpp +msgid "Ignore Y" +msgstr "" + +#: scene/3d/navigation_agent.cpp +msgid "" +"The NavigationAgent can be used only under a Spatial inheriting parent node." +msgstr "" + +#: scene/3d/navigation_mesh_instance.cpp scene/resources/mesh_library.cpp +msgid "NavMesh" +msgstr "" + +#: scene/3d/navigation_obstacle.cpp +msgid "" +"The NavigationObstacle only serves to provide collision avoidance to a " +"Spatial inheriting parent object." +msgstr "" + +#: scene/3d/occluder.cpp +msgid "No shape is set." +msgstr "" + +#: scene/3d/occluder.cpp +msgid "Only uniform scales are supported." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"GPU-based particles are not supported by the GLES2 video driver.\n" +"Use the CPUParticles node instead. You can use the \"Convert to " +"CPUParticles\" toolbar option for this purpose." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"On macOS, Particles rendering is much slower than CPUParticles due to " +"transform feedback being implemented on the CPU instead of the GPU.\n" +"Consider using CPUParticles instead when targeting macOS.\n" +"You can use the \"Convert to CPUParticles\" toolbar option for this purpose." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Nothing is visible because meshes have not been assigned to draw passes." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Particles animation requires the usage of a SpatialMaterial whose Billboard " +"Mode is set to \"Particle Billboard\"." +msgstr "" + +#: scene/3d/particles.cpp +msgid "Visibility AABB" +msgstr "" + +#: scene/3d/particles.cpp +msgid "Draw Passes" +msgstr "" + +#: scene/3d/particles.cpp +msgid "Passes" +msgstr "" + +#: scene/3d/path.cpp +msgid "PathFollow only works when set as a child of a Path node." +msgstr "" + +#: scene/3d/path.cpp +msgid "" +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." +msgstr "" + +#: scene/3d/path.cpp +msgid "Rotation Mode" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "" +"Size changes to RigidBody (in character or rigid modes) will be overridden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Axis Lock" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear X" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Y" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Z" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular X" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Y" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Z" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Motion X" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Motion Y" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Motion Z" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Joint Constraints" +msgstr "" + +#: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +msgid "Impulse Clamp" +msgstr "" + +#: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +msgid "Swing Span" +msgstr "" + +#: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +msgid "Twist Span" +msgstr "" + +#: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +#: scene/3d/vehicle_body.cpp +msgid "Relaxation" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Enabled" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Upper" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Lower" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Bias" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Softness" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Relaxation" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Limit Upper" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Limit Lower" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Limit Softness" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Limit Restitution" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Limit Damping" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Restitution" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Limit Damping" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "X" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Y" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Z" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Limit Enabled" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Spring Enabled" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Spring Stiffness" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Spring Damping" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Equilibrium Point" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Restitution" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Linear Damping" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Restitution" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Damping" +msgstr "" + +#: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp +msgid "ERP" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Spring Enabled" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Spring Stiffness" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Spring Damping" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Angular Equilibrium Point" +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "Body Offset" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node A and Node B must be PhysicsBodies" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node A must be a PhysicsBody" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node B must be a PhysicsBody" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Joint is not connected to any PhysicsBodies" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node A and Node B must be different PhysicsBodies" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Solver" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Exclude Nodes" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Params" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Limit" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Upper" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Lower" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Motor" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Target Velocity" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Max Impulse" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Limit" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Upper Distance" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Lower Distance" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Restitution" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Motion" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Ortho" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Upper Angle" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Lower Angle" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Motion" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Ortho" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Limit X" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Motor X" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Force Limit" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Spring X" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Equilibrium Point" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Limit X" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Motor X" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Spring X" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Limit Y" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Motor Y" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Spring Y" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Limit Y" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Motor Y" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Spring Y" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Limit Z" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Motor Z" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Linear Spring Z" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Limit Z" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Motor Z" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Angular Spring Z" +msgstr "" + +#: scene/3d/portal.cpp +msgid "The RoomManager should not be a child or grandchild of a Portal." +msgstr "" + +#: scene/3d/portal.cpp +msgid "A Room should not be a child or grandchild of a Portal." +msgstr "" + +#: scene/3d/portal.cpp +msgid "A RoomGroup should not be a child or grandchild of a Portal." +msgstr "" + +#: scene/3d/portal.cpp +msgid "Portal Active" +msgstr "" + +#: scene/3d/portal.cpp scene/resources/occluder_shape_polygon.cpp +msgid "Two Way" +msgstr "" + +#: scene/3d/portal.cpp +msgid "Linked Room" +msgstr "" + +#: scene/3d/portal.cpp +msgid "Use Default Margin" +msgstr "" + +#: scene/3d/proximity_group.cpp +msgid "Group Name" +msgstr "" + +#: scene/3d/proximity_group.cpp +msgid "Dispatch Mode" +msgstr "" + +#: scene/3d/proximity_group.cpp +msgid "Grid Radius" +msgstr "" + +#: scene/3d/ray_cast.cpp +msgid "Debug Shape" +msgstr "" + +#: scene/3d/ray_cast.cpp scene/resources/style_box.cpp +msgid "Thickness" +msgstr "" + +#: scene/3d/reflection_probe.cpp scene/main/viewport.cpp +msgid "Update Mode" +msgstr "" + +#: scene/3d/reflection_probe.cpp +msgid "Origin Offset" +msgstr "" + +#: scene/3d/reflection_probe.cpp +msgid "Box Projection" +msgstr "" + +#: scene/3d/reflection_probe.cpp +msgid "Enable Shadows" +msgstr "" + +#: scene/3d/reflection_probe.cpp +msgid "Ambient Color" +msgstr "" + +#: scene/3d/reflection_probe.cpp +msgid "Ambient Energy" +msgstr "" + +#: scene/3d/reflection_probe.cpp +msgid "Ambient Contrib" +msgstr "" + +#: scene/3d/remote_transform.cpp +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." +msgstr "" + +#: scene/3d/room.cpp +msgid "A Room cannot have another Room as a child or grandchild." +msgstr "" + +#: scene/3d/room.cpp +msgid "The RoomManager should not be placed inside a Room." +msgstr "" + +#: scene/3d/room.cpp +msgid "A RoomGroup should not be placed inside a Room." +msgstr "" + +#: scene/3d/room.cpp +msgid "" +"Room convex hull contains a large number of planes.\n" +"Consider simplifying the room bound in order to increase performance." +msgstr "" + +#: scene/3d/room.cpp +msgid "Use Default Simplify" +msgstr "" + +#: scene/3d/room.cpp scene/3d/room_manager.cpp +msgid "Room Simplify" +msgstr "" + +#: scene/3d/room.cpp +msgid "Bound" +msgstr "" + +#: scene/3d/room_group.cpp +msgid "Roomgroup Priority" +msgstr "" + +#: scene/3d/room_group.cpp +msgid "The RoomManager should not be placed inside a RoomGroup." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "The RoomList has not been assigned." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "The RoomList node should be a Spatial (or derived from Spatial)." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"Portal Depth Limit is set to Zero.\n" +"Only the Room that the Camera is in will render." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "There should only be one RoomManager in the SceneTree." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Main" +msgstr "" + +#: scene/3d/room_manager.cpp scene/animation/animation_blend_tree.cpp +#: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp +#: scene/animation/animation_tree_player.cpp +#: servers/audio/effects/audio_effect_delay.cpp +msgid "Active" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Roomlist" +msgstr "" + +#: scene/3d/room_manager.cpp servers/visual_server.cpp +msgid "PVS" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "PVS Mode" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "PVS Filename" +msgstr "" + +#: scene/3d/room_manager.cpp servers/visual_server.cpp +msgid "Gameplay" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Gameplay Monitor" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Use Secondary PVS" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Merge Meshes" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Show Margins" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Debug Sprawl" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Overlap Warning Threshold" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Preview Camera" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Portal Depth Limit" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Default Portal Margin" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Roaming Expansion Margin" +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"RoomList path is invalid.\n" +"Please check the RoomList branch has been assigned in the RoomManager." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "RoomList contains no Rooms, aborting." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Misnamed nodes detected, check output log for details. Aborting." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "Portal link room not found, check output log for details." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"Portal autolink failed, check output log for details.\n" +"Check the portal is facing outwards from the source room." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"Room overlap detected, cameras may work incorrectly in overlapping area.\n" +"Check output log for details." +msgstr "" + +#: scene/3d/room_manager.cpp +msgid "" +"Error calculating room bounds.\n" +"Ensure all rooms contain geometry or manual bounds." +msgstr "" + +#: scene/3d/skeleton.cpp scene/resources/skin.cpp +msgid "Pose" +msgstr "" + +#: scene/3d/skeleton.cpp +msgid "Bound Children" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Pinned Points" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Attachments" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Point Index" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Spatial Attachment Path" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Physics Enabled" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Parent Collision Ignore" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Simulation Precision" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Total Mass" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Linear Stiffness" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Areaangular Stiffness" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Volume Stiffness" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Pressure Coefficient" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Damping Coefficient" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Drag Coefficient" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "Pose Matching Coefficient" +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "This body will be ignored until you set a mesh." +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "" +"Size changes to SoftBody will be overridden by the physics engine when " +"running.\n" +"Change the size in children collision shapes instead." +msgstr "" + +#: scene/3d/spatial.cpp +msgid "Global Translation" +msgstr "" + +#: scene/3d/spatial.cpp +msgid "Matrix" +msgstr "" + +#: scene/3d/spatial.cpp +msgid "Gizmo" +msgstr "" + +#: scene/3d/spatial_velocity_tracker.cpp +msgid "Track Physics Step" +msgstr "" + +#: scene/3d/spring_arm.cpp +msgid "Spring Length" +msgstr "" + +#: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp +msgid "Opacity" +msgstr "" + +#: scene/3d/sprite_3d.cpp scene/resources/material.cpp +msgid "Transparent" +msgstr "" + +#: scene/3d/sprite_3d.cpp +msgid "" +"A SpriteFrames resource must be created or set in the \"Frames\" property in " +"order for AnimatedSprite3D to display frames." +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "" +"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " +"it as a child of a VehicleBody." +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Per-Wheel Motion" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Engine Force" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Brake" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Steering" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "VehicleBody Motion" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Use As Traction" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Use As Steering" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Wheel" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Roll Influence" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Friction Slip" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Suspension" +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "Max Force" +msgstr "" + +#: scene/3d/visibility_notifier.cpp +msgid "AABB" +msgstr "" + +#: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp +msgid "Geometry" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Material Override" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Material Overlay" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Cast Shadow" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Extra Cull Margin" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Baked Light" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Generate Lightmap" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Lightmap Scale" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "LOD" +msgstr "" + +#: scene/3d/visual_instance.cpp scene/animation/skeleton_ik.cpp +#: scene/resources/material.cpp +msgid "Min Distance" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Min Hysteresis" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Max Hysteresis" +msgstr "" + +#: scene/3d/world_environment.cpp +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" + +#: scene/3d/world_environment.cpp +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." +msgstr "" + +#: scene/3d/world_environment.cpp +msgid "" +"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set " +"this environment's Background Mode to Canvas (for 2D scenes)." +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "On BlendTree node '%s', animation not found: '%s'" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Animation not found: '%s'" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Mix Mode" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Fadein Time" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Fadeout Time" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Auto Restart" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Autorestart" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Delay" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Random Delay" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Add Amount" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Blend Amount" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Seek Position" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Input Count" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +#: scene/animation/animation_node_state_machine.cpp +msgid "Xfade Time" +msgstr "" + +#: scene/animation/animation_node_state_machine.cpp +msgid "Switch Mode" +msgstr "" + +#: scene/animation/animation_node_state_machine.cpp +msgid "Auto Advance" +msgstr "" + +#: scene/animation/animation_node_state_machine.cpp +msgid "Advance Condition" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Anim Apply Reset" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Current Animation" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Assigned Animation" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Reset On Save" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Current Animation Length" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Current Animation Position" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Playback Options" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Default Blend Time" +msgstr "" + +#: scene/animation/animation_player.cpp +msgid "Method Call Mode" +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "In node '%s', invalid animation: '%s'." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Invalid animation: '%s'." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Nothing connected to input '%s' of node '%s'." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "No root AnimationNode for the graph is set." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Path to an AnimationPlayer node containing animations is not set." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "The AnimationPlayer root node is not a valid node." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Tree Root" +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Anim Player" +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Root Motion" +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Track" +msgstr "" + +#: scene/animation/animation_tree_player.cpp +msgid "This node has been deprecated. Use AnimationTree instead." +msgstr "" + +#: scene/animation/animation_tree_player.cpp +msgid "Playback" +msgstr "" + +#: scene/animation/animation_tree_player.cpp +msgid "Master Player" +msgstr "" + +#: scene/animation/animation_tree_player.cpp +msgid "Base Path" +msgstr "" + +#: scene/animation/root_motion_view.cpp +msgid "Animation Path" +msgstr "" + +#: scene/animation/root_motion_view.cpp +msgid "Zero Y" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Root Bone" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Tip Bone" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Interpolation" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Override Tip Basis" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Use Magnet" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Magnet" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Target Node" +msgstr "" + +#: scene/animation/skeleton_ik.cpp +msgid "Max Iterations" +msgstr "" + +#: scene/animation/tween.cpp +msgid "Playback Process Mode" +msgstr "" + +#: scene/animation/tween.cpp +msgid "Playback Speed" +msgstr "" + +#: scene/audio/audio_stream_player.cpp +msgid "Mix Target" +msgstr "" + +#: scene/gui/aspect_ratio_container.cpp scene/gui/range.cpp +#: servers/audio/effects/audio_effect_compressor.cpp +msgid "Ratio" +msgstr "" + +#: scene/gui/aspect_ratio_container.cpp scene/gui/texture_button.cpp +#: scene/gui/texture_rect.cpp +msgid "Stretch Mode" +msgstr "" + +#: scene/gui/aspect_ratio_container.cpp scene/gui/box_container.cpp +msgid "Alignment" +msgstr "" + +#: scene/gui/base_button.cpp +msgid "Shortcut In Tooltip" +msgstr "" + +#: scene/gui/base_button.cpp +msgid "Action Mode" +msgstr "" + +#: scene/gui/base_button.cpp +msgid "Enabled Focus Mode" +msgstr "" + +#: scene/gui/base_button.cpp +msgid "Keep Pressed Outside" +msgstr "" + +#: scene/gui/base_button.cpp scene/gui/shortcut.cpp +msgid "Shortcut" +msgstr "" + +#: scene/gui/base_button.cpp +msgid "Group" +msgstr "" + +#: scene/gui/button.cpp scene/gui/label.cpp +msgid "Clip Text" +msgstr "" + +#: scene/gui/button.cpp scene/gui/label.cpp scene/gui/line_edit.cpp +#: scene/gui/spin_box.cpp +msgid "Align" +msgstr "" + +#: scene/gui/button.cpp +msgid "Icon Align" +msgstr "" + +#: scene/gui/button.cpp +msgid "Expand Icon" +msgstr "" + +#: scene/gui/center_container.cpp +msgid "Use Top Left" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "" +"Color: #%s\n" +"LMB: Apply color\n" +"RMB: Remove preset" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Edit Alpha" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "HSV Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Raw Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Deferred Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Presets Enabled" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Presets Visible" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Pick a color from the editor window." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "HSV" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Switch between hexadecimal and code values." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset." +msgstr "" + +#: scene/gui/container.cpp +msgid "" +"Container by itself serves no purpose unless a script configures its " +"children placement behavior.\n" +"If you don't intend to add a script, use a plain Control node instead." +msgstr "" + +#: scene/gui/control.cpp +msgid "Theme Overrides" +msgstr "" + +#: scene/gui/control.cpp +msgid "" +"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " +"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." +msgstr "" + +#: scene/gui/control.cpp +msgid "Anchor" +msgstr "" + +#: scene/gui/control.cpp +msgid "Grow Direction" +msgstr "" + +#: scene/gui/control.cpp scene/resources/navigation_mesh.cpp +msgid "Min Size" +msgstr "" + +#: scene/gui/control.cpp +msgid "Pivot Offset" +msgstr "" + +#: scene/gui/control.cpp +msgid "Clip Content" +msgstr "" + +#: scene/gui/control.cpp scene/resources/visual_shader_nodes.cpp +msgid "Hint" +msgstr "" + +#: scene/gui/control.cpp +msgid "Tooltip" +msgstr "" + +#: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp +msgid "Focus" +msgstr "" + +#: scene/gui/control.cpp +msgid "Neighbour Left" +msgstr "" + +#: scene/gui/control.cpp +msgid "Neighbour Top" +msgstr "" + +#: scene/gui/control.cpp +msgid "Neighbour Right" +msgstr "" + +#: scene/gui/control.cpp +msgid "Neighbour Bottom" +msgstr "" + +#: scene/gui/control.cpp +msgid "Next" +msgstr "" + +#: scene/gui/control.cpp +msgid "Previous" +msgstr "" + +#: scene/gui/control.cpp +msgid "Mouse" +msgstr "" + +#: scene/gui/control.cpp +msgid "Default Cursor Shape" +msgstr "" + +#: scene/gui/control.cpp +msgid "Pass On Modal Close Click" +msgstr "" + +#: scene/gui/control.cpp +msgid "Size Flags" +msgstr "" + +#: scene/gui/control.cpp +msgid "Stretch Ratio" +msgstr "" + +#: scene/gui/control.cpp +msgid "Theme Type Variation" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Window Title" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Dialog" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Hide On OK" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Alert!" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Please Confirm..." +msgstr "" + +#: scene/gui/file_dialog.cpp +msgid "Mode Overrides Title" +msgstr "" + +#: scene/gui/file_dialog.cpp +msgid "Must use a valid extension." +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Right Disconnects" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Scroll Offset" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Snap Distance" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Zoom Min" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Zoom Max" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Zoom Step" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Show Zoom Label" +msgstr "" + +#: scene/gui/graph_edit.cpp scene/gui/text_edit.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Minimap" +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Enable grid minimap." +msgstr "" + +#: scene/gui/graph_node.cpp +msgid "Show Close" +msgstr "" + +#: scene/gui/graph_node.cpp scene/gui/option_button.cpp +#: scene/resources/default_theme/default_theme.cpp +msgid "Selected" +msgstr "" + +#: scene/gui/graph_node.cpp scene/resources/default_theme/default_theme.cpp +msgid "Comment" +msgstr "" + +#: scene/gui/graph_node.cpp +msgid "Overlay" +msgstr "" + +#: scene/gui/grid_container.cpp scene/gui/item_list.cpp scene/gui/tree.cpp +msgid "Columns" +msgstr "" + +#: scene/gui/item_list.cpp scene/gui/popup_menu.cpp scene/gui/text_edit.cpp +#: scene/gui/tree.cpp scene/main/viewport.cpp +msgid "Timers" +msgstr "" + +#: scene/gui/item_list.cpp scene/gui/popup_menu.cpp scene/gui/tree.cpp +msgid "Incremental Search Max Interval Msec" +msgstr "" + +#: scene/gui/item_list.cpp scene/gui/tree.cpp +msgid "Allow Reselect" +msgstr "" + +#: scene/gui/item_list.cpp scene/gui/tree.cpp +msgid "Allow RMB Select" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Max Text Lines" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Auto Height" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Max Columns" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Same Column Width" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Fixed Column Width" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Icon Scale" +msgstr "" + +#: scene/gui/item_list.cpp +msgid "Fixed Icon Size" +msgstr "" + +#: scene/gui/label.cpp +msgid "V Align" +msgstr "" + +#: scene/gui/label.cpp scene/gui/rich_text_label.cpp +msgid "Visible Characters" +msgstr "" + +#: scene/gui/label.cpp scene/gui/rich_text_label.cpp +msgid "Percent Visible" +msgstr "" + +#: scene/gui/label.cpp +msgid "Lines Skipped" +msgstr "" + +#: scene/gui/label.cpp +msgid "Max Lines Visible" +msgstr "" + +#: scene/gui/line_edit.cpp scene/resources/navigation_mesh.cpp +msgid "Max Length" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Secret" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Secret Character" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Expand To Text Length" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Context Menu Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Virtual Keyboard Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Clear Button Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Shortcut Keys Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Middle Mouse Paste Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Selecting Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/rich_text_label.cpp +#: scene/gui/text_edit.cpp +msgid "Deselect On Focus Loss Enabled" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Right Icon" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Placeholder" +msgstr "" + +#: scene/gui/line_edit.cpp +msgid "Alpha" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Caret" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Blink" +msgstr "" + +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Blink Speed" +msgstr "" + +#: scene/gui/link_button.cpp +msgid "Underline" +msgstr "" + +#: scene/gui/menu_button.cpp +msgid "Switch On Hover" +msgstr "" + +#: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp +msgid "Draw Center" +msgstr "" + +#: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp +msgid "Region Rect" +msgstr "" + +#: scene/gui/nine_patch_rect.cpp +msgid "Patch Margin" +msgstr "" + +#: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp +msgid "Axis Stretch" +msgstr "" + +#: scene/gui/nine_patch_rect.cpp +msgid "" +"The Tile and Tile Fit options for Axis Stretch properties are only effective " +"when using the GLES3 rendering backend.\n" +"The GLES2 backend is currently in use, so these modes will act like Stretch " +"instead." +msgstr "" + +#: scene/gui/popup.cpp +msgid "Popup" +msgstr "" + +#: scene/gui/popup.cpp +msgid "Exclusive" +msgstr "" + +#: scene/gui/popup.cpp +msgid "" +"Popups will hide by default unless you call popup() or any of the popup*() " +"functions. Making them visible for editing is fine, but they will hide upon " +"running." +msgstr "" + +#: scene/gui/popup_menu.cpp +msgid "Hide On Item Selection" +msgstr "" + +#: scene/gui/popup_menu.cpp +msgid "Hide On Checkable Item Selection" +msgstr "" + +#: scene/gui/popup_menu.cpp +msgid "Hide On State Item Selection" +msgstr "" + +#: scene/gui/popup_menu.cpp +msgid "Submenu Popup Delay" +msgstr "" + +#: scene/gui/popup_menu.cpp +msgid "Allow Search" +msgstr "" + +#: scene/gui/progress_bar.cpp +msgid "Percent" +msgstr "" + +#: scene/gui/range.cpp +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "" + +#: scene/gui/range.cpp scene/resources/curve.cpp +msgid "Min Value" +msgstr "" + +#: scene/gui/range.cpp scene/resources/curve.cpp +msgid "Max Value" +msgstr "" + +#: scene/gui/range.cpp +msgid "Page" +msgstr "" + +#: scene/gui/range.cpp +msgid "Exp Edit" +msgstr "" + +#: scene/gui/range.cpp +msgid "Rounded" +msgstr "" + +#: scene/gui/range.cpp +msgid "Allow Greater" +msgstr "" + +#: scene/gui/range.cpp +msgid "Allow Lesser" +msgstr "" + +#: scene/gui/reference_rect.cpp +msgid "Border Color" +msgstr "" + +#: scene/gui/reference_rect.cpp scene/resources/style_box.cpp +msgid "Border Width" +msgstr "" + +#: scene/gui/rich_text_effect.cpp +msgid "Relative Index" +msgstr "" + +#: scene/gui/rich_text_effect.cpp +msgid "Absolute Index" +msgstr "" + +#: scene/gui/rich_text_effect.cpp +msgid "Elapsed Time" +msgstr "" + +#: scene/gui/rich_text_effect.cpp +msgid "Env" +msgstr "" + +#: scene/gui/rich_text_effect.cpp +msgid "Character" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "BBCode" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Meta Underlined" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Tab Size" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Fit Content Height" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Scroll Active" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Scroll Following" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Selection Enabled" +msgstr "" + +#: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp +msgid "Override Selected Font Color" +msgstr "" + +#: scene/gui/rich_text_label.cpp +msgid "Custom Effects" +msgstr "" + +#: scene/gui/scroll_bar.cpp +msgid "Custom Step" +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "" +"ScrollContainer is intended to work with a single child control.\n" +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " +"minimum size manually." +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "Follow Focus" +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "Horizontal Enabled" +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "Vertical Enabled" +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "Default Scroll Deadzone" +msgstr "" + +#: scene/gui/slider.cpp +msgid "Scrollable" +msgstr "" + +#: scene/gui/slider.cpp +msgid "Tick Count" +msgstr "" + +#: scene/gui/slider.cpp +msgid "Ticks On Borders" +msgstr "" + +#: scene/gui/spin_box.cpp +msgid "Prefix" +msgstr "" + +#: scene/gui/spin_box.cpp +msgid "Suffix" +msgstr "" + +#: scene/gui/split_container.cpp +msgid "Split Offset" +msgstr "" + +#: scene/gui/split_container.cpp scene/gui/tree.cpp +msgid "Collapsed" +msgstr "" + +#: scene/gui/split_container.cpp +msgid "Dragger Visibility" +msgstr "" + +#: scene/gui/tab_container.cpp scene/gui/tabs.cpp +msgid "Tab Align" +msgstr "" + +#: scene/gui/tab_container.cpp scene/gui/tabs.cpp +msgid "Current Tab" +msgstr "" + +#: scene/gui/tab_container.cpp +msgid "Tabs Visible" +msgstr "" + +#: scene/gui/tab_container.cpp +msgid "All Tabs In Front" +msgstr "" + +#: scene/gui/tab_container.cpp scene/gui/tabs.cpp +msgid "Drag To Rearrange Enabled" +msgstr "" + +#: scene/gui/tab_container.cpp +msgid "Use Hidden Tabs For Min Size" +msgstr "" + +#: scene/gui/tabs.cpp +msgid "Tab Close Display Policy" +msgstr "" + +#: scene/gui/tabs.cpp +msgid "Scrolling Enabled" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Readonly" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Bookmark Gutter" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Breakpoint Gutter" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Fold Gutter" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Drag And Drop Selection Enabled" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Hiding Enabled" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Wrap Enabled" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Scroll Vertical" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Scroll Horizontal" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Draw" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Block Mode" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Moving By Right Click" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Text Edit Idle Detect (sec)" +msgstr "" + +#: scene/gui/text_edit.cpp +msgid "Text Edit Undo Stack Max Size" +msgstr "" + +#: scene/gui/texture_button.cpp scene/resources/default_theme/default_theme.cpp +msgid "Hover" +msgstr "" + +#: scene/gui/texture_button.cpp +msgid "Focused" +msgstr "" + +#: scene/gui/texture_button.cpp +msgid "Click Mask" +msgstr "" + +#: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp +#: scene/gui/video_player.cpp +msgid "Expand" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Under" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Over" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Progress" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Progress Offset" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Fill Mode" +msgstr "" + +#: scene/gui/texture_progress.cpp scene/resources/material.cpp +msgid "Tint" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Radial Fill" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Initial Angle" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Fill Degrees" +msgstr "" + +#: scene/gui/texture_progress.cpp scene/resources/primitive_meshes.cpp +msgid "Center Offset" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Nine Patch Stretch" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Stretch Margin Left" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Stretch Margin Top" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Stretch Margin Right" +msgstr "" + +#: scene/gui/texture_progress.cpp +msgid "Stretch Margin Bottom" +msgstr "" + +#: scene/gui/tree.cpp +msgid "Custom Minimum Height" +msgstr "" + +#: scene/gui/tree.cpp +msgid "(Other)" +msgstr "" + +#: scene/gui/tree.cpp +msgid "Column Titles Visible" +msgstr "" + +#: scene/gui/tree.cpp +msgid "Hide Folding" +msgstr "" + +#: scene/gui/tree.cpp +msgid "Hide Root" +msgstr "" + +#: scene/gui/tree.cpp +msgid "Drop Mode Flags" +msgstr "" + +#: scene/gui/video_player.cpp +msgid "Audio Track" +msgstr "" + +#: scene/gui/video_player.cpp scene/main/scene_tree.cpp scene/main/timer.cpp +msgid "Paused" +msgstr "" + +#: scene/gui/video_player.cpp +msgid "Buffering Msec" +msgstr "" + +#: scene/gui/video_player.cpp +msgid "Stream Position" +msgstr "" + +#: scene/gui/viewport_container.cpp +msgid "Stretch Shrink" +msgstr "" + +#: scene/main/canvas_layer.cpp +msgid "Follow Viewport" +msgstr "" + +#: scene/main/http_request.cpp +msgid "Download File" +msgstr "" + +#: scene/main/http_request.cpp +msgid "Download Chunk Size" +msgstr "" + +#: scene/main/http_request.cpp +msgid "Body Size Limit" +msgstr "" + +#: scene/main/http_request.cpp +msgid "Max Redirects" +msgstr "" + +#: scene/main/http_request.cpp +msgid "Timeout" +msgstr "" + +#: scene/main/node.cpp +msgid "" +"Setting node name '%s' to be unique within scene for '%s', but it's already " +"claimed by '%s'. This node is no longer set unique." +msgstr "" + +#: scene/main/node.cpp +msgid "Name Num Separator" +msgstr "" + +#: scene/main/node.cpp +msgid "Name Casing" +msgstr "" + +#: scene/main/node.cpp +msgid "Editor Description" +msgstr "" + +#: scene/main/node.cpp +msgid "Pause Mode" +msgstr "" + +#: scene/main/node.cpp +msgid "Physics Interpolation Mode" +msgstr "" + +#: scene/main/node.cpp +msgid "Display Folded" +msgstr "" + +#: scene/main/node.cpp +msgid "Filename" +msgstr "" + +#: scene/main/node.cpp +msgid "Owner" +msgstr "" + +#: scene/main/node.cpp scene/main/scene_tree.cpp +msgid "Multiplayer" +msgstr "" + +#: scene/main/node.cpp +msgid "Custom Multiplayer" +msgstr "" + +#: scene/main/node.cpp +msgid "Process Priority" +msgstr "" + +#: scene/main/scene_tree.cpp scene/main/timer.cpp +msgid "Time Left" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Debug Collisions Hint" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Debug Navigation Hint" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Use Font Oversampling" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Edited Scene Root" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Root" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Multiplayer Poll" +msgstr "" + +#: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp +#: scene/resources/shape_2d.cpp +msgid "Shapes" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Shape Color" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Contact Color" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Geometry Color" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Disabled Geometry Color" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Max Contacts Displayed" +msgstr "" + +#: scene/main/scene_tree.cpp scene/resources/shape_2d.cpp +msgid "Draw 2D Outlines" +msgstr "" + +#: scene/main/scene_tree.cpp servers/visual_server.cpp +msgid "Reflections" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Atlas Size" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Atlas Subdiv" +msgstr "" + +#: scene/main/scene_tree.cpp scene/main/viewport.cpp +msgid "MSAA" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Use FXAA" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Use Debanding" +msgstr "" + +#: scene/main/scene_tree.cpp scene/main/viewport.cpp +msgid "HDR" +msgstr "" + +#: scene/main/scene_tree.cpp scene/main/viewport.cpp +msgid "Use 32 BPC Depth" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Default Environment" +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "" +"Default Environment as specified in Project Settings (Rendering -> " +"Environment -> Default Environment) could not be loaded." +msgstr "" + +#: scene/main/scene_tree.cpp +msgid "Enable Object Picking" +msgstr "" + +#: scene/main/timer.cpp +msgid "" +"Very low timer wait times (< 0.05 seconds) may behave in significantly " +"different ways depending on the rendered or physics frame rate.\n" +"Consider using a script's process loop instead of relying on a Timer for " +"very low wait times." +msgstr "" + +#: scene/main/timer.cpp +msgid "Autostart" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Viewport Path" +msgstr "" + +#: scene/main/viewport.cpp +msgid "" +"The Viewport size must be greater than or equal to 2 pixels on both " +"dimensions to render anything." +msgstr "" + +#: scene/main/viewport.cpp +msgid "" +"This Viewport has HDR enabled, but its Usage is set to 2D or 2D No-" +"Sampling.\n" +"HDR is only supported in Viewports that have their Usage set to 3D or 3D No-" +"Effects.\n" +"HDR will be disabled for this Viewport." +msgstr "" + +#: scene/main/viewport.cpp +msgid "ARVR" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Size Override Stretch" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Own World" +msgstr "" + +#: scene/main/viewport.cpp scene/resources/world_2d.cpp +msgid "World" +msgstr "" + +#: scene/main/viewport.cpp +msgid "World 2D" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Transparent BG" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Handle Input Locally" +msgstr "" + +#: scene/main/viewport.cpp +msgid "FXAA" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Debanding" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Disable 3D" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Keep 3D Linear" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Render Direct To Screen" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Debug Draw" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Render Target" +msgstr "" + +#: scene/main/viewport.cpp +msgid "V Flip" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Clear Mode" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Enable 2D" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Enable 3D" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Object Picking" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Disable Input" +msgstr "" + +#: scene/main/viewport.cpp servers/visual_server.cpp +msgid "Shadow Atlas" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Quad 0" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Quad 1" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Quad 2" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Quad 3" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Canvas Transform" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Global Canvas Transform" +msgstr "" + +#: scene/main/viewport.cpp +msgid "Tooltip Delay (sec)" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "Swap OK Cancel" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "Layer Names" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "2D Render" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "3D Render" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "2D Physics" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "3D Physics" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "2D Navigation" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "3D Navigation" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "Use hiDPI" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "Custom" +msgstr "" + +#: scene/register_scene_types.cpp +msgid "Custom Font" +msgstr "" + +#: scene/resources/audio_stream_sample.cpp +#: servers/audio/effects/audio_stream_generator.cpp servers/audio_server.cpp +msgid "Mix Rate" +msgstr "" + +#: scene/resources/audio_stream_sample.cpp +msgid "Stereo" +msgstr "" + +#: scene/resources/concave_polygon_shape_2d.cpp +msgid "Segments" +msgstr "" + +#: scene/resources/curve.cpp +msgid "Bake Resolution" +msgstr "" + +#: scene/resources/curve.cpp +msgid "Bake Interval" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Panel" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Hover" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Focus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "H Separation" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Underline Spacing" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Arrow" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Arrow Margin" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Hover Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Checked Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Unchecked" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Unchecked Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Radio Checked" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Radio Checked Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Radio Unchecked" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Radio Unchecked Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Hover Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Check V Adjust" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "On Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Off" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Off Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Shadow" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Outline Modulate" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Shadow Offset X" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Shadow Offset Y" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Shadow As Outline" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Selected" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Uneditable" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Cursor Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Clear Button Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Clear Button Color Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Minimum Spaces" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "BG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "FG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Tab" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +#: scene/resources/dynamic_font.cpp scene/resources/world.cpp +#: scene/resources/world_2d.cpp +msgid "Space" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Folded" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Fold" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Readonly" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Completion Lines" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Completion Max Width" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Completion Scroll Width" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Scroll Focus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grabber" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grabber Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grabber Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Increment" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Increment Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Increment Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Decrement" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Decrement Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Decrement Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Slider" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grabber Area" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grabber Area Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grabber Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Tick" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Updown" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Scaleborder Size" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Height" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Close Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Close H Offset" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Close V Offset" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Parent Folder" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Toggle Hidden" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Panel Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Labeled Separator Left" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Labeled Separator Right" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Separator" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Accel" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color Separator" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "V Separation" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Selected Frame" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Default Frame" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Default Focus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Comment Focus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Breakpoint" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Resizer" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Close Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Resizer Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Offset" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Close Offset" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Port Offset" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "BG Focus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Selected Focus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Cursor Unfocused" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Button Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Button Normal" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Button Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Button Hover" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Custom Button" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Custom Button Pressed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Custom Button Hover" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Select Arrow" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Arrow Collapsed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Button Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Title Button Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Guide Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Drop Position Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Relationship Line Color" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Custom Button Font Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Item Margin" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Button Margin" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Draw Relationship Lines" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Draw Guides" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Scroll Border" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Scroll Speed" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Icon Margin" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Line Separation" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Tab FG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Tab BG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Tab Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Menu" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Menu Highlight" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color FG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Font Color BG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Side Margin" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Top Margin" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Label V Align FG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Label V Align BG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Large" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Folder" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Folder Icon Modulate" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "File Icon Modulate" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Files Disabled" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "SV Width" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "SV Height" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "H Width" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Label Width" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Screen Picker" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Add Preset" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Color Hue" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Color Sample" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Preset BG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Overbright Indicator" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Preset FG" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Preset BG Icon" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Normal Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Bold Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Italics Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Bold Italics Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Mono Font" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Table H Separation" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Table V Separation" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Margin Left" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Margin Top" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Margin Right" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Margin Bottom" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Autohide" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Minus" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "More" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grid Minor" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Grid Major" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Selection Fill" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Selection Stroke" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Activity" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Bezier Len Pos" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Bezier Len Neg" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Port Grab Distance Horizontal" +msgstr "" + +#: scene/resources/default_theme/default_theme.cpp +msgid "Port Grab Distance Vertical" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Hinting" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Override Oversampling" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Font Path" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Outline Size" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Outline Color" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Use Mipmaps" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Extra Spacing" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Char" +msgstr "" + +#: scene/resources/dynamic_font.cpp +msgid "Font Data" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Background" +msgstr "" + +#: scene/resources/environment.cpp scene/resources/sky.cpp +msgid "Sky" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sky Custom FOV" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sky Orientation" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sky Rotation" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sky Rotation Degrees" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Canvas Max Layer" +msgstr "" + +#: scene/resources/environment.cpp scene/resources/texture.cpp +msgid "Camera Feed ID" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Ambient Light" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sky Contribution" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Fog" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sun Color" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Sun Amount" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Depth Enabled" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Depth Begin" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Depth End" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Depth Curve" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Transmit Enabled" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Transmit Curve" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Height Enabled" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Height Min" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Height Max" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Height Curve" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Tonemap" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Exposure" +msgstr "" + +#: scene/resources/environment.cpp +msgid "White" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Auto Exposure" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Min Luma" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Max Luma" +msgstr "" + +#: scene/resources/environment.cpp +msgid "SS Reflections" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Max Steps" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Fade In" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Fade Out" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Depth Tolerance" +msgstr "" + +#: scene/resources/environment.cpp scene/resources/material.cpp +msgid "Roughness" +msgstr "" + +#: scene/resources/environment.cpp +msgid "SSAO" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Radius 2" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Intensity 2" +msgstr "" + +#: scene/resources/environment.cpp scene/resources/material.cpp +msgid "Light Affect" +msgstr "" + +#: scene/resources/environment.cpp +msgid "AO Channel Affect" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Blur" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Edge Sharpness" +msgstr "" + +#: scene/resources/environment.cpp +msgid "DOF Far Blur" +msgstr "" + +#: scene/resources/environment.cpp scene/resources/material.cpp +msgid "Distance" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Transition" +msgstr "" + +#: scene/resources/environment.cpp +msgid "DOF Near Blur" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Glow" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Levels" +msgstr "" + +#: scene/resources/environment.cpp +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "1" +msgstr "" + +#: scene/resources/environment.cpp +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "2" +msgstr "" + +#: scene/resources/environment.cpp +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "3" +msgstr "" + +#: scene/resources/environment.cpp +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "4" +msgstr "" + +#: scene/resources/environment.cpp +msgid "5" +msgstr "" + +#: scene/resources/environment.cpp +msgid "6" +msgstr "" + +#: scene/resources/environment.cpp +msgid "7" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Bloom" +msgstr "" + +#: scene/resources/environment.cpp +msgid "HDR Threshold" +msgstr "" + +#: scene/resources/environment.cpp +msgid "HDR Luminance Cap" +msgstr "" + +#: scene/resources/environment.cpp +msgid "HDR Scale" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Bicubic Upscale" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Adjustments" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Brightness" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Saturation" +msgstr "" + +#: scene/resources/environment.cpp +msgid "Color Correction" +msgstr "" + +#: scene/resources/font.cpp +msgid "Ascent" +msgstr "" + +#: scene/resources/font.cpp +msgid "Distance Field" +msgstr "" + +#: scene/resources/gradient.cpp +msgid "Raw Data" +msgstr "" + +#: scene/resources/gradient.cpp +msgid "Offsets" +msgstr "" + +#: scene/resources/height_map_shape.cpp +msgid "Map Width" +msgstr "" + +#: scene/resources/height_map_shape.cpp +msgid "Map Depth" +msgstr "" + +#: scene/resources/height_map_shape.cpp +msgid "Map Data" +msgstr "" + +#: scene/resources/line_shape_2d.cpp +msgid "D" +msgstr "" + +#: scene/resources/material.cpp +msgid "Next Pass" +msgstr "" + +#: scene/resources/material.cpp +msgid "Use Shadow To Opacity" +msgstr "" + +#: scene/resources/material.cpp +msgid "Unshaded" +msgstr "" + +#: scene/resources/material.cpp +msgid "Vertex Lighting" +msgstr "" + +#: scene/resources/material.cpp +msgid "Use Point Size" +msgstr "" + +#: scene/resources/material.cpp +msgid "World Triplanar" +msgstr "" + +#: scene/resources/material.cpp +msgid "Albedo Tex Force sRGB" +msgstr "" + +#: scene/resources/material.cpp +msgid "Do Not Receive Shadows" +msgstr "" + +#: scene/resources/material.cpp +msgid "Disable Ambient Light" +msgstr "" + +#: scene/resources/material.cpp +msgid "Ensure Correct Normals" +msgstr "" + +#: scene/resources/material.cpp +msgid "Albedo Tex MSDF" +msgstr "" + +#: scene/resources/material.cpp +msgid "Vertex Color" +msgstr "" + +#: scene/resources/material.cpp +msgid "Use As Albedo" +msgstr "" + +#: scene/resources/material.cpp +msgid "Is sRGB" +msgstr "" + +#: scene/resources/material.cpp servers/visual_server.cpp +msgid "Parameters" +msgstr "" + +#: scene/resources/material.cpp +msgid "Diffuse Mode" +msgstr "" + +#: scene/resources/material.cpp +msgid "Specular Mode" +msgstr "" + +#: scene/resources/material.cpp +msgid "Depth Draw Mode" +msgstr "" + +#: scene/resources/material.cpp +msgid "Line Width" +msgstr "" + +#: scene/resources/material.cpp +msgid "Point Size" +msgstr "" + +#: scene/resources/material.cpp +msgid "Billboard Mode" +msgstr "" + +#: scene/resources/material.cpp +msgid "Billboard Keep Scale" +msgstr "" + +#: scene/resources/material.cpp +msgid "Grow" +msgstr "" + +#: scene/resources/material.cpp +msgid "Grow Amount" +msgstr "" + +#: scene/resources/material.cpp +msgid "Use Alpha Scissor" +msgstr "" + +#: scene/resources/material.cpp +msgid "Particles Anim" +msgstr "" + +#: scene/resources/material.cpp +msgid "H Frames" +msgstr "" + +#: scene/resources/material.cpp +msgid "V Frames" +msgstr "" + +#: scene/resources/material.cpp +msgid "Albedo" +msgstr "" + +#: scene/resources/material.cpp +msgid "Metallic" +msgstr "" + +#: scene/resources/material.cpp +msgid "Texture Channel" +msgstr "" + +#: scene/resources/material.cpp +msgid "Emission" +msgstr "" + +#: scene/resources/material.cpp +msgid "On UV2" +msgstr "" + +#: scene/resources/material.cpp +msgid "NormalMap" +msgstr "" + +#: scene/resources/material.cpp +msgid "Rim" +msgstr "" + +#: scene/resources/material.cpp +msgid "Clearcoat" +msgstr "" + +#: scene/resources/material.cpp +msgid "Gloss" +msgstr "" + +#: scene/resources/material.cpp +msgid "Anisotropy" +msgstr "" + +#: scene/resources/material.cpp +msgid "Flowmap" +msgstr "" + +#: scene/resources/material.cpp +msgid "Ambient Occlusion" +msgstr "" + +#: scene/resources/material.cpp +msgid "Deep Parallax" +msgstr "" + +#: scene/resources/material.cpp +msgid "Min Layers" +msgstr "" + +#: scene/resources/material.cpp +msgid "Max Layers" +msgstr "" + +#: scene/resources/material.cpp +msgid "Flip Tangent" +msgstr "" + +#: scene/resources/material.cpp +msgid "Flip Binormal" +msgstr "" + +#: scene/resources/material.cpp +msgid "Subsurf Scatter" +msgstr "" + +#: scene/resources/material.cpp +msgid "Transmission" +msgstr "" + +#: scene/resources/material.cpp +msgid "Refraction" +msgstr "" + +#: scene/resources/material.cpp +msgid "Detail" +msgstr "" + +#: scene/resources/material.cpp +msgid "UV Layer" +msgstr "" + +#: scene/resources/material.cpp +msgid "UV1" +msgstr "" + +#: scene/resources/material.cpp +msgid "Triplanar" +msgstr "" + +#: scene/resources/material.cpp +msgid "Triplanar Sharpness" +msgstr "" + +#: scene/resources/material.cpp +msgid "UV2" +msgstr "" + +#: scene/resources/material.cpp +msgid "Proximity Fade" +msgstr "" + +#: scene/resources/material.cpp +msgid "Distance Fade" +msgstr "" + +#: scene/resources/material.cpp +msgid "Async Mode" +msgstr "" + +#: scene/resources/mesh.cpp +msgid "Lightmap Size Hint" +msgstr "" + +#: scene/resources/mesh.cpp scene/resources/primitive_meshes.cpp +msgid "Custom AABB" +msgstr "" + +#: scene/resources/mesh_library.cpp +msgid "Mesh Transform" +msgstr "" + +#: scene/resources/mesh_library.cpp +msgid "NavMesh Transform" +msgstr "" + +#: scene/resources/multimesh.cpp +msgid "Color Format" +msgstr "" + +#: scene/resources/multimesh.cpp +msgid "Transform Format" +msgstr "" + +#: scene/resources/multimesh.cpp +msgid "Custom Data Format" +msgstr "" + +#: scene/resources/multimesh.cpp +msgid "Instance Count" +msgstr "" + +#: scene/resources/multimesh.cpp +msgid "Visible Instance Count" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Sampling" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Partition Type" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Parsed Geometry Type" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Source Geometry Mode" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Source Group Name" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Cells" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Agents" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Max Climb" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Max Slope" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Regions" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Merge Size" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Edges" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Max Error" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Verts Per Poly" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Details" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Sample Distance" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Sample Max Error" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Low Hanging Obstacles" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Ledge Spans" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Walkable Low Height Spans" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + +#: scene/resources/occluder_shape.cpp +msgid "Spheres" +msgstr "" + +#: scene/resources/occluder_shape.cpp +msgid "OccluderShapeSphere Set Spheres" +msgstr "" + +#: scene/resources/occluder_shape_polygon.cpp +msgid "Polygon Points" +msgstr "" + +#: scene/resources/occluder_shape_polygon.cpp +msgid "Hole Points" +msgstr "" + +#: scene/resources/packed_scene.cpp +msgid "Bundled" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Trail" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Divisor" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Size Modifier" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Color Modifier" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Point Texture" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Normal Texture" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Color Texture" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Point Count" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Scale Random" +msgstr "" + +#: scene/resources/particles_material.cpp +msgid "Scale Curve" +msgstr "" + +#: scene/resources/physics_material.cpp +msgid "Rough" +msgstr "" + +#: scene/resources/physics_material.cpp +msgid "Absorbent" +msgstr "" + +#: scene/resources/plane_shape.cpp +msgid "Plane" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Flip Faces" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Mid Height" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Subdivide Width" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Subdivide Height" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Subdivide Depth" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Top Radius" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Bottom Radius" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Left To Right" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Is Hemisphere" +msgstr "" + +#: scene/resources/primitive_meshes.cpp +msgid "Curve Step" +msgstr "" + +#: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp +msgid "Slips On Slope" +msgstr "" + +#: scene/resources/segment_shape_2d.cpp +msgid "A" +msgstr "" + +#: scene/resources/shape_2d.cpp +msgid "Custom Solver Bias" +msgstr "" + +#: scene/resources/skin.cpp +msgid "Bind Count" +msgstr "" + +#: scene/resources/skin.cpp +msgid "Bind" +msgstr "" + +#: scene/resources/skin.cpp +msgid "Bone" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Radiance Size" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Panorama" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Top Color" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Horizon Color" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Ground" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Bottom Color" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Sun" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Latitude" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Longitude" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Angle Min" +msgstr "" + +#: scene/resources/sky.cpp +msgid "Angle Max" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Content Margin" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Expand Margin" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Skew" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Corner Radius" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Corner Detail" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Anti Aliasing" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Grow Begin" +msgstr "" + +#: scene/resources/style_box.cpp +msgid "Grow End" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Load Path" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Base Texture" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Image Size" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Side" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Front" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Back" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Storage Mode" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Lossy Storage Quality" +msgstr "" + +#: scene/resources/texture.cpp +msgid "From" +msgstr "" + +#: scene/resources/texture.cpp +msgid "To" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Base" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Current Frame" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Pause" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Which Feed" +msgstr "" + +#: scene/resources/texture.cpp +msgid "Camera Is Active" +msgstr "" + +#: scene/resources/theme.cpp +msgid "Default Font" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Output Port For Preview" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Depth Draw" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Cull" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Diffuse" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Async" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Modes" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Input Name" +msgstr "" + +#: scene/resources/visual_shader.cpp +msgid "Uniform Name" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "" +"The sampler port is connected but not used. Consider changing the source to " +"'SamplerPort'." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for shader." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Texture Type" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Cube Map" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Default Value Enabled" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Default Value" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Color Default" +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + +#: scene/resources/world.cpp +msgid "Fallback Environment" +msgstr "" + +#: scene/resources/world.cpp +msgid "Scenario" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Navigation Map" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Direct Space State" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Gravity Vector" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Linear Damp" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Angular Damp" +msgstr "" + +#: scene/resources/world.cpp +msgid "Default Map Up" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Cell Size" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Cell Height" +msgstr "" + +#: scene/resources/world.cpp scene/resources/world_2d.cpp +msgid "Default Edge Connection Margin" +msgstr "" + +#: scene/resources/world_2d.cpp +msgid "Canvas" +msgstr "" + +#: servers/arvr/arvr_interface.cpp +msgid "Is Primary" +msgstr "" + +#: servers/arvr/arvr_interface.cpp +msgid "Is Initialized" +msgstr "" + +#: servers/arvr/arvr_interface.cpp +msgid "AR" +msgstr "" + +#: servers/arvr/arvr_interface.cpp +msgid "Is Anchor Detection Enabled" +msgstr "" + +#: servers/arvr_server.cpp +msgid "Primary Interface" +msgstr "" + +#: servers/audio/audio_stream.cpp +msgid "Audio Stream" +msgstr "" + +#: servers/audio/audio_stream.cpp +msgid "Random Pitch" +msgstr "" + +#: servers/audio/effects/audio_effect_capture.cpp +#: servers/audio/effects/audio_effect_spectrum_analyzer.cpp +#: servers/audio/effects/audio_stream_generator.cpp +msgid "Buffer Length" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "Voice Count" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_delay.cpp +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Dry" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Wet" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "Voice" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_delay.cpp +msgid "Delay (ms)" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_phaser.cpp +msgid "Rate Hz" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +msgid "Depth (ms)" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_delay.cpp +msgid "Level dB" +msgstr "" + +#: servers/audio/effects/audio_effect_chorus.cpp +#: servers/audio/effects/audio_effect_delay.cpp +#: servers/audio/effects/audio_effect_panner.cpp +msgid "Pan" +msgstr "" + +#: servers/audio/effects/audio_effect_compressor.cpp +#: servers/audio/effects/audio_effect_filter.cpp +msgid "Gain" +msgstr "" + +#: servers/audio/effects/audio_effect_compressor.cpp +msgid "Attack (µs)" +msgstr "" + +#: servers/audio/effects/audio_effect_compressor.cpp +msgid "Release (ms)" +msgstr "" + +#: servers/audio/effects/audio_effect_compressor.cpp +msgid "Mix" +msgstr "" + +#: servers/audio/effects/audio_effect_compressor.cpp +msgid "Sidechain" +msgstr "" + +#: servers/audio/effects/audio_effect_delay.cpp +msgid "Tap 1" +msgstr "" + +#: servers/audio/effects/audio_effect_delay.cpp +msgid "Tap 2" +msgstr "" + +#: servers/audio/effects/audio_effect_delay.cpp +#: servers/audio/effects/audio_effect_phaser.cpp +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Feedback" +msgstr "" + +#: servers/audio/effects/audio_effect_delay.cpp +msgid "Low-pass" +msgstr "" + +#: servers/audio/effects/audio_effect_distortion.cpp +msgid "Pre Gain" +msgstr "" + +#: servers/audio/effects/audio_effect_distortion.cpp +msgid "Keep Hf Hz" +msgstr "" + +#: servers/audio/effects/audio_effect_distortion.cpp +msgid "Drive" +msgstr "" + +#: servers/audio/effects/audio_effect_distortion.cpp +msgid "Post Gain" +msgstr "" + +#: servers/audio/effects/audio_effect_filter.cpp +msgid "Resonance" +msgstr "" + +#: servers/audio/effects/audio_effect_limiter.cpp +msgid "Ceiling dB" +msgstr "" + +#: servers/audio/effects/audio_effect_limiter.cpp +msgid "Threshold dB" +msgstr "" + +#: servers/audio/effects/audio_effect_limiter.cpp +msgid "Soft Clip dB" +msgstr "" + +#: servers/audio/effects/audio_effect_limiter.cpp +msgid "Soft Clip Ratio" +msgstr "" + +#: servers/audio/effects/audio_effect_phaser.cpp +msgid "Range Min Hz" +msgstr "" + +#: servers/audio/effects/audio_effect_phaser.cpp +msgid "Range Max Hz" +msgstr "" + +#: servers/audio/effects/audio_effect_pitch_shift.cpp +msgid "Oversampling" +msgstr "" + +#: servers/audio/effects/audio_effect_pitch_shift.cpp +#: servers/audio/effects/audio_effect_spectrum_analyzer.cpp +msgid "FFT Size" +msgstr "" + +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Predelay" +msgstr "" + +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Msec" +msgstr "" + +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "Room Size" +msgstr "" + +#: servers/audio/effects/audio_effect_reverb.cpp +msgid "High-pass" +msgstr "" + +#: servers/audio/effects/audio_effect_spectrum_analyzer.cpp +msgid "Tap Back Pos" +msgstr "" + +#: servers/audio/effects/audio_effect_stereo_enhance.cpp +msgid "Pan Pullout" +msgstr "" + +#: servers/audio/effects/audio_effect_stereo_enhance.cpp +msgid "Time Pullout (ms)" +msgstr "" + +#: servers/audio/effects/audio_effect_stereo_enhance.cpp +msgid "Surround" +msgstr "" + +#: servers/audio_server.cpp +msgid "Enable Audio Input" +msgstr "" + +#: servers/audio_server.cpp +msgid "Output Latency" +msgstr "" + +#: servers/audio_server.cpp +msgid "Channel Disable Threshold dB" +msgstr "" + +#: servers/audio_server.cpp +msgid "Channel Disable Time" +msgstr "" + +#: servers/audio_server.cpp +msgid "Video Delay Compensation (ms)" +msgstr "" + +#: servers/audio_server.cpp +msgid "Bus Count" +msgstr "" + +#: servers/audio_server.cpp +msgid "Capture Device" +msgstr "" + +#: servers/audio_server.cpp +msgid "Global Rate Scale" +msgstr "" + +#: servers/camera/camera_feed.cpp +msgid "Feed" +msgstr "" + +#: servers/camera/camera_feed.cpp +msgid "Is Active" +msgstr "" + +#: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp +msgid "Sleep Threshold Linear" +msgstr "" + +#: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp +msgid "Sleep Threshold Angular" +msgstr "" + +#: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp +msgid "Time Before Sleep" +msgstr "" + +#: servers/physics_2d/physics_2d_server_sw.cpp +msgid "BP Hash Table Size" +msgstr "" + +#: servers/physics_2d/physics_2d_server_sw.cpp +msgid "Large Object Surface Threshold In Cells" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Inverse Mass" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Inverse Inertia" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Total Angular Damp" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Total Linear Damp" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Total Gravity" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Linear Velocity" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Exclude" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Shape RID" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collide With Bodies" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collide With Areas" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Motion Remainder" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collision Point" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collision Normal" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collision Depth" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collision Safe Fraction" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Collision Unsafe Fraction" +msgstr "" + +#: servers/physics_2d_server.cpp servers/physics_server.cpp +msgid "Physics Engine" +msgstr "" + +#: servers/physics_server.cpp +msgid "Center Of Mass" +msgstr "" + +#: servers/physics_server.cpp +msgid "Principal Inertia Axes" +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Varying may not be assigned in the '%s' function." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "" +"Varyings which were assigned in 'vertex' function may not be reassigned in " +"'fragment' or 'light'." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "" +"Varyings which were assigned in 'fragment' function may not be reassigned in " +"'vertex' or 'light'." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Assignment to function." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Assignment to uniform." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Constants cannot be modified." +msgstr "" + +#: servers/visual/visual_server_scene.cpp +msgid "Spatial Partitioning" +msgstr "" + +#: servers/visual_server.cpp +msgid "Render Loop Enabled" +msgstr "" + +#: servers/visual_server.cpp +msgid "VRAM Compression" +msgstr "" + +#: servers/visual_server.cpp +msgid "Import BPTC" +msgstr "" + +#: servers/visual_server.cpp +msgid "Import S3TC" +msgstr "" + +#: servers/visual_server.cpp +msgid "Import ETC" +msgstr "" + +#: servers/visual_server.cpp +msgid "Import ETC2" +msgstr "" + +#: servers/visual_server.cpp +msgid "Import PVRTC" +msgstr "" + +#: servers/visual_server.cpp +msgid "Lossless Compression" +msgstr "" + +#: servers/visual_server.cpp +msgid "Force PNG" +msgstr "" + +#: servers/visual_server.cpp +msgid "WebP Compression Level" +msgstr "" + +#: servers/visual_server.cpp +msgid "Time Rollover Secs" +msgstr "" + +#: servers/visual_server.cpp +msgid "Cubemap Size" +msgstr "" + +#: servers/visual_server.cpp +msgid "Quadrant 0 Subdiv" +msgstr "" + +#: servers/visual_server.cpp +msgid "Quadrant 1 Subdiv" +msgstr "" + +#: servers/visual_server.cpp +msgid "Quadrant 2 Subdiv" +msgstr "" + +#: servers/visual_server.cpp +msgid "Quadrant 3 Subdiv" +msgstr "" + +#: servers/visual_server.cpp +msgid "Shadows" +msgstr "" + +#: servers/visual_server.cpp +msgid "Filter Mode" +msgstr "" + +#: servers/visual_server.cpp +msgid "Texture Array Reflections" +msgstr "" + +#: servers/visual_server.cpp +msgid "High Quality GGX" +msgstr "" + +#: servers/visual_server.cpp +msgid "Irradiance Max Size" +msgstr "" + +#: servers/visual_server.cpp +msgid "Shading" +msgstr "" + +#: servers/visual_server.cpp +msgid "Force Vertex Shading" +msgstr "" + +#: servers/visual_server.cpp +msgid "Force Lambert Over Burley" +msgstr "" + +#: servers/visual_server.cpp +msgid "Force Blinn Over GGX" +msgstr "" + +#: servers/visual_server.cpp +msgid "Mesh Storage" +msgstr "" + +#: servers/visual_server.cpp +msgid "Split Stream" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Physical Light Attenuation" +msgstr "" + +#: servers/visual_server.cpp +msgid "Depth Prepass" +msgstr "" + +#: servers/visual_server.cpp +msgid "Disable For Vendors" +msgstr "" + +#: servers/visual_server.cpp +msgid "Anisotropic Filter Level" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Nearest Mipmap Filter" +msgstr "" + +#: servers/visual_server.cpp +msgid "Skinning" +msgstr "" + +#: servers/visual_server.cpp +msgid "Software Skinning Fallback" +msgstr "" + +#: servers/visual_server.cpp +msgid "Force Software Skinning" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Software Skinning" +msgstr "" + +#: servers/visual_server.cpp +msgid "Ninepatch Mode" +msgstr "" + +#: servers/visual_server.cpp +msgid "OpenGL" +msgstr "" + +#: servers/visual_server.cpp +msgid "Batching Send Null" +msgstr "" + +#: servers/visual_server.cpp +msgid "Batching Stream" +msgstr "" + +#: servers/visual_server.cpp +msgid "Legacy Orphan Buffers" +msgstr "" + +#: servers/visual_server.cpp +msgid "Legacy Stream" +msgstr "" + +#: servers/visual_server.cpp +msgid "Batching" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Batching" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Batching In Editor" +msgstr "" + +#: servers/visual_server.cpp +msgid "Single Rect Fallback" +msgstr "" + +#: servers/visual_server.cpp +msgid "Max Join Item Commands" +msgstr "" + +#: servers/visual_server.cpp +msgid "Colored Vertex Format Threshold" +msgstr "" + +#: servers/visual_server.cpp +msgid "Scissor Area Threshold" +msgstr "" + +#: servers/visual_server.cpp +msgid "Max Join Items" +msgstr "" + +#: servers/visual_server.cpp +msgid "Batch Buffer Size" +msgstr "" + +#: servers/visual_server.cpp +msgid "Item Reordering Lookahead" +msgstr "" + +#: servers/visual_server.cpp +msgid "Flash Batching" +msgstr "" + +#: servers/visual_server.cpp +msgid "Diagnose Frame" +msgstr "" + +#: servers/visual_server.cpp +msgid "GLES2" +msgstr "" + +#: servers/visual_server.cpp +msgid "Compatibility" +msgstr "" + +#: servers/visual_server.cpp +msgid "Disable Half Float" +msgstr "" + +#: servers/visual_server.cpp +msgid "Enable High Float" +msgstr "" + +#: servers/visual_server.cpp +msgid "Precision" +msgstr "" + +#: servers/visual_server.cpp +msgid "UV Contract" +msgstr "" + +#: servers/visual_server.cpp +msgid "UV Contract Amount" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Simple PVS" +msgstr "" + +#: servers/visual_server.cpp +msgid "PVS Logging" +msgstr "" + +#: servers/visual_server.cpp +msgid "Use Signals" +msgstr "" + +#: servers/visual_server.cpp +msgid "Remove Danglers" +msgstr "" + +#: servers/visual_server.cpp +msgid "Flip Imported Portals" +msgstr "" + +#: servers/visual_server.cpp +msgid "Occlusion Culling" +msgstr "" + +#: servers/visual_server.cpp +msgid "Max Active Spheres" +msgstr "" + +#: servers/visual_server.cpp +msgid "Max Active Polygons" +msgstr "" + +#: servers/visual_server.cpp +msgid "Shader Compilation Mode" +msgstr "" + +#: servers/visual_server.cpp +msgid "Max Simultaneous Compiles" +msgstr "" + +#: servers/visual_server.cpp +msgid "Log Active Async Compiles Count" +msgstr "" + +#: servers/visual_server.cpp +msgid "Shader Cache Size (MB)" +msgstr "" diff --git a/editor/translations/is.po b/editor/translations/is.po index 512c660eef..8514155c68 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -4425,6 +4425,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7154,7 +7155,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14981,18 +14983,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Fjarlægja val" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Fjarlægja val" #: editor/scene_tree_dock.cpp @@ -15185,6 +15187,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Fjarlægja val" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15248,6 +15255,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17070,6 +17081,19 @@ msgstr "Allt úrvalið" msgid "Auto Update Project" msgstr "Verkefna Stjóri" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Verkefna Stjóri" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18799,6 +18823,11 @@ msgstr "TvÃteknir lyklar" msgid "Custom BG Color" msgstr "TvÃteknir lyklar" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Breyta..." + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19597,6 +19626,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 2c9f7eb6fe..c520b1567d 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -71,12 +71,13 @@ # conecat <ilgrandemax190@gmail.com>, 2022. # Gico2006 <gradaellig@protonmail.com>, 2022. # ale piccia <picciatialessio2@gmail.com>, 2022. +# Simone Starace <simone.starace93@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-31 18:34+0000\n" +"PO-Revision-Date: 2022-08-30 03:11+0000\n" "Last-Translator: Mirko <miknsop@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" @@ -85,7 +86,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -456,7 +457,7 @@ msgstr "Comando" #: core/os/input_event.cpp #, fuzzy msgid "Physical" -msgstr " (Fisico)" +msgstr "Fisico" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -465,8 +466,9 @@ msgid "Pressed" msgstr "Premuto" #: core/os/input_event.cpp +#, fuzzy msgid "Scancode" -msgstr "Scansione Codice" +msgstr "Scancode" #: core/os/input_event.cpp msgid "Physical Scancode" @@ -901,7 +903,6 @@ msgid "Modules" msgstr "Moduli" #: core/register_core_types.cpp -#, fuzzy msgid "TCP" msgstr "TCP" @@ -1272,7 +1273,7 @@ msgstr "Cambia la durata dell'animazione" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "Commuta ciclicità animazione" +msgstr "Cambia ciclo di animazione" #: editor/animation_track_editor.cpp msgid "Property Track" @@ -1379,9 +1380,8 @@ msgid "Type:" msgstr "Tipo:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "Template di esportazione non valido:" +msgstr "(Non valido, tipo previsto: %s)" #: editor/animation_track_editor.cpp msgid "Easing:" @@ -1398,9 +1398,8 @@ msgid "Out-Handle:" msgstr "Imposta Maniglia" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "Stream" +msgstr "Flusso:" #: editor/animation_track_editor.cpp msgid "Start (s):" @@ -1540,6 +1539,7 @@ msgid "animation" msgstr "animazione" #: editor/animation_track_editor.cpp +#, fuzzy msgid "AnimationPlayer can't animate itself, only other players." msgstr "AnimationPlayer non può animare se stesso, solo altri nodi." @@ -1630,7 +1630,6 @@ msgid "Add Method Track Key" msgstr "Aggiungi una chiave a una traccia di chiamate metodi" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" msgstr "Metodo non trovato nell'oggetto:" @@ -2115,7 +2114,6 @@ msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Sei sicuro di voler rimuovere tutte le connessioni dal segnale \"%s\"?" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp -#, fuzzy msgid "Signals" msgstr "Segnali" @@ -2813,9 +2811,8 @@ msgid "Project export for platform:" msgstr "Esportazione del progetto per la piattaforma:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Completato con errori." +msgstr "Completato con avvertimenti." #: editor/editor_export.cpp #, fuzzy @@ -4565,6 +4562,7 @@ msgstr "Strumenti di progetto o scena vari." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Progetto" @@ -6998,7 +6996,6 @@ msgstr "Anisotropico" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "sRGB" msgstr "sRGB" @@ -7355,7 +7352,8 @@ msgid "8 Bit" msgstr "8 Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -10571,7 +10569,6 @@ msgstr "Script precedente" #: editor/plugins/script_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "File" msgstr "File" @@ -15409,16 +15406,19 @@ msgstr "" msgid "Make Local" msgstr "Rendi Locale" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "Un altro nodo sta già usando questo nome unico nella scena." - #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +#, fuzzy +msgid "Enable Scene Unique Name(s)" msgstr "Abilita Nome Unico Scena" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Unique names already used by another node in the scene:" +msgstr "Un altro nodo sta già usando questo nome unico nella scena." + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Disabilita Nome Unico Scena" #: editor/scene_tree_dock.cpp @@ -15618,6 +15618,10 @@ msgid "Button Group" msgstr "Gruppo Pulsanti" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Disabilita Nome Unico Scena" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Collegamento da)" @@ -15696,6 +15700,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Nome nodo invalido, i caratteri seguenti non sono consentiti:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Un altro nodo sta già usando questo nome unico nella scena." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Rinomina Nodo" @@ -17499,6 +17507,21 @@ msgstr "Crea Soluzione" msgid "Auto Update Project" msgstr "Auto-Aggiorna Progetto" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Nome Display" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Scegli una cartella" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Scegli una cartella" + #: modules/mono/mono_gd/gd_mono_utils.cpp #, fuzzy msgid "End of inner exception stack trace" @@ -19331,6 +19354,11 @@ msgstr "Taglia nodi" msgid "Custom BG Color" msgstr "Taglia nodi" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Espandi Tutto" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20186,6 +20214,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nome breve del pacchetto non valido." @@ -22217,7 +22251,7 @@ msgstr "Gizmos" #: scene/3d/baked_lightmap.cpp msgid "Tweaks" -msgstr "" +msgstr "Ritocchi" #: scene/3d/baked_lightmap.cpp msgid "Bounces" @@ -25200,7 +25234,7 @@ msgstr "Imposta più valori:" #: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp #: scene/resources/shape_2d.cpp msgid "Shapes" -msgstr "" +msgstr "Forme" #: scene/main/scene_tree.cpp msgid "Shape Color" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 60458e89df..f086111ef2 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -40,13 +40,15 @@ # jp.owo.Manda <admin@alterbaum.net>, 2022. # KokiOgawa <mupimupicandy@gmail.com>, 2022. # cacapon <takuma.tsubo@amazingengine.co.jp>, 2022. +# fadhliazhari <m.fadhliazhari@gmail.com>, 2022. +# Chia-Hsiang Cheng <cche0109@student.monash.edu>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-06 01:50+0000\n" -"Last-Translator: nitenook <admin@alterbaum.net>\n" +"PO-Revision-Date: 2022-08-21 06:01+0000\n" +"Last-Translator: KokiOgawa <mupimupicandy@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" "Language: ja\n" @@ -54,7 +56,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.13-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -171,9 +173,8 @@ msgid "Print Error Messages" msgstr "エラーメッセージを表示" #: core/bind/core_bind.cpp -#, fuzzy msgid "Iterations Per Second" -msgstr "補間モード" +msgstr "毎秒å復回数" #: core/bind/core_bind.cpp msgid "Target FPS" @@ -186,21 +187,19 @@ msgstr "タイムスケール" #: core/bind/core_bind.cpp main/main.cpp #, fuzzy msgid "Physics Jitter Fix" -msgstr "物ç†ãƒ•レーム%" +msgstr "物ç†ã‚¸ãƒƒã‚¿ä¿®æ£" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" msgstr "エラー" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "ä¿å˜ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" +msgstr "エラー文å—列" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error Line" -msgstr "ä¿å˜ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" +msgstr "エラー行" #: core/bind/core_bind.cpp msgid "Result" @@ -350,9 +349,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "デコードã™ã‚‹ã«ã¯ãƒã‚¤ãƒˆãŒè¶³ã‚Šãªã„ã‹ã€ã¾ãŸã¯ç„¡åйãªå½¢å¼ã§ã™ã€‚" #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "å¼ä¸ã®ç„¡åйãªå…¥åŠ› %i (渡ã•れã¦ã„ã¾ã›ã‚“)" +msgstr "å¼ã«ç„¡åŠ¹å…¥åŠ› %d (渡ã•れã¦ã„ã¾ã›ã‚“)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -396,14 +394,12 @@ msgid "Max Size (KB)" msgstr "最大サイズ (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "移動モード" +msgstr "マウスモード" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "入力を削除" +msgstr "è“„ç©å…¥åŠ›ä½¿ç”¨" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -431,16 +427,14 @@ msgid "Command" msgstr "Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (物ç†çš„)" +msgstr "物ç†" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Pressed" -msgstr "プリセット" +msgstr "押下" #: core/os/input_event.cpp msgid "Scancode" @@ -489,7 +483,7 @@ msgstr "圧力" #: core/os/input_event.cpp #, fuzzy msgid "Pen Inverted" -msgstr "å転" +msgstr "ペンå転" #: core/os/input_event.cpp msgid "Relative" @@ -549,9 +543,8 @@ msgid "Velocity" msgstr "ベãƒã‚·ãƒ†ã‚£" #: core/os/input_event.cpp -#, fuzzy msgid "Instrument" -msgstr "インストゥルメント" +msgstr "楽器" #: core/os/input_event.cpp msgid "Controller Number" @@ -623,16 +616,14 @@ msgid "Use Custom User Dir" msgstr "カスタムユーザディレクトリを使用" #: core/project_settings.cpp -#, fuzzy msgid "Custom User Dir Name" -msgstr "カスタムユーザディレクトリå" +msgstr "カスタムユーザフォルダå" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "ã™ã¹ã¦è¡¨ç¤º" +msgstr "表示" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp @@ -654,14 +645,12 @@ msgid "Always On Top" msgstr "å¸¸ã«æœ€å‰é¢" #: core/project_settings.cpp -#, fuzzy msgid "Test Width" -msgstr "左伸長" +msgstr "幅テスト" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "試験的" +msgstr "高ã•テスト" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -680,9 +669,8 @@ msgid "Editor" msgstr "エディター" #: core/project_settings.cpp -#, fuzzy msgid "Main Run Args" -msgstr "メインシーンã®å¼•æ•°:" +msgstr "メイン実行引数" #: core/project_settings.cpp msgid "Scene Naming" @@ -697,14 +685,12 @@ msgid "Script Templates Search Path" msgstr "ã‚¹ã‚¯ãƒªãƒ—ãƒˆãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã®æ¤œç´¢ãƒ‘ス" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "起動時ã®è‡ªå‹•èªã¿è¾¼ã¿" +msgstr "起動時ã®VCS自動èªã¿è¾¼ã¿" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«" +msgstr "VCSプラグインå" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -713,66 +699,55 @@ msgstr "入力" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "UI åŒæ„" #: core/project_settings.cpp -#, fuzzy msgid "UI Select" -msgstr "é¸æŠž" +msgstr "UI é¸æŠž" #: core/project_settings.cpp -#, fuzzy msgid "UI Cancel" -msgstr "ã‚ャンセル" +msgstr "UI ã‚ャンセル" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Next" -msgstr "パスã«ãƒ•ォーカス" +msgstr "UI 次ã¸ãƒ•ォーカス" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Prev" -msgstr "パスã«ãƒ•ォーカス" +msgstr "UI å‰ã¸ãƒ•ォーカス" #: core/project_settings.cpp -#, fuzzy msgid "UI Left" -msgstr "å·¦" +msgstr "UI å·¦" #: core/project_settings.cpp -#, fuzzy msgid "UI Right" -msgstr "å³" +msgstr "UI å³" #: core/project_settings.cpp -#, fuzzy msgid "UI Up" -msgstr "上" +msgstr "UI 上" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "下" +msgstr "UI 下" #: core/project_settings.cpp -#, fuzzy msgid "UI Page Up" -msgstr "ページアップ" +msgstr "UI ページアップ" #: core/project_settings.cpp -#, fuzzy msgid "UI Page Down" -msgstr "ページダウン" +msgstr "UI ページダウン" #: core/project_settings.cpp msgid "UI Home" msgstr "ホーム" #: core/project_settings.cpp -#, fuzzy msgid "UI End" -msgstr "エンド" +msgstr "UI エンド" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -782,9 +757,8 @@ msgstr "エンド" #: servers/physics_2d/physics_2d_server_wrap_mt.h #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp -#, fuzzy msgid "Physics" -msgstr "(物ç†çš„)" +msgstr "物ç†" #: core/project_settings.cpp editor/editor_settings.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -799,7 +773,7 @@ msgstr "3D" #: core/project_settings.cpp #, fuzzy msgid "Smooth Trimesh Collision" -msgstr "三角形メッシュ コリジョンã®å…„弟を作æˆ" +msgstr "スムーズ三角形メッシュコリジョン" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -828,7 +802,7 @@ msgstr "å“質" #: servers/visual_server.cpp #, fuzzy msgid "Filters" -msgstr "フィルター:" +msgstr "フィルター" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" @@ -859,7 +833,7 @@ msgstr "プãƒãƒ•ァイラー" #: core/project_settings.cpp #, fuzzy msgid "Max Functions" -msgstr "関数を作æˆ" +msgstr "最大関数" #: core/project_settings.cpp scene/3d/vehicle_body.cpp msgid "Compression" @@ -910,8 +884,9 @@ msgid "Connect Timeout Seconds" msgstr "接続タイムアウトã®ç§’æ•°" #: core/register_core_types.cpp +#, fuzzy msgid "Packet Peer Stream" -msgstr "" +msgstr "パケットピアストリーム" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" @@ -1078,7 +1053,7 @@ msgstr "スケール" #: drivers/gles3/rasterizer_scene_gles3.cpp #, fuzzy msgid "Follow Surface" -msgstr "サーフェスを投入ã™ã‚‹" +msgstr "サーフェスをフォãƒãƒ¼ã™ã‚‹" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" @@ -1170,7 +1145,7 @@ msgstr "アニメーション呼ã³å‡ºã—ã®å¤‰æ›´" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Frame" -msgstr "フレーム%" +msgstr "フレーム" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp @@ -1181,16 +1156,14 @@ msgstr "時間" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" -msgstr "ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚º" +msgstr "ä½ç½®" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "回転ã®ã‚¹ãƒ†ãƒƒãƒ—:" +msgstr "回転" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp @@ -1200,7 +1173,7 @@ msgstr "値" #: editor/animation_track_editor.cpp #, fuzzy msgid "Arg Count" -msgstr "ç·è¨ˆ:" +msgstr "引数数" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp @@ -1217,12 +1190,12 @@ msgstr "タイプ(åž‹)" #: editor/animation_track_editor.cpp #, fuzzy msgid "In Handle" -msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’è¨å®šã™ã‚‹" +msgstr "インãƒãƒ³ãƒ‰ãƒ«" #: editor/animation_track_editor.cpp #, fuzzy msgid "Out Handle" -msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’è¨å®šã™ã‚‹" +msgstr "アウトãƒãƒ³ãƒ‰ãƒ«" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1234,12 +1207,12 @@ msgstr "ストリーム" #: editor/animation_track_editor.cpp #, fuzzy msgid "Start Offset" -msgstr "グリッドã®ã‚ªãƒ•セット:" +msgstr "始点オフセット" #: editor/animation_track_editor.cpp #, fuzzy msgid "End Offset" -msgstr "オフセット:" +msgstr "終点オフセット" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -2257,8 +2230,9 @@ msgid "Open" msgstr "é–‹ã" #: editor/dependency_editor.cpp +#, fuzzy msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "所有者: %s (åˆè¨ˆ: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2817,8 +2791,9 @@ msgid "Choose" msgstr "é¸ã¶" #: editor/editor_export.cpp +#, fuzzy msgid "Project export for platform:" -msgstr "" +msgstr "プラットフォーム用ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ:" #: editor/editor_export.cpp #, fuzzy @@ -2951,8 +2926,9 @@ msgid "64 Bits" msgstr "64ビット" #: editor/editor_export.cpp +#, fuzzy msgid "Embed PCK" -msgstr "" +msgstr "組ã¿è¾¼ã¿PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp #, fuzzy @@ -2960,12 +2936,14 @@ msgid "Texture Format" msgstr "テクスãƒãƒ£é ˜åŸŸ" #: editor/editor_export.cpp +#, fuzzy msgid "BPTC" -msgstr "" +msgstr "BPTC" #: editor/editor_export.cpp platform/osx/export/export.cpp +#, fuzzy msgid "S3TC" -msgstr "" +msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp #, fuzzy @@ -2973,8 +2951,9 @@ msgid "ETC" msgstr "TCP" #: editor/editor_export.cpp platform/osx/export/export.cpp +#, fuzzy msgid "ETC2" -msgstr "" +msgstr "ETC2" #: editor/editor_export.cpp #, fuzzy @@ -4427,24 +4406,28 @@ msgid "Default Property Name Style" msgstr "デフォルトã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆãƒ‘ス" #: editor/editor_node.cpp +#, fuzzy msgid "Default Float Step" -msgstr "" +msgstr "デフォルトフãƒãƒ¼ãƒˆã‚¹ãƒ†ãƒƒãƒ—" #: editor/editor_node.cpp scene/gui/tree.cpp msgid "Disable Folding" msgstr "折りãŸãŸã¿ã‚’無効化" #: editor/editor_node.cpp +#, fuzzy msgid "Auto Unfold Foreign Scenes" -msgstr "" +msgstr "自動展開外æ¥ã‚·ãƒ¼ãƒ³" #: editor/editor_node.cpp +#, fuzzy msgid "Horizontal Vector2 Editing" -msgstr "" +msgstr "水平ベクトル2編集" #: editor/editor_node.cpp +#, fuzzy msgid "Horizontal Vector Types Editing" -msgstr "" +msgstr "水平ベクトルタイプ編集" #: editor/editor_node.cpp msgid "Open Resources In Current Inspector" @@ -4567,6 +4550,7 @@ msgstr "ãã®ä»–ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã¾ãŸã¯ã‚·ãƒ¼ãƒ³å…¨ä½“ã®ãƒ„ール。" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆ" @@ -5112,13 +5096,14 @@ msgid "Debugger" msgstr "デãƒãƒƒã‚¬ãƒ¼" #: editor/editor_profiler.cpp +#, fuzzy msgid "Profiler Frame History Size" -msgstr "" +msgstr "プãƒãƒ•ァイラフレーム履æ´ã‚µã‚¤ã‚º" #: editor/editor_profiler.cpp #, fuzzy msgid "Profiler Frame Max Functions" -msgstr "関数åを変更" +msgstr "プãƒãƒ•ァイラフレーム最大関数数" #: editor/editor_properties.cpp msgid "Edit Text:" @@ -5187,9 +5172,8 @@ msgid "Size:" msgstr "サイズ:" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "Page:" -msgstr "ページ: " +msgstr "ページ:" #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -5361,12 +5345,14 @@ msgid "Dim Editor On Dialog Popup" msgstr "ダイアãƒã‚°ã®ãƒãƒƒãƒ—アップ時ã«ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’è–„æš—ãã™ã‚‹" #: editor/editor_settings.cpp main/main.cpp +#, fuzzy msgid "Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "低プãƒã‚»ãƒƒã‚µ モード スリープ (マイクãƒç§’)" #: editor/editor_settings.cpp +#, fuzzy msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "フォーカスã•れã¦ã„ãªã„低プãƒã‚»ãƒƒã‚µ モード スリープ (マイクãƒç§’)" #: editor/editor_settings.cpp #, fuzzy @@ -5374,12 +5360,14 @@ msgid "Separate Distraction Mode" msgstr "集ä¸ãƒ¢ãƒ¼ãƒ‰" #: editor/editor_settings.cpp +#, fuzzy msgid "Automatically Open Screenshots" -msgstr "" +msgstr "自動的ã«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’é–‹ã" #: editor/editor_settings.cpp +#, fuzzy msgid "Max Array Dictionary Items Per Page" -msgstr "" +msgstr "ページã‚ãŸã‚Šã®æœ€å¤§é…åˆ—è¾žæ›¸é …ç›®æ•°" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp @@ -5408,8 +5396,9 @@ msgid "Contrast" msgstr "コントラスト" #: editor/editor_settings.cpp +#, fuzzy msgid "Relationship Line Opacity" -msgstr "" +msgstr "関係線ã®ä¸é€æ˜Žåº¦" #: editor/editor_settings.cpp msgid "Highlight Tabs" @@ -5420,8 +5409,9 @@ msgid "Border Size" msgstr "ボーダーサイズ" #: editor/editor_settings.cpp +#, fuzzy msgid "Use Graph Node Headers" -msgstr "" +msgstr "グラフ ノード ヘッダーを使用ã™ã‚‹" #: editor/editor_settings.cpp #, fuzzy @@ -5460,8 +5450,9 @@ msgid "Compress Binary Resources" msgstr "リソースをコピー" #: editor/editor_settings.cpp +#, fuzzy msgid "Safe Save On Backup Then Rename" -msgstr "" +msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—時ã«å®‰å…¨ã«ä¿å˜ã—ã¦ã‹ã‚‰åå‰ã‚’変更ã™ã‚‹" #: editor/editor_settings.cpp msgid "File Dialog" @@ -5472,16 +5463,18 @@ msgid "Thumbnail Size" msgstr "サムãƒã‚¤ãƒ«ã®ã‚µã‚¤ã‚º" #: editor/editor_settings.cpp +#, fuzzy msgid "Docks" -msgstr "" +msgstr "Docks" #: editor/editor_settings.cpp msgid "Scene Tree" msgstr "シーンツリー" #: editor/editor_settings.cpp +#, fuzzy msgid "Start Create Dialog Fully Expanded" -msgstr "" +msgstr "完全ã«å±•é–‹ã•れãŸä½œæˆãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’é–‹å§‹ã™ã‚‹" #: editor/editor_settings.cpp msgid "Always Show Folders" @@ -5574,8 +5567,9 @@ msgid "Minimap Width" msgstr "ミニマップã®å¹…" #: editor/editor_settings.cpp +#, fuzzy msgid "Mouse Extra Buttons Navigate History" -msgstr "" +msgstr "ãƒžã‚¦ã‚¹è¿½åŠ ãƒœã‚¿ãƒ³ãƒŠãƒ“ã‚²ãƒ¼ãƒˆå±¥æ´" #: editor/editor_settings.cpp #, fuzzy @@ -5583,8 +5577,9 @@ msgid "Drag And Drop Selection" msgstr "GridMap ã®é¸æŠž" #: editor/editor_settings.cpp +#, fuzzy msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "ãƒŽãƒ¼ãƒ‰é¸æŠžæ™‚ã«ã‚¹ã‚¯ãƒªãƒ—トエディタã«ã¨ã©ã¾ã‚‹" #: editor/editor_settings.cpp msgid "Appearance" @@ -5599,8 +5594,9 @@ msgid "Line Numbers Zero Padded" msgstr "行番å·ã‚’ゼãƒåŸ‹ã‚" #: editor/editor_settings.cpp +#, fuzzy msgid "Show Bookmark Gutter" -msgstr "" +msgstr "ブックマークガターを表示" #: editor/editor_settings.cpp #, fuzzy @@ -5608,36 +5604,41 @@ msgid "Show Breakpoint Gutter" msgstr "ブレークãƒã‚¤ãƒ³ãƒˆã‚’スã‚ップã™ã‚‹" #: editor/editor_settings.cpp +#, fuzzy msgid "Show Info Gutter" -msgstr "" +msgstr "æƒ…å ±ã‚¬ã‚¿ãƒ¼ã‚’è¡¨ç¤º" #: editor/editor_settings.cpp msgid "Code Folding" msgstr "ã‚³ãƒ¼ãƒ‰ã®æŠ˜ã‚ŠãŸãŸã¿" #: editor/editor_settings.cpp +#, fuzzy msgid "Word Wrap" -msgstr "" +msgstr "ワードラップ" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" msgstr "行ã®é•·ã•ã®ã‚¬ã‚¤ãƒ‰ç·šã‚’表示" #: editor/editor_settings.cpp +#, fuzzy msgid "Line Length Guideline Soft Column" -msgstr "" +msgstr "行長ガイドラインソフト列" #: editor/editor_settings.cpp +#, fuzzy msgid "Line Length Guideline Hard Column" -msgstr "" +msgstr "行長ガイドライン ãƒãƒ¼ãƒ‰åˆ—" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Script List" msgstr "スクリプト一覧" #: editor/editor_settings.cpp +#, fuzzy msgid "Show Members Overview" -msgstr "" +msgstr "メンãƒãƒ¼æ¦‚è¦ã‚’表示" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -5669,16 +5670,18 @@ msgid "Create Signal Callbacks" msgstr "シグナルã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’作æˆ" #: editor/editor_settings.cpp +#, fuzzy msgid "Sort Members Outline Alphabetically" -msgstr "" +msgstr "メンãƒãƒ¼ã®ã‚¢ã‚¦ãƒˆãƒ©ã‚¤ãƒ³ã‚’ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆé †ã«ä¸¦ã¹æ›¿ãˆã‚‹" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Cursor" msgstr "カーソル" #: editor/editor_settings.cpp +#, fuzzy msgid "Scroll Past End Of File" -msgstr "" +msgstr "ファイルã®çµ‚ã‚りをéŽãŽã¦ã‚¹ã‚¯ãƒãƒ¼ãƒ«ã™ã‚‹" #: editor/editor_settings.cpp msgid "Block Caret" @@ -5703,24 +5706,29 @@ msgid "Completion" msgstr "完了" #: editor/editor_settings.cpp +#, fuzzy msgid "Idle Parse Delay" -msgstr "" +msgstr "アイドル解æžé…å»¶" #: editor/editor_settings.cpp +#, fuzzy msgid "Auto Brace Complete" -msgstr "" +msgstr "自動ブレース補完" #: editor/editor_settings.cpp +#, fuzzy msgid "Code Complete Delay" -msgstr "" +msgstr "コード補完é…å»¶" #: editor/editor_settings.cpp +#, fuzzy msgid "Put Callhint Tooltip Below Current Line" -msgstr "" +msgstr "コールヒントツールãƒãƒƒãƒ—ã‚’ç¾åœ¨ã®è¡Œã®ä¸‹ã«é…ç½®" #: editor/editor_settings.cpp +#, fuzzy msgid "Callhint Tooltip Offset" -msgstr "" +msgstr "コールヒントツールãƒãƒƒãƒ—オフセット" #: editor/editor_settings.cpp #, fuzzy @@ -5805,7 +5813,7 @@ msgstr "点" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Shape" -msgstr "" +msgstr "シェイプ" #: editor/editor_settings.cpp #, fuzzy @@ -5818,16 +5826,19 @@ msgid "Grid Size" msgstr "グリッドã®ã‚¹ãƒ†ãƒƒãƒ—:" #: editor/editor_settings.cpp +#, fuzzy msgid "Grid Division Level Max" -msgstr "" +msgstr "グリッド分割レベル最大" #: editor/editor_settings.cpp +#, fuzzy msgid "Grid Division Level Min" -msgstr "" +msgstr "グリッド分割レベル最å°" #: editor/editor_settings.cpp +#, fuzzy msgid "Grid Division Level Bias" -msgstr "" +msgstr "グリッド分割レベルãƒã‚¤ã‚¢ã‚¹" #: editor/editor_settings.cpp #, fuzzy @@ -5901,8 +5912,9 @@ msgid "Zoom Modifier" msgstr "変更済ã¿" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Warped Mouse Panning" -msgstr "" +msgstr "ワープマウスパンニング" #: editor/editor_settings.cpp #, fuzzy @@ -5910,12 +5922,14 @@ msgid "Navigation Feel" msgstr "ナビゲーションモード" #: editor/editor_settings.cpp +#, fuzzy msgid "Orbit Sensitivity" -msgstr "" +msgstr "è»Œé“æ„Ÿåº¦" #: editor/editor_settings.cpp +#, fuzzy msgid "Orbit Inertia" -msgstr "" +msgstr "è»Œé“æ…£æ€§" #: editor/editor_settings.cpp #, fuzzy @@ -6003,16 +6017,19 @@ msgid "Viewport Border Color" msgstr "ビューãƒãƒ¼ãƒˆã®ãƒœãƒ¼ãƒ€ãƒ¼ã®è‰²" #: editor/editor_settings.cpp +#, fuzzy msgid "Constrain Editor View" -msgstr "" +msgstr "エディター ビューを制é™" #: editor/editor_settings.cpp +#, fuzzy msgid "Simple Panning" -msgstr "" +msgstr "簡易パンニング" #: editor/editor_settings.cpp +#, fuzzy msgid "Scroll To Pan" -msgstr "" +msgstr "スクãƒãƒ¼ãƒ«ã—ã¦ãƒ‘ンニング" #: editor/editor_settings.cpp #, fuzzy @@ -6025,8 +6042,9 @@ msgid "Poly Editor" msgstr "Polygon 2D UV エディター" #: editor/editor_settings.cpp +#, fuzzy msgid "Point Grab Radius" -msgstr "" +msgstr "ãƒã‚¤ãƒ³ãƒˆã‚°ãƒ©ãƒ–åŠå¾„" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -6039,8 +6057,9 @@ msgid "Autorename Animation Tracks" msgstr "アニメーションã®åå‰ã‚’変更" #: editor/editor_settings.cpp +#, fuzzy msgid "Default Create Bezier Tracks" -msgstr "" +msgstr "デフォルトベジェトラックを作æˆ" #: editor/editor_settings.cpp #, fuzzy @@ -6048,12 +6067,14 @@ msgid "Default Create Reset Tracks" msgstr "RESETトラックを作æˆ" #: editor/editor_settings.cpp +#, fuzzy msgid "Onion Layers Past Color" -msgstr "" +msgstr "オニオンレイヤーéŽåŽ»ã®è‰²" #: editor/editor_settings.cpp +#, fuzzy msgid "Onion Layers Future Color" -msgstr "" +msgstr "オニオンレイヤー将æ¥ã®è‰²" #: editor/editor_settings.cpp #, fuzzy @@ -6065,8 +6086,9 @@ msgid "Minimap Opacity" msgstr "ミニマップã®ä¸é€æ˜Žåº¦" #: editor/editor_settings.cpp +#, fuzzy msgid "Window Placement" -msgstr "" +msgstr "ウィンドウã®é…ç½®" #: editor/editor_settings.cpp scene/2d/back_buffer_copy.cpp scene/2d/sprite.cpp #: scene/2d/visibility_notifier_2d.cpp scene/3d/sprite_3d.cpp @@ -6082,7 +6104,7 @@ msgstr "曲線ã®Out-Controlã®ä½ç½®ã‚’指定" #: editor/editor_settings.cpp platform/android/export/export_plugin.cpp msgid "Screen" -msgstr "" +msgstr "ç”»é¢" #: editor/editor_settings.cpp msgid "Auto Save" @@ -6183,16 +6205,19 @@ msgid "Completion Selected Color" msgstr "é¸æŠžã•れãŸã‚‚ã®ã‚’インãƒãƒ¼ãƒˆ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +#, fuzzy msgid "Completion Existing Color" -msgstr "" +msgstr "æ—¢å˜ã®è‰²ã®è£œå®Œ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +#, fuzzy msgid "Completion Scroll Color" -msgstr "" +msgstr "スクãƒãƒ¼ãƒ«è‰²ã®è£œå®Œ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +#, fuzzy msgid "Completion Font Color" -msgstr "" +msgstr "フォント色ã®è£œå®Œ" #: editor/editor_settings.cpp msgid "Text Color" @@ -6958,8 +6983,9 @@ msgid "Collada" msgstr "Collada" #: editor/import/editor_import_collada.cpp +#, fuzzy msgid "Use Ambient" -msgstr "" +msgstr "アンビエントを使用" #: editor/import/resource_importer_bitmask.cpp #, fuzzy @@ -6968,8 +6994,9 @@ msgstr "フォルダーを作æˆ" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp +#, fuzzy msgid "Threshold" -msgstr "" +msgstr "é–¾" #: editor/import/resource_importer_csv_translation.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -6981,8 +7008,9 @@ msgid "Compress" msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆ" #: editor/import/resource_importer_csv_translation.cpp +#, fuzzy msgid "Delimiter" -msgstr "" +msgstr "区切り文å—" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -6990,8 +7018,9 @@ msgid "ColorCorrect" msgstr "Color関数。" #: editor/import/resource_importer_layered_texture.cpp +#, fuzzy msgid "No BPTC If RGB" -msgstr "" +msgstr "RGB使用ä¸ã®å ´åˆã¯BPTCを使用ã—ãªã„" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/cpu_particles_2d.cpp @@ -7004,8 +7033,9 @@ msgstr "フラグ" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/animation/tween.cpp #: scene/resources/texture.cpp +#, fuzzy msgid "Repeat" -msgstr "" +msgstr "繰り返ã—" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp @@ -7022,13 +7052,14 @@ msgstr "シグナル" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Anisotropic" -msgstr "" +msgstr "異方性" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -7149,8 +7180,9 @@ msgid "Storage" msgstr "ファイルã®ä¿å˜:" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Use Legacy Names" -msgstr "" +msgstr "従æ¥ã®åå‰ã‚’使用" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp #, fuzzy @@ -7183,8 +7215,9 @@ msgid "Lightmap Texel Size" msgstr "ライトマップを焼ã込む" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp +#, fuzzy msgid "Skins" -msgstr "" +msgstr "スã‚ン" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7197,8 +7230,9 @@ msgid "External Files" msgstr "外部" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Store In Subdir" -msgstr "" +msgstr "サブディレクトリã«ä¿å˜" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7306,20 +7340,28 @@ msgid "Saving..." msgstr "ä¿å˜ä¸..." #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" +"%s: 3Dã§æ³•線マップã¨ã—ã¦ä½¿ç”¨ã•れã¦ã„るテクスãƒãƒ£ãŒæ¤œå‡ºã•れã¾ã—ãŸã€‚赤緑テクス" +"ãƒãƒ£åœ§ç¸®ã‚’有効ã«ã—ã¦ãƒ¡ãƒ¢ãƒªä½¿ç”¨é‡ã‚’削減ã—ã¾ã™ï¼ˆé’ãƒãƒ£ãƒ³ãƒãƒ«ã¯ã™ã§ã«ç ´æ£„ã•れã¾" +"ã—ãŸï¼‰ã€‚" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s: 3Dã§ä½¿ç”¨ã•れã¦ã„るテクスãƒãƒ£ãŒæ¤œå‡ºã•れã¾ã—ãŸã€‚フィルターã€ç¹°ã‚Šè¿”ã—ã€ãƒŸãƒƒ" +"プマップ生æˆã€VRAMテクスãƒãƒ£åœ§ç¸®ã‚’有効ã«ã—ã¾ã™ã€‚" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "2D, Detect 3D" -msgstr "" +msgstr "2Dã€3D検出" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7327,8 +7369,9 @@ msgid "2D Pixel" msgstr "å‡é›†ãƒ”クセル" #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp +#, fuzzy msgid "Lossy Quality" -msgstr "" +msgstr "æå¤±ã®ã‚ã‚‹å“質" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7337,14 +7380,15 @@ msgstr "é¸æŠžãƒ¢ãƒ¼ãƒ‰" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp +#, fuzzy msgid "Normal Map" -msgstr "" +msgstr "法線マップ" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7352,8 +7396,9 @@ msgid "Process" msgstr "å‰å‡¦ç†" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Fix Alpha Border" -msgstr "" +msgstr "アルファボーダーを修æ£" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7361,8 +7406,9 @@ msgid "Premult Alpha" msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Hdr As Srgb" -msgstr "" +msgstr "Srgbã¨ã—ã¦Hdr" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7379,8 +7425,9 @@ msgid "Size Limit" msgstr "サイズ制é™" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Detect 3D" -msgstr "" +msgstr "3Dを検出" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7388,10 +7435,13 @@ msgid "SVG" msgstr "CSG" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "" "Warning, no suitable PC VRAM compression enabled in Project Settings. This " "texture will not display correctly on PC." msgstr "" +"è¦å‘Šã€ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®šã§æœ‰åйãªé©åˆ‡ãªPC VRAM圧縮ãŒã‚りã¾ã›ã‚“。ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£" +"㯠PCã§æ£ã—ã表示ã•れã¾ã›ã‚“。" #: editor/import/resource_importer_texture_atlas.cpp #, fuzzy @@ -7409,8 +7459,9 @@ msgid "Crop To Region" msgstr "ã‚¿ã‚¤ãƒ«é ˜åŸŸã‚’è¨å®š" #: editor/import/resource_importer_texture_atlas.cpp +#, fuzzy msgid "Trim Alpha Border From Region" -msgstr "" +msgstr "ã‚¢ãƒ«ãƒ•ã‚¡å¢ƒç•Œç·šã‚’é ˜åŸŸã‹ã‚‰ãƒˆãƒªãƒŸãƒ³ã‚°" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp #, fuzzy @@ -7418,11 +7469,13 @@ msgid "Force" msgstr "強制プッシュ" #: editor/import/resource_importer_wav.cpp +#, fuzzy msgid "8 Bit" -msgstr "" +msgstr "8ビット" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -7437,8 +7490,9 @@ msgid "Max Rate Hz" msgstr "ミックス ノード" #: editor/import/resource_importer_wav.cpp +#, fuzzy msgid "Trim" -msgstr "" +msgstr "トリム" #: editor/import/resource_importer_wav.cpp #, fuzzy @@ -7558,8 +7612,9 @@ msgid "Localized" msgstr "ãƒã‚±ãƒ¼ãƒ«" #: editor/inspector_dock.cpp +#, fuzzy msgid "Localization not available for current language." -msgstr "" +msgstr "ç¾åœ°èªžåŒ–ã¯ç¾åœ¨ã®è¨€èªžã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。" #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -8663,8 +8718,9 @@ msgid "Testing" msgstr "試験的" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Failed to get repository configuration." -msgstr "" +msgstr "リãƒã‚¸ãƒˆãƒªã‚’æ§‹æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -9591,12 +9647,14 @@ msgid "Gradient Edited" msgstr "グラデーション編集" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp +#, fuzzy msgid "Swap GradientTexture2D Fill Points" -msgstr "" +msgstr "GradientTexture2D 塗りã¤ã¶ã—ãƒã‚¤ãƒ³ãƒˆã‚’入れ替ãˆ" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp +#, fuzzy msgid "Swap Gradient Fill Points" -msgstr "" +msgstr "Gradient ã®å¡—りã¤ã¶ã—ãƒã‚¤ãƒ³ãƒˆã‚’入れ替ãˆ" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp #, fuzzy @@ -9620,7 +9678,7 @@ msgstr "アイコン" #: editor/plugins/item_list_editor_plugin.cpp msgid "ID" -msgstr "" +msgstr "ID" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp @@ -10416,8 +10474,9 @@ msgid "Sync Bones to Polygon" msgstr "ボーンをãƒãƒªã‚´ãƒ³ã«åŒæœŸã•ã›ã‚‹" #: editor/plugins/ray_cast_2d_editor_plugin.cpp +#, fuzzy msgid "Set cast_to" -msgstr "" +msgstr "cast_to ã‚’è¨å®š" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -10748,8 +10807,9 @@ msgid "Search Results" msgstr "æ¤œç´¢çµæžœ" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Open Dominant Script On Scene Change" -msgstr "" +msgstr "シーン変更時ã«ãƒ‰ãƒŸãƒŠãƒ³ãƒˆã‚¹ã‚¯ãƒªãƒ—トを開ã" #: editor/plugins/script_editor_plugin.cpp msgid "External" @@ -10773,8 +10833,9 @@ msgid "Highlight Current Script" msgstr "ç¾åœ¨ã®ã‚¹ã‚¯ãƒªãƒ—トをãƒã‚¤ãƒ©ã‚¤ãƒˆã™ã‚‹" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Script Temperature History Size" -msgstr "" +msgstr "スクリプト温度履æ´ã‚µã‚¤ã‚º" #: editor/plugins/script_editor_plugin.cpp msgid "Current Script Background Color" @@ -10794,8 +10855,9 @@ msgid "List Script Names As" msgstr "スクリプトå:" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Exec Flags" -msgstr "" +msgstr "実行フラグ" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Scripts" @@ -11613,12 +11675,14 @@ msgid "Post" msgstr "後" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Manipulator Gizmo Size" -msgstr "" +msgstr "マニピュレータギズモサイズ" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Manipulator Gizmo Opacity" -msgstr "" +msgstr "マニピュレータギズモä¸é€æ˜Žåº¦" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -12334,14 +12398,18 @@ msgid "Override all default type items." msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒ•ォルトタイプã®ã‚¢ã‚¤ãƒ†ãƒ をオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã€‚" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Select the variation base type from a list of available types." -msgstr "" +msgstr "使用å¯èƒ½ãªã‚¿ã‚¤ãƒ—ã®ãƒªã‚¹ãƒˆã‹ã‚‰ãƒãƒªã‚¨ãƒ¼ã‚·ãƒ§ãƒ³åŸºåº•åž‹ã‚’é¸æŠžã€‚" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "" "A type associated with a built-in class cannot be marked as a variation of " "another type." msgstr "" +"組ã¿è¾¼ã¿ã‚¯ãƒ©ã‚¹ã«é–¢é€£ã™ã‚‹åž‹ã‚’ã€åˆ¥ã®åž‹ã®ãƒãƒªã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã™ã‚‹ã“ã¨ã¯ã§" +"ãã¾ã›ã‚“。" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme:" @@ -14168,8 +14236,9 @@ msgid "Runnable" msgstr "実行å¯èƒ½" #: editor/project_export.cpp +#, fuzzy msgid "Export the project for all the presets defined." -msgstr "" +msgstr "定義ã•れãŸã™ã¹ã¦ã®ãƒ—リセットã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’エクスãƒãƒ¼ãƒˆã€‚" #: editor/project_export.cpp msgid "All presets must have an export path defined for Export All to work." @@ -15440,18 +15509,19 @@ msgstr "" msgid "Make Local" msgstr "ãƒãƒ¼ã‚«ãƒ«ã«ã™ã‚‹" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ノードå:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "ä»–ã®é–¢æ•°/変数/シグナルã«ã‚ˆã‚Šã™ã§ã«ä½¿ã‚れã¦ã„ã‚‹åå‰:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "ノードå:" #: editor/scene_tree_dock.cpp @@ -15654,6 +15724,11 @@ msgid "Button Group" msgstr "ボタングループ" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ノードå:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(接続元)" @@ -15729,6 +15804,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "無効ãªãƒŽãƒ¼ãƒ‰åã€‚ä»¥ä¸‹ã®æ–‡å—ã¯ä½¿ãˆã¾ã›ã‚“:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "ノードã®åå‰ã‚’変更" @@ -17597,6 +17676,21 @@ msgstr "ソリューションをビルド" msgid "Auto Update Project" msgstr "åç„¡ã—ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆ" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "表示スケール" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠž" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠž" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "内部例外スタックトレースã®çµ‚了" @@ -17703,12 +17797,14 @@ msgid "Persistence" msgstr "é€è¦–投影" #: modules/opensimplex/open_simplex_noise.cpp +#, fuzzy msgid "Lacunarity" -msgstr "" +msgstr "空隙性" #: modules/regex/regex.cpp +#, fuzzy msgid "Subject" -msgstr "" +msgstr "対象" #: modules/regex/regex.cpp #, fuzzy @@ -17718,47 +17814,52 @@ msgstr "åå‰" #: modules/regex/regex.cpp #, fuzzy msgid "Strings" -msgstr "è¨å®š:" +msgstr "æ–‡å—列" #: modules/upnp/upnp.cpp +#, fuzzy msgid "Discover Multicast If" -msgstr "" +msgstr "マルãƒã‚ãƒ£ã‚¹ãƒˆã®æ¤œå‡º" #: modules/upnp/upnp.cpp +#, fuzzy msgid "Discover Local Port" -msgstr "" +msgstr "ãƒãƒ¼ã‚«ãƒ«ãƒãƒ¼ãƒˆã®æ¤œå‡º" #: modules/upnp/upnp.cpp +#, fuzzy msgid "Discover IPv6" -msgstr "" +msgstr "IPv6 ã®æ¤œå‡º" #: modules/upnp/upnp_device.cpp #, fuzzy msgid "Description URL" -msgstr "説明" +msgstr "説明 URL" #: modules/upnp/upnp_device.cpp #, fuzzy msgid "Service Type" -msgstr "変数ã®åž‹ã‚’è¨å®š" +msgstr "サービス種類" #: modules/upnp/upnp_device.cpp +#, fuzzy msgid "IGD Control URL" -msgstr "" +msgstr "IGD コントãƒãƒ¼ãƒ« URL" #: modules/upnp/upnp_device.cpp #, fuzzy msgid "IGD Service Type" -msgstr "変数ã®åž‹ã‚’è¨å®š" +msgstr "IGD サービス 種類" #: modules/upnp/upnp_device.cpp +#, fuzzy msgid "IGD Our Addr" -msgstr "" +msgstr "IGD 当方アドレス" #: modules/upnp/upnp_device.cpp #, fuzzy msgid "IGD Status" -msgstr "ステータス" +msgstr "IGD 状態" #: modules/visual_script/visual_script.cpp msgid "" @@ -19463,6 +19564,11 @@ msgstr "ノードを切りå–ã‚‹" msgid "Custom BG Color" msgstr "ノードを切りå–ã‚‹" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "ã™ã¹ã¦å±•é–‹" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20317,6 +20423,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "パッケージã®ã‚·ãƒ§ãƒ¼ãƒˆãƒãƒ¼ãƒ ãŒç„¡åйã§ã™ã€‚" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index 2e6e0e70e7..f085051bf7 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -4539,6 +4539,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7343,7 +7344,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15330,18 +15332,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "მáƒáƒ¨áƒáƒ ებáƒ" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "მáƒáƒ¨áƒáƒ ებáƒ" #: editor/scene_tree_dock.cpp @@ -15538,6 +15540,11 @@ msgstr "" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "მáƒáƒ¨áƒáƒ ებáƒ" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "დáƒáƒ›áƒáƒ™áƒáƒ•შირებელი სიგნáƒáƒšáƒ˜:" @@ -15602,6 +15609,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17465,6 +17476,20 @@ msgstr "ყველრმáƒáƒœáƒ˜áƒ¨áƒœáƒ•áƒ" msgid "Auto Update Project" msgstr "პრáƒáƒ”ქტის დáƒáƒ›áƒ¤áƒ£áƒ«áƒœáƒ”ბლები" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "ყველáƒáƒ¡ ჩáƒáƒœáƒáƒªáƒ•ლებáƒ" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "პრáƒáƒ”ქტის დáƒáƒ›áƒ¤áƒ£áƒ«áƒœáƒ”ბლები" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19238,6 +19263,11 @@ msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბების áƒáƒ¡áƒšá msgid "Custom BG Color" msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბების áƒáƒ¡áƒšáƒ˜áƒ¡ შექმნáƒ" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ დáƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ცვლილებáƒ" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -20056,6 +20086,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ." diff --git a/editor/translations/km.po b/editor/translations/km.po index 522cb30363..3d39686d68 100644 --- a/editor/translations/km.po +++ b/editor/translations/km.po @@ -4327,6 +4327,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7005,7 +7006,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14685,18 +14687,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "បញ្ចូល Key នៅទីនáŸáŸ‡" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "បញ្ចូល Key នៅទីនáŸáŸ‡" #: editor/scene_tree_dock.cpp @@ -14886,6 +14888,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "បញ្ចូល Key នៅទីនáŸáŸ‡" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -14949,6 +14956,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16729,6 +16740,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18415,6 +18438,10 @@ msgstr "" msgid "Custom BG Color" msgstr "" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19194,6 +19221,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index a91450dd41..e3edb07ce4 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -36,13 +36,15 @@ # Seonghyeon Cho <seonghyeoncho96@gmail.com>, 2022. # Haoyu Qiu <timothyqiu32@gmail.com>, 2022. # 김태우 <ogosengi3@gmail.com>, 2022. +# 박민규 <80dots@gmail.com>, 2022. +# ì´ì§€ë¯¼ <jiminaleejung@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-26 16:16+0000\n" -"Last-Translator: 김태우 <ogosengi3@gmail.com>\n" +"PO-Revision-Date: 2022-09-07 06:16+0000\n" +"Last-Translator: ì´ì§€ë¯¼ <jiminaleejung@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" "Language: ko\n" @@ -50,7 +52,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.13.1-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -387,9 +389,8 @@ msgid "Max Size (KB)" msgstr "최대 í¬ê¸°(KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "ì´ë™ 모드" +msgstr "마우스 모드" #: core/os/input.cpp #, fuzzy @@ -411,7 +412,7 @@ msgstr "Shift" #: core/os/input_event.cpp msgid "Control" -msgstr "ì¡°ìž‘" +msgstr "Control" #: core/os/input_event.cpp msgid "Meta" @@ -422,9 +423,8 @@ msgid "Command" msgstr "ëª…ë ¹" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (물리)" +msgstr "물리" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -680,14 +680,12 @@ msgid "Script Templates Search Path" msgstr "스í¬ë¦½íЏ 템플릿 검색 경로" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "스타트업으로 ìžë™ 로드" +msgstr "ì‹œìž‘í• ë•Œ ìžë™ìœ¼ë¡œ Version Control 로드" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "ë²„ì „ 컨트롤" +msgstr "ë²„ì „ 컨트롤 í”ŒëŸ¬ê·¸ì¸ ì´ë¦„" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2757,12 +2755,11 @@ msgstr "ì„ íƒ" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "플랫í¼ìœ¼ë¡œ 프로ì 트 내보내기:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "íŒŒì¼ ê²½ë¡œ 완성" +msgstr "완료하였지만 ê²½ê³ ê°€ 있습니다." #: editor/editor_export.cpp #, fuzzy @@ -2770,9 +2767,8 @@ msgid "Completed successfully." msgstr "패키지를 성공ì 으로 설치했습니다!" #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "실패함:" +msgstr "실패함." #: editor/editor_export.cpp msgid "Storing File:" @@ -2787,29 +2783,24 @@ msgid "Packing" msgstr "패킹 중" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "다른 ì´ë¦„으로 ì €ìž¥" +msgstr "PCK를 ì €ìž¥í•©ë‹ˆë‹¤." #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "í´ë”를 만들 수 없습니다." +msgstr "\"%s\" 파ì¼ì„ ìƒì„±í• 수 없습니다." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "프로ì 트 파ì¼ì„ 내보낼 수 없었습니다" +msgstr "프로ì 트 파ì¼ì„ 내보낼 수 없습니다." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "파ì¼ì„ 쓰기 모드로 ì—´ 수 ì—†ìŒ:" +msgstr "\"%s\" ê²½ë¡œì˜ íŒŒì¼ì„ ì½ê¸° 위해 ì—´ì§€ 못했습니다." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "다른 ì´ë¦„으로 ì €ìž¥" +msgstr "ZIP파ì¼ë¡œ ì €ìž¥" #: editor/editor_export.cpp msgid "" @@ -2934,14 +2925,12 @@ msgid "Prepare Template" msgstr "템플릿 관리" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "주어진 내보내기 경로가 ì—†ìŒ:" +msgstr "Exportí•˜ë ¤ê³ í–ˆìœ¼ë‚˜ 해당 경로가 존재하지 않습니다." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "템플릿 파ì¼ì„ ì°¾ì„ ìˆ˜ 없습니다:" +msgstr "템플릿 파ì¼ì„ ì°¾ì„ ìˆ˜ 없습니다: \"%s\"" #: editor/editor_export.cpp #, fuzzy @@ -4486,6 +4475,7 @@ msgstr "프로ì 트 ë˜ëŠ” 씬 ê´€ë ¨ 여러가지 툴." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "프로ì 트" @@ -5194,9 +5184,8 @@ msgstr "" "있ë„ë¡ ì •ì˜í•´ì£¼ì„¸ìš”." #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" -msgstr "프로ì 트" +msgstr "프로ì 트 실행" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -5374,7 +5363,7 @@ msgstr "ì¸ë„¤ì¼ í¬ê¸°" #: editor/editor_settings.cpp msgid "Docks" -msgstr "ê²°í•©" +msgstr "ë…" #: editor/editor_settings.cpp msgid "Scene Tree" @@ -5478,9 +5467,8 @@ msgid "Mouse Extra Buttons Navigate History" msgstr "마우스 부가 버튼으로 ížˆìŠ¤í† ë¦¬ 둘러보기" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "그리드맵 ì„ íƒ" +msgstr "ì„ íƒëœ í•ëª©ì„ Drag and drop" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" @@ -5766,7 +5754,7 @@ msgstr "줌 ë°©ì‹" #: editor/editor_settings.cpp msgid "Emulate Numpad" -msgstr "ìˆ«ìž íŒ¨ë“œ 모방" +msgstr "숫ìžíŒ¨ë“œ 모방" #: editor/editor_settings.cpp msgid "Emulate 3 Button Mouse" @@ -6106,12 +6094,11 @@ msgstr "í–‰ 번호:" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" -msgstr "" +msgstr "íƒˆìž ê¸°í˜¸ 색" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Caret Background Color" -msgstr "ìž˜ëª»ëœ ë°°ê²½ 색ìƒ." +msgstr "íƒˆìž ê¸°í˜¸ ë°°ê²½ 색" #: editor/editor_settings.cpp #, fuzzy @@ -7326,7 +7313,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -12594,7 +12582,7 @@ msgstr "ì½œë¦¬ì „" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Occlusion" -msgstr "ì–´í´ë£¨ì „" +msgstr "오í´ë£¨ì „" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/touch_screen_button.cpp msgid "Bitmask" @@ -15343,18 +15331,19 @@ msgstr "" msgid "Make Local" msgstr "로컬로 만들기" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "노드 ì´ë¦„:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "ì´ë¯¸ 다른 함수/변수/시그ë„로 ì‚¬ìš©ëœ ì´ë¦„:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "노드 ì´ë¦„:" #: editor/scene_tree_dock.cpp @@ -15553,6 +15542,11 @@ msgid "Button Group" msgstr "버튼 그룹" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "노드 ì´ë¦„:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(ì—°ê²° 시작 ì§€ì )" @@ -15628,6 +15622,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "ìž˜ëª»ëœ ë…¸ë“œ ì´ë¦„입니다. ë‹¤ìŒ ë¬¸ìžëŠ” 허용하지 않습니다:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "노드 ì´ë¦„ 바꾸기" @@ -17551,6 +17549,21 @@ msgstr "솔루션 빌드" msgid "Auto Update Project" msgstr "ì´ë¦„ 없는 프로ì 트" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "ëª¨ë‘ í‘œì‹œ" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ì„¸ìš”" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ì„¸ìš”" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "ë‚´ë¶€ 예외 ìŠ¤íƒ ì¶”ì ì˜ ë" @@ -19424,6 +19437,11 @@ msgstr "노드 잘ë¼ë‚´ê¸°" msgid "Custom BG Color" msgstr "노드 잘ë¼ë‚´ê¸°" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "ëª¨ë‘ íŽ¼ì¹˜ê¸°" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20195,9 +20213,8 @@ msgid "Certificate" msgstr "ì •ì :" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Algorithm" -msgstr "디버거" +msgstr "ì•Œê³ ë¦¬ì¦˜" #: platform/uwp/export/export.cpp msgid "Major" @@ -20213,9 +20230,8 @@ msgid "Build" msgstr "ìž ëª¨ë“œ" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Revision" -msgstr "í‘œí˜„ì‹ ì„¤ì •" +msgstr "ê°œì •" #: platform/uwp/export/export.cpp msgid "Landscape" @@ -20282,6 +20298,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "ìž˜ëª»ëœ íŒ¨í‚¤ì§€ 단축 ì´ë¦„." @@ -22620,9 +22642,8 @@ msgid "Alpha Scissor Threshold" msgstr "" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp -#, fuzzy msgid "Render Priority" -msgstr "ìš°ì„ ìˆœìœ„ 활성화" +msgstr "ë Œë” ìš°ì„ ìˆœìœ„" #: scene/3d/label_3d.cpp #, fuzzy @@ -24599,7 +24620,7 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "" +msgstr "íƒˆìž ê¸°í˜¸" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index 66891e3f0e..e89e801a9b 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -4505,6 +4505,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7325,7 +7326,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15320,18 +15322,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Panaikinti" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Panaikinti" #: editor/scene_tree_dock.cpp @@ -15528,6 +15530,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Panaikinti" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15592,6 +15599,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17461,6 +17472,20 @@ msgstr "Visas Pasirinkimas" msgid "Auto Update Project" msgstr "Redaguoti Filtrus" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Importuoti iÅ¡ Nodo:" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "ApraÅ¡ymas:" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19243,6 +19268,11 @@ msgstr "Transition Nodas" msgid "Custom BG Color" msgstr "Transition Nodas" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Importuoti iÅ¡ Nodo:" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -20077,6 +20107,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Netinkamas Å¡rifto dydis." diff --git a/editor/translations/lv.po b/editor/translations/lv.po index c00e8d1a44..7234ac270a 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -4570,6 +4570,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekts" @@ -7384,7 +7385,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15138,18 +15140,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Mezgla VÄrds:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Mezgla VÄrds:" #: editor/scene_tree_dock.cpp @@ -15339,6 +15341,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Mezgla VÄrds:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Savienojas No)" @@ -15404,6 +15411,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17268,6 +17279,21 @@ msgstr "BÅ«vÄ“t risinÄjumu" msgid "Auto Update Project" msgstr "Nenosaukts Projekts" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "ParÄdÄ«t Visu" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "IzvÄ“lÄ“ties Direktoriju" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "IzvÄ“lÄ“ties Direktoriju" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19049,6 +19075,11 @@ msgstr "Izgriezt mezglu(s)" msgid "Custom BG Color" msgstr "Izgriezt mezglu(s)" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "IzvÄ“rst apakšējo paneli" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19886,6 +19917,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "NederÄ«gs paketes Ä«sais nosaukums." diff --git a/editor/translations/mk.po b/editor/translations/mk.po index 2d183ec609..d0be6e7036 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -4340,6 +4340,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7030,7 +7031,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14718,18 +14720,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ВнеÑи клуч тука" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "ВнеÑи клуч тука" #: editor/scene_tree_dock.cpp @@ -14919,6 +14921,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ВнеÑи клуч тука" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -14982,6 +14989,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16767,6 +16778,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18459,6 +18482,10 @@ msgstr "" msgid "Custom BG Color" msgstr "" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19238,6 +19265,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index 7568bc881e..35845df066 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -4357,6 +4357,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7047,7 +7048,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14742,18 +14744,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ചലനതàµà´¤à´¿àµ»à´±àµ† നേരം മാറàµà´±àµà´•" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "ചലനതàµà´¤à´¿àµ»à´±àµ† നേരം മാറàµà´±àµà´•" #: editor/scene_tree_dock.cpp @@ -14943,6 +14945,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ചലനതàµà´¤à´¿àµ»à´±àµ† നേരം മാറàµà´±àµà´•" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15006,6 +15013,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16792,6 +16803,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18490,6 +18513,11 @@ msgstr "à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿à´•ൾ:" msgid "Custom BG Color" msgstr "à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿à´•ൾ:" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "à´¤àµà´°à´¿à´®à´¾à´¨ പരിവർതàµà´¤à´¨à´‚ നോകàµà´•àµà´•" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19278,6 +19306,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index 4bdf5ba4fb..6baf1dc52e 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -4351,6 +4351,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7044,7 +7045,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14736,18 +14738,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "अâ€à¥…निमेशन नाव:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "अâ€à¥…निमेशन नाव:" #: editor/scene_tree_dock.cpp @@ -14937,6 +14939,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "अâ€à¥…निमेशन नाव:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15000,6 +15007,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16793,6 +16804,19 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "पà¥à¤²à¥‡ मोड:" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18491,6 +18515,10 @@ msgstr "" msgid "Custom BG Color" msgstr "" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19279,6 +19307,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 61a60ad8fe..adb377d13a 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -16,7 +16,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-12 13:19+0000\n" +"PO-Revision-Date: 2022-09-09 12:36+0000\n" "Last-Translator: Keviindran Ramachandran <keviinx@yahoo.com>\n" "Language-Team: Malay <https://hosted.weblate.org/projects/godot-engine/godot/" "ms/>\n" @@ -25,7 +25,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.13-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -361,14 +361,12 @@ msgid "Max Size (KB)" msgstr "Saiz Maksimum (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Mod Alih" +msgstr "Mod Tetikus" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "Padam Input" +msgstr "Gunakan Input Terkumpul" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -396,9 +394,8 @@ msgid "Command" msgstr "Perintah" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "Fizik" +msgstr "Fizikal" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -452,7 +449,7 @@ msgstr "Tekanan" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Pen Terbalik" #: core/os/input_event.cpp msgid "Relative" @@ -642,9 +639,8 @@ msgid "Main Run Args" msgstr "Jalan Utama Args" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "Laluan Adegan:" +msgstr "Penamaan Adegan" #: core/project_settings.cpp msgid "Search In File Extensions" @@ -655,14 +651,12 @@ msgid "Script Templates Search Path" msgstr "Laluan Carian Templat Skrip" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "Muatkan Automatik Semasa Permulaan" +msgstr "Automuat Kawalan Versi Semasa Permulaan" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "Kawalan Versi" +msgstr "Nama Plugin Kawalan Versi" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -4516,6 +4510,7 @@ msgstr "Pelbagai projek atau alatan seluruh adegan." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projek" @@ -7405,7 +7400,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15296,18 +15292,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nama Nod:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nama Nod:" #: editor/scene_tree_dock.cpp @@ -15501,6 +15497,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nama Nod:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15564,6 +15565,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17453,6 +17458,21 @@ msgstr "Semua Pilihan" msgid "Auto Update Project" msgstr "Projek" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Paparkan Semua" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Pilih Direktori" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Pilih Direktori" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19254,6 +19274,11 @@ msgstr "Potong Nod" msgid "Custom BG Color" msgstr "Potong Nod" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Kembangkan Semua" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20093,6 +20118,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 542d5987ca..b39bc2a602 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -4690,6 +4690,7 @@ msgstr "Diverse prosjekt- eller scene-relaterte verktøy" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Prosjekt" @@ -7654,7 +7655,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15944,18 +15946,19 @@ msgstr "" msgid "Make Local" msgstr "Lag Ben" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nodenavn:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Navnet er allerede i bruk av annen funk/var/signal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Nodenavn:" #: editor/scene_tree_dock.cpp @@ -16164,6 +16167,11 @@ msgstr "Legg til i Gruppe" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nodenavn:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Tilkoblingsfeil" @@ -16228,6 +16236,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -18184,6 +18196,21 @@ msgstr "Alle valg" msgid "Auto Update Project" msgstr "Eksporter Prosjekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Vis alle" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Velg en Mappe" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Velg en Mappe" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -20053,6 +20080,11 @@ msgstr "Klipp ut Noder" msgid "Custom BG Color" msgstr "Klipp ut Noder" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Utvid alle" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20905,6 +20937,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Ugyldig navn." diff --git a/editor/translations/nl.po b/editor/translations/nl.po index aaa0f38a1d..9410069ae4 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -58,13 +58,15 @@ # Rémi Verschelde <remi@godotengine.org>, 2022. # Wouter <mysticaldev@hotmail.com>, 2022. # voylin <0voylin0@gmail.com>, 2022. +# Gert-dev <qnyasgjhapqyuhoibr@kiabws.com>, 2022. +# Nnn <irri2020@outlook.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-03-17 13:58+0000\n" -"Last-Translator: voylin <0voylin0@gmail.com>\n" +"PO-Revision-Date: 2022-08-30 03:11+0000\n" +"Last-Translator: Nnn <irri2020@outlook.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" "Language: nl\n" @@ -72,110 +74,97 @@ 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.12-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "" +msgstr "Tablet-stuurprogramma" #: core/bind/core_bind.cpp -#, fuzzy msgid "Clipboard" -msgstr "Plakbord is leeg!" +msgstr "Klembord" #: core/bind/core_bind.cpp -#, fuzzy msgid "Current Screen" -msgstr "Huidige scène" +msgstr "Huidig scherm" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "Afsluitcode" #: core/bind/core_bind.cpp -#, fuzzy msgid "V-Sync Enabled" -msgstr "Inschakelen" +msgstr "V-Sync ingeschakeld" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "V-Sync via compositor" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "" +msgstr "Delta-gladmaken" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode" -msgstr "Verplaatsingsmodus" +msgstr "Lage energieverbruiksmodus processor" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "" +msgstr "Lage energieverbruiksmodus processor slaap (µs)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp -#, fuzzy msgid "Keep Screen On" -msgstr "Houd Debugger Open" +msgstr "Scherm aanhouden" #: core/bind/core_bind.cpp -#, fuzzy msgid "Min Window Size" -msgstr "Omlijningsgrootte:" +msgstr "Minimale venstergrootte" #: core/bind/core_bind.cpp -#, fuzzy msgid "Max Window Size" -msgstr "Omlijningsgrootte:" +msgstr "Maximale venstergrootte" #: core/bind/core_bind.cpp -#, fuzzy msgid "Screen Orientation" -msgstr "Scherm operator." +msgstr "Schermoriëntering" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Window" -msgstr "Nieuw Venster" +msgstr "Venster" #: core/bind/core_bind.cpp core/project_settings.cpp -#, fuzzy msgid "Borderless" -msgstr "Randpixels" +msgstr "Naadloos" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "" +msgstr "Transparantie per pixel ingeschakeld" #: core/bind/core_bind.cpp core/project_settings.cpp -#, fuzzy msgid "Fullscreen" msgstr "Volledig scherm" #: core/bind/core_bind.cpp msgid "Maximized" -msgstr "" +msgstr "Gemaximaliseerd" #: core/bind/core_bind.cpp -#, fuzzy msgid "Minimized" -msgstr "Initialiseren" +msgstr "Geminimaliseerd" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "Verstelbare grootte" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/physics_body.cpp scene/3d/remote_transform.cpp #: scene/gui/control.cpp scene/gui/line_edit.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Position" -msgstr "Tabbladpositie" +msgstr "Positie" #: core/bind/core_bind.cpp core/project_settings.cpp editor/editor_settings.cpp #: main/main.cpp modules/gridmap/grid_map.cpp @@ -186,65 +175,56 @@ msgstr "Tabbladpositie" #: scene/resources/primitive_meshes.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp -#, fuzzy msgid "Size" -msgstr "Grootte: " +msgstr "Grootte" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "" +msgstr "Endian omwisselen" #: core/bind/core_bind.cpp -#, fuzzy msgid "Editor Hint" -msgstr "Editor" +msgstr "Editor-hint" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "Foutboodschappen tonen" #: core/bind/core_bind.cpp -#, fuzzy msgid "Iterations Per Second" -msgstr "Interpolatiemodus" +msgstr "Iteraties per seconde" #: core/bind/core_bind.cpp -#, fuzzy msgid "Target FPS" -msgstr "Doel" +msgstr "Beoogde FPS" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "Tijdschaalknoop" +msgstr "Tijdschaal" #: core/bind/core_bind.cpp main/main.cpp -#, fuzzy msgid "Physics Jitter Fix" -msgstr "Physics Frame %" +msgstr "Oplossing Jitter Fysica" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" msgstr "Fout" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "Fout bij het opslaan" +msgstr "Foutboodschap" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error Line" -msgstr "Fout bij het opslaan" +msgstr "Lijn fout" #: core/bind/core_bind.cpp -#, fuzzy msgid "Result" -msgstr "Zoek Resultaten" +msgstr "Resultaat" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" -msgstr "" +msgstr "Geheugen" #: core/command_queue_mt.cpp core/message_queue.cpp #: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -255,12 +235,11 @@ msgstr "" #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: servers/visual_server.cpp msgid "Limits" -msgstr "" +msgstr "Limieten" #: core/command_queue_mt.cpp -#, fuzzy msgid "Command Queue" -msgstr "Ctrl: Roteer" +msgstr "Commandowachtrij" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" @@ -294,9 +273,8 @@ msgid "Remote FS" msgstr "Remote " #: core/io/file_access_network.cpp -#, fuzzy msgid "Page Size" -msgstr "Pagina: " +msgstr "Pagina grootte" #: core/io/file_access_network.cpp msgid "Page Read Ahead" @@ -307,9 +285,8 @@ msgid "Blocking Mode Enabled" msgstr "" #: core/io/http_client.cpp -#, fuzzy msgid "Connection" -msgstr "Verbinden" +msgstr "Verbinding" #: core/io/http_client.cpp msgid "Read Chunk Size" @@ -497,9 +474,8 @@ msgid "Pressed" msgstr "Voorinstellingen" #: core/os/input_event.cpp -#, fuzzy msgid "Scancode" -msgstr "Inlezen" +msgstr "Scancode" #: core/os/input_event.cpp msgid "Physical Scancode" @@ -507,7 +483,7 @@ msgstr "" #: core/os/input_event.cpp msgid "Unicode" -msgstr "" +msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" @@ -980,7 +956,7 @@ msgstr "" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "TCP" #: core/register_core_types.cpp #, fuzzy @@ -4694,6 +4670,7 @@ msgstr "Overig project of scène-brede hulpmiddelen." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Project" @@ -5608,7 +5585,7 @@ msgstr "Voorbeeld..." #: editor/editor_settings.cpp msgid "Docks" -msgstr "" +msgstr "panelen" #: editor/editor_settings.cpp #, fuzzy @@ -7246,7 +7223,7 @@ msgstr "" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -7642,7 +7619,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -9765,7 +9743,7 @@ msgstr "Plat 0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "Plat 1" +msgstr "Vlak 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -11497,7 +11475,7 @@ msgstr "Hoekpunten" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" -msgstr "" +msgstr "FPS: %d (%s ms)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -15838,18 +15816,19 @@ msgstr "" msgid "Make Local" msgstr "Maak locaal" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Knoopnaam:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Naam wordt al gebruikt door een andere functie, variabele of signaal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Knoopnaam:" #: editor/scene_tree_dock.cpp @@ -16047,6 +16026,11 @@ msgid "Button Group" msgstr "Knoppen Groep" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Knoopnaam:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Verbonden vanaf)" @@ -16122,6 +16106,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Ongeldige knoopnaam, deze karakters zijn niet toegestaan:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Knoop hernoemen" @@ -18052,6 +18040,21 @@ msgstr "Vul selectie" msgid "Auto Update Project" msgstr "Naamloos Project" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Alles tonen" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Kies een map" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Kies een map" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Einde van innerlijke exception stack trace" @@ -18613,7 +18616,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "Terwijl" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" @@ -18952,7 +18955,7 @@ msgstr "Zoek VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Opgeven" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" @@ -19934,6 +19937,11 @@ msgstr "Knopen knippen" msgid "Custom BG Color" msgstr "Knopen knippen" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Alles uitklappen" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20791,6 +20799,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Ongeldige pakket korte naam." @@ -25121,7 +25135,7 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "" +msgstr "Invoercursor" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" @@ -28727,7 +28741,7 @@ msgstr "" #: servers/visual_server.cpp #, fuzzy msgid "Use Batching In Editor" -msgstr "Editor afsluiten?" +msgstr "Gebruik Batching In Editor" #: servers/visual_server.cpp msgid "Single Rect Fallback" @@ -28785,9 +28799,8 @@ msgid "Enable High Float" msgstr "Prioriteit Inschakelen" #: servers/visual_server.cpp -#, fuzzy msgid "Precision" -msgstr "Stel expressie in" +msgstr "Precisie" #: servers/visual_server.cpp msgid "UV Contract" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 3e4664c317..7b7e680cff 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -63,13 +63,14 @@ # DK0492 <doriankaczmarek28@gmail.com>, 2022. # Dawid Skubij <davidsd@tlen.pl>, 2022. # kingofsponges <q.patex.q@gmail.com>, 2022. +# Patryk Morawski <gormit7@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-04 06:38+0000\n" -"Last-Translator: kingofsponges <q.patex.q@gmail.com>\n" +"PO-Revision-Date: 2022-08-17 18:20+0000\n" +"Last-Translator: Patryk Morawski <gormit7@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" "Language: pl\n" @@ -4384,7 +4385,7 @@ msgstr "Zawsze Zamykaj WyjÅ›cie Po Zatrzymaniu" #: editor/editor_node.cpp msgid "Save On Focus Loss" -msgstr "" +msgstr "Zapisz przy utracie skupienia" #: editor/editor_node.cpp editor/editor_settings.cpp #, fuzzy @@ -4436,7 +4437,7 @@ msgstr "Åšcieżka do projektu:" #: editor/editor_node.cpp msgid "Default Float Step" -msgstr "" +msgstr "DomyÅ›lny krok zmiennoprzecinkowy" #: editor/editor_node.cpp scene/gui/tree.cpp #, fuzzy @@ -4445,15 +4446,15 @@ msgstr "Wyłączony przycisk" #: editor/editor_node.cpp msgid "Auto Unfold Foreign Scenes" -msgstr "" +msgstr "Automatyczne rozwijanie zagranicznych scen" #: editor/editor_node.cpp msgid "Horizontal Vector2 Editing" -msgstr "" +msgstr "Edycja pozioma Vector2" #: editor/editor_node.cpp msgid "Horizontal Vector Types Editing" -msgstr "" +msgstr "Edycja poziomych typów wektorów" #: editor/editor_node.cpp #, fuzzy @@ -4578,6 +4579,7 @@ msgstr "Różne narzÄ™dzia dla scen lub projektu." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -5338,7 +5340,7 @@ msgstr "Pokaż wszystko" #: editor/editor_settings.cpp msgid "Custom Display Scale" -msgstr "" +msgstr "Niestandardowa skala wyÅ›wietlania" #: editor/editor_settings.cpp msgid "Main Font Size" @@ -5346,15 +5348,15 @@ msgstr "Rozmiar głównej czcionki" #: editor/editor_settings.cpp msgid "Code Font Size" -msgstr "" +msgstr "Rozmiar czcionki kodu" #: editor/editor_settings.cpp msgid "Font Antialiased" -msgstr "" +msgstr "WygÅ‚adzana czcionka" #: editor/editor_settings.cpp msgid "Font Hinting" -msgstr "" +msgstr "Czcionka podpowiedzi" #: editor/editor_settings.cpp #, fuzzy @@ -5377,11 +5379,11 @@ msgstr "PrzygaÅ› edytor przy wyskakujÄ…cym oknie" #: editor/editor_settings.cpp main/main.cpp msgid "Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Niski tryb uÅ›pienia procesora (µsec)" #: editor/editor_settings.cpp msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Nieskoncentrowany tryb uÅ›pienia w trybie niskiego procesora (µsec)" #: editor/editor_settings.cpp #, fuzzy @@ -5394,7 +5396,7 @@ msgstr "Automatycznie otwieraj zrzuty ekranu" #: editor/editor_settings.cpp msgid "Max Array Dictionary Items Per Page" -msgstr "" +msgstr "Maksymalna liczba pozycji sÅ‚ownika tablicy na stronie" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp @@ -5408,7 +5410,7 @@ msgstr "Profil" #: editor/editor_settings.cpp msgid "Icon And Font Color" -msgstr "" +msgstr "Kolor ikony i czcionki" #: editor/editor_settings.cpp #, fuzzy @@ -5426,7 +5428,7 @@ msgstr "Kontrast" #: editor/editor_settings.cpp msgid "Relationship Line Opacity" -msgstr "" +msgstr "Przezroczystość linii relacji" #: editor/editor_settings.cpp #, fuzzy @@ -5440,7 +5442,7 @@ msgstr "Brzegowe piksele" #: editor/editor_settings.cpp msgid "Use Graph Node Headers" -msgstr "" +msgstr "Użyj wykresu nagłówków wÄ™złów" #: editor/editor_settings.cpp #, fuzzy @@ -5484,7 +5486,7 @@ msgstr "Kopiuj zasób" #: editor/editor_settings.cpp msgid "Safe Save On Backup Then Rename" -msgstr "" +msgstr "Bezpieczne zapisywanie kopii zapasowej, a nastÄ™pnie zmiana nazwy" #: editor/editor_settings.cpp #, fuzzy @@ -5507,7 +5509,7 @@ msgstr "Pozyskaj drzewo sceny" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" -msgstr "" +msgstr "Rozpocznij tworzenie w peÅ‚ni rozwiniÄ™tego okna dialogowego" #: editor/editor_settings.cpp #, fuzzy @@ -5559,7 +5561,7 @@ msgstr "PodÅ›wietl obecnÄ… liniÄ™" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Highlight Type Safe Lines" -msgstr "" +msgstr "Wyróżnij typy bezpiecznych linii" #: editor/editor_settings.cpp #, fuzzy @@ -5598,7 +5600,7 @@ msgstr "PÅ‚ynne przewijanie" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "V Scroll Speed" -msgstr "" +msgstr "Pionowa szybkość przewijania" #: editor/editor_settings.cpp #, fuzzy @@ -5611,7 +5613,7 @@ msgstr "Szerokość minimapy" #: editor/editor_settings.cpp msgid "Mouse Extra Buttons Navigate History" -msgstr "" +msgstr "Historia nawigacji dodatkowych przycisków myszy" #: editor/editor_settings.cpp #, fuzzy @@ -5620,7 +5622,7 @@ msgstr "Wybór GridMap" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "PozostaÅ„ w edytorze skryptów na wybranym węźle" #: editor/editor_settings.cpp msgid "Appearance" @@ -5638,7 +5640,7 @@ msgstr "Numer linii:" #: editor/editor_settings.cpp msgid "Show Bookmark Gutter" -msgstr "" +msgstr "Pokaż ciek zakÅ‚adek" #: editor/editor_settings.cpp #, fuzzy @@ -5647,23 +5649,23 @@ msgstr "PomiÅ„ punkty wstrzymania" #: editor/editor_settings.cpp msgid "Show Info Gutter" -msgstr "" +msgstr "Pokaż ciek informacji" #: editor/editor_settings.cpp msgid "Code Folding" -msgstr "" +msgstr "Zawijanie kodu" #: editor/editor_settings.cpp msgid "Word Wrap" -msgstr "" +msgstr "Zawijanie tekstu" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" -msgstr "" +msgstr "Pokaż wytyczne dotyczÄ…ce dÅ‚ugoÅ›ci linii" #: editor/editor_settings.cpp msgid "Line Length Guideline Soft Column" -msgstr "" +msgstr "Wytyczne dotyczÄ…ce dÅ‚ugoÅ›ci linii miÄ™kkiej kolumny" #: editor/editor_settings.cpp msgid "Line Length Guideline Hard Column" @@ -7517,7 +7519,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15574,18 +15577,19 @@ msgstr "" msgid "Make Local" msgstr "UczyÅ„ lokalnym" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nazwa wÄ™zÅ‚a:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Nazwa jest już użyta przez innÄ… funkcjÄ™/zmiennÄ…/sygnaÅ‚:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Nazwa wÄ™zÅ‚a:" #: editor/scene_tree_dock.cpp @@ -15787,6 +15791,11 @@ msgid "Button Group" msgstr "Grupa przycisków" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nazwa wÄ™zÅ‚a:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(łączony teraz)" @@ -15862,6 +15871,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "NieprawidÅ‚owa nazwa wÄ™zÅ‚a, nastÄ™pujÄ…ce znaki sÄ… niedozwolone:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "ZmieÅ„ nazwÄ™ wÄ™zÅ‚a" @@ -17789,6 +17802,21 @@ msgstr "Zbuduj rozwiÄ…zanie" msgid "Auto Update Project" msgstr "Projekt bez nazwy" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Pokaż wszystko" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Wybierz katalog" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Wybierz katalog" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Koniec Å›ladu stosu wewnÄ™trznego wyjÄ…tku" @@ -19645,6 +19673,11 @@ msgstr "NiestandardowyWÄ™zeÅ‚" msgid "Custom BG Color" msgstr "NiestandardowyWÄ™zeÅ‚" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "RozwiÅ„ wszystko" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20540,6 +20573,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Niepoprawna krótka nazwa paczki." diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 4c073f8542..e8e4e5c79d 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -4494,6 +4494,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7309,7 +7310,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15326,18 +15328,20 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Discharge ye' Signal" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "" +"Yer name be backstabin'! She be used by another dastardly func/var/signal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Discharge ye' Signal" #: editor/scene_tree_dock.cpp @@ -15537,6 +15541,11 @@ msgstr "" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Discharge ye' Signal" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Slit th' Node" @@ -15601,6 +15610,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17481,6 +17494,20 @@ msgstr "All yer Booty" msgid "Auto Update Project" msgstr "Rename Function" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Slit th' Node" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Yer functions:" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19295,6 +19322,11 @@ msgstr "Slit th' Node" msgid "Custom BG Color" msgstr "Slit th' Node" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Edit" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20127,6 +20159,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Yer unique name be evil." diff --git a/editor/translations/pt.po b/editor/translations/pt.po index f284e0ece8..271dcc1e8b 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -26,13 +26,15 @@ # Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>, 2022. # Ednaldo Pereira Confia <filat51823@storypo.com>, 2022. # Zé Beato Página Oficial <zebeato@gmail.com>, 2022. +# Rafael Testa <rafael1testa@gmail.com>, 2022. +# Baiterson <baiter160@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: Zé Beato Página Oficial <zebeato@gmail.com>\n" +"PO-Revision-Date: 2022-08-25 13:04+0000\n" +"Last-Translator: Baiterson <baiter160@gmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot/pt/>\n" "Language: pt\n" @@ -410,9 +412,8 @@ msgid "Command" msgstr "Comando" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (FÃsico)" +msgstr "FÃsico" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -466,7 +467,7 @@ msgstr "Pressione" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Caneta Invertida" #: core/os/input_event.cpp msgid "Relative" @@ -2754,9 +2755,8 @@ msgid "Project export for platform:" msgstr "Exportação do projeto para plataforma:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "ConcluÃdo com erros." +msgstr "ConcluÃdo com advertências." #: editor/editor_export.cpp msgid "Completed successfully." @@ -2779,29 +2779,24 @@ msgid "Packing" msgstr "Empacotamento" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "Guardar Como" +msgstr "Salvar Como PCK" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "Não consegui criar pasta." +msgstr "Não pôde criar arquivo \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Incapaz de exportar ficheiros do projeto" +msgstr "Falha ao exportar arquivos do projeto." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "Incapaz de abrir o ficheiro para escrita:" +msgstr "Incapaz de abrir o arquivo pelo caminho \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "Guardar Como" +msgstr "Salvar como ZIP" #: editor/editor_export.cpp msgid "" @@ -2862,9 +2857,8 @@ msgstr "" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Custom Template" -msgstr "Editor de Tema" +msgstr "Modelo customizado" #: editor/editor_export.cpp editor/project_export.cpp #: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp @@ -2886,9 +2880,8 @@ msgid "Embed PCK" msgstr "Incorporar PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Texture Format" -msgstr "TextureRegion" +msgstr "Formato de Textura" #: editor/editor_export.cpp msgid "BPTC" @@ -2924,12 +2917,10 @@ msgid "Custom release template not found." msgstr "Modelo de lançamento personalizado não encontrado." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "Gerir Modelos" +msgstr "Preparar Modelos" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." msgstr "O caminho de exportação não existe:" @@ -2938,15 +2929,13 @@ msgid "Template file not found: \"%s\"." msgstr "Ficheiro Modelo não encontrado" #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Modelo de exportação inválido:" +msgstr "Falha ao copiar Modelo de exportação." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "Preenchimento" +msgstr "Encorporar PCK" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -3160,9 +3149,8 @@ msgid "Manage Editor Feature Profiles" msgstr "Gerir Editor Perfis de Funcionalidades" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Default Feature Profile" -msgstr "Perfil de Funcionalidades Godot" +msgstr "Perfil de Funcionalidades padrão" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -3252,9 +3240,8 @@ msgstr "Modo de Visualização" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/visual_shader.cpp #: servers/audio/effects/audio_effect_distortion.cpp -#, fuzzy msgid "Mode" -msgstr "Modo deslocamento" +msgstr "Modo" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Current Dir" @@ -3270,9 +3257,8 @@ msgstr "Caminho Atual" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Show Hidden Files" -msgstr "Alternar Ficheiros Escondidos" +msgstr "Mostrar arquivos ocultos" #: editor/editor_file_dialog.cpp msgid "Disable Overwrite Warning" @@ -3570,24 +3556,20 @@ msgid "Property:" msgstr "Propriedade:" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp -#, fuzzy msgid "Label" -msgstr "Valor" +msgstr "Texto" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Read Only" -msgstr "Apenas Métodos" +msgstr "Apenas Leitura" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp -#, fuzzy msgid "Checkable" msgstr "Marcar item" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Checked" msgstr "Item Marcado" @@ -3596,7 +3578,6 @@ msgid "Draw Red" msgstr "Desenhar Vermelho" #: editor/editor_inspector.cpp -#, fuzzy msgid "Keying" msgstr "Executar" @@ -3962,14 +3943,12 @@ msgid "Quick Open Script..." msgstr "Abrir Script de forma rápida..." #: editor/editor_node.cpp -#, fuzzy msgid "Save & Reload" -msgstr "Guardar & Reiniciar" +msgstr "Salvar E Reiniciar" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to '%s' before reloading?" -msgstr "Guardar alterações a '%s' antes de fechar?" +msgstr "Salvar alterações '%s' antes de reiniciar?" #: editor/editor_node.cpp msgid "Save & Close" @@ -4088,9 +4067,8 @@ msgid "Open Project Manager?" msgstr "Abrir Gestor de Projeto?" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to the following scene(s) before reloading?" -msgstr "Guardar alterações da(s) seguinte(s) cena(s) antes de sair?" +msgstr "Salvar alterações da(s) seguinte(s) cena(s) antes de reiniciar?" #: editor/editor_node.cpp msgid "Save & Quit" @@ -4283,19 +4261,16 @@ msgstr "" #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp -#, fuzzy msgid "Interface" -msgstr "Interface do Utilizador" +msgstr "Interface" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Scene Tabs" -msgstr "Trocar Aba de Cena" +msgstr "Abas da Cena" #: editor/editor_node.cpp -#, fuzzy msgid "Always Show Close Button" -msgstr "Mostrar Grelha Sempre" +msgstr "Sempre mostrar o Botão de Fechar" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Resize If Many Tabs" @@ -4310,9 +4285,8 @@ msgid "Output" msgstr "SaÃda" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Always Clear Output On Play" -msgstr "Limpar SaÃda" +msgstr "Sempre Apagar Output quando Iniciar" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Open Output On Play" @@ -4327,19 +4301,16 @@ msgid "Save On Focus Loss" msgstr "Salvar ao Perder o Foco" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Save Each Scene On Quit" -msgstr "Guardar Ramo como Cena" +msgstr "Salvar Cada Cena ao Sair" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Quit Confirmation" -msgstr "Ver informação" +msgstr "Confirmação de Saida" #: editor/editor_node.cpp -#, fuzzy msgid "Show Update Spinner" -msgstr "Esconder Roleta de Atualização" +msgstr "Mostra Ãcone de Atualização" #: editor/editor_node.cpp msgid "Update Continuously" @@ -4350,14 +4321,12 @@ msgid "Update Vital Only" msgstr "Só Atualizar Vital" #: editor/editor_node.cpp -#, fuzzy msgid "Localize Settings" -msgstr "Localização" +msgstr "Configuração de tradução" #: editor/editor_node.cpp -#, fuzzy msgid "Restore Scenes On Load" -msgstr "Obter Nó da Cena" +msgstr "Restaurar Cenas quando carregar" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" @@ -4376,7 +4345,6 @@ msgid "Default Float Step" msgstr "FloatStep Padrão" #: editor/editor_node.cpp scene/gui/tree.cpp -#, fuzzy msgid "Disable Folding" msgstr "Desativar Botão" @@ -4393,14 +4361,12 @@ msgid "Horizontal Vector Types Editing" msgstr "Edição de Tipo de Vetor Horizontal" #: editor/editor_node.cpp -#, fuzzy msgid "Open Resources In Current Inspector" -msgstr "Abrir no Inspetor" +msgstr "Abrir Recursos no Inspetor atual" #: editor/editor_node.cpp -#, fuzzy msgid "Resources To Open In New Inspector" -msgstr "Abrir no Inspetor" +msgstr "Abrir Recursos em um novo Inspetor" #: editor/editor_node.cpp msgid "Default Color Picker Mode" @@ -4514,6 +4480,7 @@ msgstr "Ferramentas diversas de projeto ou cena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projeto" @@ -4792,9 +4759,8 @@ msgid "Save & Restart" msgstr "Guardar & Reiniciar" #: editor/editor_node.cpp -#, fuzzy msgid "Update All Changes" -msgstr "Atualizar quando há Alterações" +msgstr "Atualizar todas as Mudanças" #: editor/editor_node.cpp msgid "Update Vital Changes" @@ -5062,9 +5028,8 @@ msgid "Profiler Frame History Size" msgstr "Tamanho do Histórico do Perfilador de Quadro" #: editor/editor_profiler.cpp -#, fuzzy msgid "Profiler Frame Max Functions" -msgstr "Mudar nome da Função" +msgstr "Profiler Frame Max Funções" #: editor/editor_properties.cpp msgid "Edit Text:" @@ -5133,9 +5098,8 @@ msgid "Size:" msgstr "Tamanho:" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "Page:" -msgstr "Página: " +msgstr "Página:" #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -5197,18 +5161,15 @@ msgstr "Novo %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Base Type" msgstr "Mudar tipo base" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Edited Resource" -msgstr "Adicionar recurso" +msgstr "Recurso Editado" #: editor/editor_resource_picker.cpp scene/gui/line_edit.cpp #: scene/gui/slider.cpp scene/gui/spin_box.cpp -#, fuzzy msgid "Editable" msgstr "Item Editável" @@ -5236,7 +5197,6 @@ msgstr "" "definido existente como executável." #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" msgstr "Projeto" @@ -5265,14 +5225,12 @@ msgid "Did you forget the '_run' method?" msgstr "Esqueceu-se do método '_run'?" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor Language" -msgstr "Apresentação do Editor" +msgstr "Linguagem do Editor" #: editor/editor_settings.cpp -#, fuzzy msgid "Display Scale" -msgstr "Mostrar Tudo" +msgstr "Escala do Editor" #: editor/editor_settings.cpp msgid "Custom Display Scale" @@ -5295,18 +5253,16 @@ msgid "Font Hinting" msgstr "Alinhar Fonte" #: editor/editor_settings.cpp -#, fuzzy msgid "Main Font" -msgstr "Cena Principal" +msgstr "Fonte Principal" #: editor/editor_settings.cpp msgid "Main Font Bold" msgstr "Fonte Principal em Negrito" #: editor/editor_settings.cpp -#, fuzzy msgid "Code Font" -msgstr "Adicionar Ponto Nó" +msgstr "Fonte do Código" #: editor/editor_settings.cpp msgid "Dim Editor On Dialog Popup" @@ -5321,7 +5277,6 @@ msgid "Unfocused Low Processor Mode Sleep (µsec)" msgstr "Duração do Modo de Baixo Consumo do Processador Fora de Foco (µsec)" #: editor/editor_settings.cpp -#, fuzzy msgid "Separate Distraction Mode" msgstr "Modo Livre de Distrações" @@ -5412,9 +5367,8 @@ msgid "Safe Save On Backup Then Rename" msgstr "Salvar com Segurança no Backup e Renomear" #: editor/editor_settings.cpp -#, fuzzy msgid "File Dialog" -msgstr "Diálogo XForm" +msgstr "Arquivo de Diálogo" #: editor/editor_settings.cpp msgid "Thumbnail Size" @@ -5425,37 +5379,32 @@ msgid "Docks" msgstr "Painéis" #: editor/editor_settings.cpp -#, fuzzy msgid "Scene Tree" -msgstr "Obter Ãrvore da Cena" +msgstr "Grupo de Cenas" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" msgstr "Iniciar Diálogo de Criação Totalmente Expandido" #: editor/editor_settings.cpp -#, fuzzy msgid "Always Show Folders" -msgstr "Mostrar Grelha Sempre" +msgstr "Sempre mostrar Pastas" #: editor/editor_settings.cpp -#, fuzzy msgid "Property Editor" -msgstr "Editor de Grupo" +msgstr "Editor de propriedades" #: editor/editor_settings.cpp msgid "Auto Refresh Interval" msgstr "Intervalo de Atualização Automática" #: editor/editor_settings.cpp -#, fuzzy msgid "Subresource Hue Tint" -msgstr "Sub-recursos" +msgstr "Sub-recursos Cor Hue" #: editor/editor_settings.cpp -#, fuzzy msgid "Color Theme" -msgstr "Editor de Tema" +msgstr "Cor do Tema" #: editor/editor_settings.cpp scene/3d/label_3d.cpp #: scene/resources/default_theme/default_theme.cpp @@ -5468,9 +5417,8 @@ msgid "Highlighting" msgstr "Destaque" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Syntax Highlighting" -msgstr "Destaque de Sintaxe" +msgstr "Destaque da Sintaxe" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight All Occurrences" @@ -5485,18 +5433,16 @@ msgid "Highlight Type Safe Lines" msgstr "Destacar Linhas com Tipo Seguro" #: editor/editor_settings.cpp -#, fuzzy msgid "Indent" -msgstr "Indentar à esquerda" +msgstr "Indentar" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Auto Indent" msgstr "Indentação Automática" #: editor/editor_settings.cpp -#, fuzzy msgid "Convert Indent On Save" -msgstr "Converter Indentação em Espaços" +msgstr "Converter Indentação ao Salvar" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Draw Tabs" @@ -5522,9 +5468,8 @@ msgid "V Scroll Speed" msgstr "Velocidade de Rolagem V" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Minimap" -msgstr "Mostrar Origem" +msgstr "Mostrar Minimapa" #: editor/editor_settings.cpp msgid "Minimap Width" @@ -5535,13 +5480,12 @@ msgid "Mouse Extra Buttons Navigate History" msgstr "Botões extra do Mouse para Navegar no Histórico" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "Seleção de GridMap" +msgstr "Arrastar e soltar" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "Manter editor de script no Nodo selecionado" #: editor/editor_settings.cpp msgid "Appearance" @@ -5560,9 +5504,8 @@ msgid "Show Bookmark Gutter" msgstr "Mostrar Barra de Favoritos" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Breakpoint Gutter" -msgstr "Saltar Pontos de Paragem" +msgstr "Mostrar Pontos de Parada" #: editor/editor_settings.cpp msgid "Show Info Gutter" @@ -5589,23 +5532,20 @@ msgid "Line Length Guideline Hard Column" msgstr "Diretriz de Comprimento de Linha de Coluna RÃgida" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script List" -msgstr "Editor de Script" +msgstr "Lista de Scripts" #: editor/editor_settings.cpp msgid "Show Members Overview" msgstr "Mostrar Visão Geral dos Membros" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Files" -msgstr "Ficheiro" +msgstr "Arquivos" #: editor/editor_settings.cpp -#, fuzzy msgid "Trim Trailing Whitespace On Save" -msgstr "Apagar Espaços nos Limites" +msgstr "Apagar Espaços nos Limites ao Salvar" #: editor/editor_settings.cpp msgid "Autosave Interval Secs" @@ -5624,9 +5564,8 @@ msgid "Auto Reload Scripts On External Change" msgstr "Recarregamento Automático de Scripts em Caso de Mudança Externa" #: editor/editor_settings.cpp -#, fuzzy msgid "Create Signal Callbacks" -msgstr "Forçar Shader de Reserva" +msgstr "Criar Sinais de Chamadas" #: editor/editor_settings.cpp msgid "Sort Members Outline Alphabetically" @@ -7369,7 +7308,8 @@ msgid "8 Bit" msgstr "8 Bits" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -15402,18 +15342,19 @@ msgstr "" msgid "Make Local" msgstr "Tornar Local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "Outro nó já usa esse nome exclusivo na cena." - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nome do Nó:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Outro nó já usa esse nome exclusivo na cena." + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Nome do Nó:" #: editor/scene_tree_dock.cpp @@ -15615,6 +15556,11 @@ msgid "Button Group" msgstr "Grupo Botão" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nome do Nó:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(A Ligar de)" @@ -15693,6 +15639,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Nome de nó inválido, os caracteres seguintes não são permitidos:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Outro nó já usa esse nome exclusivo na cena." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renomear Nó" @@ -17563,6 +17513,21 @@ msgstr "Construir Solução" msgid "Auto Update Project" msgstr "Projeto sem nome" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Mostrar Tudo" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Escolha uma Diretoria" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Escolha uma Diretoria" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Fim do stack trace de exceção interna" @@ -19412,6 +19377,11 @@ msgstr "CustomNode" msgid "Custom BG Color" msgstr "CustomNode" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Expandir Tudo" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20266,6 +20236,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nome curto de pacote inválido." @@ -28344,7 +28320,7 @@ msgstr "Modo de Interpolação" #: servers/visual_server.cpp msgid "Max Simultaneous Compiles" -msgstr "" +msgstr "Compilação simultânea Maxima" #: servers/visual_server.cpp msgid "Log Active Async Compiles Count" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 84a5ac45c3..4541da85ee 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -144,13 +144,20 @@ # Ednaldo Pereira Confia <filat51823@storypo.com>, 2022. # Mauricio <mauricio.fidalgo1@gmail.com>, 2022. # Felipe Kinoshita <kinofhek@gmail.com>, 2022. +# TLAliceDev <calicedev@protonmail.com>, 2022. +# Mr.Albino <ricmorsoleto@gmail.com>, 2022. +# Jaide Alonso Ambrosio <jaide.sp@gmail.com>, 2022. +# Paulo Sergio Campos de Lima <cloverfieldor@gmail.com>, 2022. +# Avery <jarreed0@gmail.com>, 2022. +# TheJC <the-green-green.0rvdk@simplelogin.fr>, 2022. +# Mauricio Mazur <mauricio.mazur12@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2022-08-04 06:38+0000\n" -"Last-Translator: Felipe Kinoshita <kinofhek@gmail.com>\n" +"PO-Revision-Date: 2022-09-05 11:17+0000\n" +"Last-Translator: TheJC <the-green-green.0rvdk@simplelogin.fr>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -158,7 +165,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -363,7 +370,7 @@ msgstr "Página lida adiante" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "Modo de Bloqueio Ativado" +msgstr "Modo de bloqueio Ativado" #: core/io/http_client.cpp msgid "Connection" @@ -929,7 +936,7 @@ msgstr "Profilador" #: core/project_settings.cpp msgid "Max Functions" -msgstr "Funções máximas" +msgstr "Máximo de Funções" #: core/project_settings.cpp scene/3d/vehicle_body.cpp msgid "Compression" @@ -1121,7 +1128,7 @@ msgstr "Máximo de luzes renderizáveis" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Reflections" -msgstr "Máximo de Reflexões Renderizáveis" +msgstr "Máximo de Reflexos renderizáveis" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" @@ -1668,7 +1675,7 @@ msgstr "Adicionar Trilha Bezier" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "Caminho da faixa é inválido, então não pode adicionar uma chave." +msgstr "Caminho da trilha é inválido, então não pode adicionar uma chave." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" @@ -2868,9 +2875,8 @@ msgid "Project export for platform:" msgstr "Exportação do projeto para plataforma:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "ConcluÃdo com erros." +msgstr "ConcluÃdo com avisos." #: editor/editor_export.cpp msgid "Completed successfully." @@ -2992,7 +2998,7 @@ msgstr "64 Bits" #: editor/editor_export.cpp msgid "Embed PCK" -msgstr "PCK Incorporado" +msgstr "Embutir PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "Texture Format" @@ -4598,6 +4604,7 @@ msgstr "Ferramentas diversas atuantes no projeto ou cena." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projeto" @@ -5605,7 +5612,7 @@ msgstr "Seleção Arrasta e Solta" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "Ficar no Editor de Script ao Selecionar Nó" #: editor/editor_settings.cpp msgid "Appearance" @@ -5819,7 +5826,7 @@ msgstr "Junção" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Shape" -msgstr "Form" +msgstr "Forma" #: editor/editor_settings.cpp msgid "Primary Grid Steps" @@ -7234,7 +7241,7 @@ msgstr "Importando Cena..." #: editor/import/resource_importer_scene.cpp msgid "Generating Lightmaps" -msgstr "Generando Lightmaps" +msgstr "Gerando Lightmaps" #: editor/import/resource_importer_scene.cpp msgid "Generating for Mesh:" @@ -7299,7 +7306,7 @@ msgstr "Modo HDR" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp @@ -7318,7 +7325,7 @@ msgstr "Corrigir Alpha da Borda" #: editor/import/resource_importer_texture.cpp msgid "Premult Alpha" -msgstr "" +msgstr "Pré-Multiplicar Alpha" #: editor/import/resource_importer_texture.cpp msgid "Hdr As Srgb" @@ -7378,7 +7385,8 @@ msgid "8 Bit" msgstr "8 Bits" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -11724,9 +11732,8 @@ msgid "New Animation" msgstr "Nova animação" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Filtrar métodos" +msgstr "Filtrar animações" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -12529,9 +12536,8 @@ msgid "Palette Min Width" msgstr "Largura MÃnima de Paleta" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Palette Item H Separation" -msgstr "Separador Nomeado" +msgstr "Separação Horizontal dos Itens de Paleta" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Show Tile Names" @@ -12560,9 +12566,8 @@ msgid "Display Grid" msgstr "Mostrar Grid" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Axis Color" -msgstr "Escolher Cor" +msgstr "Cor do Eixo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Texture(s) to TileSet." @@ -12606,7 +12611,7 @@ msgstr "Coordenada Anterior" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the previous shape, subtile, or Tile." -msgstr "Selecione a forma, subtile ou tile anterior." +msgstr "Selecione a forma anterior, subtile ou Tile." #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/sprite.cpp #: scene/3d/sprite_3d.cpp scene/resources/texture.cpp @@ -12714,7 +12719,7 @@ msgstr "Ative o snap e mostre a grade (configurável através do Inspetor)." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Display Tile Names (Hold Alt Key)" -msgstr "Exibir nomes de mosaico (segure a tecla Alt)" +msgstr "Exibir nomes dos Tiles (segure a tecla Alt)" #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -12725,7 +12730,8 @@ msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove selected texture? This will remove all tiles which use it." -msgstr "Remover Texture Selecionada e TODAS PEÇAS que a usam." +msgstr "" +"Remover textura selecionada? Todos os tiles que a usam serão removidos." #: editor/plugins/tile_set_editor_plugin.cpp msgid "You haven't selected a texture to remove." @@ -12733,7 +12739,7 @@ msgstr "Você não selecionou uma textura para remover." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from scene? This will overwrite all current tiles." -msgstr "Criar a partir de cena? Isso substituirá todos os blocos atuais." +msgstr "Criar a partir de cena? Isso substituirá todos os tiles atuais." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" @@ -12753,7 +12759,7 @@ msgid "" "Click on another Tile to edit it." msgstr "" "Arraste alças para editar o Rect.\n" -"Clique em outro Mosaico para editá-lo." +"Clique em outro Tile para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Delete selected Rect." @@ -12764,8 +12770,8 @@ msgid "" "Select current edited sub-tile.\n" "Click on another Tile to edit it." msgstr "" -"Selecione o sub-bloco editado atual.\n" -"Clique em outro Mosaico para editá-lo." +"Selecione o sub-tile editado atual.\n" +"Clique em outro Tile para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Delete polygon." @@ -12781,7 +12787,7 @@ msgstr "" "LMB: Ligar bit.\n" "RMB: Desligar bit.\n" "Shift+LMB: Escolher bit curinga.\n" -"Clique em outro Mosaico para editá-lo." +"Clique em outro Tile para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -12789,41 +12795,41 @@ msgid "" "bindings.\n" "Click on another Tile to edit it." msgstr "" -"Selecione o sub-bloco para usar como Ãcone, isso também será usado em " -"ligações inválidas do autotile.\n" -"Clique em outro Mosaico para editá-lo." +"Selecione o sub-tile para usar como Ãcone, ele também será usado em ligações " +"inválidas do autotile.\n" +"Clique em outro Tile para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" "Select sub-tile to change its priority.\n" "Click on another Tile to edit it." msgstr "" -"Selecione o sub-bloco para alterar sua prioridade.\n" -"Clique em outro Mosaico para editá-lo." +"Selecione o sub-tile para alterar sua prioridade.\n" +"Clique em outro Tile para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" "Select sub-tile to change its z index.\n" "Click on another Tile to edit it." msgstr "" -"Selecione o sub-bloco para alterar seu Ãndice z.\n" -"Clique em outro Mosaico para editá-lo." +"Selecione o sub-tile para alterar seu Ãndice z.\n" +"Clique em outro Tile para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Region" -msgstr "Definir a região do Mosaico" +msgstr "Definir a região do Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create Tile" -msgstr "Criar Telha" +msgstr "Criar Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Icon" -msgstr "Definir Ãcone de telha" +msgstr "Definir Ãcone do Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Bitmask" -msgstr "Editar o Bitmask da telha" +msgstr "Editar o Bitmask do Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Collision Polygon" @@ -12839,11 +12845,11 @@ msgstr "Editar polÃgono de navegação" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Paste Tile Bitmask" -msgstr "Colar Máscara Bitmask" +msgstr "Colar Bitmask de Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Clear Tile Bitmask" -msgstr "Limpar o Bitmask da telha" +msgstr "Limpar Bitmask do Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Make Polygon Concave" @@ -12855,7 +12861,7 @@ msgstr "Tornar o PolÃgono Convexo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Tile" -msgstr "Remover Telha" +msgstr "Remover Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Collision Polygon" @@ -12871,11 +12877,11 @@ msgstr "Remover PolÃgono de Navegação" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Priority" -msgstr "Editar prioridade da telha" +msgstr "Editar Prioridade do Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Z Index" -msgstr "Editar Ãndice de telha Z" +msgstr "Editar Ãndice Z do Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Make Convex" @@ -12898,9 +12904,8 @@ msgid "This property can't be changed." msgstr "Esta propriedade não pode ser alterada." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Snap Options" -msgstr "Opções de encaixe" +msgstr "Opções de Encaixe" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/animated_sprite.cpp #: scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp @@ -12941,9 +12946,8 @@ msgid "Texture" msgstr "Textura" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tex Offset" -msgstr "Deslocamento do Byte" +msgstr "Deslocamento da Textura" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp @@ -12953,31 +12957,28 @@ msgstr "Material" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Modulate" -msgstr "Popular" +msgstr "Modular" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Tile Mode" msgstr "Modo de Tiles" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Autotile Bitmask Mode" -msgstr "Modo Bitmask" +msgstr "Modo Bitmask do Autotile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Subtile Size" -msgstr "Tamanho do Sub TÃtulo" +msgstr "Tamanho do Subtile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Subtile Spacing" msgstr "Espaçamento dos Subtiles" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occluder Offset" -msgstr "Criar PolÃgono de Oclusão" +msgstr "Deslocamento de Oclusor" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Navigation Offset" @@ -12996,9 +12997,8 @@ msgid "Selected Collision" msgstr "Colisão Selecionada" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way" -msgstr "Selecionar Apenas" +msgstr "Colisão em sentido único selecionada" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13019,7 +13019,7 @@ msgstr "Scripts do Tileset" #: editor/plugins/tile_set_editor_plugin.cpp msgid "TileSet" -msgstr "Conjunto de Telha" +msgstr "TileSet" #: editor/plugins/version_control_editor_plugin.cpp msgid "No VCS plugins are available." @@ -13054,7 +13054,7 @@ msgstr "Commit:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "Encontro:" +msgstr "Data:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Subtitle:" @@ -13158,6 +13158,7 @@ msgid "Remove Remote" msgstr "Remover remoto" #: editor/plugins/version_control_editor_plugin.cpp +#, fuzzy msgid "Remote Name" msgstr "Nome Remoto" @@ -15373,19 +15374,20 @@ msgstr "" msgid "Make Local" msgstr "Tornar Local" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "Outro nó já está usando este nome único na cena atual." +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Enable Scene Unique Name(s)" +msgstr "Habilitar Nome Único de Cena" #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" -msgstr "Nome Único" +msgid "Unique names already used by another node in the scene:" +msgstr "Outro nó já está usando este nome único na cena atual." -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" -msgstr "Nome Único" +msgid "Disable Scene Unique Name(s)" +msgstr "Desabilitar Nome Único de Cena" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15586,6 +15588,10 @@ msgid "Button Group" msgstr "Grupo de Botões" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Desabilitar Nome Único de Cena" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Conectando de)" @@ -15664,6 +15670,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Nome de nó inválido, os seguintes caracteres não são permitidos:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Outro nó já está usando este nome único na cena atual." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Renomear Nó" @@ -15888,9 +15898,8 @@ msgid "Stack Frames" msgstr "Pilha de Quadros" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Filter stack variables" -msgstr "Filtros do tile" +msgstr "Filtrar variáveis stack" #: editor/script_editor_debugger.cpp msgid "Auto Switch To Remote Scene Tree" @@ -16033,23 +16042,20 @@ msgid "Change Particles AABB" msgstr "Alterar o AABB das PartÃculas" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Reflection Probe" -msgstr "Selecionar Propriedade" +msgstr "Sonda de Reflexão" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" msgstr "Alterar a Extensão da Sonda" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "GI Probe" -msgstr "Cozinhar Sonda GI" +msgstr "Sonda GI" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Baked Indirect Light" -msgstr "Iluminação indireta" +msgstr "Pré-Processar Iluminação indireta" #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp msgid "Change Sphere Shape Radius" @@ -16084,9 +16090,8 @@ msgid "Navigation Edge" msgstr "Bordas de Navegação" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Edge Disabled" -msgstr "Modo Navegação" +msgstr "Bordas de Navegação Desativadas" #: editor/spatial_editor_gizmos.cpp msgid "Navigation Solid" @@ -16117,9 +16122,8 @@ msgid "Set Room Point Position" msgstr "Definir Posição Do Ponto Da Sala" #: editor/spatial_editor_gizmos.cpp scene/3d/portal.cpp -#, fuzzy msgid "Portal Margin" -msgstr "Definir Margem" +msgstr "Margem do Portal" #: editor/spatial_editor_gizmos.cpp msgid "Portal Edge" @@ -16138,15 +16142,13 @@ msgid "Portal Front" msgstr "Frente do Portal" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Portal Back" -msgstr "Voltar" +msgstr "Voltar ao Portal" #: editor/spatial_editor_gizmos.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp -#, fuzzy msgid "Occluder" -msgstr "Modo Oclusão" +msgstr "Oclusor" #: editor/spatial_editor_gizmos.cpp msgid "Set Occluder Sphere Radius" @@ -16159,27 +16161,25 @@ msgstr "Definir Posição Da Esfera Do Oclusor" #: editor/spatial_editor_gizmos.cpp #, fuzzy msgid "Set Occluder Polygon Point Position" -msgstr "Definir Posição Do Ponto Do Portal" +msgstr "Definir Posição do Ponto do PolÃgono Oclusor" #: editor/spatial_editor_gizmos.cpp #, fuzzy msgid "Set Occluder Hole Point Position" -msgstr "Definir Posição do Ponto da Curva" +msgstr "Definir Posição do Ponto do Buraco Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Front" -msgstr "Criar PolÃgono de Oclusão" +msgstr "Frente do PolÃgono Oclusor" #: editor/spatial_editor_gizmos.cpp #, fuzzy msgid "Occluder Polygon Back" -msgstr "Criar PolÃgono de Oclusão" +msgstr "Costas do PolÃgono Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Hole" -msgstr "Criar PolÃgono de Oclusão" +msgstr "Buraco Oclusor" #: main/main.cpp msgid "Godot Physics" @@ -16192,19 +16192,16 @@ msgstr "Usar BVH" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp -#, fuzzy msgid "BVH Collision Margin" -msgstr "Modo Colisão" +msgstr "Margem de Colisão BVH" #: main/main.cpp -#, fuzzy msgid "Crash Handler" -msgstr "Definir Manipulador" +msgstr "Gerenciador de Falhas" #: main/main.cpp -#, fuzzy msgid "Multithreaded Server" -msgstr "Conjunto de MultiNode" +msgstr "Servidor com Multi-Thread" #: main/main.cpp msgid "RID Pool Prealloc" @@ -16243,14 +16240,12 @@ msgid "File Logging" msgstr "Registrando Log de Arquivos" #: main/main.cpp -#, fuzzy msgid "Enable File Logging" -msgstr "Habilitar Filtragem" +msgstr "Habilitar Log de Arquivos" #: main/main.cpp -#, fuzzy msgid "Log Path" -msgstr "Copiar Caminho" +msgstr "Caminho de Log" #: main/main.cpp msgid "Max Log Files" @@ -16301,9 +16296,8 @@ msgid "Intended Usage" msgstr "Intenção de Uso" #: main/main.cpp -#, fuzzy msgid "Framebuffer Allocation" -msgstr "Seleção de Frame" +msgstr "Alocação de Framebuffer" #: main/main.cpp platform/uwp/os_uwp.cpp msgid "Energy Saving" @@ -16314,9 +16308,8 @@ msgid "Threads" msgstr "Threads" #: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h -#, fuzzy msgid "Thread Model" -msgstr "Alternar Modo" +msgstr "Modelo de Thread" #: main/main.cpp msgid "Thread Safe BVH" @@ -16337,9 +16330,8 @@ msgid "Common" msgstr "Comum" #: main/main.cpp -#, fuzzy msgid "Physics FPS" -msgstr "Frame de FÃsica %" +msgstr "FPS da FisÃca" #: main/main.cpp msgid "Force FPS" @@ -16347,7 +16339,7 @@ msgstr "Forçar FPS" #: main/main.cpp msgid "Enable Pause Aware Picking" -msgstr "Habilitar Escolha que é Ciente à Pausas" +msgstr "Habilitar Seleção Ciente a Pausas" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp @@ -16372,9 +16364,8 @@ msgid "Verbose stdout" msgstr "stdout Verboso" #: main/main.cpp scene/main/scene_tree.cpp scene/resources/multimesh.cpp -#, fuzzy msgid "Physics Interpolation" -msgstr "Modo de Interpolação" +msgstr "Interpolação da FÃsica" #: main/main.cpp msgid "Enable Warnings" @@ -16402,14 +16393,12 @@ msgid "Hide Home Indicator" msgstr "Esconder Indicador de Home" #: main/main.cpp -#, fuzzy msgid "Input Devices" -msgstr "Todos os dispositivos" +msgstr "Dispositivos de Entrada" #: main/main.cpp -#, fuzzy msgid "Pointing" -msgstr "Ponto" +msgstr "Apontando" #: main/main.cpp msgid "Touch Delay" @@ -16424,9 +16413,8 @@ msgid "Shaders" msgstr "Shaders" #: main/main.cpp -#, fuzzy msgid "Debug Shader Fallbacks" -msgstr "Forçar Fallbacks do Shader" +msgstr "Depurar Fallbacks do Shader" #: main/main.cpp scene/3d/baked_lightmap.cpp scene/3d/camera.cpp #: scene/3d/world_environment.cpp scene/main/scene_tree.cpp @@ -16436,7 +16424,7 @@ msgstr "Ambiente" #: main/main.cpp msgid "Default Clear Color" -msgstr "Cor de Limpeza Padrão" +msgstr "Cor Limpa Padrão" #: main/main.cpp msgid "Boot Splash" @@ -16459,9 +16447,8 @@ msgid "Use Filter" msgstr "Usar Filtro" #: main/main.cpp scene/resources/style_box.cpp -#, fuzzy msgid "BG Color" -msgstr "Cores" +msgstr "Cor do Plano de Fundo" #: main/main.cpp msgid "macOS Native Icon" @@ -16473,7 +16460,7 @@ msgstr "Ãcone Windows Nativo" #: main/main.cpp msgid "Buffering" -msgstr "" +msgstr "Buffering" #: main/main.cpp msgid "Agile Event Flushing" @@ -16504,9 +16491,8 @@ msgid "Tooltip Position Offset" msgstr "Deslocamento de Posição da Dica de Ferramenta" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Debugger Agent" -msgstr "Depurador" +msgstr "Agente Depurador" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Wait For Debugger" @@ -16525,9 +16511,8 @@ msgid "Unhandled Exception Policy" msgstr "Politica de Tratamento Exceções" #: main/main.cpp -#, fuzzy msgid "Main Loop Type" -msgstr "Localizar Tipo de Nó" +msgstr "Tipo de Loop Principal" #: main/main.cpp scene/gui/texture_progress.cpp #: scene/gui/viewport_container.cpp @@ -16549,7 +16534,7 @@ msgstr "Aceitar Sair Automaticamente" #: main/main.cpp scene/main/scene_tree.cpp #, fuzzy msgid "Quit On Go Back" -msgstr "Voltar" +msgstr "Sair em Voltar" #: main/main.cpp scene/main/viewport.cpp #, fuzzy @@ -16570,7 +16555,7 @@ msgstr "Ativar Mundo Macio" #: modules/csg/csg_gizmos.cpp msgid "CSG" -msgstr "" +msgstr "CSG" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -16638,23 +16623,20 @@ msgid "Smooth Faces" msgstr "Suavizar Faces" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Sides" -msgstr "Mostrar Guias" +msgstr "Lados" #: modules/csg/csg_shape.cpp msgid "Cone" msgstr "Cone" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Inner Radius" -msgstr "Alterar Raio Interno do Toro" +msgstr "Raio Interno" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Outer Radius" -msgstr "Alterar Raio Externo do Toro" +msgstr "Raio Externo" #: modules/csg/csg_shape.cpp msgid "Ring Sides" @@ -16763,9 +16745,8 @@ msgstr "Carregar Apenas uma Vez" #: modules/gdnative/gdnative.cpp #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Singleton" -msgstr "Esqueleto" +msgstr "Singleton" #: modules/gdnative/gdnative.cpp msgid "Symbol Prefix" @@ -16855,9 +16836,8 @@ msgid "Function Definition Color" msgstr "Cor de Definição de Função" #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Node Path Color" -msgstr "Copiar Caminho do Nó" +msgstr "Cor do Caminho do Nó" #: modules/gdscript/gdscript.cpp modules/visual_script/visual_script.cpp msgid "Max Call Stack" @@ -16918,9 +16898,8 @@ msgid "Language Server" msgstr "Servidor de Idioma" #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Enable Smart Resolve" -msgstr "Não foi possÃvel resolver" +msgstr "Habilitar Resolução Inteligente" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Show Native Symbols In Editor" @@ -16952,9 +16931,8 @@ msgid "Component Type" msgstr "Tipo do Componente" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Normalized" -msgstr "Formato" +msgstr "Normalizado" #: modules/gltf/gltf_accessor.cpp msgid "Count" @@ -17046,11 +17024,11 @@ msgstr "Intervalo" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" -msgstr "" +msgstr "Ângulo interno do cone" #: modules/gltf/gltf_light.cpp msgid "Outer Cone Angle" -msgstr "" +msgstr "Ângulo externo do cone" #: modules/gltf/gltf_mesh.cpp #, fuzzy @@ -17062,9 +17040,8 @@ msgid "Instance Materials" msgstr "Materiais da Instância" #: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp -#, fuzzy msgid "Parent" -msgstr "Reparentar" +msgstr "Pai" #: modules/gltf/gltf_node.cpp #, fuzzy @@ -17100,9 +17077,8 @@ msgid "Godot Bone Node" msgstr "Nó de Osso Godot" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Skin Root" -msgstr "Nova Raiz de Cena" +msgstr "Raiz da Skin" #: modules/gltf/gltf_skin.cpp msgid "Joints Original" @@ -17119,11 +17095,11 @@ msgstr "Mover Junta" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Bone I" -msgstr "" +msgstr "Junta I ao Osso I" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Name" -msgstr "" +msgstr "Junta I ao Nome" #: modules/gltf/gltf_skin.cpp msgid "Godot Skin" @@ -17131,15 +17107,15 @@ msgstr "" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Img" -msgstr "" +msgstr "Difusa Img" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Factor" -msgstr "" +msgstr "Difusa Fator" #: modules/gltf/gltf_spec_gloss.cpp msgid "Gloss Factor" -msgstr "" +msgstr "Fator de Brilho" #: modules/gltf/gltf_spec_gloss.cpp msgid "Specular Factor" @@ -17178,7 +17154,7 @@ msgstr "Visão Traseira" #: modules/gltf/gltf_state.cpp msgid "Accessors" -msgstr "" +msgstr "Assessores" #: modules/gltf/gltf_state.cpp msgid "Scene Name" @@ -17231,9 +17207,8 @@ msgid "Mesh Library" msgstr "Biblioteca de Malhas" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Physics Material" -msgstr "Frame de FÃsica %" +msgstr "Material de FÃsica" #: modules/gridmap/grid_map.cpp scene/3d/visual_instance.cpp #, fuzzy @@ -17268,9 +17243,8 @@ msgid "Mask" msgstr "Máscara" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp -#, fuzzy msgid "Bake Navigation" -msgstr "Navegação" +msgstr "Navegação Pré-Processada" #: modules/gridmap/grid_map.cpp scene/2d/navigation_2d.cpp #: scene/2d/navigation_agent_2d.cpp scene/2d/navigation_polygon.cpp @@ -17436,25 +17410,24 @@ msgid "Plotting lightmaps" msgstr "Traçando mapas de luz" #: modules/lightmapper_cpu/register_types.cpp -#, fuzzy msgid "CPU Lightmapper" -msgstr "Faça mapas de luz" +msgstr "Mapeamento de Luz da CPU" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" -msgstr "" +msgstr "Quantidade de Raios de Baixa Qualidade" #: modules/lightmapper_cpu/register_types.cpp msgid "Medium Quality Ray Count" -msgstr "" +msgstr "Quantidade de Raios de Qualidade Média" #: modules/lightmapper_cpu/register_types.cpp msgid "High Quality Ray Count" -msgstr "" +msgstr "Quantidade de Raios de Qualidade Alta" #: modules/lightmapper_cpu/register_types.cpp msgid "Ultra Quality Ray Count" -msgstr "" +msgstr "Quantidade de Raios de Qualidade Ultra" #: modules/minimp3/audio_stream_mp3.cpp #: modules/minimp3/resource_importer_mp3.cpp @@ -17465,16 +17438,15 @@ msgstr "Deslocamento do Loop" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Eye Height" -msgstr "" +msgstr "Altura do Olho" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" msgstr "" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "Display Width" -msgstr "Exibição Wireframe" +msgstr "Largura de Tela" #: modules/mobile_vr/mobile_vr_interface.cpp #, fuzzy @@ -17502,9 +17474,23 @@ msgid "Build Solution" msgstr "Construir Solução" #: modules/mono/editor/csharp_project.cpp -#, fuzzy msgid "Auto Update Project" -msgstr "Projeto Sem Nome" +msgstr "Atualizar Projeto Automaticamente" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Nome de Exibição" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Escolha um Diretório" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Escolha um Diretório" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -17591,7 +17577,7 @@ msgstr "" #: modules/opensimplex/noise_texture.cpp msgid "Noise" -msgstr "" +msgstr "RuÃdo" #: modules/opensimplex/noise_texture.cpp msgid "Noise Offset" @@ -17603,25 +17589,23 @@ msgstr "Oitavas" #: modules/opensimplex/open_simplex_noise.cpp msgid "Period" -msgstr "" +msgstr "PerÃodo" #: modules/opensimplex/open_simplex_noise.cpp -#, fuzzy msgid "Persistence" -msgstr "Perspectiva" +msgstr "Persistência" #: modules/opensimplex/open_simplex_noise.cpp msgid "Lacunarity" -msgstr "" +msgstr "Lacunaridade" #: modules/regex/regex.cpp msgid "Subject" msgstr "Sujeito" #: modules/regex/regex.cpp -#, fuzzy msgid "Names" -msgstr "Nome" +msgstr "Nomes" #: modules/regex/regex.cpp msgid "Strings" @@ -17633,11 +17617,11 @@ msgstr "" #: modules/upnp/upnp.cpp msgid "Discover Local Port" -msgstr "" +msgstr "Descobrir Porta Local" #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "" +msgstr "Descobrir IPv6" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -17645,27 +17629,24 @@ msgid "Description URL" msgstr "Descrição" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "Service Type" -msgstr "Definir o Tipo da Variável" +msgstr "Tipo de Serviço" #: modules/upnp/upnp_device.cpp msgid "IGD Control URL" -msgstr "" +msgstr "URL de Controle IGD" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Service Type" -msgstr "Definir o Tipo da Variável" +msgstr "Tipo de Serviço IGD" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" msgstr "" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Status" -msgstr "Estado" +msgstr "Estado do IGD" #: modules/visual_script/visual_script.cpp msgid "" @@ -17704,9 +17685,8 @@ msgid "Stack overflow with stack depth:" msgstr "Sobrecarga da pilha com profundidade:" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Visual Script" -msgstr "Buscar VisualScript" +msgstr "Script Visual" #: modules/visual_script/visual_script_editor.cpp msgid "Change Signal Arguments" @@ -18041,9 +18021,8 @@ msgid "Return Enabled" msgstr "Executável" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return Type" -msgstr "Retornar" +msgstr "Tipo de Retorno" #: modules/visual_script/visual_script_flow_control.cpp #: scene/resources/visual_shader_nodes.cpp @@ -18084,17 +18063,15 @@ msgstr "Iterador tornou-se inválido:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "Seqüência" +msgstr "Sequência" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "Renomear pasta:" +msgstr "em ordem:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Steps" -msgstr "Passo" +msgstr "Passos" #: modules/visual_script/visual_script_flow_control.cpp msgid "Switch" @@ -18110,17 +18087,16 @@ msgstr "Tipo de Projeção" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "É %s?" #: modules/visual_script/visual_script_flow_control.cpp #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Base Script" -msgstr "Novo Script" +msgstr "Script Base" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "Em %s" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -18129,59 +18105,53 @@ msgstr "Self" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Call Mode" -msgstr "Modo de Escalonamento" +msgstr "Modo de Chamada" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Type" -msgstr "Mudar Tipo Base" +msgstr "Tipo Base" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Node Path" -msgstr "Copiar Caminho do Nó" +msgstr "Caminho do Nó" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Use Default Args" -msgstr "Redefinir para o padrão" +msgstr "Usar Argumentos Padrão" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Validate" msgstr "Validar" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "RPC Call Mode" -msgstr "Modo de Escalonamento" +msgstr "Modo de Chamada RPC" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Subtract %s" -msgstr "Para caractere %s" +msgstr "Subtrair %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "Multiplicar %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "Dividir %s" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy msgid "Mod %s" -msgstr "Adicionar %s" +msgstr "Mod %s" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy msgid "ShiftLeft %s" -msgstr "Conjunto %s" +msgstr "ShiftLeft %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" @@ -18190,7 +18160,7 @@ msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy msgid "BitAnd %s" -msgstr "Adicionar %s" +msgstr "BitAnd %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" @@ -18208,7 +18178,7 @@ msgstr "Modo de Seleção" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy msgid "Assign Op" -msgstr "Atribuir" +msgstr "Atribuir Op" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -18225,23 +18195,20 @@ msgid "Base object is not a Node!" msgstr "Objeto base não é um Nó!" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Path does not lead to Node!" -msgstr "Caminho não leva a um Nó!" +msgstr "Caminho não leva ao Nó!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." msgstr "Nome de propriedade '%s' inválido no nó %s." #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Emit %s" -msgstr "Conjunto %s" +msgstr "Emitir %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Compose Array" -msgstr "Redimensionar Vetor" +msgstr "Compôr Vetor" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp @@ -18261,9 +18228,8 @@ msgid "a if cond, else b" msgstr "" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Var Name" -msgstr "Nome" +msgstr "Nome da Variável" #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script:" @@ -18274,64 +18240,53 @@ msgid "VariableSet not found in script:" msgstr "VariableSet não encontrado no script:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Preload" -msgstr "Recarregar" +msgstr "Pré Carregar" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Index" -msgstr "Ãndice Z" +msgstr "Obter Ãndice" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Index" -msgstr "Ãndice Z" +msgstr "Definir Ãndice" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Global Constant" -msgstr "Constante" +msgstr "Constante Global" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Class Constant" -msgstr "Constante" +msgstr "Classe Constante" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Constant" -msgstr "Constante" +msgstr "Constante Básica" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Math Constant" -msgstr "Constante" +msgstr "Constante Matemática" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Engine Singleton" -msgstr "Singleton GDNative ativado" +msgstr "Obter Singleton da Engine" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Node" -msgstr "Nó TimeSeek" +msgstr "Obter Nó da Cena" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Scene Tree" -msgstr "Edição da Ãrvore de Cena" +msgstr "Obter Ãrvore de Cenas" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Self" -msgstr "Self" +msgstr "Obter Sà Mesmo" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "CustomNode" -msgstr "Recortar Nós" +msgstr "CustomNode" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -18350,35 +18305,31 @@ msgstr "" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "SubCall" -msgstr "Chamadas" +msgstr "SubCall" #: modules/visual_script/visual_script_nodes.cpp scene/gui/graph_node.cpp msgid "Title" msgstr "TÃtulo" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "Constantes" +msgstr "Construir %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Local Var" -msgstr "Usar Espaço Local" +msgstr "Obter Variável Local" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Local Var" -msgstr "Usar Espaço Local" +msgstr "Definir Variável Local" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Action %s" -msgstr "Ação" +msgstr "Ação %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "Desconstruir %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -18386,45 +18337,42 @@ msgstr "Buscar VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Yield" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" msgstr "Esperar" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Frame" -msgstr "Mover Quadro" +msgstr "Próximo Quadro" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Next Physics Frame" -msgstr "Frame de FÃsica %" +msgstr "Próximo Quadro de FÃsica" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s s" #: modules/visual_script/visual_script_yield_nodes.cpp scene/main/timer.cpp -#, fuzzy msgid "Wait Time" -msgstr "Pintar Tile" +msgstr "Tempo de Espera" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy msgid "WaitSignal" -msgstr "Sinal" +msgstr "WaitSignal" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy msgid "WaitNodeSignal" -msgstr "Sinal" +msgstr "WaitNodeSignal" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy msgid "WaitInstanceSignal" -msgstr "Instância" +msgstr "WaitInstanceSignal" #: modules/webrtc/webrtc_data_channel.cpp #, fuzzy @@ -18442,57 +18390,51 @@ msgstr "Tamanho do buffer do Ãndice do polÃgono da tela (KB)" #: modules/websocket/websocket_client.cpp msgid "Verify SSL" -msgstr "" +msgstr "Verificar SSL" #: modules/websocket/websocket_client.cpp msgid "Trusted SSL Certificate" -msgstr "" +msgstr "Certificados SSL Confiáveis" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "WebSocket Client" -msgstr "Perfis de rede" +msgstr "Cliente WebSocket" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "Max In Buffer (KB)" -msgstr "Tamanho Máximo (KB)" +msgstr "Buffer de Entrada Máximo (KB)" #: modules/websocket/websocket_macros.h msgid "Max In Packets" -msgstr "" +msgstr "Máximo de Pacotes de Entrada" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "Max Out Buffer (KB)" -msgstr "Tamanho Máximo (KB)" +msgstr "Buffer de SaÃda Máximo (KB)" #: modules/websocket/websocket_macros.h msgid "Max Out Packets" -msgstr "" +msgstr "Máximo de Pacotes de SaÃda" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "WebSocket Server" -msgstr "Perfis de rede" +msgstr "Servidor WebSocket" #: modules/websocket/websocket_server.cpp msgid "Bind IP" msgstr "" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "Private Key" -msgstr "Caminho da chave privada SSH" +msgstr "Chave Privada" #: modules/websocket/websocket_server.cpp platform/javascript/export/export.cpp msgid "SSL Certificate" -msgstr "" +msgstr "Certificado SSL" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "CA Chain" -msgstr "Limpar Cadeia de IK" +msgstr "Cadeia CA" #: modules/websocket/websocket_server.cpp msgid "Handshake Timeout" @@ -18520,9 +18462,8 @@ msgid "Reference Space Type" msgstr "" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Visibility State" -msgstr "Alternar Visibilidade" +msgstr "Estado de Visibilidade" #: modules/webxr/webxr_interface.cpp #, fuzzy @@ -18536,7 +18477,7 @@ msgstr "Encaixe inteligente" #: platform/android/export/export.cpp msgid "Android SDK Path" -msgstr "" +msgstr "Caminho para SDK Android" #: platform/android/export/export.cpp #, fuzzy @@ -18557,23 +18498,23 @@ msgstr "" #: platform/android/export/export.cpp msgid "Shutdown ADB On Exit" -msgstr "" +msgstr "Desligar ADB Quando Sair" #: platform/android/export/export_plugin.cpp msgid "Launcher Icons" -msgstr "" +msgstr "Ãcones do Iniciador" #: platform/android/export/export_plugin.cpp msgid "Main 192 X 192" -msgstr "" +msgstr "Principal 192 X 192" #: platform/android/export/export_plugin.cpp msgid "Adaptive Foreground 432 X 432" -msgstr "" +msgstr "Primeiro Plano Adaptável 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Adaptive Background 432 X 432" -msgstr "" +msgstr "Fundo Adaptável 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -18613,23 +18554,20 @@ msgid "Use Custom Build" msgstr "Usar Diretório de Usuário Personalizado" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Export Format" -msgstr "Caminho de Exportação" +msgstr "Exportar Formato" #: platform/android/export/export_plugin.cpp msgid "Min SDK" msgstr "SDK MÃnimo" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Target SDK" -msgstr "FPS alvo" +msgstr "SDK Alvo" #: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp -#, fuzzy msgid "Architectures" -msgstr "Arquitetura" +msgstr "Arquiteturas" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18658,30 +18596,27 @@ msgstr "Senha" #: platform/android/export/export_plugin.cpp msgid "One Click Deploy" -msgstr "" +msgstr "Um Clique Implantar" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Clear Previous Install" -msgstr "Inspecionar a Instância Anterior" +msgstr "Limpar Instalação Anterior" #: platform/android/export/export_plugin.cpp msgid "Code" msgstr "Código" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Package" -msgstr "Empacotando" +msgstr "Pacote" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Unique Name" msgstr "Nome Único" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signed" -msgstr "Sinal" +msgstr "Assinado" #: platform/android/export/export_plugin.cpp msgid "Classify As Game" @@ -18689,12 +18624,11 @@ msgstr "Classificar como Jogo" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" -msgstr "" +msgstr "Manter Dados ao Desinstalar" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exclude From Recents" -msgstr "Excluir Nós" +msgstr "Excluir de Recentes" #: platform/android/export/export_plugin.cpp msgid "Graphics" @@ -18706,14 +18640,12 @@ msgid "OpenGL Debug" msgstr "Abrir" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "XR Features" -msgstr "Funcionalidades" +msgstr "Funcionalidades XR" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "XR Mode" -msgstr "Modo Panorâmico" +msgstr "Modo XR" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18722,16 +18654,15 @@ msgstr "Empacotando" #: platform/android/export/export_plugin.cpp msgid "Hand Tracking Frequency" -msgstr "" +msgstr "Frequência de Rastreamento de Mão" #: platform/android/export/export_plugin.cpp msgid "Passthrough" -msgstr "" +msgstr "Atravessar" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Immersive Mode" -msgstr "Modo Prioridade" +msgstr "Modo Imersivo" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18754,18 +18685,16 @@ msgid "Support Xlarge" msgstr "Suporte" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "User Data Backup" -msgstr "Interface de Usuário" +msgstr "Backup de Dados do Usuário" #: platform/android/export/export_plugin.cpp msgid "Allow" msgstr "Permitir" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Command Line" -msgstr "Command" +msgstr "Linha de Comando" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Extra Args" @@ -18781,19 +18710,16 @@ msgid "Salt" msgstr "Sal" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Public Key" -msgstr "Caminho da chave pública SSH" +msgstr "Chave Pública" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Permissions" -msgstr "Máscara de Emissão" +msgstr "Permissões" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Custom Permissions" -msgstr "Rodar Outra Cena" +msgstr "Permissões Personalizadas" #: platform/android/export/export_plugin.cpp msgid "Select device from the list" @@ -18912,6 +18838,11 @@ msgid "" "Note that the singleton was also renamed from \"GodotPayments\" to " "\"GodotGooglePlayBilling\"." msgstr "" +"Módulo \"GodotPaymentV3\" inválido incluÃdo na configuração do projeto " +"\"android/modules\" (alterado no Godot 3.2.2).\n" +"Substitua-o pelo plug-in \"GodotGooglePlayBilling\" original.\n" +"Observe que o singleton também foi renomeado de \"GodotPayments\" para " +"\"GodotGooglePlayBilling\"." #: platform/android/export/export_plugin.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." @@ -18950,12 +18881,16 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"\"Min SDK\" deve ser um número inteiro válido, mas obteve \"%s\" que é " +"inválido." #: platform/android/export/export_plugin.cpp msgid "" "\"Min SDK\" cannot be lower than %d, which is the version needed by the " "Godot library." msgstr "" +"\"Min SDK\" não pode ser inferior a %d, que é a versão necessária para a " +"biblioteca Godot." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18969,12 +18904,16 @@ msgstr "" msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"\"Target SDK\" deve ser um número inteiro válido, mas obteve \"%s\", que é " +"inválido." #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." msgstr "" +"\"Target SDK\" %d é superior à versão padrão %d. Isso pode funcionar, mas " +"não foi testado e pode ser instável." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18985,9 +18924,8 @@ msgstr "" #: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Code Signing" -msgstr "Sinal" +msgstr "Assinatura de Código" #: platform/android/export/export_plugin.cpp msgid "" @@ -19065,12 +19003,11 @@ msgstr "" "'Projeto'." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" "Incapaz de sobrescrever os arquivos res://android/build/res/*.xml com o nome " -"do projeto" +"do projeto." #: platform/android/export/export_plugin.cpp msgid "Could not export project files to gradle project." @@ -19246,30 +19183,25 @@ msgid "Identifier" msgstr "Identificador" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Signature" -msgstr "Sinal" +msgstr "Assinatura" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Short Version" -msgstr "Versão" +msgstr "Versão Curta" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Copyright" -msgstr "Superior Direita" +msgstr "Direitos Autorais" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Capabilities" -msgstr "Colar Propriedades" +msgstr "Capacidades" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Access Wi-Fi" -msgstr "Acesso" +msgstr "Acessar Wi-Fi" #: platform/iphone/export/export.cpp msgid "Push Notifications" @@ -19288,19 +19220,16 @@ msgid "Accessible From iTunes Sharing" msgstr "" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Privacy" -msgstr "Caminho da chave privada SSH" +msgstr "Privacidade" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Camera Usage Description" -msgstr "Descrição" +msgstr "Descrição do Uso da Câmera" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Microphone Usage Description" -msgstr "Descrições da Propriedade" +msgstr "Descrição do Uso do Microfone" #: platform/iphone/export/export.cpp #, fuzzy @@ -19329,7 +19258,7 @@ msgstr "iPad 167 X 167" #: platform/iphone/export/export.cpp msgid "App Store 1024 X 1024" -msgstr "" +msgstr "Apple Store 1024 X 1024" #: platform/iphone/export/export.cpp msgid "Spotlight 40 X 40" @@ -19348,9 +19277,8 @@ msgid "Use Launch Screen Storyboard" msgstr "" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Image Scale Mode" -msgstr "Modo de Escalonamento" +msgstr "Modo de Escalonamento de Imagem" #: platform/iphone/export/export.cpp #, fuzzy @@ -19363,25 +19291,26 @@ msgid "Custom Image @3x" msgstr "Recortar Nós" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Use Custom BG Color" -msgstr "Recortar Nós" +msgstr "Usar Cor Personalizada de Fundo" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Custom BG Color" -msgstr "Recortar Nós" +msgstr "Cor Personalizada de Fundo" + +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Exportar Ãcone" #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Prepare Templates" -msgstr "Gerenciar Templates" +msgstr "Preparar Templates" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Export template not found." -msgstr "Template customizado de release não encontrado." +msgstr "Template exportado não encontrado." #: platform/iphone/export/export.cpp msgid "App Store Team ID not specified - cannot configure the project." @@ -19417,9 +19346,8 @@ msgid "Could not write file: \"%s\"." msgstr "Não foi possÃvel escrever o arquivo: \"%s\"." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Icon Creation" -msgstr "Definir Margem" +msgstr "Criação de Ãcone" #: platform/javascript/export/export.cpp msgid "Could not read file: \"%s\"." @@ -19434,9 +19362,8 @@ msgid "Variant" msgstr "Variante" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Export Type" -msgstr "Exportação" +msgstr "Tipo de Exportação" #: platform/javascript/export/export.cpp #, fuzzy @@ -19456,9 +19383,8 @@ msgid "HTML" msgstr "HTML" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Export Icon" -msgstr "Expandir Tudo" +msgstr "Exportar Ãcone" #: platform/javascript/export/export.cpp #, fuzzy @@ -19474,14 +19400,12 @@ msgid "Canvas Resize Policy" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Focus Canvas On Start" msgstr "Focar Canvas ao Iniciar" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Experimental Virtual Keyboard" -msgstr "Filtrar sinais" +msgstr "Teclado Virtual Experimental" #: platform/javascript/export/export.cpp msgid "Progressive Web App" @@ -19493,15 +19417,15 @@ msgstr "Página Offline" #: platform/javascript/export/export.cpp msgid "Icon 144 X 144" -msgstr "" +msgstr "Ãcone 144 X 144" #: platform/javascript/export/export.cpp msgid "Icon 180 X 180" -msgstr "" +msgstr "Ãcone 180 X 180" #: platform/javascript/export/export.cpp msgid "Icon 512 X 512" -msgstr "" +msgstr "Ãcone 512 X 512" #: platform/javascript/export/export.cpp msgid "Could not read HTML shell: \"%s\"." @@ -19521,16 +19445,15 @@ msgstr "Web" #: platform/javascript/export/export.cpp msgid "HTTP Host" -msgstr "" +msgstr "Host HTTP" #: platform/javascript/export/export.cpp msgid "HTTP Port" -msgstr "" +msgstr "Porta HTTP" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Use SSL" -msgstr "Use Encaixar" +msgstr "Usar SSL" #: platform/javascript/export/export.cpp msgid "SSL Key" @@ -19538,7 +19461,7 @@ msgstr "Chave SSL" #: platform/osx/export/codesign.cpp msgid "Can't get filesystem access." -msgstr "" +msgstr "Não conseguiu acesso ao sistema de arquivos." #: platform/osx/export/codesign.cpp msgid "Failed to get Info.plist hash." @@ -19559,27 +19482,24 @@ msgid "Invalid Info.plist, can't load." msgstr "Geometria inválida, não é possÃvel criar o polÃgono." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Failed to create \"%s\" subfolder." -msgstr "Não foi possÃvel criar a pasta." +msgstr "Falha ao criar sub-pasta \"%s\"." #: platform/osx/export/codesign.cpp msgid "Failed to extract thin binary." msgstr "" #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Invalid binary format." -msgstr "Caminho base inválido." +msgstr "Formato de binário inválido." #: platform/osx/export/codesign.cpp msgid "Already signed!" msgstr "Já assinado!" #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Failed to process nested resources." -msgstr "Falha ao carregar recurso." +msgstr "Falha ao processar recursos aninhados." #: platform/osx/export/codesign.cpp msgid "Failed to create _CodeSignature subfolder." @@ -19596,9 +19516,8 @@ msgid "Invalid entitlements file." msgstr "Extensão inválida." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Invalid executable file." -msgstr "Extensão inválida." +msgstr "Arquivo executável inválido." #: platform/osx/export/codesign.cpp msgid "Can't resize signature load command." @@ -19625,37 +19544,32 @@ msgid "High Res" msgstr "Alta Resolução" #: platform/osx/export/export.cpp -#, fuzzy msgid "Location Usage Description" -msgstr "Descrição" +msgstr "Descrição do Uso da Localização" #: platform/osx/export/export.cpp msgid "Address Book Usage Description" -msgstr "" +msgstr "Descrição do Uso dos Contatos" #: platform/osx/export/export.cpp -#, fuzzy msgid "Calendar Usage Description" -msgstr "Descrição" +msgstr "Descrição do Uso do Calendário" #: platform/osx/export/export.cpp -#, fuzzy msgid "Photos Library Usage Description" -msgstr "Descrições da Propriedade" +msgstr "Descrição do Uso da Biblioteca de Fotos" #: platform/osx/export/export.cpp -#, fuzzy msgid "Desktop Folder Usage Description" -msgstr "Descrições do Método" +msgstr "Descrição do Uso da Pasta da Ãrea de Trabalho" #: platform/osx/export/export.cpp -#, fuzzy msgid "Documents Folder Usage Description" -msgstr "Descrições do Método" +msgstr "Descrição do Uso da Pasta de Documentos" #: platform/osx/export/export.cpp msgid "Downloads Folder Usage Description" -msgstr "" +msgstr "Descrição do Uso da Pasta de Downloads" #: platform/osx/export/export.cpp msgid "Network Volumes Usage Description" @@ -19672,23 +19586,20 @@ msgstr "Nós" #: platform/osx/export/export.cpp platform/uwp/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Identity" -msgstr "Recuar Esquerda" +msgstr "Identidade" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Timestamp" -msgstr "Tempo" +msgstr "Registro do Tempo" #: platform/osx/export/export.cpp msgid "Hardened Runtime" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Replace Existing Signature" -msgstr "Substituir em Arquivos" +msgstr "Substituir Assinatura Existente" #: platform/osx/export/export.cpp #, fuzzy @@ -19696,9 +19607,8 @@ msgid "Entitlements" msgstr "Gizmos" #: platform/osx/export/export.cpp -#, fuzzy msgid "Custom File" -msgstr "Recortar Nós" +msgstr "Arquivo Personalizado" #: platform/osx/export/export.cpp msgid "Allow JIT Code Execution" @@ -19713,14 +19623,12 @@ msgid "Allow Dyld Environment Variables" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Disable Library Validation" -msgstr "Botão Desativado" +msgstr "Desativar Validação da Biblioteca" #: platform/osx/export/export.cpp -#, fuzzy msgid "Audio Input" -msgstr "Adicionar Entrada" +msgstr "Entrada de Ãudio" #: platform/osx/export/export.cpp msgid "Address Book" @@ -19731,17 +19639,14 @@ msgid "Calendars" msgstr "Calendários" #: platform/osx/export/export.cpp -#, fuzzy msgid "Photos Library" -msgstr "Exportar Biblioteca" +msgstr "Biblioteca de Fotos" #: platform/osx/export/export.cpp -#, fuzzy msgid "Apple Events" -msgstr "Adicionar VEvento" +msgstr "Eventos Apple" #: platform/osx/export/export.cpp -#, fuzzy msgid "Debugging" msgstr "Depuração" @@ -19750,28 +19655,24 @@ msgid "App Sandbox" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Network Server" -msgstr "Perfis de rede" +msgstr "Servidor de Rede" #: platform/osx/export/export.cpp -#, fuzzy msgid "Network Client" -msgstr "Perfis de rede" +msgstr "Cliente de Rede" #: platform/osx/export/export.cpp -#, fuzzy msgid "Device USB" -msgstr "Dispositivo" +msgstr "Dispositivo USB" #: platform/osx/export/export.cpp msgid "Device Bluetooth" msgstr "Bluetooth do Dispositivo" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Downloads" -msgstr "Baixar" +msgstr "Download de Arquivos" #: platform/osx/export/export.cpp #, fuzzy @@ -19789,9 +19690,8 @@ msgid "Files Movies" msgstr "Filtros do tile" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Custom Options" -msgstr "Opções do canal" +msgstr "Opções Personalizadas" #: platform/osx/export/export.cpp #, fuzzy @@ -19800,7 +19700,7 @@ msgstr "Localização" #: platform/osx/export/export.cpp msgid "Apple ID Name" -msgstr "" +msgstr "Nome Apple ID" #: platform/osx/export/export.cpp #, fuzzy @@ -19809,7 +19709,7 @@ msgstr "Senha" #: platform/osx/export/export.cpp msgid "Apple Team ID" -msgstr "" +msgstr "ID Apple Team" #: platform/osx/export/export.cpp msgid "Could not open icon file \"%s\"." @@ -19873,23 +19773,20 @@ msgstr "" "utilidades de linha de comando do Xcode estão instaladas." #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "No identity found." -msgstr "Ãcones não encontrados." +msgstr "Nenhuma identidade encontrada." #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "Erro ao salvar o arquivo: %s" +msgstr "Erro ao assinar arquivo %s." #: platform/osx/export/export.cpp msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "DMG Creation" -msgstr "Direções" +msgstr "Criação de DMG" #: platform/osx/export/export.cpp msgid "Could not start hdiutil executable." @@ -19897,11 +19794,11 @@ msgstr "Não foi possÃvel iniciar o executável hdiutil." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." -msgstr "" +msgstr "`hdiutil create` falhou - arquivo existe." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed." -msgstr "" +msgstr "`hdiutil create` falhou." #: platform/osx/export/export.cpp #, fuzzy @@ -19966,9 +19863,8 @@ msgid "Sending archive for notarization" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "ZIP Creation" -msgstr "Projeção" +msgstr "Criação de ZIP" #: platform/osx/export/export.cpp msgid "Could not open file to read from path \"%s\"." @@ -20023,6 +19919,8 @@ msgid "" "Warning: Notarization is disabled. The exported project will be blocked by " "Gatekeeper if it's downloaded from an unknown source." msgstr "" +"Aviso: Notarização está desativada. O projeto exportado será bloqueado pelo " +"Gatekeeper se for baixado de uma fonte desconhecida." #: platform/osx/export/export.cpp msgid "" @@ -20106,9 +20004,8 @@ msgid "Architecture" msgstr "Arquitetura" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Display Name" -msgstr "Exibir Tudo" +msgstr "Nome de Exibição" #: platform/uwp/export/export.cpp msgid "Short Name" @@ -20137,9 +20034,8 @@ msgid "Signing" msgstr "Sinal" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Certificate" -msgstr "Certificados" +msgstr "Certificado" #: platform/uwp/export/export.cpp msgid "Algorithm" @@ -20167,9 +20063,8 @@ msgid "Landscape" msgstr "Paisagem" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Portrait" -msgstr "Inverter Horizontalmente" +msgstr "Retrato" #: platform/uwp/export/export.cpp msgid "Landscape Flipped" @@ -20186,19 +20081,19 @@ msgstr "Modo de Escalonamento" #: platform/uwp/export/export.cpp msgid "Square 44 X 44 Logo" -msgstr "" +msgstr "Logo Quadrada 44 X 44" #: platform/uwp/export/export.cpp msgid "Square 71 X 71 Logo" -msgstr "" +msgstr "Logo Quadrada 71 X 71" #: platform/uwp/export/export.cpp msgid "Square 150 X 150 Logo" -msgstr "" +msgstr "Logo Quadrada 150 X 150" #: platform/uwp/export/export.cpp msgid "Square 310 X 310 Logo" -msgstr "" +msgstr "Logo Quadrada 310 X 310" #: platform/uwp/export/export.cpp msgid "Wide 310 X 150 Logo" @@ -20209,9 +20104,8 @@ msgid "Splash Screen" msgstr "Tela de Abertura" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Tiles" -msgstr "Arquivo" +msgstr "Tiles" #: platform/uwp/export/export.cpp msgid "Show Name On Square 150 X 150" @@ -20226,6 +20120,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Nome de pacote inválido." @@ -20291,9 +20191,8 @@ msgid "Debug Certificate" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Debug Algorithm" -msgstr "Depurador" +msgstr "Algoritmo de Depuração" #: platform/windows/export/export.cpp msgid "Failed to rename temporary file \"%s\"." @@ -20314,14 +20213,12 @@ msgid "Digest Algorithm" msgstr "Depurador" #: platform/windows/export/export.cpp -#, fuzzy msgid "Modify Resources" -msgstr "Copiar Recurso" +msgstr "Modificar Recursos" #: platform/windows/export/export.cpp -#, fuzzy msgid "File Version" -msgstr "Versão" +msgstr "Versão do Arquivo" #: platform/windows/export/export.cpp msgid "Product Version" @@ -20336,18 +20233,16 @@ msgid "Product Name" msgstr "Nome do Produto" #: platform/windows/export/export.cpp -#, fuzzy msgid "File Description" -msgstr "Descrição" +msgstr "Descrição do Arquivo" #: platform/windows/export/export.cpp msgid "Trademarks" msgstr "Marca Registrada (Trademarks)" #: platform/windows/export/export.cpp -#, fuzzy msgid "Resources Modification" -msgstr "Notificações Push" +msgstr "Modificações dos Recursos" #: platform/windows/export/export.cpp #, fuzzy @@ -20426,7 +20321,7 @@ msgstr "Versão de produto inválida:" #: platform/windows/export/export.cpp msgid "Windows executables cannot be >= 4 GiB." -msgstr "" +msgstr "Executáveis Windows não podem ser >= 4GiB." #: platform/windows/export/export.cpp platform/x11/export/export.cpp #, fuzzy @@ -20438,13 +20333,13 @@ msgid "Executable file header corrupted." msgstr "" #: platform/windows/export/export.cpp platform/x11/export/export.cpp +#, fuzzy msgid "Executable \"pck\" section not found." -msgstr "" +msgstr "Executável seção \"pck\" não encontrado." #: platform/windows/export/export.cpp -#, fuzzy msgid "Windows" -msgstr "Nova Janela" +msgstr "Windows" #: platform/windows/export/export.cpp msgid "Rcedit" @@ -20456,7 +20351,7 @@ msgstr "" #: platform/windows/export/export.cpp msgid "Wine" -msgstr "" +msgstr "Wine" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." @@ -20464,9 +20359,8 @@ msgstr "" #: scene/2d/animated_sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Frames" -msgstr "Frame %" +msgstr "Quadros" #: scene/2d/animated_sprite.cpp msgid "" @@ -20478,21 +20372,18 @@ msgstr "" #: scene/2d/animated_sprite.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Speed Scale" -msgstr "Escala" +msgstr "Escalonamento da Velocidade" #: scene/2d/animated_sprite.cpp scene/2d/audio_stream_player_2d.cpp #: scene/3d/audio_stream_player_3d.cpp scene/3d/sprite_3d.cpp #: scene/audio/audio_stream_player.cpp -#, fuzzy msgid "Playing" -msgstr "Rodar" +msgstr "Rodando" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp -#, fuzzy msgid "Centered" -msgstr "Centro" +msgstr "Centralizado" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp @@ -20505,14 +20396,12 @@ msgid "Flip V" msgstr "" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Monitoring" -msgstr "Monitor" +msgstr "Monitorando" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Monitorable" -msgstr "Monitor" +msgstr "Monitorável" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20525,9 +20414,8 @@ msgid "Space Override" msgstr "Sobrescreve" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Gravity Point" -msgstr "Gerar Pontos" +msgstr "Ponto de Gravidade" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20554,38 +20442,33 @@ msgid "Angular Damp" msgstr "" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Audio Bus" -msgstr "Adicionar Canal de Ãudio" +msgstr "Canal de Ãudio" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Override" -msgstr "Sobrescreve" +msgstr "Sobrescrever" #: scene/2d/audio_stream_player_2d.cpp scene/audio/audio_stream_player.cpp #: scene/gui/video_player.cpp servers/audio/effects/audio_effect_amplify.cpp -#, fuzzy msgid "Volume dB" -msgstr "Volume" +msgstr "Volume dB (decibéis)" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp #: servers/audio/effects/audio_effect_pitch_shift.cpp -#, fuzzy msgid "Pitch Scale" -msgstr "Escala" +msgstr "Escalonamento de Pitch" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Autoplay" -msgstr "Alternar InÃcio Automático" +msgstr "Rodar automaticamente" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp msgid "Stream Paused" -msgstr "" +msgstr "Fluxo Pausado" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/3d/light.cpp scene/3d/reflection_probe.cpp @@ -20601,23 +20484,20 @@ msgstr "Animação" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Bus" -msgstr "Adicionar Canal" +msgstr "Canal" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp msgid "Area Mask" msgstr "" #: scene/2d/back_buffer_copy.cpp -#, fuzzy msgid "Copy Mode" -msgstr "Copiar Nós" +msgstr "Mode de Cópia" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Anchor Mode" -msgstr "Modo Ãcone" +msgstr "Modo de Âncora" #: scene/2d/camera_2d.cpp msgid "Rotating" @@ -20629,9 +20509,8 @@ msgid "Current" msgstr "Atual" #: scene/2d/camera_2d.cpp scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom" -msgstr "Ampliar" +msgstr "Zoom" #: scene/2d/camera_2d.cpp scene/main/canvas_layer.cpp #, fuzzy @@ -20651,27 +20530,23 @@ msgstr "Limite" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp -#, fuzzy msgid "Left" -msgstr "Esquerda (UI)" +msgstr "Esquerda" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp -#, fuzzy msgid "Right" -msgstr "Luz" +msgstr "Direita" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/dynamic_font.cpp scene/resources/style_box.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Bottom" -msgstr "Inferior Esquerda" +msgstr "Embaixo" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Smoothed" -msgstr "Passo suave" +msgstr "Suavizado" #: scene/2d/camera_2d.cpp #, fuzzy @@ -20689,9 +20564,8 @@ msgid "Drag Margin V Enabled" msgstr "Definir Margem" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Smoothing" -msgstr "Passo suave" +msgstr "Suavizamento" #: scene/2d/camera_2d.cpp msgid "H" @@ -20732,9 +20606,8 @@ msgid "Light Mode" msgstr "Largura Direita" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Particles Animation" -msgstr "PartÃculas" +msgstr "Animação de PartÃculas" #: scene/2d/canvas_item.cpp msgid "Particles Anim H Frames" @@ -20750,15 +20623,13 @@ msgid "Particles Anim Loop" msgstr "PartÃculas" #: scene/2d/canvas_item.cpp scene/3d/spatial.cpp -#, fuzzy msgid "Visibility" -msgstr "Alternar Visibilidade" +msgstr "Visibilidade" #: scene/2d/canvas_item.cpp scene/3d/spatial.cpp scene/gui/progress_bar.cpp #: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp -#, fuzzy msgid "Visible" -msgstr "Alternar Visibilidade" +msgstr "VisÃvel" #: scene/2d/canvas_item.cpp #, fuzzy @@ -20767,22 +20638,20 @@ msgstr "Popular" #: scene/2d/canvas_item.cpp msgid "Show Behind Parent" -msgstr "" +msgstr "Mostrar Atrás do Pai" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Show On Top" -msgstr "Mostrar Origem" +msgstr "Mostrar Em Cima" #: scene/2d/canvas_item.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp -#, fuzzy msgid "Light Mask" -msgstr "Luz" +msgstr "Máscara de Luz" #: scene/2d/canvas_item.cpp msgid "Use Parent Material" -msgstr "" +msgstr "Usar Material do Pai" #: scene/2d/canvas_modulate.cpp msgid "" @@ -20805,9 +20674,8 @@ msgstr "" "para definir sua forma." #: scene/2d/collision_object_2d.cpp -#, fuzzy msgid "Pickable" -msgstr "Escolher Tile" +msgstr "Pegável" #: scene/2d/collision_polygon_2d.cpp msgid "" @@ -20849,9 +20717,8 @@ msgstr "Modo de Régua" #: scene/3d/collision_polygon.cpp scene/3d/collision_shape.cpp #: scene/animation/animation_node_state_machine.cpp scene/gui/base_button.cpp #: scene/gui/texture_button.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Disabled" -msgstr "Item Desativado" +msgstr "Desativado" #: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp #, fuzzy @@ -20935,9 +20802,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Fixed FPS" -msgstr "Ver FPS" +msgstr "FPS Fixado" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -20951,9 +20817,8 @@ msgstr "Desenhando" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Local Coords" -msgstr "Projetos Locais" +msgstr "Coordenadas Locais" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -20962,9 +20827,8 @@ msgstr "Ordem de Desenho" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Emission Shape" -msgstr "Máscara de Emissão" +msgstr "Forma de Emissão" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20977,9 +20841,8 @@ msgid "Rect Extents" msgstr "Gizmos" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Normals" -msgstr "Formato" +msgstr "Normais" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20989,9 +20852,8 @@ msgstr "Atribuir" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Direction" -msgstr "Direções" +msgstr "Direção" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21001,15 +20863,13 @@ msgstr "Espalhar" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Initial Velocity" -msgstr "Inicializar" +msgstr "Velocidade Inicial" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity Random" -msgstr "Velocidade" +msgstr "Velocidade Aleatória" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp @@ -21019,48 +20879,43 @@ msgstr "Velocidade Angular" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity Curve" -msgstr "Velocidade" +msgstr "Curva de Velocidade" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Orbit Velocity" -msgstr "Orbitar Visão para a Direita" +msgstr "Velocidade Orbital" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Linear Accel" -msgstr "Linear" +msgstr "Aceleração Linear" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Accel" -msgstr "Acesso" +msgstr "Aceleração" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Accel Random" -msgstr "" +msgstr "Aceleração Aleatória" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Accel Curve" -msgstr "Dvidir Curva" +msgstr "Curva de Aceleração" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Radial Accel" -msgstr "" +msgstr "Aceleração Radial" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Tangential Accel" -msgstr "" +msgstr "Aceleração Tangencial" #: scene/2d/cpu_particles_2d.cpp scene/2d/joints_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/physics_body.cpp @@ -21089,13 +20944,12 @@ msgstr "Ângulo" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Angle Random" -msgstr "" +msgstr "Ângulo Aleatório" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Angle Curve" -msgstr "Fechar Curva" +msgstr "Curva do Ângulo" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Scale Amount" @@ -21143,15 +20997,13 @@ msgstr "Curva de Variação" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed Random" -msgstr "Escala" +msgstr "Velocidade Aleatória" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed Curve" -msgstr "Dvidir Curva" +msgstr "Curva de Velocidade" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21199,9 +21051,8 @@ msgid "Bias" msgstr "" #: scene/2d/joints_2d.cpp -#, fuzzy msgid "Disable Collision" -msgstr "Botão Desativado" +msgstr "Desativar Colisão" #: scene/2d/joints_2d.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Softness" @@ -21238,9 +21089,8 @@ msgid "Editor Only" msgstr "Editor" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Texture Scale" -msgstr "Região da Textura" +msgstr "Escalonamento da Textura" #: scene/2d/light_2d.cpp scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/light.cpp scene/resources/environment.cpp @@ -21271,9 +21121,8 @@ msgid "Item Cull Mask" msgstr "" #: scene/2d/light_2d.cpp scene/3d/light.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Shadow" -msgstr "Shader" +msgstr "Sombra" #: scene/2d/light_2d.cpp #, fuzzy @@ -21281,9 +21130,8 @@ msgid "Buffer Size" msgstr "Visão Traseira" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Gradient Length" -msgstr "Gradiente Editado" +msgstr "Comprimento do Gradiente" #: scene/2d/light_2d.cpp #, fuzzy @@ -21291,9 +21139,8 @@ msgid "Filter Smooth" msgstr "Filtrar métodos" #: scene/2d/light_occluder_2d.cpp -#, fuzzy msgid "Closed" -msgstr "Fechar" +msgstr "Fechado" #: scene/2d/light_occluder_2d.cpp scene/resources/material.cpp #, fuzzy @@ -21313,28 +21160,24 @@ msgstr "" "O polÃgono para este oclusor está vazio. Por favor desenhe um polÃgono." #: scene/2d/line_2d.cpp -#, fuzzy msgid "Width Curve" -msgstr "Dvidir Curva" +msgstr "Largura da Curva" #: scene/2d/line_2d.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Default Color" -msgstr "Padrão" +msgstr "Cor Padrão" #: scene/2d/line_2d.cpp scene/resources/texture.cpp msgid "Fill" msgstr "Preencher" #: scene/2d/line_2d.cpp scene/resources/texture.cpp -#, fuzzy msgid "Gradient" -msgstr "Gradiente Editado" +msgstr "Gradiente" #: scene/2d/line_2d.cpp -#, fuzzy msgid "Texture Mode" -msgstr "Região da Textura" +msgstr "Modo de Textura" #: scene/2d/line_2d.cpp msgid "Capping" @@ -21364,7 +21207,7 @@ msgstr "" #: scene/2d/line_2d.cpp msgid "Round Precision" -msgstr "" +msgstr "Precisão do Arredondamento" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp #: scene/resources/dynamic_font.cpp @@ -21548,7 +21391,6 @@ msgid "Mirroring" msgstr "Espelhar" #: scene/2d/particles_2d.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles2D node instead. You can use the \"Convert to " @@ -21594,9 +21436,8 @@ msgstr "" #: scene/2d/path_2d.cpp scene/3d/path.cpp scene/resources/sky.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Curve" -msgstr "Dvidir Curva" +msgstr "Curva" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -21624,9 +21465,8 @@ msgid "Lookahead" msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/visual_instance.cpp -#, fuzzy msgid "Layers" -msgstr "Camada" +msgstr "Camadas" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Constant Linear Velocity" @@ -21638,9 +21478,8 @@ msgstr "Velocidade Angular Constante" #: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp #: scene/resources/physics_material.cpp -#, fuzzy msgid "Friction" -msgstr "Funções" +msgstr "Fricção" #: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp #: scene/resources/physics_material.cpp @@ -21653,9 +21492,8 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Gravity" -msgstr "Prévia Padrão" +msgstr "Gravidade Padrão" #: scene/2d/physics_body_2d.cpp msgid "" @@ -21676,13 +21514,12 @@ msgid "Inertia" msgstr "Inércia" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Weight" -msgstr "Luz" +msgstr "Peso" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Gravity Scale" -msgstr "" +msgstr "Escala da Gravidade" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Custom Integrator" @@ -21722,7 +21559,7 @@ msgstr "Angular" #: scene/2d/physics_body_2d.cpp msgid "Applied Forces" -msgstr "" +msgstr "Forças Aplicadas" #: scene/2d/physics_body_2d.cpp msgid "Torque" @@ -21750,56 +21587,49 @@ msgstr "Aplicar Velocidade ao Sair" #: scene/3d/physics_body.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp #: scene/resources/line_shape_2d.cpp scene/resources/material.cpp -#, fuzzy msgid "Normal" -msgstr "Formato" +msgstr "Normal" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Remainder" msgstr "Restante" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Local Shape" -msgstr "Localizar" +msgstr "Forma Local" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider" -msgstr "Modo Colisão" +msgstr "Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collider ID" -msgstr "" +msgstr "ID do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider RID" -msgstr "RID inválido" +msgstr "RID do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider Shape" -msgstr "Modo Colisão" +msgstr "Forma do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Collider Shape Index" -msgstr "Modo Colisão" +msgstr "Ãndice da Forma do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider Velocity" -msgstr "Orbitar Visão para a Direita" +msgstr "Velocidade do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Collider Metadata" -msgstr "" +msgstr "Metadados do Colisor" #: scene/2d/polygon_2d.cpp msgid "Invert" @@ -21822,7 +21652,7 @@ msgstr "Gizmos" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Exclude Parent" -msgstr "" +msgstr "Excluir Pai" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp #, fuzzy @@ -21848,14 +21678,12 @@ msgstr "" "funcionar." #: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp -#, fuzzy msgid "Remote Path" -msgstr "Remover Ponto" +msgstr "Remover Caminho" #: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp -#, fuzzy msgid "Use Global Coordinates" -msgstr "Próxima Coordenada" +msgstr "Usar Coordenadas Globais" #: scene/2d/skeleton_2d.cpp scene/3d/skeleton.cpp #, fuzzy @@ -21910,14 +21738,12 @@ msgstr "" "KinematicBody2D, etc. para dar-lhes uma forma." #: scene/2d/tile_map.cpp -#, fuzzy msgid "Tile Set" -msgstr "Conjunto de Telha" +msgstr "Tile Set" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Quadrant Size" -msgstr "Alterar Tamanho da Câmera" +msgstr "Tamanho do Quadrante" #: scene/2d/tile_map.cpp #, fuzzy @@ -21930,9 +21756,8 @@ msgid "Half Offset" msgstr "Inicializar" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Tile Origin" -msgstr "Ver Origem" +msgstr "Origem do Tile" #: scene/2d/tile_map.cpp #, fuzzy @@ -21957,7 +21782,7 @@ msgstr "" #: scene/2d/tile_map.cpp msgid "Use Parent" -msgstr "" +msgstr "Usar Pai" #: scene/2d/tile_map.cpp msgid "Use Kinematic" @@ -21965,20 +21790,19 @@ msgstr "" #: scene/2d/touch_screen_button.cpp msgid "Shape Centered" -msgstr "" +msgstr "Forma Centralizada" #: scene/2d/touch_screen_button.cpp msgid "Shape Visible" -msgstr "" +msgstr "Forma VisÃvel" #: scene/2d/touch_screen_button.cpp msgid "Passby Press" msgstr "" #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Visibility Mode" -msgstr "Modo Prioridade" +msgstr "Modo de Visibilidade" #: scene/2d/visibility_notifier_2d.cpp msgid "" @@ -21989,23 +21813,20 @@ msgstr "" "diretamente como pai." #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp -#, fuzzy msgid "Pause Animations" -msgstr "Colar Animação" +msgstr "Pausar Animações" #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp msgid "Freeze Bodies" -msgstr "" +msgstr "Congelar Corpos" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "Pause Particles" -msgstr "PartÃculas" +msgstr "Pausar PartÃculas" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "Pause Animated Sprites" -msgstr "Colar Animação" +msgstr "Pausar Sprites Animados" #: scene/2d/visibility_notifier_2d.cpp #, fuzzy @@ -22035,7 +21856,7 @@ msgstr "" #: scene/3d/arvr_nodes.cpp servers/arvr/arvr_positional_tracker.cpp msgid "Rumble" -msgstr "" +msgstr "Vibrar" #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent." @@ -22120,14 +21941,12 @@ msgstr "" #: scene/3d/audio_stream_player_3d.cpp #: servers/audio/effects/audio_effect_filter.cpp -#, fuzzy msgid "dB" -msgstr "B" +msgstr "dB" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Doppler" -msgstr "Ativar Doppler" +msgstr "Doppler" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22191,9 +22010,8 @@ msgid "Use HDR" msgstr "Usar HDR" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Use Color" -msgstr "Cores" +msgstr "Usar Cor" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22205,32 +22023,28 @@ msgid "Atlas" msgstr "Atlas" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generate" -msgstr "Geral" +msgstr "Gerar" #: scene/3d/baked_lightmap.cpp msgid "Max Size" msgstr "Tamanho Máximo" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Sky" -msgstr "Recortar Nós" +msgstr "Céu Personalizado" #: scene/3d/baked_lightmap.cpp msgid "Custom Sky Rotation Degrees" msgstr "Graus de Rotação do Céu Personalizados" #: scene/3d/baked_lightmap.cpp scene/3d/ray_cast.cpp -#, fuzzy msgid "Custom Color" -msgstr "Recortar Nós" +msgstr "Cor Personalizada" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Energy" -msgstr "Mover Efeito de Canal" +msgstr "Energia Personalizada" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22406,28 +22220,24 @@ msgid "Ring Axis" msgstr "Avisos" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Rotate Y" -msgstr "Rotacionar" +msgstr "Rotacionar em Y" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Disable Z" -msgstr "Item Desativado" +msgstr "Desativar Z" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp msgid "Flatness" msgstr "" #: scene/3d/cull_instance.cpp servers/visual_server.cpp -#, fuzzy msgid "Portals" -msgstr "Inverter Horizontalmente" +msgstr "Portais" #: scene/3d/cull_instance.cpp -#, fuzzy msgid "Portal Mode" -msgstr "Modo Prioridade" +msgstr "Modo Portal" #: scene/3d/cull_instance.cpp msgid "Include In Bound" @@ -22482,9 +22292,8 @@ msgstr "" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Pixel Size" -msgstr "Snap de Pixel" +msgstr "Tamanho de Pixel" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Billboard" @@ -22505,9 +22314,8 @@ msgid "No Depth Test" msgstr "" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp -#, fuzzy msgid "Fixed Size" -msgstr "Visão Frontal" +msgstr "Tamanho Fixo" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Alpha Cut" @@ -22534,18 +22342,16 @@ msgstr "Forçar Módulo Branco" #: scene/3d/label_3d.cpp scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Font" -msgstr "Fontes" +msgstr "Fonte" #: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp msgid "Horizontal Alignment" msgstr "Alinhamento Horizontal" #: scene/3d/label_3d.cpp -#, fuzzy msgid "Vertical Alignment" -msgstr "Filtrar sinais" +msgstr "Alinhamento Vertical" #: scene/3d/label_3d.cpp scene/gui/dialogs.cpp scene/gui/label.cpp #, fuzzy @@ -22553,9 +22359,8 @@ msgid "Autowrap" msgstr "AutoLoad" #: scene/3d/light.cpp -#, fuzzy msgid "Indirect Energy" -msgstr "Cores de Emissão" +msgstr "Energia Indireta" #: scene/3d/light.cpp msgid "Negative" @@ -22631,7 +22436,7 @@ msgstr "Um SpotLight com um ângulo maior que 90 graus não pode criar sombras." #: scene/3d/light.cpp msgid "Spot" -msgstr "" +msgstr "Ponto" #: scene/3d/light.cpp msgid "Angle Attenuation" @@ -22669,9 +22474,8 @@ msgid "Agent Height Offset" msgstr "" #: scene/3d/navigation_agent.cpp -#, fuzzy msgid "Ignore Y" -msgstr "(Ignore)" +msgstr "Ignorar Y" #: scene/3d/navigation_agent.cpp msgid "" @@ -22679,9 +22483,8 @@ msgid "" msgstr "" #: scene/3d/navigation_mesh_instance.cpp scene/resources/mesh_library.cpp -#, fuzzy msgid "NavMesh" -msgstr "Bake NavMesh" +msgstr "NavMesh" #: scene/3d/navigation_obstacle.cpp msgid "" @@ -22698,7 +22501,6 @@ msgid "Only uniform scales are supported." msgstr "Apenas escalas uniformes são suportadas." #: scene/3d/particles.cpp -#, fuzzy msgid "" "GPU-based particles are not supported by the GLES2 video driver.\n" "Use the CPUParticles node instead. You can use the \"Convert to " @@ -22731,9 +22533,8 @@ msgstr "" "Billboard está definido como \"Particle Billboard\"." #: scene/3d/particles.cpp -#, fuzzy msgid "Visibility AABB" -msgstr "Alternar Visibilidade" +msgstr "Visibilidade AABB" #: scene/3d/particles.cpp msgid "Draw Passes" @@ -22756,7 +22557,6 @@ msgstr "" "no recurso de Curva do Caminho do seu pai." #: scene/3d/path.cpp -#, fuzzy msgid "Rotation Mode" msgstr "Modo de Rotação" @@ -22776,31 +22576,28 @@ msgid "Axis Lock" msgstr "Eixo" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear X" -msgstr "Linear" +msgstr "X Linear" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Y" -msgstr "Linear" +msgstr "Y Linear" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Z" -msgstr "Linear" +msgstr "Z Linear" #: scene/3d/physics_body.cpp msgid "Angular X" -msgstr "" +msgstr "X Angular" #: scene/3d/physics_body.cpp msgid "Angular Y" -msgstr "" +msgstr "Y Angular" #: scene/3d/physics_body.cpp msgid "Angular Z" -msgstr "" +msgstr "Z Angular" #: scene/3d/physics_body.cpp #, fuzzy @@ -22841,9 +22638,8 @@ msgid "Relaxation" msgstr "Relaxamento" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Enabled" -msgstr "Filtrar sinais" +msgstr "Limite Angular Habilitado" #: scene/3d/physics_body.cpp #, fuzzy @@ -22918,9 +22714,8 @@ msgid "Z" msgstr "Z" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Limit Enabled" -msgstr "Linear" +msgstr "Limite Linear Habilitado" #: scene/3d/physics_body.cpp #, fuzzy @@ -22938,9 +22733,8 @@ msgid "Linear Spring Damping" msgstr "Linear" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Equilibrium Point" -msgstr "Linear" +msgstr "Ponto de EquilÃbrio Linear" #: scene/3d/physics_body.cpp #, fuzzy @@ -22964,7 +22758,7 @@ msgstr "Animação" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "ERP" -msgstr "" +msgstr "ERP" #: scene/3d/physics_body.cpp #, fuzzy @@ -22981,7 +22775,7 @@ msgstr "" #: scene/3d/physics_body.cpp msgid "Angular Equilibrium Point" -msgstr "" +msgstr "Ponto de EquilÃbrio Angular" #: scene/3d/physics_body.cpp msgid "Body Offset" @@ -22989,11 +22783,11 @@ msgstr "Deslocamento do Corpo" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" -msgstr "Nó A e Nó B devem ser PhysicsBodys" +msgstr "Nó A e Nó B devem ser PhysicsBodies" #: scene/3d/physics_joint.cpp msgid "Node A must be a PhysicsBody" -msgstr "Nó A deve ser PhysicsBody" +msgstr "Nó A deve ser um PhysicsBody" #: scene/3d/physics_joint.cpp msgid "Node B must be a PhysicsBody" @@ -23005,14 +22799,13 @@ msgstr "A junta não está conectada a nenhum PhysicsBody" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be different PhysicsBodies" -msgstr "Nó A e Nó B devem ser diferente PhysicsBodies" +msgstr "Nó A e Nó B devem ser diferentes PhysicsBodies" #: scene/3d/physics_joint.cpp msgid "Solver" msgstr "" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Exclude Nodes" msgstr "Excluir Nós" @@ -23022,7 +22815,7 @@ msgstr "Parâmetros" #: scene/3d/physics_joint.cpp msgid "Angular Limit" -msgstr "" +msgstr "Limite Angular" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23048,9 +22841,8 @@ msgid "Max Impulse" msgstr "Impulso Máximo" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Limit" -msgstr "Linear" +msgstr "Limite Linear" #: scene/3d/physics_joint.cpp msgid "Upper Distance" @@ -23115,7 +22907,7 @@ msgstr "Linear" #: scene/3d/physics_joint.cpp msgid "Equilibrium Point" -msgstr "" +msgstr "Ponto de EquilÃbrio" #: scene/3d/physics_joint.cpp msgid "Angular Limit X" @@ -23213,9 +23005,8 @@ msgid "Use Default Margin" msgstr "Padrão" #: scene/3d/proximity_group.cpp -#, fuzzy msgid "Group Name" -msgstr "Agrupado" +msgstr "Nome do Grupo" #: scene/3d/proximity_group.cpp msgid "Dispatch Mode" @@ -23249,19 +23040,16 @@ msgid "Box Projection" msgstr "Projeto" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Enable Shadows" -msgstr "Ativar Snap" +msgstr "Habilitar Sombras" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Ambient Color" -msgstr "Escolher Cor" +msgstr "Cor Ambiente" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Ambient Energy" -msgstr "Cores de Emissão" +msgstr "Energia Ambiente" #: scene/3d/reflection_probe.cpp #, fuzzy @@ -23335,7 +23123,7 @@ msgstr "" #: scene/3d/room_manager.cpp msgid "There should only be one RoomManager in the SceneTree." -msgstr "Só Deve existir um RoomManager na SceneTree." +msgstr "Só deve existir um RoomManager na SceneTree." #: scene/3d/room_manager.cpp msgid "Main" @@ -23345,32 +23133,28 @@ msgstr "Principal" #: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp #: scene/animation/animation_tree_player.cpp #: servers/audio/effects/audio_effect_delay.cpp -#, fuzzy msgid "Active" -msgstr "Ação" +msgstr "Ativo" #: scene/3d/room_manager.cpp msgid "Roomlist" msgstr "" #: scene/3d/room_manager.cpp servers/visual_server.cpp -#, fuzzy msgid "PVS" -msgstr "FPS" +msgstr "PVS" #: scene/3d/room_manager.cpp -#, fuzzy msgid "PVS Mode" -msgstr "Modo Panorâmico" +msgstr "Modo PVS" #: scene/3d/room_manager.cpp -#, fuzzy msgid "PVS Filename" -msgstr "Arquivo ZIP" +msgstr "Nome do Arquivo PVS" #: scene/3d/room_manager.cpp servers/visual_server.cpp msgid "Gameplay" -msgstr "" +msgstr "Jogabilidade" #: scene/3d/room_manager.cpp #, fuzzy @@ -23378,19 +23162,16 @@ msgid "Gameplay Monitor" msgstr "Monitor" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Use Secondary PVS" -msgstr "Usar Encaixe Escalar" +msgstr "Usar PVS Secundário" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Merge Meshes" -msgstr "Malha" +msgstr "Mesclar Malhas" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Show Margins" -msgstr "Mostrar Origem" +msgstr "Mostrar Margens" #: scene/3d/room_manager.cpp #, fuzzy @@ -23411,9 +23192,8 @@ msgid "Portal Depth Limit" msgstr "" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Default Portal Margin" -msgstr "Definir Margem" +msgstr "Margem Padrão de Portal" #: scene/3d/room_manager.cpp #, fuzzy @@ -23499,9 +23279,8 @@ msgid "Spatial Attachment Path" msgstr "" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Physics Enabled" -msgstr "Frame de FÃsica %" +msgstr "FÃsica Ativada" #: scene/3d/soft_body.cpp #, fuzzy @@ -23530,7 +23309,7 @@ msgstr "" #: scene/3d/soft_body.cpp msgid "Pressure Coefficient" -msgstr "" +msgstr "Coeficiente de Pressão" #: scene/3d/soft_body.cpp msgid "Damping Coefficient" @@ -23559,18 +23338,16 @@ msgstr "" "Altere o tamanho em formas de colisão de crianças." #: scene/3d/spatial.cpp -#, fuzzy msgid "Global Translation" -msgstr "Manter Transformação Global" +msgstr "Transformação Global" #: scene/3d/spatial.cpp msgid "Matrix" msgstr "Matriz" #: scene/3d/spatial.cpp -#, fuzzy msgid "Gizmo" -msgstr "Gizmos" +msgstr "Gizmo" #: scene/3d/spatial_velocity_tracker.cpp #, fuzzy @@ -23611,13 +23388,12 @@ msgid "Per-Wheel Motion" msgstr "Roda para Baixo" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Engine Force" -msgstr "Documentação Online" +msgstr "Força do Motor" #: scene/3d/vehicle_body.cpp msgid "Brake" -msgstr "" +msgstr "Freio" #: scene/3d/vehicle_body.cpp msgid "Steering" @@ -23649,9 +23425,8 @@ msgid "Friction Slip" msgstr "Funções" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Suspension" -msgstr "Expressão" +msgstr "Suspensão" #: scene/3d/vehicle_body.cpp #, fuzzy @@ -23660,12 +23435,11 @@ msgstr "Erro" #: scene/3d/visibility_notifier.cpp msgid "AABB" -msgstr "" +msgstr "AABB" #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Geometry" -msgstr "Tentar Novamente" +msgstr "Geometria" #: scene/3d/visual_instance.cpp #, fuzzy @@ -23701,7 +23475,7 @@ msgstr "" #: scene/3d/visual_instance.cpp msgid "LOD" -msgstr "" +msgstr "LOD (NÃvel de Detalhe)" #: scene/3d/visual_instance.cpp scene/animation/skeleton_ik.cpp #: scene/resources/material.cpp @@ -24455,7 +24229,7 @@ msgstr "Carregar como Substituto" #: scene/gui/line_edit.cpp msgid "Alpha" -msgstr "" +msgstr "Alfa" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" @@ -24629,7 +24403,7 @@ msgstr "Caractere" #: scene/gui/rich_text_label.cpp msgid "BBCode" -msgstr "" +msgstr "BBCode" #: scene/gui/rich_text_label.cpp msgid "Meta Underlined" @@ -25008,7 +24782,7 @@ msgstr "Separador Nomeado" #: scene/main/node.cpp msgid "Name Casing" -msgstr "" +msgstr "Capitalização do Nome" #: scene/main/node.cpp #, fuzzy @@ -25021,9 +24795,8 @@ msgid "Pause Mode" msgstr "Modo Panorâmico" #: scene/main/node.cpp -#, fuzzy msgid "Physics Interpolation Mode" -msgstr "Modo de Interpolação" +msgstr "Modo de Interpolação da FÃsica" #: scene/main/node.cpp #, fuzzy @@ -25091,7 +24864,7 @@ msgstr "Formas" #: scene/main/scene_tree.cpp msgid "Shape Color" -msgstr "" +msgstr "Cor da Forma" #: scene/main/scene_tree.cpp #, fuzzy @@ -25100,7 +24873,7 @@ msgstr "Escolher Cor" #: scene/main/scene_tree.cpp msgid "Geometry Color" -msgstr "" +msgstr "Cor da Geometria" #: scene/main/scene_tree.cpp #, fuzzy @@ -25149,9 +24922,8 @@ msgid "Use 32 BPC Depth" msgstr "" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Default Environment" -msgstr "Visualizar Ambiente" +msgstr "Ambiente Padrão" #: scene/main/scene_tree.cpp msgid "" @@ -25227,9 +24999,8 @@ msgid "World 2D" msgstr "Mundo 2D" #: scene/main/viewport.cpp -#, fuzzy msgid "Transparent BG" -msgstr "Transpor" +msgstr "Fundo Transparente" #: scene/main/viewport.cpp #, fuzzy @@ -25256,7 +25027,6 @@ msgid "Keep 3D Linear" msgstr "Linear Esquerda" #: scene/main/viewport.cpp -#, fuzzy msgid "Render Direct To Screen" msgstr "Renderizar Diretamente para a Tela" @@ -25573,7 +25343,7 @@ msgstr "Cena Principal" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "BG" -msgstr "B" +msgstr "Plano de Fundo" #: scene/resources/default_theme/default_theme.cpp msgid "FG" @@ -25834,7 +25604,7 @@ msgstr "Selecionar" #: scene/resources/default_theme/default_theme.cpp msgid "Cursor Unfocused" -msgstr "" +msgstr "Cursor Desfocado" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25954,7 +25724,7 @@ msgstr "Guia 1" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Tab BG" -msgstr "Guia 1" +msgstr "Plano de Fundo da Aba" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26062,9 +25832,8 @@ msgid "Color Sample" msgstr "Cores" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG" -msgstr "Predefinição" +msgstr "Fundo Predefinido" #: scene/resources/default_theme/default_theme.cpp msgid "Overbright Indicator" @@ -26076,9 +25845,8 @@ msgid "Preset FG" msgstr "Predefinição" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG Icon" -msgstr "Predefinição" +msgstr "Ãcone de Fundo Predefinido" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26231,7 +25999,7 @@ msgstr "Com Dados" #: scene/resources/environment.cpp msgid "Background" -msgstr "" +msgstr "Plano de Fundo" #: scene/resources/environment.cpp scene/resources/sky.cpp msgid "Sky" @@ -26583,7 +26351,7 @@ msgstr "" #: scene/resources/material.cpp msgid "Do Not Receive Shadows" -msgstr "" +msgstr "Não Receber Sombras" #: scene/resources/material.cpp #, fuzzy @@ -26843,7 +26611,7 @@ msgstr "Instância" #: scene/resources/multimesh.cpp msgid "Visible Instance Count" -msgstr "" +msgstr "Quantidade de Instâncias VisÃveis" #: scene/resources/navigation_mesh.cpp msgid "Sampling" @@ -26903,7 +26671,7 @@ msgstr "Erro" #: scene/resources/navigation_mesh.cpp msgid "Verts Per Poly" -msgstr "" +msgstr "Vértices Por PolÃgono" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26943,7 +26711,7 @@ msgstr "Deslocamento Base" #: scene/resources/occluder_shape.cpp msgid "Spheres" -msgstr "" +msgstr "Esferas" #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" @@ -27390,11 +27158,11 @@ msgstr "Margem de Ligação da Borda" #: scene/resources/world_2d.cpp msgid "Canvas" -msgstr "" +msgstr "Canvas" #: servers/arvr/arvr_interface.cpp msgid "Is Primary" -msgstr "" +msgstr "É Principal" #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -27431,7 +27199,7 @@ msgstr "" #: servers/audio/effects/audio_effect_chorus.cpp msgid "Voice Count" -msgstr "" +msgstr "Quantidade de Vozes" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp @@ -27610,9 +27378,8 @@ msgid "Enable Audio Input" msgstr "Renomear Canal de Ãudio" #: servers/audio_server.cpp -#, fuzzy msgid "Output Latency" -msgstr "SaÃda" +msgstr "Latência de SaÃda" #: servers/audio_server.cpp msgid "Channel Disable Threshold dB" @@ -27661,7 +27428,7 @@ msgstr "" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Time Before Sleep" -msgstr "" +msgstr "Tempo Antes de Dormir" #: servers/physics_2d/physics_2d_server_sw.cpp msgid "BP Hash Table Size" @@ -27673,12 +27440,11 @@ msgstr "" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Inverse Mass" -msgstr "" +msgstr "Inverter Massa" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Inverse Inertia" -msgstr "Visão Livre na Esquerda" +msgstr "Inverter Inércia" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Total Angular Damp" @@ -27701,7 +27467,7 @@ msgstr "Inicializar" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Exclude" -msgstr "" +msgstr "Excluir" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Shape RID" @@ -27714,7 +27480,7 @@ msgstr "Modo Colisão" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collide With Areas" -msgstr "" +msgstr "Colidir com Ãreas" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Motion Remainder" @@ -27834,7 +27600,7 @@ msgstr "Importar Tema" #: servers/visual_server.cpp msgid "Lossless Compression" -msgstr "" +msgstr "Compressão Sem Perda" #: servers/visual_server.cpp #, fuzzy @@ -27843,7 +27609,7 @@ msgstr "Forçar Push" #: servers/visual_server.cpp msgid "WebP Compression Level" -msgstr "" +msgstr "NÃvel de Compressão WebP" #: servers/visual_server.cpp msgid "Time Rollover Secs" @@ -27887,7 +27653,7 @@ msgstr "Seleção Central" #: servers/visual_server.cpp msgid "High Quality GGX" -msgstr "" +msgstr "GGX de Alta Qualidade" #: servers/visual_server.cpp msgid "Irradiance Max Size" @@ -28034,7 +27800,7 @@ msgstr "Colar Frame" #: servers/visual_server.cpp msgid "GLES2" -msgstr "" +msgstr "GLES2" #: servers/visual_server.cpp msgid "Compatibility" @@ -28056,11 +27822,11 @@ msgstr "Expressão" #: servers/visual_server.cpp msgid "UV Contract" -msgstr "" +msgstr "Contrato UV" #: servers/visual_server.cpp msgid "UV Contract Amount" -msgstr "" +msgstr "Valor do Contrato UV" #: servers/visual_server.cpp #, fuzzy @@ -28093,7 +27859,7 @@ msgstr "Ver Ocultação Pela Oclusão" #: servers/visual_server.cpp msgid "Max Active Spheres" -msgstr "" +msgstr "Máximo de Esferas Ativas" #: servers/visual_server.cpp #, fuzzy @@ -28107,13 +27873,12 @@ msgstr "Modo de Interpolação" #: servers/visual_server.cpp msgid "Max Simultaneous Compiles" -msgstr "" +msgstr "Compilações Simultâneas Máximas" #: servers/visual_server.cpp msgid "Log Active Async Compiles Count" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shader Cache Size (MB)" -msgstr "Alterar Tamanho da Câmera" +msgstr "Tamanho do Cache de Shader (MB)" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index a78712c6ba..0dc49c7dba 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -4608,6 +4608,7 @@ msgstr "Proiect Divers sau unelte pentru scenă." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proiect" @@ -7508,7 +7509,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15712,18 +15714,18 @@ msgstr "" msgid "Make Local" msgstr "Creează Oase" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nume Nod:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nume Nod:" #: editor/scene_tree_dock.cpp @@ -15930,6 +15932,11 @@ msgstr "Adaugă în Grup" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nume Nod:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Eroare de Conexiune" @@ -15993,6 +16000,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17921,6 +17932,21 @@ msgstr "Toată selecÈ›ia" msgid "Auto Update Project" msgstr "Exportă Proiectul" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "AfiÈ™ează Tot" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "AlegeÅ£i un Director" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "AlegeÅ£i un Director" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19752,6 +19778,11 @@ msgstr "Creează Nod" msgid "Custom BG Color" msgstr "Creează Nod" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Extinde Toate" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20600,6 +20631,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Nume nevalid." diff --git a/editor/translations/ru.po b/editor/translations/ru.po index 1df1d87308..b79923abf1 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -78,7 +78,7 @@ # Alex Tern <ternvein@gmail.com>, 2020. # Varion Drakon Neonovich <variondrakon@gmail.com>, 2020. # d2cyb <dmitrydpb@gmail.com>, 2020. -# ÐлекÑей Смирнов <tir74@mail.ru>, 2020. +# ÐлекÑей Смирнов <tir74@mail.ru>, 2020, 2022. # Calamander <Calamander@yandex.ru>, 2020. # Terminator <fresh-ter@yandex.com>, 2020. # Anatoly Kuznetsov <muffinnorth@yandex.ru>, 2020. @@ -119,13 +119,18 @@ # Vadim Mitroshkin <Vadim7540@yandex.ru>, 2022. # Maksim Marchukov <mar.maksim63@gmail.com>, 2022. # Slava Beloglazov <slavathedeveloper@gmail.com>, 2022. +# Sned Of Bread <d.cto20181389@gmail.com>, 2022. +# Kedr <lava20121991@gmail.com>, 2022. +# Gulpy <yak.aryslan.1999@gmail.com>, 2022. +# Sergey Karmanov <ppoocpel8888@gmail.com>, 2022. +# Дмитрий <Dimega@inbox.ru>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-26 01:55+0000\n" -"Last-Translator: NeoLan Qu <it.bulla@mail.ru>\n" +"PO-Revision-Date: 2022-09-01 15:11+0000\n" +"Last-Translator: Дмитрий <Dimega@inbox.ru>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -134,7 +139,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.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -506,9 +511,8 @@ msgid "Command" msgstr "Command" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr "(ФизичеÑкаÑ)" +msgstr "ФизичеÑкий" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -764,14 +768,12 @@ msgid "Script Templates Search Path" msgstr "Путь поиÑка шаблонов Ñкриптов" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "Ðвтозагрузка при запуÑке" +msgstr "Ðвтозагрузка ÑиÑтемы ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÐµÑ€ÑиÑми при запуÑке" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "Контроль верÑий" +msgstr "Ðазвание плагина ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð²ÐµÑ€Ñий" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2852,7 +2854,6 @@ msgid "Project export for platform:" msgstr "ÐкÑпорт проекта Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ñ‹:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." msgstr "Завершено Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸." @@ -2861,9 +2862,8 @@ msgid "Completed successfully." msgstr "Завершено без ошибок." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "Ðе удалоÑÑŒ:" +msgstr "Ошибка." #: editor/editor_export.cpp msgid "Storing File:" @@ -2882,24 +2882,20 @@ msgid "Save PCK" msgstr "Сохранить PCK" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "Ðевозможно Ñоздать папку." +msgstr "Ðевозможно Ñоздать файл \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Ðе удалоÑÑŒ ÑкÑпортировать файлы проекта" +msgstr "Ðе удалоÑÑŒ ÑкÑпортировать файлы проекта." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "Ðевозможно открыть файл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи:" +msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸Ð· пути \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "Сохранить как" +msgstr "Сохранить ZIP" #: editor/editor_export.cpp msgid "" @@ -3019,30 +3015,25 @@ msgid "Custom release template not found." msgstr "ПользовательÑкий релизный шаблон не найден." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "Управление шаблонами" +msgstr "Подготовить шаблон" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "Данный путь ÑкÑпорта не ÑущеÑтвует:" +msgstr "Указанный путь ÑкÑпорта не ÑущеÑтвует." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "Файл шаблона не найден:" +msgstr "Ðе найден файл шаблона: \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Ðеверный шаблон ÑкÑпорта:" +msgstr "Ðе удалоÑÑŒ Ñкопировать шаблон ÑкÑпорта." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "ОтÑтуп" +msgstr "Ð’Ñтраивание PCK" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -4594,6 +4585,7 @@ msgstr "Прочие инÑтрументы." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Проект" @@ -5311,9 +5303,8 @@ msgstr "" "ÑущеÑтвующий преÑет как активный." #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" -msgstr "Проект" +msgstr "ЗапуÑк проекта" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -5596,13 +5587,12 @@ msgid "Mouse Extra Buttons Navigate History" msgstr "ÐÐ°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ Ð¿Ð¾ иÑтории дополнительными кнопками мыши" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "Выделение Ñетки" +msgstr "DragAndDrop выделение" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "ОÑтатьÑÑ Ð² Редакторе Скриптов Ðа Выбранном Узле" #: editor/editor_settings.cpp msgid "Appearance" @@ -7366,7 +7356,8 @@ msgid "8 Bit" msgstr "8-бит" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Моно" @@ -11599,9 +11590,8 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ, не может быть заменена полиÑеткой." #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to MeshInstance2D" -msgstr "Преобразовать в Mesh2D" +msgstr "Преобразование в MeshInstance2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." @@ -11707,7 +11697,7 @@ msgstr "ÐÐ¾Ð²Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy msgid "Filter animations" -msgstr "Фильтр методов" +msgstr "Фильтровать анимации" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -14231,12 +14221,10 @@ msgid "Export All" msgstr "ÐкÑпортировать вÑÑ‘" #: editor/project_export.cpp -#, fuzzy msgid "Choose an export mode:" -msgstr "ПожалуйÑта, выберите пуÑтую папку." +msgstr "ПожалуйÑта, выберите режим ÑкÑпорта:" #: editor/project_export.cpp -#, fuzzy msgid "Export All..." msgstr "ÐкÑпортировать вÑÑ‘" @@ -14393,7 +14381,7 @@ msgstr "ОтриÑовщик:" #: editor/project_manager.cpp msgid "OpenGL ES 3.0" -msgstr "ОткрытыйGL ES 3.0" +msgstr "OpenGL ES 3.0" #: editor/project_manager.cpp msgid "Not supported by your GPU drivers." @@ -14413,7 +14401,7 @@ msgstr "" #: editor/project_manager.cpp msgid "OpenGL ES 2.0" -msgstr "ОткрытыйGL ES 2.0" +msgstr "OpenGL ES 2.0" #: editor/project_manager.cpp msgid "" @@ -15370,16 +15358,19 @@ msgstr "" msgid "Make Local" msgstr "Сделать локальным" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "Данное уникальное Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользовано у другого узла в Ñцене." - #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +#, fuzzy +msgid "Enable Scene Unique Name(s)" msgstr "Добавить уникальное Ð¸Ð¼Ñ Ñцене" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Unique names already used by another node in the scene:" +msgstr "Данное уникальное Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользовано у другого узла в Ñцене." + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Убрать уникальное Ð¸Ð¼Ñ Ð² Ñцене" #: editor/scene_tree_dock.cpp @@ -15580,6 +15571,10 @@ msgid "Button Group" msgstr "Группа кнопок" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Убрать уникальное Ð¸Ð¼Ñ Ð² Ñцене" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(ИÑточник)" @@ -15657,6 +15652,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Ðекорректное Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð°, Ñледующие Ñимволы недопуÑтимы:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Данное уникальное Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользовано у другого узла в Ñцене." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Переименовать узел" @@ -17051,12 +17050,12 @@ msgstr "Узел коÑти Godot" #: modules/gltf/gltf_skin.cpp #, fuzzy msgid "Skin Root" -msgstr "Ðовый корень Ñцены" +msgstr "Корневой Ñкин" #: modules/gltf/gltf_skin.cpp #, fuzzy msgid "Joints Original" -msgstr "СфокуÑироватьÑÑ Ð½Ð° начале координат" +msgstr "СуÑтавы Оригинал" #: modules/gltf/gltf_skin.cpp msgid "Inverse Binds" @@ -17065,7 +17064,7 @@ msgstr "Инвертировать СвÑзи" #: modules/gltf/gltf_skin.cpp #, fuzzy msgid "Non Joints" -msgstr "Передвинуть ÑуÑтав" +msgstr "Ðе СуÑтавы" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Bone I" @@ -17098,7 +17097,7 @@ msgstr "Зеркальный коÑффициент" #: modules/gltf/gltf_spec_gloss.cpp msgid "Spec Gloss Img" -msgstr "" +msgstr "Зеркальное ГлÑнцевое Изображение" #: modules/gltf/gltf_state.cpp msgid "Json" @@ -17115,16 +17114,16 @@ msgstr "ÐœÐ»Ð°Ð´ÑˆÐ°Ñ Ð²ÐµÑ€ÑиÑ" #: modules/gltf/gltf_state.cpp #, fuzzy msgid "GLB Data" -msgstr "С данными" +msgstr "GLB Данные" #: modules/gltf/gltf_state.cpp +#, fuzzy msgid "Use Named Skin Binds" -msgstr "" +msgstr "ИÑпользовать СвÑзи Именованного Скина" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Buffer Views" -msgstr "Вид Ñзади" +msgstr "Буфер видов" #: modules/gltf/gltf_state.cpp msgid "Accessors" @@ -17389,23 +17388,23 @@ msgstr "ПоÑтроение карт оÑвещениÑ" #: modules/lightmapper_cpu/register_types.cpp #, fuzzy msgid "CPU Lightmapper" -msgstr "Запекать карты оÑвещениÑ" +msgstr "CPU Карты оÑвещениÑ" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" -msgstr "" +msgstr "КоличеÑтво Лучей Ðизкого КачеÑтва" #: modules/lightmapper_cpu/register_types.cpp msgid "Medium Quality Ray Count" -msgstr "" +msgstr "КоличеÑтво Лучей Среднего КачеÑтва" #: modules/lightmapper_cpu/register_types.cpp msgid "High Quality Ray Count" -msgstr "" +msgstr "КоличеÑтво Лучей Ð’Ñ‹Ñокого КачеÑтва" #: modules/lightmapper_cpu/register_types.cpp msgid "Ultra Quality Ray Count" -msgstr "" +msgstr "КоличеÑтво Лучей Ультра КачеÑтва" #: modules/minimp3/audio_stream_mp3.cpp #: modules/minimp3/resource_importer_mp3.cpp @@ -17420,7 +17419,7 @@ msgstr "Ð’Ñ‹Ñота глаз" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" -msgstr "" +msgstr "IOD" #: modules/mobile_vr/mobile_vr_interface.cpp #, fuzzy @@ -17434,15 +17433,15 @@ msgstr "Режим без теней" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" -msgstr "" +msgstr "ПередиÑкретизациÑ" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K1" -msgstr "" +msgstr "K1" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K2" -msgstr "" +msgstr "K2" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -17456,6 +17455,21 @@ msgstr "Собрать решение" msgid "Auto Update Project" msgstr "Ðвтообновление проекта" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "МаÑштаб отображениÑ" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Выбрать каталог" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Выбрать каталог" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Конец траÑÑировки внутреннего Ñтека иÑключений" @@ -17536,7 +17550,7 @@ msgstr "Как карта нормалей" #: modules/opensimplex/noise_texture.cpp msgid "Bump Strength" -msgstr "" +msgstr "Сила Bump" #: modules/opensimplex/noise_texture.cpp msgid "Noise" @@ -17562,7 +17576,7 @@ msgstr "ПерÑпективный" #: modules/opensimplex/open_simplex_noise.cpp msgid "Lacunarity" -msgstr "" +msgstr "ЛакунарноÑть" #: modules/regex/regex.cpp msgid "Subject" @@ -17578,7 +17592,7 @@ msgstr "Строки" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" -msgstr "" +msgstr "Обнаружить МногоадреÑную РаÑÑылку, ЕÑли" #: modules/upnp/upnp.cpp msgid "Discover Local Port" @@ -17586,7 +17600,7 @@ msgstr "Обнаружить локальный порт" #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "" +msgstr "Обнаружить IPv6" #: modules/upnp/upnp_device.cpp msgid "Description URL" @@ -17598,7 +17612,7 @@ msgstr "Тип ÑервиÑа" #: modules/upnp/upnp_device.cpp msgid "IGD Control URL" -msgstr "" +msgstr "IDG Контроль URL" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -17607,7 +17621,7 @@ msgstr "УÑтановить тип переменной" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" -msgstr "" +msgstr "IGD Ðаш Ðдр" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -18413,12 +18427,14 @@ msgid "Optional Features" msgstr "Дополнительные Компоненты" #: modules/webxr/webxr_interface.cpp +#, fuzzy msgid "Requested Reference Space Types" -msgstr "" +msgstr "Запрошенные Типы Опорного ПроÑтранÑтва" #: modules/webxr/webxr_interface.cpp +#, fuzzy msgid "Reference Space Type" -msgstr "" +msgstr "Тип Опорного ПроÑтранÑтва" #: modules/webxr/webxr_interface.cpp msgid "Visibility State" @@ -18443,12 +18459,14 @@ msgid "Debug Keystore" msgstr "Отладочное хранилище ключей" #: platform/android/export/export.cpp +#, fuzzy msgid "Debug Keystore User" -msgstr "" +msgstr "Отладочное Хранилище ключей ПользователÑ" #: platform/android/export/export.cpp +#, fuzzy msgid "Debug Keystore Pass" -msgstr "" +msgstr "Отладочное Хранилище ключей Паролей" #: platform/android/export/export.cpp msgid "Force System User" @@ -18590,9 +18608,8 @@ msgid "Graphics" msgstr "Смещение графа" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "OpenGL Debug" -msgstr "Открыть" +msgstr "OpenGL Отладка" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18950,11 +18967,9 @@ msgstr "" "%s. ПожалуйÑта, переуÑтановите шаблон Ñборки Android из меню «Проект»." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." -msgstr "" -"Ðевозможно перезапиÑать файлы res://android/build/res/*.xml Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ проекта" +msgstr "Ðевозможно перезапиÑать res://android/build/res/*.xml Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ проекта" #: platform/android/export/export_plugin.cpp msgid "Could not export project files to gradle project." @@ -18990,9 +19005,8 @@ msgstr "" "проекта gradle на наличие выходных данных." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "Пакет не найден: %s" +msgstr "Пакет не найден: \"%s\"." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." @@ -19017,9 +19031,8 @@ msgid "Adding files..." msgstr "Добавление файлов..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "Ðе удалоÑÑŒ ÑкÑпортировать файлы проекта" +msgstr "Ðе удалоÑÑŒ ÑкÑпортировать файлы проекта." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19257,6 +19270,11 @@ msgstr "ПользовательÑкий цвет" msgid "Custom BG Color" msgstr "ПользовательÑкий цвет" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Развернуть вÑе" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19289,19 +19307,16 @@ msgid "Run exported HTML in the system's default browser." msgstr "ЗапуÑтить HTML в ÑиÑтемном браузере по умолчанию." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "Ðе удалоÑÑŒ открыть шаблон Ð´Ð»Ñ ÑкÑпорта:" +msgstr "Ðе удалоÑÑŒ открыть шаблон Ð´Ð»Ñ ÑкÑпорта: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "Ðеверный шаблон ÑкÑпорта:" +msgstr "Ðеверный шаблон ÑкÑпорта: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "Ðе удалоÑÑŒ запиÑать файл:" +msgstr "Ðе удалоÑÑŒ запиÑать файл: \"%s\"." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19309,9 +19324,8 @@ msgid "Icon Creation" msgstr "Задать отÑтуп" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "Ðе удалоÑÑŒ прочитать файл:" +msgstr "Ðе удалоÑÑŒ прочитать файл: \"%s\"." #: platform/javascript/export/export.cpp msgid "PWA" @@ -19392,14 +19406,12 @@ msgid "Icon 512 X 512" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "Ðе удалоÑÑŒ прочитать HTML-оболочку:" +msgstr "Ðе удалоÑÑŒ прочитать HTML-оболочку: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "Ðе удалоÑÑŒ Ñоздать каталог HTTP-Ñервера:" +msgstr "Ðе удалоÑÑŒ Ñоздать каталог HTTP-Ñервера: %s." #: platform/javascript/export/export.cpp #, fuzzy @@ -20144,6 +20156,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "ÐедопуÑтимое короткое Ð¸Ð¼Ñ Ð¿Ð°ÐºÐµÑ‚Ð°." @@ -26223,9 +26241,8 @@ msgid "Camera Feed ID" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Ambient Light" -msgstr "ОтÑтуп вправо" +msgstr "РаÑÑеÑнный Ñвет" #: scene/resources/environment.cpp #, fuzzy @@ -26458,7 +26475,7 @@ msgstr "" #: scene/resources/environment.cpp msgid "Adjustments" -msgstr "" +msgstr "Adjustments (наÑтройки)" #: scene/resources/environment.cpp #, fuzzy @@ -27900,7 +27917,7 @@ msgstr "Режим интерполÑции" #: servers/visual_server.cpp msgid "OpenGL" -msgstr "ОткрытыйGL" +msgstr "OpenGL" #: servers/visual_server.cpp msgid "Batching Send Null" @@ -27990,8 +28007,9 @@ msgid "Precision" msgstr "ТочноÑть" #: servers/visual_server.cpp +#, fuzzy msgid "UV Contract" -msgstr "" +msgstr "UV Контракт" #: servers/visual_server.cpp msgid "UV Contract Amount" @@ -28017,7 +28035,7 @@ msgstr "Удалить тайл" #: servers/visual_server.cpp #, fuzzy msgid "Flip Imported Portals" -msgstr "Перевернуть порталы" +msgstr "Перевернуть Импортированные Порталы" #: servers/visual_server.cpp #, fuzzy diff --git a/editor/translations/si.po b/editor/translations/si.po index 8ce2d1d628..5e99894cf1 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -4394,6 +4394,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7117,7 +7118,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14891,18 +14893,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "සජීවීකරණ පුනරà·à·€à¶»à·Šà¶®à¶±à¶º" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "සජීවීකරණ පුනරà·à·€à¶»à·Šà¶®à¶±à¶º" #: editor/scene_tree_dock.cpp @@ -15094,6 +15096,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "සජීවීකරණ පුනරà·à·€à¶»à·Šà¶®à¶±à¶º" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15157,6 +15164,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16975,6 +16986,19 @@ msgstr "" msgid "Auto Update Project" msgstr "මෙම ලුහුබදින්න෠ඉවà¶à·Š කරන්න." +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "නිවේà·à¶± මà·à¶¯à·’ලිය" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18700,6 +18724,11 @@ msgstr "යà¶à·”රු à¶´à·’à¶§à¶´à¶à·Š කරන්න" msgid "Custom BG Color" msgstr "යà¶à·”රු à¶´à·’à¶§à¶´à¶à·Š කරන්න" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Anim පරිවර්à¶à¶±à¶º වෙනස් කරන්න" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19496,6 +19525,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 7cba3886ba..ebd2256728 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -4623,6 +4623,7 @@ 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 modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7541,7 +7542,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15643,18 +15645,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Meno Node-u:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Meno Node-u:" #: editor/scene_tree_dock.cpp @@ -15855,6 +15857,11 @@ msgid "Button Group" msgstr "TlaÄidlo" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Meno Node-u:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Pripájanie z)" @@ -15919,6 +15926,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17845,6 +17856,21 @@ msgstr "VÅ¡etky vybrané" msgid "Auto Update Project" msgstr "Projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "ZobraziÅ¥ VÅ¡etko" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Vyberte adresár" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Vyberte adresár" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19676,6 +19702,11 @@ msgstr "VložiÅ¥" msgid "Custom BG Color" msgstr "VložiÅ¥" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "ExpandovaÅ¥ VÅ¡etky" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20524,6 +20555,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Nesprávna veľkosÅ¥ pÃsma." diff --git a/editor/translations/sl.po b/editor/translations/sl.po index ceb21aa750..f0e227266d 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -12,15 +12,15 @@ # Arnold Marko <arnold.marko@gmail.com>, 2019. # Alex <alexrixhardson@gmail.com>, 2019. # Andrew Poženel <andrej.pozenel@outlook.com>, 2020, 2022. -# Jakob Tadej VrtaÄnik <minecraftalka2@gmail.com>, 2021. +# Jakob Tadej VrtaÄnik <minecraftalka2@gmail.com>, 2021, 2022. # Andrew Poženel <andrew.pozenel@protonmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-23 16:41+0000\n" -"Last-Translator: Andrew Poženel <andrew.pozenel@protonmail.com>\n" +"PO-Revision-Date: 2022-08-12 17:08+0000\n" +"Last-Translator: Jakob Tadej VrtaÄnik <minecraftalka2@gmail.com>\n" "Language-Team: Slovenian <https://hosted.weblate.org/projects/godot-engine/" "godot/sl/>\n" "Language: sl\n" @@ -29,7 +29,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " "n%100==4 ? 2 : 3;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -320,9 +320,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "Ni dovolj bajtov za dekodiranje, ali pa je neveljaven format." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "NapaÄen vnos %i(ni podan) v izrazu" +msgstr "NapaÄen vnos %d (ni podan) v izrazu" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -351,70 +350,63 @@ msgstr "Na klic '%s':" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp msgid "Seed" -msgstr "" +msgstr "Seme" #: core/math/random_number_generator.cpp -#, fuzzy msgid "State" -msgstr "NaÄin Vrtenja" +msgstr "Stanje" #: core/message_queue.cpp msgid "Message Queue" -msgstr "" +msgstr "Vrsta sporoÄil" #: core/message_queue.cpp msgid "Max Size (KB)" -msgstr "" +msgstr "NajveÄja velikost (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "NaÄin Premika" +msgstr "NaÄin kazalca" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "IzbriÅ¡i Vnos" +msgstr "Uporabi zbran vnos" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp msgid "Device" -msgstr "" +msgstr "Naprava" #: core/os/input_event.cpp -#, fuzzy msgid "Alt" -msgstr "Vse" +msgstr "Alt" #: core/os/input_event.cpp msgid "Shift" -msgstr "" +msgstr "Shift" #: core/os/input_event.cpp -#, fuzzy msgid "Control" -msgstr "RazliÄica:" +msgstr "Control" #: core/os/input_event.cpp msgid "Meta" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Command" -msgstr "Skupnost" +msgstr "Ukaz" #: core/os/input_event.cpp #, fuzzy msgid "Physical" -msgstr "Fizikalni Okvir %" +msgstr "Fizikalno" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Pressed" -msgstr "Prednastavitev..." +msgstr "Pritisnjeno" #: core/os/input_event.cpp msgid "Scancode" @@ -430,98 +422,87 @@ msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" -msgstr "" +msgstr "Odmev" #: core/os/input_event.cpp scene/gui/base_button.cpp #, fuzzy msgid "Button Mask" -msgstr "Dodaj v Skupino" +msgstr "Maska gumba" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp -#, fuzzy msgid "Global Position" -msgstr "Konstanta" +msgstr "Globalna pozicija" #: core/os/input_event.cpp -#, fuzzy msgid "Factor" -msgstr "Nadzornik" +msgstr "Faktor" #: core/os/input_event.cpp -#, fuzzy msgid "Button Index" -msgstr "NaÄin PloÅ¡Äe" +msgstr "Kazalo gumba" #: core/os/input_event.cpp msgid "Doubleclick" -msgstr "" +msgstr "Dvojni klik" #: core/os/input_event.cpp msgid "Tilt" -msgstr "" +msgstr "Nagib" #: core/os/input_event.cpp -#, fuzzy msgid "Pressure" -msgstr "Prednastavitev..." +msgstr "Pritisk" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Obrnjeno pero" #: core/os/input_event.cpp -#, fuzzy msgid "Relative" -msgstr "Pripni Relativno" +msgstr "Relativno" #: core/os/input_event.cpp scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/resources/environment.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed" -msgstr "Prilagodi Velikost:" +msgstr "Hitrost" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: scene/3d/sprite_3d.cpp msgid "Axis" -msgstr "" +msgstr "Os" #: core/os/input_event.cpp -#, fuzzy msgid "Axis Value" -msgstr "Novo ime:" +msgstr "Vrednost osi" #: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Index" -msgstr "NaÄin PloÅ¡Äe" +msgstr "Kazalo" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Action" -msgstr "Premakni Dejanje" +msgstr "Akcija" #: core/os/input_event.cpp scene/resources/environment.cpp #: scene/resources/material.cpp msgid "Strength" -msgstr "" +msgstr "MoÄ" #: core/os/input_event.cpp msgid "Delta" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Channel" -msgstr "Spremeni" +msgstr "Kanal" #: core/os/input_event.cpp main/main.cpp -#, fuzzy msgid "Message" -msgstr "Usklajuj Spremembe Skript" +msgstr "SporoÄilo" #: core/os/input_event.cpp #, fuzzy @@ -532,11 +513,11 @@ msgstr "Prilagodi Velikost:" #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp #: scene/3d/physics_body.cpp scene/resources/particles_material.cpp msgid "Velocity" -msgstr "" +msgstr "Hitrost" #: core/os/input_event.cpp msgid "Instrument" -msgstr "" +msgstr "InÅ¡trument" #: core/os/input_event.cpp #, fuzzy @@ -550,19 +531,16 @@ msgstr "" #: core/project_settings.cpp editor/editor_node.cpp main/main.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Application" -msgstr "Premakni Dejanje" +msgstr "Aplikacija" #: core/project_settings.cpp main/main.cpp -#, fuzzy msgid "Config" -msgstr "Nastavi Zaskok" +msgstr "Konfiguracija" #: core/project_settings.cpp -#, fuzzy msgid "Project Settings Override" -msgstr "Nastavitve Projekta" +msgstr "Preglasi nastavitve projekta" #: core/project_settings.cpp core/resource.cpp #: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp @@ -580,9 +558,8 @@ msgstr "Ime" #: core/project_settings.cpp editor/editor_help.cpp #: modules/visual_script/visual_script_nodes.cpp platform/uwp/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Description" -msgstr "Opis:" +msgstr "Opis" #: core/project_settings.cpp editor/editor_node.cpp editor/editor_settings.cpp #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp @@ -594,42 +571,42 @@ msgstr "Zaženi" #: core/project_settings.cpp editor/editor_node.cpp #: editor/run_settings_dialog.cpp main/main.cpp msgid "Main Scene" -msgstr "" +msgstr "Glavna scena" #: core/project_settings.cpp -#, fuzzy msgid "Disable stdout" -msgstr "OnemogoÄen" +msgstr "OnemogoÄi stdout" #: core/project_settings.cpp -#, fuzzy msgid "Disable stderr" -msgstr "OnemogoÄen" +msgstr "OnemogoÄi stderr" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "" +msgstr "Uporabi imenik skritih podatkov projekta" #: core/project_settings.cpp +#, fuzzy msgid "Use Custom User Dir" -msgstr "" +msgstr "Uporabi posebno uporabniÅ¡ko (režijo?)" #: core/project_settings.cpp +#, fuzzy msgid "Custom User Dir Name" -msgstr "" +msgstr "Posebno uporabniÅ¡ko ime (režije?)" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp #, fuzzy msgid "Display" -msgstr "Zamenjaj Vse" +msgstr "Zaslon(glagol ali samostalnik?)" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Å irina" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -638,21 +615,19 @@ msgstr "" #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp msgid "Height" -msgstr "" +msgstr "ViÅ¡ina" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "Vedno na vrhu" #: core/project_settings.cpp -#, fuzzy msgid "Test Width" -msgstr "Linearno" +msgstr "Testiraj Å¡irino" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "PreskuÅ¡anje" +msgstr "Testiraj viÅ¡ino" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -662,7 +637,7 @@ msgstr "Zvok" #: core/project_settings.cpp #, fuzzy msgid "Default Bus Layout" -msgstr "Naloži prevezeto Postavitev Vodila." +msgstr "Privzeta postavitev (?)" #: core/project_settings.cpp editor/editor_export.cpp #: editor/editor_file_system.cpp editor/editor_node.cpp @@ -673,95 +648,84 @@ msgstr "Urejevalnik" #: core/project_settings.cpp msgid "Main Run Args" -msgstr "" +msgstr "Glavni zagonski argumenti" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "Pot Prizora:" +msgstr "Imenovanje scene" #: core/project_settings.cpp msgid "Search In File Extensions" -msgstr "" +msgstr "IÅ¡Äi v razÅ¡iritvah datotek" #: core/project_settings.cpp msgid "Script Templates Search Path" -msgstr "" +msgstr "Pot iskanja predlogov skript" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "RazliÄica:" +msgstr "Samodejno nalaganje nadzora razliÄic ob zagonu" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "RazliÄica:" +msgstr "Ime vtiÄnika za nadzor razliÄic" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp -#, fuzzy msgid "Input" -msgstr "Dodaj Vnos" +msgstr "Vnos" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "UI Sprejmi" #: core/project_settings.cpp -#, fuzzy msgid "UI Select" -msgstr "Izberi" +msgstr "UI Izberi" #: core/project_settings.cpp -#, fuzzy msgid "UI Cancel" -msgstr "PrekliÄi" +msgstr "UI Prekini" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Next" -msgstr "Poudari Pot" +msgstr "UI OsredotoÄi naslednje" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Prev" -msgstr "Poudari Pot" +msgstr "UI OsredotoÄi prejÅ¡nje" #: core/project_settings.cpp -#, fuzzy msgid "UI Left" -msgstr "NaÄin Vrtenja" +msgstr "UI Levo" #: core/project_settings.cpp -#, fuzzy msgid "UI Right" -msgstr "NaÄin Vrtenja" +msgstr "UI Desno" #: core/project_settings.cpp msgid "UI Up" -msgstr "" +msgstr "UI Gor" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "Prenesi" +msgstr "UI Dol" #: core/project_settings.cpp msgid "UI Page Up" -msgstr "" +msgstr "UI Page Up" #: core/project_settings.cpp msgid "UI Page Down" -msgstr "" +msgstr "UI Page Down" #: core/project_settings.cpp msgid "UI Home" -msgstr "" +msgstr "UI Home" #: core/project_settings.cpp msgid "UI End" -msgstr "" +msgstr "UI End" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -773,7 +737,7 @@ msgstr "" #: servers/physics_server.cpp #, fuzzy msgid "Physics" -msgstr "Fizikalni Okvir %" +msgstr "Fizika" #: core/project_settings.cpp editor/editor_settings.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -783,11 +747,11 @@ msgstr "Fizikalni Okvir %" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "3D" #: core/project_settings.cpp msgid "Smooth Trimesh Collision" -msgstr "" +msgstr "Gladko trimeÅ¡ko trÄenje" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -799,7 +763,7 @@ msgstr "" #: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Rendering" -msgstr "" +msgstr "Upodabljanje" #: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -809,18 +773,17 @@ msgstr "" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Kakovost" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "Filtri..." +msgstr "Filtri" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" -msgstr "" +msgstr "Izostri intenzivnost" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -836,28 +799,27 @@ msgstr "RazhroÅ¡Äevalnik" #: core/project_settings.cpp main/main.cpp modules/gdscript/gdscript.cpp #: modules/visual_script/visual_script.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Settings" -msgstr "Nastavitve ZaskoÄenja" +msgstr "Nastavitve" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp +#, fuzzy msgid "Profiler" -msgstr "" +msgstr "Zabeležnik(?)" #: core/project_settings.cpp #, fuzzy msgid "Max Functions" -msgstr "Preimenuj Funkcijo" +msgstr "NajveÄja koliÄina funkcij" #: core/project_settings.cpp scene/3d/vehicle_body.cpp -#, fuzzy msgid "Compression" -msgstr "Trenutna RazliÄica:" +msgstr "Kompresija" #: core/project_settings.cpp msgid "Formats" -msgstr "" +msgstr "Formati" #: core/project_settings.cpp msgid "Zstd" @@ -869,11 +831,12 @@ msgstr "" #: core/project_settings.cpp msgid "Compression Level" -msgstr "" +msgstr "Nivo kompresije" #: core/project_settings.cpp +#, fuzzy msgid "Window Log Size" -msgstr "" +msgstr "Velikost beležnega okna" #: core/project_settings.cpp msgid "Zlib" @@ -885,20 +848,19 @@ msgstr "" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" -msgstr "" +msgstr "Android" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "Moduli" #: core/register_core_types.cpp msgid "TCP" msgstr "TCP" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "Poveži se z Gradnikom:" +msgstr "ÄŒasovna omejitev povezave v sekundah" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -906,16 +868,15 @@ msgstr "" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" -msgstr "" +msgstr "NajveÄja koliÄina medpomnilnikov (VeÄkratnik 2)" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" msgstr "" #: core/register_core_types.cpp main/main.cpp -#, fuzzy msgid "Certificates" -msgstr "Lastnosti" +msgstr "Certifikati" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_resource_picker.cpp @@ -924,9 +885,8 @@ msgid "Resource" msgstr "Viri" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "Zapri Prizor" +msgstr "Lokalno tej sceni" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -936,18 +896,16 @@ msgid "Path" msgstr "Pot" #: core/script_language.cpp -#, fuzzy msgid "Source Code" -msgstr "Viri" +msgstr "Izvirna koda" #: core/translation.cpp editor/project_settings_editor.cpp msgid "Locale" msgstr "" #: core/translation.cpp -#, fuzzy msgid "Test" -msgstr "PreskuÅ¡anje" +msgstr "Test" #: core/translation.cpp scene/resources/font.cpp msgid "Fallback" @@ -987,17 +945,17 @@ msgstr "EiB" #: drivers/gles3/rasterizer_scene_gles3.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp msgid "Buffers" -msgstr "" +msgstr "Predpomnilnik" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Buffer Size (KB)" -msgstr "" +msgstr "Platno mnogotnik predpomnilnik velikost (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Index Buffer Size (KB)" -msgstr "" +msgstr "Platno mnogokotnik kazalo predpomnilnik velikost (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp editor/editor_settings.cpp @@ -1009,13 +967,12 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Snapping" -msgstr "Pametno pripenjanje" +msgstr "Pripenjanje" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1026,7 +983,7 @@ msgstr "Uporabi Pripenjanje Pikslov" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Immediate Buffer Size (KB)" -msgstr "" +msgstr "TakojÅ¡nja velikost predpomnilnika (KB)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp @@ -1036,29 +993,30 @@ msgstr "ZapeÄi Svetlobne karte" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp +#, fuzzy msgid "Use Bicubic Sampling" -msgstr "" +msgstr "Uporabite bikubiÄno vzorÄenje" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" -msgstr "" +msgstr "NajveÄ upodobljivih elementov" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Lights" -msgstr "" +msgstr "NajveÄ upodobljivih luÄi" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Max Renderable Reflections" -msgstr "GridMap IzbriÅ¡i Izbor" +msgstr "NajveÄ upodobljivih refleksij" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" -msgstr "" +msgstr "NajveÄ luÄi na objekt" #: drivers/gles3/rasterizer_scene_gles3.cpp +#, fuzzy msgid "Subsurface Scattering" -msgstr "" +msgstr "PodpovrÅ¡insko razprÅ¡evanje" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1070,29 +1028,30 @@ msgstr "" #: scene/animation/animation_blend_tree.cpp scene/gui/control.cpp #: scene/main/canvas_layer.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Scale" -msgstr "Prilagodi Velikost:" +msgstr "Velikost" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Follow Surface" -msgstr "" +msgstr "Sledi povrÅ¡ini" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" -msgstr "" +msgstr "Vzorci teže" #: drivers/gles3/rasterizer_scene_gles3.cpp +#, fuzzy msgid "Voxel Cone Tracing" -msgstr "" +msgstr "Sledenje (voxel?) stožca" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "Visoka kakovost" #: drivers/gles3/rasterizer_storage_gles3.cpp +#, fuzzy msgid "Blend Shape Max Buffer Size (KB)" -msgstr "" +msgstr "MeÅ¡anica oblike najveÄja velikost predpomnilnika (KB)" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp @@ -1166,9 +1125,8 @@ msgstr "Animacija Spremeni klic" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "Okvir %" +msgstr "Okvir" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp @@ -1179,38 +1137,35 @@ msgstr "ÄŒas" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" -msgstr "Rotacijski Korak:" +msgstr "Lokacija" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "Rotacijski Korak:" +msgstr "Rotacija" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp msgid "Value" -msgstr "" +msgstr "Vrednost" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "KoliÄina:" +msgstr "KoliÄina argumentov" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "Argumenti" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp #: modules/gltf/gltf_light.cpp modules/visual_script/visual_script_nodes.cpp #: scene/3d/physics_body.cpp scene/resources/visual_shader_nodes.cpp msgid "Type" -msgstr "" +msgstr "NaÄin" #: editor/animation_track_editor.cpp msgid "In Handle" @@ -1225,17 +1180,15 @@ msgstr "" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp msgid "Stream" -msgstr "" +msgstr "Tok" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "Mrežni Zamik:" +msgstr "ZaÄetni odmik" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "Mrežni Zamik:" +msgstr "KonÄni odmik" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1249,7 +1202,7 @@ msgstr "Animacija" #: editor/animation_track_editor.cpp msgid "Easing" -msgstr "" +msgstr "PopuÅ¡Äanje" #: editor/animation_track_editor.cpp #, fuzzy @@ -1313,7 +1266,7 @@ msgstr "Ustavi predvajanje animacije. (S)" #: editor/animation_track_editor.cpp #, fuzzy msgid "Animation length (frames)" -msgstr "Dolžina animacije (v sekundah)." +msgstr "Dolžina animacije (v slikah?)." #: editor/animation_track_editor.cpp #, fuzzy @@ -1326,9 +1279,8 @@ msgid "Add Track" msgstr "Animacija Dodaj sled" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Looping" -msgstr "Približaj animacijo." +msgstr "Animacija v zanki" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -1337,7 +1289,7 @@ msgstr "Funkcije:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" -msgstr "" +msgstr "ZvoÄni posnetki:" #: editor/animation_track_editor.cpp msgid "Anim Clips:" @@ -4694,6 +4646,7 @@ msgstr "RazliÄna projektna ali prizorska orodja." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7627,7 +7580,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15903,18 +15857,19 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Ime Gradnika:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Ime že uporablja druga funkcija/sprem/signal:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Ime Gradnika:" #: editor/scene_tree_dock.cpp @@ -16121,6 +16076,11 @@ msgstr "Dodaj v Skupino" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Ime Gradnika:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Napaka Pri Povezavi" @@ -16185,6 +16145,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -18118,6 +18082,21 @@ msgstr "Celotna izbira" msgid "Auto Update Project" msgstr "Izvozi Projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Zamenjaj Vse" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Izberi Mapo" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Izberi Mapo" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19970,6 +19949,11 @@ msgstr "Gradnik Prehod" msgid "Custom BG Color" msgstr "Gradnik Prehod" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "RazÅ¡iri vse" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20820,6 +20804,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Neveljavno ime." diff --git a/editor/translations/sq.po b/editor/translations/sq.po index af72b686b9..f8ffd0e88d 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -4632,6 +4632,7 @@ msgstr "Vegla të ndryshme për projektin ose skenën." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekti" @@ -7527,7 +7528,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15491,18 +15493,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Emri i Nyjes:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Emri i Nyjes:" #: editor/scene_tree_dock.cpp @@ -15699,6 +15701,11 @@ msgstr "Shto te Grupi" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Emri i Nyjes:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Gabim në Lidhje" @@ -15763,6 +15770,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17644,6 +17655,21 @@ msgstr "" msgid "Auto Update Project" msgstr "Eksporto Projektin" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Shfaqi të Gjitha" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Zgjidh një Direktori" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Zgjidh një Direktori" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19455,6 +19481,11 @@ msgstr "Dyfisho Nyjet" msgid "Custom BG Color" msgstr "Dyfisho Nyjet" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Zgjero të Gjitha" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20297,6 +20328,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Emër i palejuar." diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index 4231d62c6b..f2f6a5bf09 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -4878,6 +4878,7 @@ msgstr "Разни алати за пројекат или Ñцену." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Пројекат" @@ -7944,7 +7945,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -17014,18 +17016,19 @@ msgstr "" msgid "Make Local" msgstr "Ðаправи коÑти" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Име чвора:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Име је већ у употреби у функ/пром/Ñигналу:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Име чвора:" #: editor/scene_tree_dock.cpp @@ -17258,6 +17261,11 @@ msgstr "Група Дугмића" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Име чвора:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "(Повезивање од)" @@ -17343,6 +17351,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Ðеважеће име чвора, Ñледећи карактери ниÑу дозвољени:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp #, fuzzy msgid "Rename Node" msgstr "Преименуј Чвор" @@ -19420,6 +19432,21 @@ msgstr "ИÑпуни одабрано" msgid "Auto Update Project" msgstr "Ðеименован Пројекат" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Прикажи нормалу" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Одабери директоријум" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Одабери директоријум" + #: modules/mono/mono_gd/gd_mono_utils.cpp #, fuzzy msgid "End of inner exception stack trace" @@ -21351,6 +21378,11 @@ msgstr "Ðаправи чвор" msgid "Custom BG Color" msgstr "Ðаправи чвор" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Прошири Ñве" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -22211,6 +22243,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Ðеважеће кратко име паковања." diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index b898108402..8af5b1daaf 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -4411,6 +4411,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7151,7 +7152,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14924,18 +14926,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ObriÅ¡i Selekciju" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "ObriÅ¡i Selekciju" #: editor/scene_tree_dock.cpp @@ -15128,6 +15130,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ObriÅ¡i Selekciju" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15191,6 +15198,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17031,6 +17042,19 @@ msgstr "Sve sekcije" msgid "Auto Update Project" msgstr "Izmjeni Selekciju Krivulje" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Izmjeni Selekciju Krivulje" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18778,6 +18802,11 @@ msgstr "Animacija Uduplaj KljuÄeve" msgid "Custom BG Color" msgstr "Animacija Uduplaj KljuÄeve" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Homogenost Boje." + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19579,6 +19608,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index 9fd6b9bf67..44b6fcf8b6 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: Kenny Andersson <kenny@ordinary.se>\n" +"PO-Revision-Date: 2022-08-30 03:11+0000\n" +"Last-Translator: Björn Ã…kesson <bjorn.akesson@gmail.com>\n" "Language-Team: Swedish <https://hosted.weblate.org/projects/godot-engine/" "godot/sv/>\n" "Language: sv\n" @@ -41,7 +41,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp #, fuzzy @@ -49,9 +49,8 @@ msgid "Tablet Driver" msgstr "Drivrutin för surfplatta" #: core/bind/core_bind.cpp -#, fuzzy msgid "Clipboard" -msgstr "Klippbordet är tomt!" +msgstr "Urklipp" #: core/bind/core_bind.cpp msgid "Current Screen" @@ -4662,6 +4661,7 @@ msgstr "Diverse projekt eller scenövergripande-verktyg." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Projekt" @@ -7565,7 +7565,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15718,18 +15719,18 @@ msgstr "" msgid "Make Local" msgstr "Gör Patch" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Node Namn:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Node Namn:" #: editor/scene_tree_dock.cpp @@ -15934,6 +15935,11 @@ msgstr "Lägg till i Grupp" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Node Namn:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Anslutningsfel" @@ -15999,6 +16005,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Byt namn pÃ¥ Node" @@ -17909,6 +17919,21 @@ msgstr "Alla urval" msgid "Auto Update Project" msgstr "Namnlöst Projekt" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Ersätt Alla" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Välj en Katalog" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Välj en Katalog" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19734,6 +19759,11 @@ msgstr "Klipp ut Noder" msgid "Custom BG Color" msgstr "Klipp ut Noder" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Expandera alla" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20583,6 +20613,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "Ogiltigt namn." diff --git a/editor/translations/te.po b/editor/translations/te.po index af4c65f062..fe9f95b213 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -4330,6 +4330,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7008,7 +7009,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -14677,16 +14679,16 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." +#: editor/scene_tree_dock.cpp +msgid "Enable Scene Unique Name(s)" msgstr "" #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +msgid "Disable Scene Unique Name(s)" msgstr "" #: editor/scene_tree_dock.cpp @@ -14876,6 +14878,10 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -14939,6 +14945,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -16723,6 +16733,18 @@ msgstr "" msgid "Auto Update Project" msgstr "" +#: modules/mono/godotsharp_dirs.cpp +msgid "Assembly Name" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +msgid "C# Project Directory" +msgstr "" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -18417,6 +18439,10 @@ msgstr "" msgid "Custom BG Color" msgstr "" +#: platform/iphone/export/export.cpp +msgid "Export Icons" +msgstr "" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19198,6 +19224,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index f1eb8b716f..6e4b0e578f 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -4623,6 +4623,7 @@ msgstr "โปรเจà¸à¸•์à¹à¸¥à¸°à¹€à¸„รื่à¸à¸‡à¸¡à¸·à¸à¸à¸·à¹ˆ #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "โปรเจà¸à¸•์" @@ -7560,7 +7561,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15655,18 +15657,19 @@ msgstr "" msgid "Make Local" msgstr "ทำให้เป็นภายใน" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ชื่à¸à¹‚นด:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "มีฟังà¸à¹Œà¸Šà¸±à¸™/ตัวà¹à¸›à¸£/สัà¸à¸à¸²à¸“à¸à¸·à¹ˆà¸™à¹ƒà¸Šà¹‰à¸Šà¸·à¹ˆà¸à¸™à¸µà¹‰à¹à¸¥à¹‰à¸§:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "ชื่à¸à¹‚นด:" #: editor/scene_tree_dock.cpp @@ -15862,6 +15865,11 @@ msgid "Button Group" msgstr "ชุดขà¸à¸‡à¸›à¸¸à¹ˆà¸¡" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ชื่à¸à¹‚นด:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(เชื่à¸à¸¡à¸•่à¸à¸ˆà¸²à¸)" @@ -15937,6 +15945,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "ชื่à¸à¹‚หนดไม่ถูà¸à¸•้à¸à¸‡ ใช้ตัวà¸à¸±à¸à¸©à¸£à¸•่à¸à¹„ปนี้ไม่ได้:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "เปลี่ยนชื่à¸à¹‚หนด" @@ -17864,6 +17876,21 @@ msgstr "เติมส่วนที่เลืà¸à¸" msgid "Auto Update Project" msgstr "โปรเจà¸à¸•์ไม่มีชื่à¸" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "à¹à¸ªà¸”งทั้งหมด" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "เลืà¸à¸à¹‚ฟลเดà¸à¸£à¹Œ" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "เลืà¸à¸à¹‚ฟลเดà¸à¸£à¹Œ" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "สิ้นสุดสà¹à¸•คข้à¸à¸œà¸´à¸”พลาดภายใน" @@ -19716,6 +19743,11 @@ msgstr "ตัดโหนด" msgid "Custom BG Color" msgstr "ตัดโหนด" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "ขยายà¸à¸à¸" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20572,6 +20604,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "ชื่à¸à¹à¸žà¹‡à¸„เà¸à¸ˆà¹à¸šà¸šà¸ªà¸±à¹‰à¸™à¸œà¸´à¸”พลาด" diff --git a/editor/translations/tl.po b/editor/translations/tl.po index fec7766383..bf39f11166 100644 --- a/editor/translations/tl.po +++ b/editor/translations/tl.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-04-08 07:29+0000\n" +"PO-Revision-Date: 2022-08-12 17:08+0000\n" "Last-Translator: Napstaguy04 <brokenscreen3@gmail.com>\n" "Language-Team: Tagalog <https://hosted.weblate.org/projects/godot-engine/" "godot/tl/>\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 " "|| n % 10 == 6 || n % 10 == 9);\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -523,30 +523,26 @@ msgid "Delta" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Channel" -msgstr "Baguhin" +msgstr "" #: core/os/input_event.cpp main/main.cpp -#, fuzzy msgid "Message" -msgstr "I-commit Lahat ng Pagbabago" +msgstr "Mensahe" #: core/os/input_event.cpp -#, fuzzy msgid "Pitch" -msgstr "Switch" +msgstr "Taas ng Tunog" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp #: scene/3d/physics_body.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity" -msgstr "Simulan" +msgstr "Bilis" #: core/os/input_event.cpp msgid "Instrument" -msgstr "" +msgstr "Instrumento" #: core/os/input_event.cpp #, fuzzy @@ -627,15 +623,14 @@ msgstr "" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "Ipakita Lahat" +msgstr "" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Lapad" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -644,11 +639,11 @@ msgstr "" #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp msgid "Height" -msgstr "" +msgstr "Taas" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "Parating Nasa Taas" #: core/project_settings.cpp msgid "Test Width" @@ -742,30 +737,27 @@ msgstr "I-urong Pakanan" #: core/project_settings.cpp msgid "UI Up" -msgstr "" +msgstr "UI Taas" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "Baba" +msgstr "UI Baba" #: core/project_settings.cpp -#, fuzzy msgid "UI Page Up" -msgstr "Pahina: " +msgstr "UI Pahinang Taas" #: core/project_settings.cpp msgid "UI Page Down" -msgstr "" +msgstr "UI Pahinang Baba" #: core/project_settings.cpp msgid "UI Home" -msgstr "" +msgstr "UI Panimula" #: core/project_settings.cpp -#, fuzzy msgid "UI End" -msgstr "Sa Huli" +msgstr "UI Wakas" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -776,7 +768,7 @@ msgstr "Sa Huli" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Physics" -msgstr "" +msgstr "Pisika" #: core/project_settings.cpp editor/editor_settings.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -786,7 +778,7 @@ msgstr "" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "3D" #: core/project_settings.cpp msgid "Smooth Trimesh Collision" @@ -802,7 +794,7 @@ msgstr "" #: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Rendering" -msgstr "" +msgstr "Pagre-render" #: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -812,18 +804,17 @@ msgstr "" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Kalidad" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "Salain ang mga node" +msgstr "Mga Pansala" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" -msgstr "" +msgstr "Tindi ng Pagkatulis" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -839,9 +830,8 @@ msgstr "Debug" #: core/project_settings.cpp main/main.cpp modules/gdscript/gdscript.cpp #: modules/visual_script/visual_script.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Settings" -msgstr "Kaayusan:" +msgstr "Pagsasaayos:" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp @@ -849,18 +839,16 @@ msgid "Profiler" msgstr "" #: core/project_settings.cpp -#, fuzzy msgid "Max Functions" -msgstr "Gumawa ng Punsyon" +msgstr "Max na Punksyon" #: core/project_settings.cpp scene/3d/vehicle_body.cpp -#, fuzzy msgid "Compression" -msgstr "Ekspresyon" +msgstr "Kompresyon" #: core/project_settings.cpp msgid "Formats" -msgstr "" +msgstr "Mga Format" #: core/project_settings.cpp msgid "Zstd" @@ -868,15 +856,15 @@ msgstr "" #: core/project_settings.cpp msgid "Long Distance Matching" -msgstr "" +msgstr "Pagtugma sa Mahabang Layo" #: core/project_settings.cpp msgid "Compression Level" -msgstr "" +msgstr "Tindi ng Kompresyon" #: core/project_settings.cpp msgid "Window Log Size" -msgstr "" +msgstr "Laki ng Log ng Window" #: core/project_settings.cpp msgid "Zlib" @@ -892,16 +880,15 @@ msgstr "" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "Mga Modyul" #: core/register_core_types.cpp msgid "TCP" msgstr "" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "Ikabit sa Node:" +msgstr "" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -917,7 +904,7 @@ msgstr "" #: core/register_core_types.cpp main/main.cpp msgid "Certificates" -msgstr "" +msgstr "Mga Katibayan" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_resource_picker.cpp @@ -926,9 +913,8 @@ msgid "Resource" msgstr "" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "Isara ang Eksena" +msgstr "Lokal sa Eksena" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -943,7 +929,7 @@ msgstr "" #: core/translation.cpp editor/project_settings_editor.cpp msgid "Locale" -msgstr "" +msgstr "Wika" #: core/translation.cpp #, fuzzy @@ -1019,9 +1005,8 @@ msgstr "" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Use GPU Pixel Snap" -msgstr "Paguurong na Pa-pixel" +msgstr "Gamiting ang GPU Paguurong na Pa-pixel" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -1070,11 +1055,11 @@ msgstr "" #: scene/main/canvas_layer.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/particles_material.cpp msgid "Scale" -msgstr "" +msgstr "Iskala" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Follow Surface" -msgstr "" +msgstr "Sundan ang Ibabaw" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" @@ -1086,7 +1071,7 @@ msgstr "" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "Mataas na Kalidad" #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Blend Shape Max Buffer Size (KB)" @@ -1095,7 +1080,7 @@ msgstr "" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp msgid "Free" -msgstr "Walang Bayad" +msgstr "Malaya" #: editor/animation_bezier_editor.cpp msgid "Balanced" @@ -4497,6 +4482,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proyekto" @@ -7300,7 +7286,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -11524,27 +11511,27 @@ msgstr "Sariwain ang Preview" #: editor/plugins/sprite_editor_plugin.cpp msgid "Settings:" -msgstr "Kaayusan:" +msgstr "Pagsasaayos:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "No Frames Selected" -msgstr "" +msgstr "Walang Pinipiling Frames" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add %d Frame(s)" -msgstr "" +msgstr "Magdagdag ng %d Frame(s)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" -msgstr "" +msgstr "Magdagdag ng Frame" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Unable to load images" -msgstr "" +msgstr "Hindi mai-karga ang mga larawan" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" -msgstr "" +msgstr "ERROR: Hindi mai-karga ang frame resource!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Resource clipboard is empty or not a texture!" @@ -11560,7 +11547,7 @@ msgstr "Magdagdag ng Puwang" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation FPS" -msgstr "" +msgstr "Palitan ang FPS ng Animation" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "(empty)" @@ -11579,9 +11566,8 @@ msgid "New Animation" msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Salain ang mga method" +msgstr "Salain ang mga animation" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -11630,16 +11616,16 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Horizontal:" -msgstr "" +msgstr "Pahalang:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Vertical:" -msgstr "" +msgstr "Patayo:" #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp msgid "Separation:" -msgstr "" +msgstr "Pagkakahiwalay:" #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp @@ -11668,7 +11654,7 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" -msgstr "Paraan ng Paguurong:" +msgstr "Paraan ng Pag-uurong:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" @@ -11716,15 +11702,15 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "No fonts found." -msgstr "" +msgstr "Walang font na mahanap." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} icon(s)" -msgstr "" +msgstr "(mga) {num} icon" #: editor/plugins/theme_editor_plugin.cpp msgid "No icons found." -msgstr "" +msgstr "Walang icon na mahanap." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} stylebox(es)" @@ -11732,15 +11718,15 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "No styleboxes found." -msgstr "" +msgstr "Walang stylebox ang nahanap." #: editor/plugins/theme_editor_plugin.cpp msgid "{num} currently selected" -msgstr "" +msgstr "{num} ang kasalukuyang pinipili" #: editor/plugins/theme_editor_plugin.cpp msgid "Nothing was selected for the import." -msgstr "" +msgstr "Walang pinili upang i-import." #: editor/plugins/theme_editor_plugin.cpp msgid "Importing Theme Items" @@ -11764,7 +11750,7 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "With Data" -msgstr "" +msgstr "May Data" #: editor/plugins/theme_editor_plugin.cpp msgid "Select by data type:" @@ -11878,9 +11864,8 @@ msgid "" msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Type" -msgstr "Alisin ang Tile" +msgstr "Alisin ang Type" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -15086,18 +15071,19 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Pangalan ng Node:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Ginagamit na ang pangalan ng ibang punsyon/var/hudyat:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Pangalan ng Node:" #: editor/scene_tree_dock.cpp @@ -15288,6 +15274,11 @@ msgid "Button Group" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Pangalan ng Node:" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "" @@ -15353,6 +15344,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17219,6 +17214,21 @@ msgstr "" msgid "Auto Update Project" msgstr "Bumalik sa Talaproyektuhan" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Ipakita Lahat" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Pumili ng Lalagyanan" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Pumili ng Lalagyanan" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19007,6 +19017,11 @@ msgstr "Kopyahin ang mga Node" msgid "Custom BG Color" msgstr "Kopyahin ang mga Node" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Palakihin lahat" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19847,6 +19862,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index ab58a87c36..e115c4d368 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -78,13 +78,19 @@ # Emre <mr.inkaya@gmail.com>, 2022. # Deleted User <noreply+46858@weblate.org>, 2022. # Ümid Quliyev <lucifer25x@protonmail.com>, 2022. +# Mustafa Said AÄŸca <m.said.agca@gmail.com>, 2022. +# YaÅŸar Anıl Sansak <anilsansak@gmail.com>, 2022. +# Hasan Hüseyin Cihangir <hashusfb@gmail.com>, 2022. +# Volkan Gezer <volkangezer@gmail.com>, 2022. +# bsr <bsndrn16@gmail.com>, 2022. +# Ramazan SANCAR <ramazansancar4545@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-05 01:04+0000\n" -"Last-Translator: Ümid Quliyev <lucifer25x@protonmail.com>\n" +"PO-Revision-Date: 2022-08-30 03:11+0000\n" +"Last-Translator: Ramazan SANCAR <ramazansancar4545@gmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -92,7 +98,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -107,6 +113,7 @@ msgid "Current Screen" msgstr "Åžu anki Ekran" #: core/bind/core_bind.cpp +#, fuzzy msgid "Exit Code" msgstr "Çıkış Kodu" @@ -136,11 +143,11 @@ msgstr "Ekranı Açık Tut" #: core/bind/core_bind.cpp msgid "Min Window Size" -msgstr "Minimum Pencere Boyutu" +msgstr "Minimum Ekran Boyutu" #: core/bind/core_bind.cpp msgid "Max Window Size" -msgstr "Maksimum Pencere Boyutu" +msgstr "Maksimum Ekran Boyutu" #: core/bind/core_bind.cpp msgid "Screen Orientation" @@ -202,7 +209,7 @@ msgstr "Endian DeÄŸiÅŸimi" #: core/bind/core_bind.cpp msgid "Editor Hint" -msgstr "Düzenleyici İpucusu" +msgstr "Editör İpucu" #: core/bind/core_bind.cpp msgid "Print Error Messages" @@ -214,7 +221,7 @@ msgstr "Saniye Başına Yineleme" #: core/bind/core_bind.cpp msgid "Target FPS" -msgstr "Hedef FPS" +msgstr "Hedeflenen FPS" #: core/bind/core_bind.cpp msgid "Time Scale" @@ -256,6 +263,7 @@ msgid "Limits" msgstr "Limitler" #: core/command_queue_mt.cpp +#, fuzzy msgid "Command Queue" msgstr "Komut Sırası" @@ -349,7 +357,7 @@ msgstr "Çıkış ArabelleÄŸi Maksimum Boyutu" #: core/io/packet_peer.cpp msgid "Stream Peer" -msgstr "" +msgstr "Akış EÅŸi" #: core/io/stream_peer.cpp msgid "Big Endian" @@ -425,7 +433,7 @@ msgstr "Mesaj Sırası" #: core/message_queue.cpp msgid "Max Size (KB)" -msgstr "En Büyük Boyut (KB)" +msgstr "Maksimum Boyut (KB)" #: core/os/input.cpp msgid "Mouse Mode" @@ -515,7 +523,6 @@ msgid "Pressure" msgstr "Baskı" #: core/os/input_event.cpp -#, fuzzy msgid "Pen Inverted" msgstr "Ters Kalem" @@ -567,9 +574,8 @@ msgid "Message" msgstr "Mesaj" #: core/os/input_event.cpp -#, fuzzy msgid "Pitch" -msgstr "Perde" +msgstr "EÄŸim" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp @@ -644,7 +650,7 @@ msgstr "Stderr'i devre dışı bırak" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "GizlenmiÅŸ Proje Verileri Dizinini Kullan" +msgstr "Gizli Proje Veri Dizinini Kullan" #: core/project_settings.cpp msgid "Use Custom User Dir" @@ -704,12 +710,10 @@ msgid "Editor" msgstr "Düzenleyici" #: core/project_settings.cpp -#, fuzzy msgid "Main Run Args" -msgstr "Ana Sahne DeÄŸiÅŸtirgenleri:" +msgstr "Oynatma Argümanları" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" msgstr "Sahne Adlandırma" @@ -722,14 +726,12 @@ msgid "Script Templates Search Path" msgstr "Script Dosyalarını Aramak İçin Dosya Yolu" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" msgstr "BaÅŸlangıçta Otomatik Sürüm Kontrolü" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "Sürüm Denetimi Eklenti Adı" +msgstr "Sürüm Denetim Eklentisi Adı" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -864,9 +866,8 @@ msgstr "Ayarlar" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Profiler" -msgstr "Kesitçi" +msgstr "Profil OluÅŸturucu" #: core/project_settings.cpp msgid "Max Functions" @@ -921,7 +922,6 @@ msgid "Connect Timeout Seconds" msgstr "BaÄŸlanma Zaman Aşımı Süresi(Saniye)" #: core/register_core_types.cpp -#, fuzzy msgid "Packet Peer Stream" msgstr "Paket EÅŸ Akışı" @@ -963,7 +963,6 @@ msgid "Locale" msgstr "Yerel" #: core/translation.cpp -#, fuzzy msgid "Test" msgstr "Deneme" @@ -1051,9 +1050,8 @@ msgstr "Işık Haritalama" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp -#, fuzzy msgid "Use Bicubic Sampling" -msgstr "Bicubic Örneklemeyi Kullanın" +msgstr "Çift Kübik Örneklemeyi Kullan" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" @@ -1073,7 +1071,7 @@ msgstr "Maks. Objeye düşen Işık Sayısı" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Subsurface Scattering" -msgstr "" +msgstr "Yüzeyaltı Saçılması" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1097,9 +1095,8 @@ msgid "Weight Samples" msgstr "Ağırlık Örnekleri" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Voxel Cone Tracing" -msgstr "Işın İzleme" +msgstr "Voksel Koni İzleme" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" @@ -1112,7 +1109,7 @@ msgstr "Karışım Åžekli Maksimum Arabellek Boyutu (KB)" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp msgid "Free" -msgstr "Özgür" +msgstr "Serbest" #: editor/animation_bezier_editor.cpp msgid "Balanced" @@ -1151,16 +1148,19 @@ msgid "Move Bezier Points" msgstr "Bezier Noktalarını Taşı" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Duplicate Keys" -msgstr "Animasyon Anahtarlarını ÇoÄŸalt" +msgstr "Animasyon Anahtarları ÇoÄŸalt" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Delete Keys" msgstr "Animasyon Anahtarları Sil" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Change Keyframe Time" -msgstr "Anim Anahtar-kare Zamanını DeÄŸiÅŸtir" +msgstr "Animasyon Bağımsız Kare Zamanını DeÄŸiÅŸtir" #: editor/animation_track_editor.cpp msgid "Anim Change Transition" @@ -1171,8 +1171,9 @@ msgid "Anim Change Transform" msgstr "Animasyon DeÄŸiÅŸikliÄŸi Dönüşümü" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Change Keyframe Value" -msgstr "Anim Anahtar-kare DeÄŸerini DeÄŸiÅŸtir" +msgstr "Animasyon Bağımsız Kare DeÄŸerini DeÄŸiÅŸtir" #: editor/animation_track_editor.cpp msgid "Anim Change Call" @@ -1224,32 +1225,27 @@ msgid "Type" msgstr "Tür" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In Handle" -msgstr "Tutamacı Ayarla" +msgstr "İç Kulp" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out Handle" -msgstr "Tutamacı Ayarla" +msgstr "Dış Kulp" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Stream" -msgstr "Aktarım" +msgstr "Akış" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "Izgarayı Kaydır:" +msgstr "BaÅŸlangıç Dengeleme" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "Kaydırma:" +msgstr "BitiÅŸ Dengeleme" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1266,8 +1262,9 @@ msgid "Easing" msgstr "YumuÅŸatma" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Multi Change Keyframe Time" -msgstr "Animasyon Anahtar-Çerçeve Zamanını DeÄŸiÅŸtir" +msgstr "Animasyon Çoklu Bağımsız Kare Zamanı DeÄŸiÅŸtir" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transition" @@ -1300,7 +1297,7 @@ msgstr "Özellik Parçası" #: editor/animation_track_editor.cpp msgid "3D Transform Track" -msgstr "3D Dönüştürücü İzi" +msgstr "3B Dönüştürücü İzi" #: editor/animation_track_editor.cpp msgid "Call Method Track" @@ -1398,41 +1395,34 @@ msgid "Type:" msgstr "Tür:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "(Geçersiz Dışa Aktarım Åžablonu: %s)" +msgstr "(Geçersiz, beklenen tür: %s)" #: editor/animation_track_editor.cpp msgid "Easing:" msgstr "YumuÅŸatma:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In-Handle:" -msgstr "Tutamacı Ayarla" +msgstr "İç-Kulp:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out-Handle:" -msgstr "Tutamacı Ayarla" +msgstr "Dış-Kulp:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "Aktarım:" +msgstr "Akış:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "BaÅŸlangıç (lar):" +msgstr "BaÅŸlangıç (saniye):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End (s):" -msgstr "BitiÅŸ (ler):" +msgstr "BitiÅŸ (saniye):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" msgstr "Animasyon Klibi:" @@ -1518,12 +1508,10 @@ msgstr "Animasyon İzini Kaldır" #: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editors" -msgstr "Düzenleyici" +msgstr "Editörler" #: editor/animation_track_editor.cpp editor/editor_settings.cpp -#, fuzzy msgid "Confirm Insert Track" msgstr "Parça Eklemeyi Onayla" @@ -1650,7 +1638,6 @@ msgid "Add Method Track Key" msgstr "Yöntem İz Anahtarı Ekle" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" msgstr "Metot, nesne içinde bulunamadı:" @@ -1672,7 +1659,7 @@ msgstr "Metodlar" #: editor/animation_track_editor.cpp msgid "Bezier" -msgstr "" +msgstr "Bezier EÄŸrisi" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -1845,7 +1832,7 @@ msgstr "Maks. EniyileÅŸtirilebilir Açı:" #: editor/animation_track_editor.cpp scene/3d/room_manager.cpp #: servers/visual_server.cpp msgid "Optimize" -msgstr "İyileÅŸtir" +msgstr "En İyileÅŸtir" #: editor/animation_track_editor.cpp msgid "Remove invalid keys" @@ -2262,7 +2249,6 @@ msgid "Open" msgstr "Aç" #: editor/dependency_editor.cpp -#, fuzzy msgid "Owners of: %s (Total: %d)" msgstr "Sahipleri: %s (Toplam: %d)" @@ -2376,7 +2362,6 @@ msgstr "BaÅŸ GeliÅŸtirici" #. TRANSLATORS: This refers to a job title. #: editor/editor_about.cpp -#, fuzzy msgctxt "Job Title" msgid "Project Manager" msgstr "Proje Yöneticisi" @@ -2621,9 +2606,8 @@ msgid "There is no '%s' file." msgstr "'%s' dosyası bulunamadı." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "YerleÅŸim Düzeni:" +msgstr "Düzen:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2672,7 +2656,6 @@ msgid "Create a new Bus Layout." msgstr "Yeni bir Bus YerleÅŸim Düzeni oluÅŸtur." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Audio Bus Layout" msgstr "Ses Veri Yolu Düzeni" @@ -2682,7 +2665,7 @@ msgstr "Geçersiz ad." #: editor/editor_autoload_settings.cpp msgid "Cannot begin with a digit." -msgstr "Basamak ile baÅŸlayamaz." +msgstr "Rakamla baÅŸlanamaz." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" @@ -2826,22 +2809,18 @@ msgid "Choose" msgstr "Seç" #: editor/editor_export.cpp -#, fuzzy msgid "Project export for platform:" msgstr "Platform için proje dışa aktarımı:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Hatalarla tamamlandı." +msgstr "Uyarılar ile tamamlandı." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." msgstr "BaÅŸarıyla tamamlandı." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." msgstr "BaÅŸarısız." @@ -2855,32 +2834,27 @@ msgstr "Beklenen adreste dışa aktarım ÅŸablonu bulunamadı:" #: editor/editor_export.cpp msgid "Packing" -msgstr "Çıkınla" +msgstr "Paketle" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "PCK'yi kaydet" +msgstr "PCK Dosyasına Kaydet" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." msgstr "\"%s\" dosyası oluÅŸturulamıyor." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." msgstr "Proje dosyaları dışa aktarılamadı." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." msgstr "\"%s\" yolundan okunacak dosya açılamıyor." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "ZIP dosyasını kaydet" +msgstr "ZIP Dosyasına Kaydet" #: editor/editor_export.cpp msgid "" @@ -2941,7 +2915,6 @@ msgstr "" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Custom Template" msgstr "Özel Åžablon" @@ -2953,49 +2926,40 @@ msgid "Release" msgstr "Yayınlamak" #: editor/editor_export.cpp -#, fuzzy msgid "Binary Format" -msgstr "Çift Biçim" +msgstr "Binary Biçimi" #: editor/editor_export.cpp -#, fuzzy msgid "64 Bits" msgstr "64 Bit" #: editor/editor_export.cpp -#, fuzzy msgid "Embed PCK" -msgstr "PCK'yı yerleÅŸtirin" +msgstr "PCK'yi YerleÅŸtir" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Texture Format" msgstr "Doku Biçimi" #: editor/editor_export.cpp -#, fuzzy msgid "BPTC" msgstr "BPTC" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "S3TC" msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "ETC" msgstr "ETC" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "ETC2" msgstr "ETC2" #: editor/editor_export.cpp -#, fuzzy msgid "No BPTC Fallbacks" -msgstr "Shader Yedeklerini Zorla" +msgstr "BPTC Gerilemesi Yok" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -3010,39 +2974,33 @@ msgid "Custom release template not found." msgstr "Özel yayınlama ÅŸablonu bulunamadı." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" msgstr "Åžablon Hazırla" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "Belirtilen Dışa aktarım yolu mevcut deÄŸil:" +msgstr "Belirtilen dışa aktarım yolu mevcut deÄŸil." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." msgstr "Åžablon dosyası bulunamadı: \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Dışa aktarma ÅŸablonu kopyalanamadı." +msgstr "Dışa aktarım ÅŸablonu kopyalanamadı." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "Dolgulama" +msgstr "PCK Gömme" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." msgstr "32-bit dışa aktarımlarda gömülü PCK 4GiB'tan büyük olamaz." #: editor/editor_export.cpp -#, fuzzy msgid "Convert Text Resources To Binary On Export" -msgstr "Dışa Aktarmada Metin Kaynaklarını İkili Dosyaya Dönüştür" +msgstr "Dışa Aktarım Sırasında Metin Kaynaklarını Binary Formata Dönüştür" #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -3063,19 +3021,19 @@ msgstr "Sahne AÄŸacı Düzenleme" #: editor/editor_feature_profile.cpp msgid "Node Dock" -msgstr "Dock Nod" +msgstr "Node Rıhtımı" #: editor/editor_feature_profile.cpp msgid "FileSystem Dock" -msgstr "Dosya Sistemi" +msgstr "Dosya Sistemi Rıhtımı" #: editor/editor_feature_profile.cpp msgid "Import Dock" -msgstr "Dock İçe Aktar" +msgstr "Rıhtım İçe Aktar" #: editor/editor_feature_profile.cpp msgid "Allows to view and edit 3D scenes." -msgstr "3D sahneleri görüntülemeye ve düzenlemeye izin verir." +msgstr "Üç boyutlu sahneleri görüntülemeye ve düzenlemeye izin verir." #: editor/editor_feature_profile.cpp msgid "Allows to edit scripts using the integrated script editor." @@ -3113,7 +3071,7 @@ msgstr "" #: editor/editor_feature_profile.cpp msgid "(current)" -msgstr "(Åžu anki)" +msgstr "(mevcut)" #: editor/editor_feature_profile.cpp msgid "(none)" @@ -3251,7 +3209,6 @@ msgid "Manage Editor Feature Profiles" msgstr "Dışa Aktarım Åžablonlarını Yönet" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Default Feature Profile" msgstr "Varsayılan Özellik Profili" @@ -3325,14 +3282,12 @@ msgid "Save a File" msgstr "Bir Dosya Kaydet" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Access" msgstr "EriÅŸim" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp -#, fuzzy msgid "Display Mode" -msgstr "Ekran Modu" +msgstr "Görüntüleme Modu" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3345,33 +3300,27 @@ msgstr "Ekran Modu" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/visual_shader.cpp #: servers/audio/effects/audio_effect_distortion.cpp -#, fuzzy msgid "Mode" msgstr "Mod" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Dir" msgstr "Geçerli Dizin" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current File" msgstr "Geçerli Dosya" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Path" msgstr "Geçerli Yol" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Show Hidden Files" msgstr "Gizli Dosyaları Göster" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Disable Overwrite Warning" msgstr "Üzerine Yazma Uyarısını Devre Dışı Bırak" @@ -3475,9 +3424,8 @@ msgid "(Re)Importing Assets" msgstr "Varlıklar Yeniden-İçe Aktarılıyor" #: editor/editor_file_system.cpp -#, fuzzy msgid "Reimport Missing Imported Files" -msgstr "İçe Aktarılan Eksik Dosyaları Yeniden İçe Aktar" +msgstr "Eksik Dosyaları Yeniden İçe Aktar" #: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp @@ -3507,7 +3455,6 @@ msgid "Properties" msgstr "Özellikler" #: editor/editor_help.cpp -#, fuzzy msgid "overrides %s:" msgstr "%s'yi geçersiz kılar:" @@ -3579,9 +3526,8 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp #: modules/gdscript/gdscript_editor.cpp -#, fuzzy msgid "Text Editor" -msgstr "Metin Düzenleyici" +msgstr "Metin Editörü" #: editor/editor_help.cpp editor/editor_node.cpp editor/editor_settings.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3589,7 +3535,6 @@ msgid "Help" msgstr "Yardım" #: editor/editor_help.cpp -#, fuzzy msgid "Sort Functions Alphabetically" msgstr "Fonksiyonları Alfabetik Olarak Sırala" @@ -3671,40 +3616,34 @@ msgid "Property:" msgstr "Özellik:" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp -#, fuzzy msgid "Label" msgstr "Etiket" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Read Only" -msgstr "Sadece Okunur" +msgstr "Salt Okunur" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp -#, fuzzy msgid "Checkable" -msgstr "Kontrol edilebilir" +msgstr "Denetlenebilir" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Checked" -msgstr "Kontrol edildi" +msgstr "Denetlendi" #: editor/editor_inspector.cpp -#, fuzzy msgid "Draw Red" msgstr "Kırmızı Çiz" #: editor/editor_inspector.cpp -#, fuzzy msgid "Keying" msgstr "Anahtarlama" #: editor/editor_inspector.cpp msgid "Pin value" -msgstr "İğneleme deÄŸeri" +msgstr "Sabitleme deÄŸeri" #: editor/editor_inspector.cpp msgid "" @@ -3715,7 +3654,7 @@ msgstr "" #: editor/editor_inspector.cpp msgid "Pin value [Disabled because '%s' is editor-only]" msgstr "" -"DeÄŸer sabitle [Devre dışı bırakıldı çünkü '%s' sadece editör için aktiftir]" +"Sabitleme deÄŸeri [Devre dışı bırakıldı çünkü '%s' sadece editör içindir]" #: editor/editor_inspector.cpp #: editor/plugins/gradient_texture_2d_editor_plugin.cpp @@ -3732,11 +3671,11 @@ msgstr "Çoklu Ayarla:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "% SabitlenmiÅŸler" +msgstr "%s sabitlendi" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "%SabitlenmemiÅŸler" +msgstr "%s serbest bırakıldı" #: editor/editor_inspector.cpp msgid "Copy Property" @@ -4063,14 +4002,12 @@ msgid "Quick Open Script..." msgstr "BetiÄŸi Hızlı Aç..." #: editor/editor_node.cpp -#, fuzzy msgid "Save & Reload" msgstr "Kaydet ve Yeniden Yükle" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to '%s' before reloading?" -msgstr "Çıkmadan önce deÄŸiÅŸiklikler '%s' ‘ye kaydedilsin mi?" +msgstr "Yeniden yüklemeden önce deÄŸiÅŸiklikler '%s' dosyasına kaydedilsin mi?" #: editor/editor_node.cpp msgid "Save & Close" @@ -4189,9 +4126,9 @@ msgid "Open Project Manager?" msgstr "Proje Yöneticisi Açılsın Mı?" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to the following scene(s) before reloading?" -msgstr "Çıkmadan önce deÄŸiÅŸiklikler sahne(ler)e kaydedilsin mi?" +msgstr "" +"Yeniden yüklemeden önce ÅŸu sahne(ler)deki deÄŸiÅŸiklikler kaydedilsin mi?" #: editor/editor_node.cpp msgid "Save & Quit" @@ -4375,7 +4312,6 @@ msgid "%d more files" msgstr "%d daha fazla dosyalar" #: editor/editor_node.cpp -#, fuzzy msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" @@ -4419,70 +4355,60 @@ msgid "Always Close Output On Stop" msgstr "DurdurulduÄŸunda Çıktıyı Daima Kapat" #: editor/editor_node.cpp -#, fuzzy msgid "Save On Focus Loss" -msgstr "Odak Kaybından Tasarruf Edin" +msgstr "Odak Kaybında Kaydet" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Save Each Scene On Quit" -msgstr "Dalı Sahne olarak Kaydet" +msgstr "Çıkışta Her Sahneyi Kaydet" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Quit Confirmation" -msgstr "Bilgi Göster" +msgstr "Çıkış Onayı" #: editor/editor_node.cpp -#, fuzzy msgid "Show Update Spinner" -msgstr "Güncelleme Topacını Gizle" +msgstr "Güncelleme İkonunu Göster" #: editor/editor_node.cpp msgid "Update Continuously" msgstr "Sürekli Güncelle" #: editor/editor_node.cpp -#, fuzzy msgid "Update Vital Only" -msgstr "Materyal DeÄŸiÅŸiklikleri:" +msgstr "Sadece Önemli Güncellemeler" #: editor/editor_node.cpp -#, fuzzy msgid "Localize Settings" -msgstr "YerelleÅŸtirme" +msgstr "YerelleÅŸtirme Ayarları" #: editor/editor_node.cpp -#, fuzzy msgid "Restore Scenes On Load" -msgstr "Sahne Düğümünü Al" +msgstr "Açılışta Sahneleri Geri Yükle" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Show Thumbnail On Hover" -msgstr "Fareyle üzerine gelindiÄŸinde  küçük resmi göster" +msgstr "Üzerine GelindiÄŸinde Küçük Resim Göster" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Inspector" -msgstr "Denetçi" +msgstr "Denetleyici" #: editor/editor_node.cpp -#, fuzzy msgid "Default Property Name Style" -msgstr "Proje Yolu:" +msgstr "Varsayılan Özellik İsim Biçimi" #: editor/editor_node.cpp msgid "Default Float Step" -msgstr "" +msgstr "Varsayılan Ondalık Adımı" #: editor/editor_node.cpp scene/gui/tree.cpp -#, fuzzy msgid "Disable Folding" -msgstr "Pasif Düğme" +msgstr "Katlamayı Devre Dışı Bırak" #: editor/editor_node.cpp msgid "Auto Unfold Foreign Scenes" -msgstr "" +msgstr "Harici Sahneleri Otomatik Olarak Yay" #: editor/editor_node.cpp msgid "Horizontal Vector2 Editing" @@ -4493,19 +4419,16 @@ msgid "Horizontal Vector Types Editing" msgstr "Yatay Vector tipleri düzenleme" #: editor/editor_node.cpp -#, fuzzy msgid "Open Resources In Current Inspector" -msgstr "Gözetmen Bölümünde Aç" +msgstr "Kaynakları Mevcut Denetleyicide Aç" #: editor/editor_node.cpp -#, fuzzy msgid "Resources To Open In New Inspector" -msgstr "Gözetmen Bölümünde Aç" +msgstr "Yeni Denetleyicide Açılacak Kaynaklar" #: editor/editor_node.cpp -#, fuzzy msgid "Default Color Picker Mode" -msgstr "Varsayılan renk seçme modu" +msgstr "Varsayılan Renk Seçme Modu" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -4615,6 +4538,7 @@ msgstr "ÇeÅŸitli proje ya da sahne-çapında araçlar." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Proje" @@ -4896,14 +4820,12 @@ msgid "Save & Restart" msgstr "Kaydet ve BaÅŸtan BaÅŸlat" #: editor/editor_node.cpp -#, fuzzy msgid "Update All Changes" -msgstr "DeÄŸiÅŸiklik OlduÄŸunda Güncelle" +msgstr "Tüm DeÄŸiÅŸiklikleri Güncelle" #: editor/editor_node.cpp -#, fuzzy msgid "Update Vital Changes" -msgstr "Materyal DeÄŸiÅŸiklikleri:" +msgstr "Önemli DeÄŸiÅŸiklikleri Güncelle" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -5164,12 +5086,11 @@ msgstr "Hata Ayıklayıcı" #: editor/editor_profiler.cpp msgid "Profiler Frame History Size" -msgstr "" +msgstr "Profil OluÅŸturucu Çerçeve GeçmiÅŸi Boyutu" #: editor/editor_profiler.cpp -#, fuzzy msgid "Profiler Frame Max Functions" -msgstr "İşlevi Yeniden Adlandır" +msgstr "Profil OluÅŸturucu Çerçeve Maksimum Fonksiyon Sayısı" #: editor/editor_properties.cpp msgid "Edit Text:" @@ -5302,20 +5223,17 @@ msgstr "Yeni %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Base Type" -msgstr "Temel Tipi DeÄŸiÅŸtir" +msgstr "Temel Tür" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Edited Resource" -msgstr "Kaynak Ekle" +msgstr "DeÄŸiÅŸtirilmiÅŸ Kaynak" #: editor/editor_resource_picker.cpp scene/gui/line_edit.cpp #: scene/gui/slider.cpp scene/gui/spin_box.cpp -#, fuzzy msgid "Editable" -msgstr "Düzenlenebilir Öge" +msgstr "Düzenlenebilir" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "New Script" @@ -5326,9 +5244,8 @@ msgid "Extend Script" msgstr "Betik Aç" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Script Owner" -msgstr "Betik Adı:" +msgstr "Senaryo Sahibi" #: editor/editor_run_native.cpp msgid "" @@ -5341,9 +5258,8 @@ msgstr "" "bir ön ayarı çalıştırılabilir olarak tanımlayın." #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" -msgstr "Proje" +msgstr "Proje KoÅŸusu" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -5370,14 +5286,12 @@ msgid "Did you forget the '_run' method?" msgstr "'_run()' metodunu unuttunuz mu?" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor Language" -msgstr "Düzenleyici YerleÅŸim Düzeni" +msgstr "Editör Dili" #: editor/editor_settings.cpp -#, fuzzy msgid "Display Scale" -msgstr "Hepsini Görüntüle" +msgstr "ÖlçeÄŸi Görüntüle" #: editor/editor_settings.cpp msgid "Custom Display Scale" @@ -5397,48 +5311,43 @@ msgstr "Kenarı yumuÅŸatılmış font" #: editor/editor_settings.cpp msgid "Font Hinting" -msgstr "" +msgstr "Yazıtipi İpucusu" #: editor/editor_settings.cpp -#, fuzzy msgid "Main Font" -msgstr "Ana Sahne" +msgstr "Ana Yazı Tipi" #: editor/editor_settings.cpp msgid "Main Font Bold" msgstr "Ana font kalınlığı" #: editor/editor_settings.cpp -#, fuzzy msgid "Code Font" -msgstr "Düğüm Noktası Ekle" +msgstr "Kod Yazı Tipi" #: editor/editor_settings.cpp -#, fuzzy msgid "Dim Editor On Dialog Popup" -msgstr "İletiÅŸim penceresinde Dim Editörü" +msgstr "Popup Diyalog Çıktığında Editörü Karart" #: editor/editor_settings.cpp main/main.cpp msgid "Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Düşük İşlemci Modu Uykusu (mikrosaniye)" #: editor/editor_settings.cpp msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Odaklanılmamış Düşük İşlemci Modu Uykusu (mikrosaniye)" #: editor/editor_settings.cpp -#, fuzzy msgid "Separate Distraction Mode" -msgstr "Dikkat Dağıtmayan Kip" +msgstr "Ayrık Dikkat Modu" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" msgstr "Otomatik olarak ekran görüntülerini aç" #: editor/editor_settings.cpp -#, fuzzy msgid "Max Array Dictionary Items Per Page" -msgstr "Her sayfada maks dizi sözlüğü öğesi" +msgstr "Sayfa Başına Maksimum Dizi Sözlüğü Öğesi" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp @@ -5455,14 +5364,12 @@ msgid "Icon And Font Color" msgstr "Simge ve Font rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Color" -msgstr "Renkler" +msgstr "Temel Renk" #: editor/editor_settings.cpp -#, fuzzy msgid "Accent Color" -msgstr "Renk Seç" +msgstr "Vurgu Rengi" #: editor/editor_settings.cpp scene/resources/environment.cpp msgid "Contrast" @@ -5470,113 +5377,96 @@ msgstr "Kontrast" #: editor/editor_settings.cpp msgid "Relationship Line Opacity" -msgstr "" +msgstr "İliÅŸki Hattı Opaklığı" #: editor/editor_settings.cpp -#, fuzzy msgid "Highlight Tabs" -msgstr "Işık-haritaları kaydediliyor" +msgstr "Tab Karakterlerini Vurgula" #: editor/editor_settings.cpp -#, fuzzy msgid "Border Size" -msgstr "Kenar Pikselleri" +msgstr "Kenarlık Boyutu" #: editor/editor_settings.cpp msgid "Use Graph Node Headers" -msgstr "" +msgstr "Grafik Node Üstbilgilerini Kullan" #: editor/editor_settings.cpp -#, fuzzy msgid "Additional Spacing" -msgstr "Animasyon Döngüsü" +msgstr "Ek BoÅŸluk" #: editor/editor_settings.cpp -#, fuzzy msgid "Custom Theme" -msgstr "Editör Teması" +msgstr "Özel Tema" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Script Button" -msgstr "Tekerlek SaÄŸ Düğme" +msgstr "Senaryo Düğmesini Göster" #: editor/editor_settings.cpp -#, fuzzy msgid "Directories" -msgstr "Yönler" +msgstr "Klasörler" #: editor/editor_settings.cpp -#, fuzzy msgid "Autoscan Project Path" -msgstr "Proje Yolu:" +msgstr "Proje Yolunu Otomatik Tara" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Project Path" -msgstr "Proje Yolu:" +msgstr "Varsayılan Proje Yolu" #: editor/editor_settings.cpp -#, fuzzy msgid "On Save" -msgstr "Kaydet" +msgstr "Kayıtta" #: editor/editor_settings.cpp -#, fuzzy msgid "Compress Binary Resources" -msgstr "Kaynağı Tıpkıla" +msgstr "Binary Kaynakları Sıkıştır" #: editor/editor_settings.cpp +#, fuzzy msgid "Safe Save On Backup Then Rename" -msgstr "" +msgstr "İsimlendirdikten Sonra YedeÄŸe Güvenli Kaydet" #: editor/editor_settings.cpp -#, fuzzy msgid "File Dialog" -msgstr "XForm İletiÅŸim Kutusu" +msgstr "Dosya DiyaloÄŸu" #: editor/editor_settings.cpp -#, fuzzy msgid "Thumbnail Size" -msgstr "Küçük Resim..." +msgstr "Küçük Resim Boyutu" #: editor/editor_settings.cpp msgid "Docks" -msgstr "Eklentiler" +msgstr "Rıhtımlar" #: editor/editor_settings.cpp -#, fuzzy msgid "Scene Tree" -msgstr "Sahne AÄŸacını Al" +msgstr "Sahne AÄŸacı" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" -msgstr "" +msgstr "OluÅŸtur DiyaloÄŸunu Tam Boy BaÅŸlat" #: editor/editor_settings.cpp -#, fuzzy msgid "Always Show Folders" -msgstr "Daima Izgarayı Göster" +msgstr "Klasörleri Daima Göster" #: editor/editor_settings.cpp -#, fuzzy msgid "Property Editor" -msgstr "Grup Düzenleyici" +msgstr "Özellik Editörü" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Refresh Interval" -msgstr "Otomatik yenileme intervalı" +msgstr "Otomatik Yenileme Aralığı" #: editor/editor_settings.cpp -#, fuzzy msgid "Subresource Hue Tint" -msgstr "Alt Kaynaklar" +msgstr "Alt Kaynak Renk Tonu" #: editor/editor_settings.cpp -#, fuzzy msgid "Color Theme" -msgstr "Editör Teması" +msgstr "Renk Teması" #: editor/editor_settings.cpp scene/3d/label_3d.cpp #: scene/resources/default_theme/default_theme.cpp @@ -5585,50 +5475,44 @@ msgstr "Satır aralığı" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Highlighting" -msgstr "DoÄŸrudan aydınlatma" +msgstr "Vurgulama" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Syntax Highlighting" -msgstr "Yazım Vurgulama" +msgstr "Sözdizim Vurgulama" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight All Occurrences" -msgstr "" +msgstr "Tüm Olayları Vurgula" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight Current Line" -msgstr "Geçerli satırı vurgula" +msgstr "Mevcut Satırı Vurgula" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Highlight Type Safe Lines" -msgstr "" +msgstr "Tip GüvenliÄŸine Tabi Satırları Vurgula" #: editor/editor_settings.cpp -#, fuzzy msgid "Indent" -msgstr "Sola Girintile" +msgstr "Girintile" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Auto Indent" msgstr "Kendinden Girintili" #: editor/editor_settings.cpp -#, fuzzy msgid "Convert Indent On Save" -msgstr "Girintiyi BoÅŸluklara Dönüştür" +msgstr "Kayıt Sırasında Girintileri Dönüştür" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Tabs" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "Tab Karakterlerini Çiz" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Spaces" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "BoÅŸluk Karakterlerini Çiz" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/tile_map.cpp @@ -5646,9 +5530,8 @@ msgid "V Scroll Speed" msgstr "V kaydırma hızı" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Minimap" -msgstr "BaÅŸlatımı Göster" +msgstr "Mini Haritayı Göster" #: editor/editor_settings.cpp msgid "Minimap Width" @@ -5656,113 +5539,102 @@ msgstr "Küçük Harita GeniÅŸliÄŸi" #: editor/editor_settings.cpp msgid "Mouse Extra Buttons Navigate History" -msgstr "" +msgstr "Ek Fare Butonları GeçmiÅŸte Gezinmek İçin Kullanılsın" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "GridMap Seçimi" +msgstr "Sürükle ve Bırak Seçimi" #: editor/editor_settings.cpp -#, fuzzy msgid "Stay In Script Editor On Node Selected" -msgstr "SeçilmiÅŸ Düğümde Script Editöründe Kal" +msgstr "Node Seçiminde Senaryo Editöründe Kal" #: editor/editor_settings.cpp msgid "Appearance" msgstr "Dış görünüş" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Show Line Numbers" -msgstr "Satır Numarası:" +msgstr "Satır Numaralarını Göster" #: editor/editor_settings.cpp -#, fuzzy msgid "Line Numbers Zero Padded" -msgstr "Satır Numarası:" +msgstr "Satır Numaralarının Başına Sıfır Ekle" #: editor/editor_settings.cpp msgid "Show Bookmark Gutter" -msgstr "" +msgstr "Yer İmi BoÅŸluÄŸunu Göster" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Breakpoint Gutter" -msgstr "İşaret Noktalarını Atla" +msgstr "Breakpoint BoÅŸluÄŸunu Göster" #: editor/editor_settings.cpp msgid "Show Info Gutter" -msgstr "" +msgstr "Bilgi BoÅŸluÄŸunu Göster" #: editor/editor_settings.cpp -#, fuzzy msgid "Code Folding" -msgstr "Kod katlama" +msgstr "Kod Katlama" #: editor/editor_settings.cpp -#, fuzzy msgid "Word Wrap" -msgstr "Kelime Paketle" +msgstr "Sözcük Kaydırma" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" -msgstr "" +msgstr "Satır UzunluÄŸu Yönergelerini Göster" #: editor/editor_settings.cpp msgid "Line Length Guideline Soft Column" -msgstr "" +msgstr "Satır UzunluÄŸu Yönergesi YumuÅŸak Sütun" #: editor/editor_settings.cpp msgid "Line Length Guideline Hard Column" -msgstr "" +msgstr "Satır UzunluÄŸu Yönergesi Sert Sütun" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script List" -msgstr "Kod Düzenleyici" +msgstr "Senaryo Listesi" #: editor/editor_settings.cpp msgid "Show Members Overview" msgstr "Üyelerin Genel Bakışını Göster" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Files" -msgstr "Dosya" +msgstr "Dosyalar" #: editor/editor_settings.cpp -#, fuzzy msgid "Trim Trailing Whitespace On Save" -msgstr "İzleyenin BoÅŸluklarını Kırp" +msgstr "Kaydederken Satır Sonundaki BoÅŸlukları Sil" #: editor/editor_settings.cpp msgid "Autosave Interval Secs" -msgstr "" +msgstr "Otomatik Kayıt Aralığı Saniye" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Restore Scripts On Load" -msgstr "Script'leri Yüklemede Eski Haline Getir" +msgstr "Yükleme Sırasında Komut Dizilerini Eski Hallerine Getir" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Reload And Parse Scripts On Save" -msgstr "Kaydederken Script'leri Otomatik Tekrar yükle ve Ayrıştır" +msgstr "" +"Kayıt Sırasında Komut Dizilerini Otomatik Olarak Tekrar Yükle ve Çözümle" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Reload Scripts On External Change" -msgstr "Dış DeÄŸiÅŸiklikte Otomatik Olarak Script'i Geri Yükle" +msgstr "" +"Dışarıdan Bir DeÄŸiÅŸiklik Yapıldığında Komut Dizilerini Otomatik Olarak " +"Yeniden Yükle" #: editor/editor_settings.cpp -#, fuzzy msgid "Create Signal Callbacks" -msgstr "Shader Yedeklerini Zorla" +msgstr "Sinyal Geri Çağırması OluÅŸtur" #: editor/editor_settings.cpp msgid "Sort Members Outline Alphabetically" -msgstr "" +msgstr "Fonksiyonları Alfabetik Sırala" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Cursor" @@ -5774,35 +5646,33 @@ msgstr "Dosyanın Sonunu Kaydır" #: editor/editor_settings.cpp msgid "Block Caret" -msgstr "" +msgstr "Blok İmleç" #: editor/editor_settings.cpp msgid "Caret Blink" -msgstr "" +msgstr "Karet Yansön" #: editor/editor_settings.cpp msgid "Caret Blink Speed" -msgstr "" +msgstr "Karet Yansön Hızı" #: editor/editor_settings.cpp -#, fuzzy msgid "Right Click Moves Caret" -msgstr "Nokta eklemek için saÄŸ tıkla" +msgstr "SaÄŸ Tık Kareti Hareket Ettirsin" #: editor/editor_settings.cpp modules/gdscript/gdscript.cpp #: modules/gdscript/gdscript_editor.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion" -msgstr "Seçimi Kopyala" +msgstr "Tamamlanma" #: editor/editor_settings.cpp msgid "Idle Parse Delay" -msgstr "" +msgstr "BoÅŸta Çözümleme Gecikmesi" #: editor/editor_settings.cpp msgid "Auto Brace Complete" -msgstr "" +msgstr "Süslü Ayraçları Otomatik EÅŸle" #: editor/editor_settings.cpp msgid "Code Complete Delay" @@ -5810,84 +5680,73 @@ msgstr "Kod Tamamlama Gecikme Süresi" #: editor/editor_settings.cpp msgid "Put Callhint Tooltip Below Current Line" -msgstr "" +msgstr "Çağırma Araç İpucunu Mavcut Satırın Altında Tut" #: editor/editor_settings.cpp msgid "Callhint Tooltip Offset" -msgstr "" +msgstr "Çağırma Araç İpucu Göreli Konumu" #: editor/editor_settings.cpp -#, fuzzy msgid "Complete File Paths" -msgstr "Düğüm Yolunu Kopyala" +msgstr "Dosya Yollarını Tamamla" #: editor/editor_settings.cpp modules/gdscript/gdscript_editor.cpp -#, fuzzy msgid "Add Type Hints" -msgstr "Tür Ekle" +msgstr "Tür İpuçlarını Ekle" #: editor/editor_settings.cpp -#, fuzzy msgid "Use Single Quotes" -msgstr "Yeni Döşeme Parçacığı" +msgstr "Tek Tırnak İşareti Kullan" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Help Index" -msgstr "Yardımcıları Göster" +msgstr "Yardım İndeksini Göster" #: editor/editor_settings.cpp msgid "Help Font Size" -msgstr "" +msgstr "Yardım Yazı Tipi Boyutu" #: editor/editor_settings.cpp msgid "Help Source Font Size" -msgstr "" +msgstr "Yardım Kaynak Yazı Tipi Boyutu" #: editor/editor_settings.cpp msgid "Help Title Font Size" -msgstr "" +msgstr "Yardım BaÅŸlık Yazı Tipi Boyutu" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" msgstr "Izgara Haritası" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Pick Distance" -msgstr "Uzaklık Seç:" +msgstr "Mesafe Seç" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Preview Size" -msgstr "Önizleme" +msgstr "Önizleme Boyutu" #: editor/editor_settings.cpp -#, fuzzy msgid "Primary Grid Color" msgstr "Birincil Izgara Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Secondary Grid Color" msgstr "İkincil Izgara Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Selection Box Color" -msgstr "Yalnızca Seçim" +msgstr "Seçim Kutusu Rengi" #: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp -#, fuzzy msgid "3D Gizmos" -msgstr "Gizmolar" +msgstr "Üç Boyutlu Gizmolar" #: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp -#, fuzzy msgid "Gizmo Colors" -msgstr "Emisyon Renkleri" +msgstr "Gizmo Renkleri" #: editor/editor_settings.cpp #, fuzzy @@ -5896,9 +5755,8 @@ msgstr "Örnek" #: editor/editor_settings.cpp modules/gltf/gltf_node.cpp #: scene/3d/physics_body.cpp -#, fuzzy msgid "Joint" -msgstr "Nokta" +msgstr "Eklem" #: editor/editor_settings.cpp scene/2d/collision_shape_2d.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/touch_screen_button.cpp @@ -5910,112 +5768,96 @@ msgid "Shape" msgstr "Åžekil" #: editor/editor_settings.cpp -#, fuzzy msgid "Primary Grid Steps" -msgstr "Izgara Adımı:" +msgstr "Birincil Izgara Adımları" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid Size" -msgstr "Izgara Adımı:" +msgstr "Izgara Boyutu" #: editor/editor_settings.cpp msgid "Grid Division Level Max" -msgstr "" +msgstr "Maksimum Izgara Bölme Seviyesi" #: editor/editor_settings.cpp msgid "Grid Division Level Min" -msgstr "" +msgstr "Minimum Izgara Bölme Seviyesi" #: editor/editor_settings.cpp msgid "Grid Division Level Bias" -msgstr "" +msgstr "Izgara Bölme Seviyesi Sapması" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid XZ Plane" -msgstr "IzgaraHaritası Boyama" +msgstr "Izgara XZ Düzlemi" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid XY Plane" -msgstr "IzgaraHaritası Boyama" +msgstr "Izgara XY Düzlemi" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid YZ Plane" -msgstr "IzgaraHaritası Boyama" +msgstr "Izgara YZ Düzlemi" #: editor/editor_settings.cpp -#, fuzzy msgid "Default FOV" -msgstr "Varsayılan" +msgstr "Varsayılan Görüş Alanı" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Z Near" -msgstr "Varsayılan tema" +msgstr "Varsayılan Z Yakın" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Z Far" -msgstr "Varsayılan" +msgstr "Varsayılan Z Uzak" #: editor/editor_settings.cpp msgid "Lightmap Baking Number Of CPU Threads" -msgstr "" +msgstr "Işık Haritası PiÅŸirme İş Parçacığı Sayısı" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Scheme" -msgstr "Gezinim Kipi" +msgstr "Navigasyon Düzeni" #: editor/editor_settings.cpp -#, fuzzy msgid "Invert Y Axis" -msgstr "Y Eksenini Düzenle" +msgstr "Y Eksenini Çevir" #: editor/editor_settings.cpp -#, fuzzy msgid "Invert X Axis" -msgstr "X Eksenini Düzenle" +msgstr "X Eksenini Çevir" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Style" -msgstr "UzaklaÅŸtır" +msgstr "Zoom Biçimi" #: editor/editor_settings.cpp msgid "Emulate Numpad" -msgstr "" +msgstr "Sayı TuÅŸlarını Emüle Et" #: editor/editor_settings.cpp msgid "Emulate 3 Button Mouse" -msgstr "" +msgstr "3 Butonlu Fareyi Emüle Et" #: editor/editor_settings.cpp -#, fuzzy msgid "Orbit Modifier" -msgstr "İlk DeÄŸiÅŸiklik Tarihi'ne göre sırala" +msgstr "Yörünge DeÄŸiÅŸtirici" #: editor/editor_settings.cpp -#, fuzzy msgid "Pan Modifier" -msgstr "Kaydırma Biçimi" +msgstr "Kaydırma DeÄŸiÅŸtirici" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Modifier" -msgstr "DeÄŸiÅŸti" +msgstr "Zoom DeÄŸiÅŸtirici" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Warped Mouse Panning" -msgstr "" +msgstr "Çarpık Fare Kaydırması" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Feel" -msgstr "Gezinim Kipi" +msgstr "Navigasyon Hissi" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" @@ -6023,47 +5865,39 @@ msgstr "Yörünge Hassasiyeti" #: editor/editor_settings.cpp msgid "Orbit Inertia" -msgstr "" +msgstr "Yörünge Ataleti" #: editor/editor_settings.cpp -#, fuzzy msgid "Translation Inertia" -msgstr "Çeviriler" +msgstr "Öteleme Ataleti" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Inertia" -msgstr "YaklaÅŸtır" +msgstr "Zoom Ataleti" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook" -msgstr "Yukarı Serbest Bakış" +msgstr "Serbest Bakış" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Navigation Scheme" -msgstr "Yönlendirici Örüntüsü OluÅŸtur" +msgstr "Serbest Bakış Navigasyon Düzeni" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Sensitivity" -msgstr "Sola Serbest Bakış" +msgstr "Serbest Bakış Hassasiyeti" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Inertia" -msgstr "Sola Serbest Bakış" +msgstr "Serbest Bakış Ataleti" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Base Speed" -msgstr "Serbest Bakış Hız DeÄŸiÅŸtirici" +msgstr "Serbest Bakış Baz Hızı" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Activation Modifier" -msgstr "Serbest Bakış Hız DeÄŸiÅŸtirici" +msgstr "Serbest Bakış Aktivasyon DeÄŸiÅŸtirici" #: editor/editor_settings.cpp #, fuzzy @@ -6071,72 +5905,64 @@ msgid "Freelook Speed Zoom Link" msgstr "Serbest Bakış Hız DeÄŸiÅŸtirici" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Grid Color" -msgstr "Renk Seç" +msgstr "Izgara Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Guides Color" -msgstr "Renk Seç" +msgstr "Kılavuz Çizgi Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Smart Snapping Line Color" -msgstr "Akıllı Hizalama" +msgstr "Akıllı Yapışma Satır Rengi" #: editor/editor_settings.cpp msgid "Bone Width" -msgstr "" +msgstr "Kemik GeniÅŸliÄŸi" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Color 1" -msgstr "Renk Öğesini Yeniden Adlandır" +msgstr "Kemik Rengi 1" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Color 2" -msgstr "Renk Öğesini Yeniden Adlandır" +msgstr "Kemik Rengi 2" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Selected Color" -msgstr "Seçilen Profili Yapılandır:" +msgstr "SeçilmiÅŸ Kemik Rengi" #: editor/editor_settings.cpp msgid "Bone IK Color" -msgstr "" +msgstr "Kemik TK Rengi" #: editor/editor_settings.cpp msgid "Bone Outline Color" -msgstr "" +msgstr "Kemik Kontur Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Outline Size" -msgstr "Kontur Boyutu:" +msgstr "Kemik Kontur Boyutu" #: editor/editor_settings.cpp msgid "Viewport Border Color" -msgstr "" +msgstr "Çerçeve Sınır Rengi" #: editor/editor_settings.cpp msgid "Constrain Editor View" -msgstr "" +msgstr "Düzenleyici Görünümünü Kısıtla" #: editor/editor_settings.cpp msgid "Simple Panning" -msgstr "" +msgstr "Basit Kaydırma" #: editor/editor_settings.cpp msgid "Scroll To Pan" -msgstr "" +msgstr "Kaydırmak İçin Tut" #: editor/editor_settings.cpp -#, fuzzy msgid "Pan Speed" -msgstr "Hız:" +msgstr "Pan Yapma Hızı" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -6145,109 +5971,103 @@ msgstr "Çokgen 2B UV Düzenleyicisi" #: editor/editor_settings.cpp msgid "Point Grab Radius" -msgstr "" +msgstr "Nokta Yakalama Yarıçapı" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Show Previous Outline" -msgstr "Önceki sekme" +msgstr "Önceki Konturu Göster" #: editor/editor_settings.cpp editor/scene_tree_dock.cpp #, fuzzy msgid "Autorename Animation Tracks" -msgstr "Animasyonu Yeniden Adlandır" +msgstr "Animasyon İzlerini Otomatik Yeniden Adlandır" #: editor/editor_settings.cpp +#, fuzzy msgid "Default Create Bezier Tracks" -msgstr "" +msgstr "Varsayılan Bezier İz OluÅŸtur" #: editor/editor_settings.cpp #, fuzzy msgid "Default Create Reset Tracks" -msgstr "RESET İz(ler)i oluÅŸturun" +msgstr "Varsayılan İzleri Sıfırla ve OluÅŸtur" #: editor/editor_settings.cpp +#, fuzzy msgid "Onion Layers Past Color" -msgstr "" +msgstr "Eski SoÄŸan Katman Rengi" #: editor/editor_settings.cpp +#, fuzzy msgid "Onion Layers Future Color" -msgstr "" +msgstr "Yeni SoÄŸan Katmanı Rengi" #: editor/editor_settings.cpp #, fuzzy msgid "Visual Editors" -msgstr "Grup Düzenleyici" +msgstr "Görsel Editörler" #: editor/editor_settings.cpp msgid "Minimap Opacity" -msgstr "" +msgstr "Mini Harita Åžeffaflığı" #: editor/editor_settings.cpp msgid "Window Placement" -msgstr "" +msgstr "Pencere YerleÅŸimi" #: editor/editor_settings.cpp scene/2d/back_buffer_copy.cpp scene/2d/sprite.cpp #: scene/2d/visibility_notifier_2d.cpp scene/3d/sprite_3d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Rect" -msgstr "Tam Kare" +msgstr "Dikdörtgen" #: editor/editor_settings.cpp -#, fuzzy msgid "Rect Custom Position" -msgstr "EÄŸri Çıkış Konumunu Ayarla" +msgstr "Dikdörtgen Özel Konumu" #: editor/editor_settings.cpp platform/android/export/export_plugin.cpp msgid "Screen" -msgstr "" +msgstr "Ekran" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Save" -msgstr "Otomatik Dilimle" +msgstr "Otomatik Kaydet" #: editor/editor_settings.cpp -#, fuzzy msgid "Save Before Running" -msgstr "Çalıştırmadan önce sahneyi kaydedin..." +msgstr "Çalıştırmadan Önce Kaydet" #: editor/editor_settings.cpp -#, fuzzy msgid "Font Size" -msgstr "Önden Görünüm" +msgstr "Yazı Tipi Boyutu" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Host" msgstr "Uzak Ana Bilgisayar" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Port" -msgstr "Noktayı kaldır" +msgstr "Uzak Port" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor SSL Certificates" -msgstr "Düzenleyici Ayarları" +msgstr "Düzenleyicinin SSL Sertifikası" #: editor/editor_settings.cpp msgid "HTTP Proxy" -msgstr "" +msgstr "HTTP Proxy" #: editor/editor_settings.cpp msgid "Host" -msgstr "" +msgstr "Ana Bilgisayar" #: editor/editor_settings.cpp editor/fileserver/editor_file_server.cpp #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Port" -msgstr "" +msgstr "Port" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp @@ -6256,171 +6076,150 @@ msgstr "Proje Yöneticisi" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp -#, fuzzy msgid "Sorting Order" -msgstr "Klasör yeniden adlandırma:" +msgstr "Sıralama Yöntemi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" -msgstr "" +msgstr "Simge Rengi" #: editor/editor_settings.cpp msgid "Keyword Color" -msgstr "" +msgstr "Anahtar Sözcük Rengi" #: editor/editor_settings.cpp msgid "Control Flow Keyword Color" -msgstr "" +msgstr "Akış Kontrolü Anahtar Sözcüğü Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Type Color" -msgstr "Temel Tipi DeÄŸiÅŸtir" +msgstr "Temel Tür Rengi" #: editor/editor_settings.cpp msgid "Engine Type Color" -msgstr "" +msgstr "Motor Tür Rengi" #: editor/editor_settings.cpp msgid "User Type Color" -msgstr "" +msgstr "Üye Tür Rengi" #: editor/editor_settings.cpp msgid "Comment Color" -msgstr "" +msgstr "Yorum Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "String Color" -msgstr "Dosya Depolama:" +msgstr "String Rengi" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Background Color" -msgstr "Geçersiz arkaplan rengi." +msgstr "Arkaplan Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Background Color" -msgstr "Geçersiz arkaplan rengi." +msgstr "Tamamlanma Arkaplan Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Selected Color" -msgstr "Seçileni İçe Aktar" +msgstr "Tamamlayıcı Seçim Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Existing Color" -msgstr "" +msgstr "Tamamlayıcı Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Scroll Color" -msgstr "" +msgstr "Tamamlayıcı Kaydırma ÇubuÄŸu Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Font Color" -msgstr "" +msgstr "Tamamlayıcı Yazı Tipi Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Color" -msgstr "Sonraki Zemin" +msgstr "Metin Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Number Color" -msgstr "Satır Numarası:" +msgstr "Satır Numarası Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Safe Line Number Color" -msgstr "Satır Numarası:" +msgstr "Güvenli Satır Numarası Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" -msgstr "" +msgstr "İmleç Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Caret Background Color" -msgstr "Geçersiz arkaplan rengi." +msgstr "Karet Arkaplan Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Selected Color" -msgstr "Seçilenleri Sil" +msgstr "Seçili Metin Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Color" -msgstr "Yalnızca Seçim" +msgstr "Seçim Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Brace Mismatch Color" -msgstr "" +msgstr "Ayraç Uyumsuz Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Current Line Color" -msgstr "Åžu anki Sahne" +msgstr "Geçerli Satır Rengi" #: editor/editor_settings.cpp msgid "Line Length Guideline Color" -msgstr "" +msgstr "Satır UzunluÄŸu Sınır Çizgisi Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Word Highlighted Color" -msgstr "Yazım Vurgulama" +msgstr "Vurgulu Kelime Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Number Color" -msgstr "" +msgstr "Sayı Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Function Color" -msgstr "Fonksiyon" +msgstr "Fonksiyon Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Member Variable Color" -msgstr "DeÄŸiÅŸkeni Yeniden Adlandır" +msgstr "Üye DeÄŸiÅŸken Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mark Color" -msgstr "Renk Seç" +msgstr "İşaret Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bookmark Color" -msgstr "Yer imleri" +msgstr "Yer İmi Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Breakpoint Color" -msgstr "Hata ayıklama noktaları" +msgstr "Kesme Noktası Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Executing Line Color" -msgstr "" +msgstr "Yürütülen Satır Rengi" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Code Folding Color" -msgstr "" +msgstr "Kod Katlama Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Color" -msgstr "Arama Sonuçları" +msgstr "Arama Sonuç Rengi" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Border Color" -msgstr "Arama Sonuçları" +msgstr "Arama Sonuç Sınır Rengi" #: editor/editor_spin_slider.cpp msgid "Hold %s to round to integers. Hold Shift for more precise changes." @@ -6429,14 +6228,12 @@ msgstr "" "Shift tuÅŸuna basılı tutun." #: editor/editor_spin_slider.cpp scene/gui/button.cpp -#, fuzzy msgid "Flat" -msgstr "Sade 0" +msgstr "Düz" #: editor/editor_spin_slider.cpp -#, fuzzy msgid "Hide Slider" -msgstr "Temas Kipi" +msgstr "Kaydırıcıyı Gizle" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -6729,7 +6526,7 @@ msgstr "" #: editor/fileserver/editor_file_server.cpp msgid "File Server" -msgstr "" +msgstr "Dosya Sunucusu" #: editor/fileserver/editor_file_server.cpp #: editor/plugins/version_control_editor_plugin.cpp @@ -6797,6 +6594,11 @@ msgid "" "After renaming to an unknown extension, the file won't be shown in the " "editor anymore." msgstr "" +"Bu dosya uzantısı editör tarafından tanınmadı.\n" +"Yine de isimlendirmek istiyorsanız, iÅŸletim sisteminizin dosya yöneticisini " +"kullanın.\n" +"Bilinmeyen bir uzantı isimlendirildikten sonra dosya artık editörde " +"görüntülenmeyecek." #: editor/filesystem_dock.cpp msgid "" @@ -7097,43 +6899,41 @@ msgstr "Grupları Düzenle" #: editor/import/editor_import_collada.cpp msgid "Collada" -msgstr "" +msgstr "Collada" #: editor/import/editor_import_collada.cpp msgid "Use Ambient" -msgstr "" +msgstr "Çevreyi Kullan" #: editor/import/resource_importer_bitmask.cpp -#, fuzzy msgid "Create From" -msgstr "Klasör OluÅŸtur" +msgstr "Åžuradan OluÅŸtur" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp msgid "Threshold" -msgstr "" +msgstr "EÅŸik" #: editor/import/resource_importer_csv_translation.cpp #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_scene.cpp #: editor/import/resource_importer_texture.cpp #: editor/import/resource_importer_wav.cpp scene/3d/gi_probe.cpp -#, fuzzy msgid "Compress" -msgstr "BileÅŸenler" +msgstr "Sıkıştırma" #: editor/import/resource_importer_csv_translation.cpp msgid "Delimiter" -msgstr "" +msgstr "Sınırlayıcı" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "ColorCorrect" -msgstr "Renk iÅŸlevi." +msgstr "ColorCorrect" #: editor/import/resource_importer_layered_texture.cpp +#, fuzzy msgid "No BPTC If RGB" -msgstr "" +msgstr "RGB ise BPTC Yok" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/cpu_particles_2d.cpp @@ -7141,31 +6941,29 @@ msgstr "" #: scene/resources/material.cpp scene/resources/particles_material.cpp #: scene/resources/texture.cpp scene/resources/visual_shader.cpp msgid "Flags" -msgstr "" +msgstr "Bayraklar" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/animation/tween.cpp #: scene/resources/texture.cpp msgid "Repeat" -msgstr "" +msgstr "Tekrar Et" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Filter" -msgstr "Süzgeçler:" +msgstr "Filtre" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Mipmaps" -msgstr "sinyaller" +msgstr "Mipmap'ler" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "Anisotropic" -msgstr "" +msgstr "EÅŸyönsüz" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp @@ -7173,51 +6971,43 @@ msgid "sRGB" msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "Slices" -msgstr "Otomatik Dilimle" +msgstr "Dilimler" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Horizontal" -msgstr "Yatay:" +msgstr "Yatay" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/gui/scroll_container.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Vertical" -msgstr "Dikey:" +msgstr "Dikey" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Generate Tangents" -msgstr "Noktalar OluÅŸtur" +msgstr "TeÄŸetler OluÅŸtur" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Scale Mesh" -msgstr "Esnetme Åžekli" +msgstr "Mesh ÖlçeÄŸi" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Offset Mesh" -msgstr "Kaydırma:" +msgstr "Mesh Kaydırma" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Octahedral Compression" -msgstr "İfade" +msgstr "Octahedral Sıkıştırma" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Optimize Mesh Flags" -msgstr "Boyut:" +msgstr "Örüntü Bayraklarını En İyileÅŸtir" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" @@ -7261,53 +7051,44 @@ msgstr "Çoklu Sahneler+Materyaller olarak İçe Aktar" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Nodes" -msgstr "Düğüm" +msgstr "Düğümler" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Type" -msgstr "Dön" +msgstr "Kök Türü" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Name" -msgstr "Uzak Depo Adı" +msgstr "Kök İsmi" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Scale" -msgstr "Ölçekle" +msgstr "Kök ÖlçeÄŸi" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Custom Script" -msgstr "ÖzelSınıf" +msgstr "Özel Betik" #: editor/import/resource_importer_scene.cpp scene/resources/texture.cpp -#, fuzzy msgid "Storage" -msgstr "Dosya Depolama:" +msgstr "Depolama" #: editor/import/resource_importer_scene.cpp msgid "Use Legacy Names" -msgstr "" +msgstr "Eski İsimleri Kullan" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp -#, fuzzy msgid "Materials" -msgstr "Materyal DeÄŸiÅŸiklikleri:" +msgstr "Materyaller" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep On Reimport" -msgstr "Yeniden İçe Aktar" +msgstr "Yeniden İçe Aktarmaya Devam Et" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp -#, fuzzy msgid "Meshes" -msgstr "Örgü" +msgstr "Örgüler" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7320,42 +7101,36 @@ msgid "Light Baking" msgstr "Işık-Haritalarını PiÅŸir" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Lightmap Texel Size" -msgstr "Işık-Haritalarını PiÅŸir" +msgstr "Işık Haritası Texel Boyutu" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Skins" -msgstr "" +msgstr "Kaplamalar" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Use Named Skins" -msgstr "Esnetme Hizalaması Kullan" +msgstr "İsimlendirilmiÅŸ Kaplamaları Kullan" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "External Files" -msgstr "Bir Dosya Aç" +msgstr "Harici Dosyalar" #: editor/import/resource_importer_scene.cpp msgid "Store In Subdir" -msgstr "" +msgstr "Alt Dizine Depola" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Filter Script" -msgstr "Betikleri Süz" +msgstr "Betik Süz" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep Custom Tracks" -msgstr "Dönüşüm" +msgstr "Özel İzleri Tut" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Optimizer" -msgstr "İyileÅŸtir" +msgstr "En İyileÅŸtirici" #: editor/import/resource_importer_scene.cpp #: editor/plugins/item_list_editor_plugin.cpp main/main.cpp @@ -7374,36 +7149,30 @@ msgid "Enabled" msgstr "Etkin" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Linear Error" -msgstr "Maks. DoÄŸrusal Hata:" +msgstr "Maksimum DoÄŸrusal Hata" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angular Error" -msgstr "Maks. Açısal Hata:" +msgstr "Maksimum Açısal Hata" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angle" -msgstr "DeÄŸer" +msgstr "Maksimum Açı" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Remove Unused Tracks" -msgstr "Animasyon İzini Kaldır" +msgstr "Kullanılmayan İzleri Kaldır" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Clips" -msgstr "Animasyon Klipleri" +msgstr "Klipler" #: editor/import/resource_importer_scene.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/area.cpp scene/3d/cpu_particles.cpp #: scene/3d/particles.cpp scene/resources/environment.cpp -#, fuzzy msgid "Amount" -msgstr "DeÄŸer:" +msgstr "Miktar" #: editor/import/resource_importer_scene.cpp #: editor/plugins/mesh_library_editor_plugin.cpp @@ -7456,28 +7225,30 @@ msgid "" msgstr "" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s: Dokunun 3B olarak kullanıldığı tespit edildi. Filtreleme, tekrarlama, " +"mipmap oluÅŸturma ve VRAM doku sıkıştırma etkileÅŸtiriliyor." #: editor/import/resource_importer_texture.cpp msgid "2D, Detect 3D" -msgstr "" +msgstr "2D, 3D Algıla" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "2D Pixel" -msgstr "Åžekil Pikselleri" +msgstr "2D Pixel" #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp +#, fuzzy msgid "Lossy Quality" -msgstr "" +msgstr "Kayıplı Kalite" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "HDR Mode" -msgstr "Kip Seç" +msgstr "HDR Modu" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" @@ -7487,8 +7258,9 @@ msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp +#, fuzzy msgid "Normal Map" -msgstr "" +msgstr "Normal Haritası" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7496,27 +7268,28 @@ msgid "Process" msgstr "RötuÅŸ" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Fix Alpha Border" -msgstr "" +msgstr "Alfa Sınırını Düzelt" #: editor/import/resource_importer_texture.cpp #, fuzzy msgid "Premult Alpha" -msgstr "Çokluyu Düzenleyin" +msgstr "İlk Alfa" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Hdr As Srgb" -msgstr "" +msgstr "SRGB Olarak HDR" #: editor/import/resource_importer_texture.cpp #, fuzzy msgid "Invert Color" -msgstr "Köşe" +msgstr "Rengi Ters Çevir" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Normal Map Invert Y" -msgstr "Rastgele Ölçek:" +msgstr "Normal Haritası Y Eksenini Ters Çevir" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7524,89 +7297,89 @@ msgid "Size Limit" msgstr "Boyut Limiti" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "Detect 3D" -msgstr "" +msgstr "3D Algıla" #: editor/import/resource_importer_texture.cpp #, fuzzy msgid "SVG" -msgstr "HSV" +msgstr "SVG" #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "" "Warning, no suitable PC VRAM compression enabled in Project Settings. This " "texture will not display correctly on PC." msgstr "" +"Uyarı, proje ayarlarında uygun PC VRAM sıkıştırması etkin deÄŸil. Bu doku " +"PC'de düzgün görüntülenmez." #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Atlas File" -msgstr "Kontur Boyutu:" +msgstr "Atlas Dosyası" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Import Mode" -msgstr "Dışa Aktarma Biçimi:" +msgstr "İçe Aktarım Modu" #: editor/import/resource_importer_texture_atlas.cpp #, fuzzy msgid "Crop To Region" -msgstr "Döşeme Bölgesi Ata" +msgstr "Bölgeye Kırp" #: editor/import/resource_importer_texture_atlas.cpp msgid "Trim Alpha Border From Region" -msgstr "" +msgstr "Alfa Sınırını Bölgeden Kırp" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp #, fuzzy msgid "Force" -msgstr "Zorla Gönder" +msgstr "Zorla" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" -msgstr "" +msgstr "8 Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp +#, fuzzy msgid "Mono" -msgstr "" +msgstr "Tek" #: editor/import/resource_importer_wav.cpp #, fuzzy msgid "Max Rate" -msgstr "Düğümü Çırp" +msgstr "Maximum Oran" #: editor/import/resource_importer_wav.cpp #, fuzzy msgid "Max Rate Hz" -msgstr "Düğümü Çırp" +msgstr "Maximum Hz Oranı" #: editor/import/resource_importer_wav.cpp msgid "Trim" msgstr "" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Normalize" -msgstr "Biçem" +msgstr "NormalleÅŸtir" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Mode" -msgstr "Biçimi Taşı" +msgstr "Döngü Modu" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Begin" -msgstr "Biçimi Taşı" +msgstr "Döngü BaÅŸlangıcı" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop End" -msgstr "Biçimi Taşı" +msgstr "Döngü Sonu" #: editor/import_defaults_editor.cpp msgid "Select Importer" @@ -7686,27 +7459,24 @@ msgid "Failed to load resource." msgstr "Kaynak yükleme baÅŸarısız oldu." #: editor/inspector_dock.cpp -#, fuzzy msgid "Property Name Style" -msgstr "Proje Adı:" +msgstr "Özellik İsim Biçimi" #: editor/inspector_dock.cpp scene/gui/color_picker.cpp msgid "Raw" msgstr "Ham" #: editor/inspector_dock.cpp -#, fuzzy msgid "Capitalized" -msgstr "Büyük harfe çevirme" +msgstr "Büyük Harfe ÇevrilmiÅŸ" #: editor/inspector_dock.cpp -#, fuzzy msgid "Localized" -msgstr "Yerel" +msgstr "YerelleÅŸtirilmiÅŸ" #: editor/inspector_dock.cpp msgid "Localization not available for current language." -msgstr "" +msgstr "Geçerli dil için yerelleÅŸtirme mevcut deÄŸil." #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -8247,9 +8017,8 @@ msgid "New" msgstr "Yeni" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Paste As Reference" -msgstr "%s Class referansı" +msgstr "Referans. Olarak Yapıştır" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Transitions..." @@ -8581,7 +8350,7 @@ msgstr "Süzgeçler..." #: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp msgid "Use Threads" -msgstr "" +msgstr "Thread'leri Kullan" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -8708,9 +8477,8 @@ msgid "Download Error" msgstr "İndirme Hatası" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Available URLs" -msgstr "Kullanılabilir Profiller:" +msgstr "Uygun URL'ler" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -8745,25 +8513,21 @@ msgid "Loading..." msgstr "Yükle..." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "First" msgstr "İlk" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Previous" msgstr "Önceki" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Next" msgstr "Sonraki" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Last" msgstr "Son" @@ -8813,8 +8577,9 @@ msgid "Testing" msgstr "Deneme" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Failed to get repository configuration." -msgstr "" +msgstr "Depo yapılandırması alınamadı." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -8871,8 +8636,9 @@ msgid "Bake Lightmaps" msgstr "Işık-Haritalarını PiÅŸir" #: editor/plugins/baked_lightmap_editor_plugin.cpp +#, fuzzy msgid "LightMap Bake" -msgstr "" +msgstr "Işık Haritasını PiÅŸir" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Select lightmap bake file:" @@ -9378,23 +9144,21 @@ msgid "View" msgstr "Görüş" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show" -msgstr "Izgarayı Göster" +msgstr "Göster" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show When Snapping" -msgstr "Akıllı Hizalama" +msgstr "Yapışırken Göster" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Hide" -msgstr "" +msgstr "Gizle" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Toggle Grid" -msgstr "Aç / Kapat Biçimi" +msgstr "Izgarayı Aç/Kapat" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -9745,16 +9509,15 @@ msgstr "Renk GeçiÅŸi Düzenlendi" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap GradientTexture2D Fill Points" -msgstr "" +msgstr "GradientTexture2D Dolgu Noktalarını DeÄŸiÅŸtir" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap Gradient Fill Points" -msgstr "" +msgstr "Gradient Doldurma Noktalarını DeÄŸiÅŸtir" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp -#, fuzzy msgid "Toggle Grid Snap" -msgstr "Aç / Kapat Biçimi" +msgstr "Snap Aç/Kapat" #: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp #: scene/3d/label_3d.cpp scene/gui/button.cpp scene/gui/dialogs.cpp @@ -9777,9 +9540,8 @@ msgstr "" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separator" -msgstr "Ayrım:" +msgstr "Ayraç" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -10013,9 +9775,8 @@ msgstr "" "%s" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "MeshLibrary" -msgstr "Model Kütüphanesi" +msgstr "" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Add Item" @@ -10038,14 +9799,12 @@ msgid "Update from Scene" msgstr "Sahneden Güncelle" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Apply without Transforms" -msgstr "MeshInstance dönüşümlerini uygula" +msgstr "Dönüşümler olmadan uygula" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Apply with Transforms" -msgstr "MeshInstance dönüşümlerini uygula" +msgstr "Dönüşümlerle uygula" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." @@ -10211,9 +9970,8 @@ msgid "Volume" msgstr "Oylum" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source:" -msgstr "Emisyon Kaynağı:" +msgstr "Emission Kaynağı:" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -10569,7 +10327,7 @@ msgstr "Kemikleri Çokgene EÅŸleÅŸtir" #: editor/plugins/ray_cast_2d_editor_plugin.cpp msgid "Set cast_to" -msgstr "" +msgstr "cast_to ayarla" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -10899,12 +10657,13 @@ msgid "Search Results" msgstr "Arama Sonuçları" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Open Dominant Script On Scene Change" -msgstr "" +msgstr "Sahne DeÄŸiÅŸiminde Baskın BetiÄŸi Aç" #: editor/plugins/script_editor_plugin.cpp msgid "External" -msgstr "" +msgstr "Harici" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -10922,17 +10681,17 @@ msgid "Script Temperature Enabled" msgstr "Åžablon Dosyası Seç" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Highlight Current Script" -msgstr "" +msgstr "Geçerli BetiÄŸi Vurgula" #: editor/plugins/script_editor_plugin.cpp msgid "Script Temperature History Size" msgstr "" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Current Script Background Color" -msgstr "Geçersiz arkaplan rengi." +msgstr "Mevcut Komut Dizisi Arkaplan Rengi" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -10945,9 +10704,8 @@ msgid "Sort Scripts By" msgstr "Betik OluÅŸtur" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "List Script Names As" -msgstr "Betik Adı:" +msgstr "Script İsimlerini Listele" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" @@ -11210,7 +10968,7 @@ msgstr "Oynat IK" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "Dikey" +msgstr "Dik Açılı" #: editor/plugins/spatial_editor_plugin.cpp modules/gltf/gltf_camera.cpp msgid "Perspective" @@ -11764,12 +11522,14 @@ msgid "Post" msgstr "Sonrası" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Manipulator Gizmo Size" -msgstr "" +msgstr "Gizmo Boyutu Ayarlayıcı" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Manipulator Gizmo Opacity" -msgstr "" +msgstr "Gizmo Åžeffaflığı Ayarlayıcı" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -11932,9 +11692,8 @@ msgid "New Animation" msgstr "Yeni Animasyon" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Metotları filtrele" +msgstr "Animasyonları filtrele" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -12416,7 +12175,7 @@ msgstr "Tür Ekle" #: editor/plugins/theme_editor_plugin.cpp msgid "Filter the list of types or create a new custom type:" -msgstr "Tip listesini süz veya yeni bir özel tip oluÅŸtur." +msgstr "Tip listesini filtrele veya yeni bir özel tip oluÅŸtur:" #: editor/plugins/theme_editor_plugin.cpp msgid "Available Node-based types:" @@ -12485,14 +12244,18 @@ msgid "Override all default type items." msgstr "Tüm varsayılan tür öğelerini geçersiz kıl." #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Select the variation base type from a list of available types." -msgstr "" +msgstr "Kullanılabilir tipler listesinden temel varyasyon tipini seçin." #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "" "A type associated with a built-in class cannot be marked as a variation of " "another type." msgstr "" +"YerleÅŸik sınıfla iliÅŸkili bir tür baÅŸka bir türün varyasyonu olarak " +"belirlenemez." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme:" @@ -12738,7 +12501,7 @@ msgstr "TileMap'i Boya" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Palette Min Width" -msgstr "" +msgstr "Palet Minimum GeniÅŸliÄŸi" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -13132,9 +12895,8 @@ msgstr "Hizalama Ayarları" #: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp #: scene/main/canvas_layer.cpp scene/resources/material.cpp #: scene/resources/particles_material.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Offset" -msgstr "Kaydırma:" +msgstr "Kaydırma" #: editor/plugins/tile_set_editor_plugin.cpp editor/rename_dialog.cpp #: scene/gui/range.cpp scene/resources/animation.cpp @@ -13145,9 +12907,8 @@ msgstr "Adım" #: editor/plugins/tile_set_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separation" -msgstr "Ayrım:" +msgstr "Ayrım" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13168,14 +12929,13 @@ msgstr "Yazı" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Tex Offset" -msgstr "Izgarayı Kaydır:" +msgstr "Izgarayı Kaydır" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp #: scene/3d/mesh_instance.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Material" -msgstr "Materyal DeÄŸiÅŸiklikleri:" +msgstr "Materyal" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp @@ -13194,9 +12954,8 @@ msgid "Autotile Bitmask Mode" msgstr "Bitmask Kipi" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Size" -msgstr "Kontur Boyutu:" +msgstr "Alt Döşeme Boyutu" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13214,9 +12973,8 @@ msgid "Navigation Offset" msgstr "Gezinim Kipi" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Offset" -msgstr "Kaydırma:" +msgstr "Åžekil Kaydırması" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -14332,11 +14090,14 @@ msgstr "KoÅŸturulabilir" #: editor/project_export.cpp msgid "Export the project for all the presets defined." -msgstr "" +msgstr "Tanımlanan tüm ön ayarlar için projeyi dışa aktarın." #: editor/project_export.cpp +#, fuzzy msgid "All presets must have an export path defined for Export All to work." msgstr "" +"Bütün ön ayarlar Hepsini Dışa Aktar iÅŸlemi için bir dışa aktarım dizinine " +"sahip olmalıdır." #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -14446,10 +14207,13 @@ msgid "GDScript Encryption Key (256-bits as hexadecimal):" msgstr "GDScript Åžifreleme Anahtarı (On altılı sayı sisteminde 256-bit):" #: editor/project_export.cpp +#, fuzzy msgid "" "Note: Encryption key needs to be stored in the binary,\n" "you need to build the export templates from source." msgstr "" +"Not: Åžifreleme anahtarının iki sayı sistemi olarak saklanması gerekir,\n" +"kaynaktan dışa aktarım ÅŸablonlarınızı derlemelisiniz." #: editor/project_export.cpp #, fuzzy @@ -14457,28 +14221,24 @@ msgid "More Info..." msgstr "Åžuraya Taşı..." #: editor/project_export.cpp -#, fuzzy msgid "Export PCK/Zip..." -msgstr "PCK/Zip Dışa Aktar" +msgstr "PCK/Zip Dışa Aktar..." #: editor/project_export.cpp -#, fuzzy msgid "Export Project..." -msgstr "Projeyi Dışa Aktar" +msgstr "Projeyi Dışa Aktar..." #: editor/project_export.cpp msgid "Export All" msgstr "Tümünü Dışa Aktar" #: editor/project_export.cpp -#, fuzzy msgid "Choose an export mode:" -msgstr "Lütfen boÅŸ bir klasör seçin." +msgstr "Bir dışa aktarım modu seç:" #: editor/project_export.cpp -#, fuzzy msgid "Export All..." -msgstr "Tümünü Dışa Aktar" +msgstr "Tümünü Dışa Aktar..." #: editor/project_export.cpp editor/project_manager.cpp msgid "ZIP File" @@ -15600,19 +15360,20 @@ msgstr "" msgid "Make Local" msgstr "YerelleÅŸtir" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Enable Scene Unique Name(s)" +msgstr "Sahne Benzersiz İsmini Etkin Kıl" #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" -msgstr "Düğüm adı:" +msgid "Unique names already used by another node in the scene:" +msgstr "BaÅŸka bir düğüm sahnede bu benzersiz adı zaten kullanıyor." -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" -msgstr "Düğüm adı:" +msgid "Disable Scene Unique Name(s)" +msgstr "Sahne Benzersiz İsmini Etkisiz Kıl" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15790,8 +15551,9 @@ msgid "Show Scene Tree Root Selection" msgstr "Merkez Seçimi" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Derive Script Globals By Name" -msgstr "" +msgstr "Ada Göre Betik Globallerini Türet" #: editor/scene_tree_dock.cpp #, fuzzy @@ -15811,6 +15573,10 @@ msgid "Button Group" msgstr "Düğme Grubu" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Sahne Benzersiz İsmini Etkisiz Kıl" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Gelen BaÄŸlantı)" @@ -15819,11 +15585,15 @@ msgid "Node configuration warning:" msgstr "Düğüm yapılandırma uyarısı:" #: editor/scene_tree_editor.cpp +#, fuzzy msgid "" "This node can be accessed from within anywhere in the scene by preceding it " "with the '%s' prefix in a node path.\n" "Click to disable this." msgstr "" +"Bu düğüme, bir düğüm adresinde önüne '%s' ön eki koyarak sahnenin herhangi " +"bir yerinden eriÅŸilebilir.\n" +"Bunu devre dışı bırakmak için tıklayın." #: editor/scene_tree_editor.cpp msgid "" @@ -15886,6 +15656,11 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Geçersiz düğüm adı, aÅŸağıdaki karakterlere izin verilmiyor:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Another node already uses this unique name in the scene." +msgstr "BaÅŸka bir düğüm sahnede bu benzersiz adı zaten kullanıyor." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Düğümü Yeniden Adlandır" @@ -16115,16 +15890,19 @@ msgid "Filter stack variables" msgstr "Döşemelerde Bul" #: editor/script_editor_debugger.cpp +#, fuzzy msgid "Auto Switch To Remote Scene Tree" -msgstr "" +msgstr "Uzak Sahne AÄŸacına Otomatik GeçiÅŸ" #: editor/script_editor_debugger.cpp +#, fuzzy msgid "Remote Scene Tree Refresh Interval" -msgstr "" +msgstr "Uzak Sahne AÄŸacı Yenileme Sıklığı" #: editor/script_editor_debugger.cpp +#, fuzzy msgid "Remote Inspect Refresh Interval" -msgstr "" +msgstr "Uzaktan İnceleme Yenileme Aralığı" #: editor/script_editor_debugger.cpp msgid "Network Profiler" @@ -16232,7 +16010,7 @@ msgstr "AudioStreamPlayer3D Emisyon Açısı DeÄŸiÅŸimi" #: platform/osx/export/export.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Camera" -msgstr "" +msgstr "Kamera" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" @@ -16243,8 +16021,9 @@ msgid "Change Camera Size" msgstr "Kamera Boyutunu DeÄŸiÅŸtir" #: editor/spatial_editor_gizmos.cpp +#, fuzzy msgid "Visibility Notifier" -msgstr "" +msgstr "Görünürlük Bildiricisi" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier AABB" @@ -16374,8 +16153,9 @@ msgid "Occluder" msgstr "Örtü Kipi" #: editor/spatial_editor_gizmos.cpp +#, fuzzy msgid "Set Occluder Sphere Radius" -msgstr "Engelleyici Silindir Yarıçapını Ayarla" +msgstr "Engelleyici Küre Yarıçapını Ayarla" #: editor/spatial_editor_gizmos.cpp msgid "Set Occluder Sphere Position" @@ -16407,8 +16187,9 @@ msgid "Occluder Hole" msgstr "Engelleyici Çokgeni OluÅŸtur" #: main/main.cpp +#, fuzzy msgid "Godot Physics" -msgstr "" +msgstr "Godot FiziÄŸi" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp @@ -16441,32 +16222,35 @@ msgid "Debugger stdout" msgstr "Hata Ayıklayıcı" #: main/main.cpp +#, fuzzy msgid "Max Chars Per Second" -msgstr "" +msgstr "Saniye başı maksimum karakter sayısı" #: main/main.cpp msgid "Max Messages Per Frame" -msgstr "" +msgstr "Kare Başına Maksimum Mesaj" #: main/main.cpp msgid "Max Errors Per Second" -msgstr "" +msgstr "Saniye Başına Maksimum Hata" #: main/main.cpp msgid "Max Warnings Per Second" -msgstr "" +msgstr "Saniye Başına Maksimum Uyarı" #: main/main.cpp msgid "Flush stdout On Print" msgstr "" #: main/main.cpp servers/visual_server.cpp +#, fuzzy msgid "Logging" -msgstr "" +msgstr "Kayıt tutma" #: main/main.cpp +#, fuzzy msgid "File Logging" -msgstr "" +msgstr "Dosya Kaaydı Tutma" #: main/main.cpp #, fuzzy @@ -16480,16 +16264,15 @@ msgstr "Dosya Yolunu Kopyala" #: main/main.cpp msgid "Max Log Files" -msgstr "" +msgstr "Maksimum Kayıt Dosyası" #: main/main.cpp msgid "Driver" -msgstr "" +msgstr "Sürücü" #: main/main.cpp -#, fuzzy msgid "Driver Name" -msgstr "Betik Adı:" +msgstr "Sürücü Adı" #: main/main.cpp msgid "Fallback To GLES2" @@ -16500,8 +16283,9 @@ msgid "Use Nvidia Rect Flicker Workaround" msgstr "" #: main/main.cpp +#, fuzzy msgid "DPI" -msgstr "" +msgstr "DPI" #: main/main.cpp msgid "Allow hiDPI" @@ -16518,16 +16302,18 @@ msgid "Use V-Sync" msgstr "Yapışma Kullan" #: main/main.cpp +#, fuzzy msgid "Per Pixel Transparency" -msgstr "" +msgstr "Piksel Başına Åžeffaflık" #: main/main.cpp +#, fuzzy msgid "Allowed" -msgstr "" +msgstr "İzin Verildi" #: main/main.cpp msgid "Intended Usage" -msgstr "" +msgstr "Kullanım Amacı" #: main/main.cpp #, fuzzy @@ -16541,7 +16327,7 @@ msgstr "Kaydedilirken hata" #: main/main.cpp msgid "Threads" -msgstr "" +msgstr "İş parçacıkları" #: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h #, fuzzy @@ -16585,8 +16371,9 @@ msgstr "" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp #: scene/main/viewport.cpp scene/register_scene_types.cpp +#, fuzzy msgid "GUI" -msgstr "" +msgstr "Grafiksel Kullanıcı Arayüzü" #: main/main.cpp msgid "Drop Mouse On GUI Input Disabled" @@ -16597,8 +16384,9 @@ msgid "stdout" msgstr "" #: main/main.cpp +#, fuzzy msgid "Print FPS" -msgstr "" +msgstr "Saniyedeki kare sayısını(FPS) yazdır" #: main/main.cpp msgid "Verbose stdout" @@ -16620,8 +16408,9 @@ msgid "Frame Delay Msec" msgstr "Çerçeve Seçimi" #: main/main.cpp +#, fuzzy msgid "Low Processor Mode" -msgstr "" +msgstr "Düşük İşlemci Modu" #: main/main.cpp msgid "Delta Sync After Draw" @@ -16646,8 +16435,9 @@ msgid "Pointing" msgstr "Nokta" #: main/main.cpp +#, fuzzy msgid "Touch Delay" -msgstr "" +msgstr "Dokunma Gecikmesi" #: main/main.cpp servers/visual_server.cpp msgid "GLES3" @@ -16671,8 +16461,9 @@ msgid "Environment" msgstr "Ortamı Göster" #: main/main.cpp +#, fuzzy msgid "Default Clear Color" -msgstr "" +msgstr "Varsayılan Temizleme Rengi" #: main/main.cpp msgid "Boot Splash" @@ -16685,16 +16476,15 @@ msgstr "Kemikleri Göster" #: main/main.cpp msgid "Image" -msgstr "" +msgstr "Görüntü" #: main/main.cpp msgid "Fullsize" -msgstr "" +msgstr "Tam boyut" #: main/main.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Use Filter" -msgstr "Süzgeç:" +msgstr "Filtre Kullan" #: main/main.cpp scene/resources/style_box.cpp #, fuzzy @@ -16741,9 +16531,8 @@ msgid "Custom Image Hotspot" msgstr "" #: main/main.cpp -#, fuzzy msgid "Tooltip Position Offset" -msgstr "Dönme Kayması:" +msgstr "Araç İpucu Pozisyon Kaydırması" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #, fuzzy @@ -16756,9 +16545,8 @@ msgid "Wait For Debugger" msgstr "Hata Ayıklayıcı" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Wait Timeout" -msgstr "Zaman aşımı." +msgstr "Bekleme Zaman Aşımı" #: main/main.cpp msgid "Runtime" @@ -16873,14 +16661,12 @@ msgstr "Büyük/Küçük Harf Dönüştür" #: scene/resources/cylinder_shape.cpp scene/resources/environment.cpp #: scene/resources/navigation_mesh.cpp scene/resources/primitive_meshes.cpp #: scene/resources/sphere_shape.cpp -#, fuzzy msgid "Radius" -msgstr "Yarıçap:" +msgstr "Yarıçap" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Radial Segments" -msgstr "Ana Sahne DeÄŸiÅŸtirgenleri:" +msgstr "Radyal Dilimler" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -16949,9 +16735,8 @@ msgid "Path Simplify Angle" msgstr "" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Rotation" -msgstr "Rastgele Döndürme:" +msgstr "Yol Rotasyonu" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16964,9 +16749,8 @@ msgid "Path Continuous U" msgstr "Sürekli" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path U Distance" -msgstr "Uzaklık Seç:" +msgstr "Yol U Mesafesi" #: modules/csg/csg_shape.cpp #, fuzzy @@ -17019,9 +16803,8 @@ msgid "Use FBX" msgstr "" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Config File" -msgstr "Dosya Depolama:" +msgstr "Konfigürasyon Dosyası" #: modules/gdnative/gdnative.cpp #, fuzzy @@ -17037,7 +16820,7 @@ msgstr "İskelet" #: modules/gdnative/gdnative.cpp #, fuzzy msgid "Symbol Prefix" -msgstr "Ön Ek:" +msgstr "Sembol Ön Eki" #: modules/gdnative/gdnative.cpp #, fuzzy @@ -17099,14 +16882,12 @@ msgid "Libraries:" msgstr "Kütüphaneler:" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Class Name" -msgstr "Sınıf İsmi:" +msgstr "Sınıf İsmi" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Script Class" -msgstr "Betik Adı:" +msgstr "Betik Sınıfı" #: modules/gdnative/nativescript/nativescript.cpp #, fuzzy @@ -17185,9 +16966,8 @@ msgid "Object can't provide a length." msgstr "Nesne bir uzunluk saÄŸlayamaz." #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Language Server" -msgstr "Dil:" +msgstr "Dil Sunucusu" #: modules/gdscript/language_server/gdscript_language_server.cpp #, fuzzy @@ -17216,9 +16996,8 @@ msgid "Buffer View" msgstr "Arkadan Görünüm" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Byte Offset" -msgstr "Izgarayı Kaydır:" +msgstr "" #: modules/gltf/gltf_accessor.cpp #, fuzzy @@ -17259,9 +17038,8 @@ msgid "Sparse Indices Byte Offset" msgstr "" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Indices Component Type" -msgstr "Geometri Ayrıştırılıyor..." +msgstr "Seyrek Dizinler BileÅŸen Tipi" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" @@ -17291,9 +17069,8 @@ msgid "Indices" msgstr "Tüm Aygıtlar" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "FOV Size" -msgstr "Boyut:" +msgstr "Görüş Alanı Boyutu" #: modules/gltf/gltf_camera.cpp msgid "Zfar" @@ -17342,7 +17119,7 @@ msgstr "Işık-Haritalarını PiÅŸir" #: modules/gltf/gltf_mesh.cpp #, fuzzy msgid "Instance Materials" -msgstr "Materyal DeÄŸiÅŸiklikleri:" +msgstr "Örnek Malzemeler" #: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp #, fuzzy @@ -17430,9 +17207,8 @@ msgid "Gloss Factor" msgstr "" #: modules/gltf/gltf_spec_gloss.cpp -#, fuzzy msgid "Specular Factor" -msgstr "Katsayı operatörü." +msgstr "Yansıtıcı Etkeni" #: modules/gltf/gltf_spec_gloss.cpp msgid "Spec Gloss Img" @@ -17471,9 +17247,8 @@ msgid "Accessors" msgstr "" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Scene Name" -msgstr "Sahne Yolu:" +msgstr "Sahne Adı" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -17502,7 +17277,7 @@ msgstr "Işık" #: modules/gltf/gltf_state.cpp #, fuzzy msgid "Unique Animation Names" -msgstr "Yeni Animasyon İsmi:" +msgstr "Benzersiz Animasyon Adları" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -17515,9 +17290,8 @@ msgid "Skeleton To Node" msgstr "Bir Düğüm Seç" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Animations" -msgstr "Animasyonlar:" +msgstr "Animasyonlar" #: modules/gltf/gltf_texture.cpp #, fuzzy @@ -17764,7 +17538,7 @@ msgstr "" #: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp #, fuzzy msgid "Loop Offset" -msgstr "Kaydırma:" +msgstr "Döngü Kaydırma" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Eye Height" @@ -17809,6 +17583,21 @@ msgstr "Solüsyonu İnÅŸa Et" msgid "Auto Update Project" msgstr "Adsız Proje" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Hepsini Görüntüle" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Bir Dizin Seç" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Bir Dizin Seç" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "İç özel durum yığını izlemesinin sonu" @@ -17887,7 +17676,7 @@ msgstr "" #: modules/opensimplex/noise_texture.cpp #, fuzzy msgid "As Normal Map" -msgstr "Rastgele Ölçek:" +msgstr "Normal Haritalama Olarak" #: modules/opensimplex/noise_texture.cpp msgid "Bump Strength" @@ -17900,7 +17689,7 @@ msgstr "" #: modules/opensimplex/noise_texture.cpp #, fuzzy msgid "Noise Offset" -msgstr "Izgarayı Kaydır:" +msgstr "Gürültü Kaydırma" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" @@ -17929,9 +17718,8 @@ msgid "Names" msgstr "İsim" #: modules/regex/regex.cpp -#, fuzzy msgid "Strings" -msgstr "Ayarlar:" +msgstr "Dizgiler" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" @@ -18009,7 +17797,7 @@ msgstr "Bit dizisi bulundu fakat yığındaki düğüm deÄŸil, kusuru bildir!" #: modules/visual_script/visual_script.cpp #, fuzzy msgid "Stack overflow with stack depth:" -msgstr "Åžu derinlikte yığın taÅŸması: " +msgstr "Åžu derinlikte yığın taÅŸması:" #: modules/visual_script/visual_script.cpp #, fuzzy @@ -18381,7 +18169,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy msgid "Input type not iterable:" -msgstr "Girdi türü yinelenebilir deÄŸil: " +msgstr "Girdi türü yinelenebilir deÄŸil:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" @@ -18390,7 +18178,7 @@ msgstr "Yineleyici geçersiz durumda" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy msgid "Iterator became invalid:" -msgstr "Yineleyici geçersiz durumda: " +msgstr "Yineleyici geçersiz durumda:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" @@ -18462,9 +18250,8 @@ msgid "Use Default Args" msgstr "Varsayılanlara dön" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Validate" -msgstr "Geçerli karakterler:" +msgstr "DoÄŸrula" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -18553,19 +18340,18 @@ msgstr "Diziyi Yeniden Boyutlandır" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Operator" -msgstr "Kaplama opeartörü." +msgstr "Operatör" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "Invalid argument of type:" -msgstr ": Åžu tür için geçersiz deÄŸiÅŸtirgen: " +msgstr ": Åžu tür için geçersiz deÄŸiÅŸtirgen:" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "Invalid arguments:" -msgstr ": Geçersiz deÄŸiÅŸtirgenler: " +msgstr ": Geçersiz deÄŸiÅŸtirgenler:" #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" @@ -18579,12 +18365,12 @@ msgstr "İsim" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "VariableGet not found in script:" -msgstr "VariableGet betikte bulunamadı: " +msgstr "VariableGet betikte bulunamadı:" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "VariableSet not found in script:" -msgstr "VariableSet betikte bulunamadı: " +msgstr "VariableSet betikte bulunamadı:" #: modules/visual_script/visual_script_nodes.cpp msgid "Preload" @@ -18683,7 +18469,7 @@ msgstr "Görsel Betikte Ara" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "Yield" +msgstr "Verim" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" @@ -18785,9 +18571,8 @@ msgid "CA Chain" msgstr "IK Zincirini Temizle" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "Handshake Timeout" -msgstr "Zaman aşımı." +msgstr "TokalaÅŸma Zaman Aşımı" #: modules/webxr/webxr_interface.cpp #, fuzzy @@ -18795,14 +18580,12 @@ msgid "Session Mode" msgstr "Bölge Kipi" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Required Features" -msgstr "Ana Özellikler:" +msgstr "Gerekli Özellikler" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Optional Features" -msgstr "Ana Özellikler:" +msgstr "İsteÄŸe BaÄŸlı Özellikler" #: modules/webxr/webxr_interface.cpp msgid "Requested Reference Space Types" @@ -18907,9 +18690,8 @@ msgid "Export Format" msgstr "Dışa aktarım Yolu" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Min SDK" -msgstr "Kontur Boyutu:" +msgstr "Minimum SDK" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18960,14 +18742,12 @@ msgid "Code" msgstr "" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Package" -msgstr "Çıkınla" +msgstr "Paket" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Unique Name" -msgstr "Düğüm adı:" +msgstr "Benzersiz Ad" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18975,9 +18755,8 @@ msgid "Signed" msgstr "Sinyal" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Classify As Game" -msgstr "Sınıf İsmi:" +msgstr "Oyun Olarak Sınıflandır" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" @@ -18989,9 +18768,8 @@ msgid "Exclude From Recents" msgstr "Düğümleri Sil" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Graphics" -msgstr "Izgarayı Kaydır:" +msgstr "Grafikler" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19063,7 +18841,7 @@ msgstr "Topluluk" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp #, fuzzy msgid "Extra Args" -msgstr "Ekstra ÇaÄŸrı Argümanları:" +msgstr "Ek ÇaÄŸrı Argümanları" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19282,10 +19060,8 @@ msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." msgstr "" -"'apksigner' bulunamadı.\n" -"Lütfen komutun Android SDK build-tools dizininde bulunup bulunmadığını " -"kontrol edin.\n" -"Elde edilen %s imzasız." +"'apksigner' bulunamadı. Lütfen komutun Android SDK build-tools dizininde " +"bulunup bulunmadığını kontrol edin. Elde edilen %s imzasız." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19300,9 +19076,8 @@ msgid "Could not find keystore, unable to export." msgstr "Anahtar deposu bulunamadı, dışa aktarılamadı." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "Alt iÅŸlem baÅŸlatılamadı!" +msgstr "apksigner uygulaması baÅŸlatılamadı." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -19333,9 +19108,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "Geçersiz dosya adı! Android APK, * .apk uzantısını gerektirir." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "Desteklenmeyen dışa aktarma biçimi!\n" +msgstr "Desteklenmeyen dışa aktarım biçimi!" #: platform/android/export/export_plugin.cpp msgid "" @@ -19346,27 +19120,22 @@ msgstr "" "için sürüm bilgisi yok. Lütfen 'Proje' menüsünden yeniden yükleyin." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"Android derlemesi sürüm uyumsuzluÄŸu:\n" -" Yüklü Åžablon: %s\n" -" Godot Versiyonu: %s\n" +"Android derlemesi sürüm uyumsuzluÄŸu: Yüklü Åžablon: %s, Godot versiyonu: %s. " "Lütfen 'Proje' menüsünden Android derleme ÅŸablonunu yeniden yükleyin." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" -"Proje adıyla res://android/build/res/*.xml dosyalarının üzerine yazılamıyor" +"Proje adıyla res://android/build/res/*.xml dosyalarının üzerine yazılamıyor." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "Proje dosyaları gradle projesine aktarılamadı\n" +msgstr "Proje dosyaları gradle projesine aktarılamadı." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19382,10 +19151,9 @@ msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"Android projesinin oluÅŸturulması baÅŸarısız oldu, hatayı çıktı için kontrol " -"edin.\n" -"Alternatif olarak, Android derleme dokümantasyonu için docs.godotengine.org " -"adresini ziyaret edin.." +"Android projesinin oluÅŸturulması baÅŸarısız oldu, hata. için çıktıyı kontrol " +"edin. Alternatif olarak, Android derleme dokümantasyonu için docs." +"godotengine.org adresini ziyaret edin." #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -19400,40 +19168,34 @@ msgstr "" "için gradle proje dizinini kontrol edin." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "Paket bulunamadı: %s" +msgstr "Paket bulunamadı: \"%s\"." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." msgstr "APK oluÅŸturuluyor..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"Dışa aktarılacak ÅŸablon APK bulunamadı:\n" -"%s" +msgstr "Dışa aktarılacak ÅŸablon APK bulunamadı: \"%s\"." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Missing libraries in the export template for the selected architectures: %s. " "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" -"Seçili mimariler için dışa aktarma ÅŸablonunda eksik kitaplıklar: %s.\n" -"Lütfen tüm gerekli kitaplıkları içeren bir ÅŸablon oluÅŸturun veya dışa " -"aktarma ön ayarındaki eksik mimarilerin iÅŸaretini kaldırın." +"Seçili mimariler için dışa aktarma ÅŸablonunda eksik kitaplıklar: %s. Lütfen " +"tüm gerekli kitaplıkları içeren bir ÅŸablon oluÅŸturun veya dışa aktarma ön " +"ayarındaki eksik mimarilerin iÅŸaretini kaldırın." #: platform/android/export/export_plugin.cpp msgid "Adding files..." msgstr "Dosyalar ekleniyor..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "Proje dosyaları dışa aktarılamadı" +msgstr "Proje dosyaları dışa aktarılamadı." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19529,9 +19291,8 @@ msgid "Code Sign Identity Release" msgstr "" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Export Method Release" -msgstr "Dışa Aktarma Biçimi:" +msgstr "Dışa Aktarma Yöntemi Sürümü" #: platform/iphone/export/export.cpp msgid "Targeted Device Family" @@ -19542,9 +19303,8 @@ msgid "Info" msgstr "" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Identifier" -msgstr "Geçersiz Tanımlayıcı:" +msgstr "Tanımlayıcı" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19570,12 +19330,12 @@ msgstr "Özellikleri Yapıştır" #: platform/iphone/export/export.cpp #, fuzzy msgid "Access Wi-Fi" -msgstr "BaÅŸarılı!" +msgstr "Wi-Fi'ye EriÅŸ" #: platform/iphone/export/export.cpp #, fuzzy msgid "Push Notifications" -msgstr "Rastgele Döndürme:" +msgstr "Rastgele Döndürme" #: platform/iphone/export/export.cpp #, fuzzy @@ -19675,6 +19435,11 @@ msgstr "ÖzelSınıf" msgid "Custom BG Color" msgstr "ÖzelSınıf" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Hepsini GeniÅŸlet" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19707,19 +19472,16 @@ msgid "Run exported HTML in the system's default browser." msgstr "Dışa aktarılmış HTML'yi sistemin varsayılan tarayıcısında çalıştır." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "Dışa aktarma için ÅŸablon açılamadı:" +msgstr "Dışa aktarım için ÅŸablon açılamadı: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "Geçersiz Dışa Aktarım Åžablonu:" +msgstr "Geçersiz dışa aktarım ÅŸablonu: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "Dosya yazılamadı:" +msgstr "Dosya yazılamadı: \"%s\"." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19727,18 +19489,16 @@ msgid "Icon Creation" msgstr "Kenar BoÅŸluk Belirle" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "Dosya okunamadı:" +msgstr "Dosya okunamadı: \"%s\"." #: platform/javascript/export/export.cpp msgid "PWA" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Variant" -msgstr "Ayrım:" +msgstr "Varyant" #: platform/javascript/export/export.cpp #, fuzzy @@ -19810,19 +19570,16 @@ msgid "Icon 512 X 512" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "HTML kabuÄŸu okunamadı:" +msgstr "HTML kabuÄŸu okunamadı: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "HTTP sunucu klasörü oluÅŸturulamadı:" +msgstr "HTTP sunucu klasörü oluÅŸturulamadı: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "HTTP sunucusu baÅŸlatılırken hata:" +msgstr "HTTP sunucusu baÅŸlatılırken hata: %d." #: platform/javascript/export/export.cpp msgid "Web" @@ -19926,9 +19683,8 @@ msgid "Unknown object type." msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "App Category" -msgstr "Kategori:" +msgstr "Uygulama Kategorisi" #: platform/osx/export/export.cpp msgid "High Res" @@ -20122,19 +19878,16 @@ msgid "Apple Team ID" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "Proje dosyaları dışa aktarılamadı" +msgstr "İkon dosyası \"%s\" açılamadı." #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "Alt iÅŸlem baÅŸlatılamadı!" +msgstr "xcrun uygulaması baÅŸlatılamadı." #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization failed." -msgstr "YerelleÅŸtirme" +msgstr "Noter tasdiki baÅŸarısız oldu." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" @@ -20187,9 +19940,8 @@ msgid "No identity found." msgstr "Simge bulunamadı." #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "%s dosyası kaydedilirken hata" +msgstr "%s dosyası imzalanamadı." #: platform/osx/export/export.cpp msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" @@ -20201,9 +19953,8 @@ msgid "DMG Creation" msgstr "Yönler" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start hdiutil executable." -msgstr "Alt iÅŸlem baÅŸlatılamadı!" +msgstr "hdiutil uygulaması baÅŸlatılamadı." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." @@ -20219,16 +19970,12 @@ msgid "Creating app bundle" msgstr "Küçük Bediz OluÅŸturuluyor" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "" -"Dışa aktarılacak ÅŸablon APK bulunamadı:\n" -"%s" +msgstr "Dışa aktarım için ÅŸablon uygulaması bulunamadı: \"%s\"." #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "Geçersiz Dışa Aktarım Åžablonu:" +msgstr "Geçersiz dışa aktarım biçimi." #: platform/osx/export/export.cpp msgid "" @@ -20284,9 +20031,8 @@ msgid "ZIP Creation" msgstr "Proje" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "Proje dosyaları gradle projesine aktarılamadı\n" +msgstr "\"%s\" yolundan okunacak dosya açılamadı." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -20413,23 +20159,20 @@ msgid "Display Name" msgstr "Hepsini Görüntüle" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Short Name" -msgstr "Betik Adı:" +msgstr "Kısa Ad" #: platform/uwp/export/export.cpp msgid "Publisher" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Publisher Display Name" -msgstr "Geçersiz paket yayıncı görünen adı." +msgstr "Görünen Yayıncı Adı" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Product GUID" -msgstr "Geçersiz ürün GUID'i." +msgstr "Ürün GUID" #: platform/uwp/export/export.cpp #, fuzzy @@ -20444,7 +20187,7 @@ msgstr "Sinyal" #: platform/uwp/export/export.cpp #, fuzzy msgid "Certificate" -msgstr "Köşenoktalar:" +msgstr "Sertifika" #: platform/uwp/export/export.cpp #, fuzzy @@ -20512,9 +20255,8 @@ msgid "Wide 310 X 150 Logo" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Splash Screen" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "BaÅŸlangıç Ekranı" #: platform/uwp/export/export.cpp #, fuzzy @@ -20534,6 +20276,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Geçersiz paket kısa ismi." @@ -20604,9 +20352,8 @@ msgid "Debug Algorithm" msgstr "Hata Ayıklayıcı" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to rename temporary file \"%s\"." -msgstr "Geçici dosya kaldırılamıyor:" +msgstr "\"%s\" geçici dosyasının yeniden adlandırılması baÅŸarısız oldu." #: platform/windows/export/export.cpp msgid "Identity Type" @@ -20632,19 +20379,16 @@ msgid "File Version" msgstr "Sürüm" #: platform/windows/export/export.cpp -#, fuzzy msgid "Product Version" -msgstr "Geçersiz ürün GUID'i." +msgstr "Ürün Sürümü" #: platform/windows/export/export.cpp -#, fuzzy msgid "Company Name" -msgstr "Düğüm adı:" +msgstr "Åžirket Adı" #: platform/windows/export/export.cpp -#, fuzzy msgid "Product Name" -msgstr "Proje Adı:" +msgstr "Ürün Adı" #: platform/windows/export/export.cpp #, fuzzy @@ -20693,9 +20437,8 @@ msgid "Could not find osslsigncode executable at \"%s\"." msgstr "Anahtar deposu bulunamadı, dışa aktarılamadı." #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid identity type." -msgstr "Geçersiz Tanımlayıcı:" +msgstr "Geçersiz kimlik türü." #: platform/windows/export/export.cpp #, fuzzy @@ -20715,9 +20458,8 @@ msgid "Signtool failed to sign executable: %s." msgstr "Geçersiz uzantı." #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "Geçici dosya kaldırılamıyor:" +msgstr "\"%s\" geçici dosyasının silinme iÅŸlemi baÅŸarısız oldu." #: platform/windows/export/export.cpp msgid "" @@ -20726,19 +20468,16 @@ msgid "" msgstr "" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid icon path:" -msgstr "Geçersiz yol." +msgstr "Geçersiz ikon yolu:" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid file version:" -msgstr "Geçersiz uzantı." +msgstr "Geçersiz dosya sürümü:" #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid product version:" -msgstr "Geçersiz ürün GUID'i." +msgstr "Geçersiz ürün sürümü:" #: platform/windows/export/export.cpp msgid "Windows executables cannot be >= 4 GiB." @@ -20875,7 +20614,6 @@ msgid "Audio Bus" msgstr "Audio Bus Ekle" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Override" msgstr "Üzerine Yaz" @@ -20907,9 +20645,8 @@ msgstr "" #: scene/3d/light.cpp scene/3d/reflection_probe.cpp #: scene/3d/visibility_notifier.cpp scene/3d/visual_instance.cpp #: scene/resources/material.cpp -#, fuzzy msgid "Max Distance" -msgstr "Uzaklık Seç:" +msgstr "Maksimum Uzaklık" #: scene/2d/audio_stream_player_2d.cpp scene/3d/light.cpp #, fuzzy @@ -20937,15 +20674,14 @@ msgid "Anchor Mode" msgstr "Simge Kipi" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Rotating" -msgstr "Dönme Adımı:" +msgstr "Döndürme" #: scene/2d/camera_2d.cpp scene/2d/listener_2d.cpp scene/3d/camera.cpp #: scene/3d/listener.cpp scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Current" -msgstr "Geçerli:" +msgstr "Geçerli" #: scene/2d/camera_2d.cpp scene/gui/graph_edit.cpp #, fuzzy @@ -21027,14 +20763,12 @@ msgid "Drag Margin" msgstr "Kenar BoÅŸluk Belirle" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Draw Screen" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "Çizim Ekranı" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Draw Limits" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "Çizim Sınırları" #: scene/2d/camera_2d.cpp #, fuzzy @@ -21248,9 +20982,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Randomness" -msgstr "Rastgele Yeniden BaÅŸlama (sn):" +msgstr "Rastgelelik" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21292,9 +21025,8 @@ msgstr "Emisyon Maskesi" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Sphere Radius" -msgstr "Emisyon Kaynağı: " +msgstr "Küre Yarıçapı" #: scene/2d/cpu_particles_2d.cpp #, fuzzy @@ -21364,7 +21096,7 @@ msgstr "DoÄŸrusal" #: scene/resources/particles_material.cpp #, fuzzy msgid "Accel" -msgstr "BaÅŸarılı!" +msgstr "Hızlanma" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21423,9 +21155,8 @@ msgid "Angle Curve" msgstr "EÄŸriyi Kapat" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Scale Amount" -msgstr "DeÄŸer:" +msgstr "Ölçek Miktarı" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Scale Amount Random" @@ -21451,13 +21182,12 @@ msgstr "" #: scene/resources/particles_material.cpp #, fuzzy msgid "Hue Variation" -msgstr "Ayrım:" +msgstr "Renk Tonu Varyasyonu" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Variation" -msgstr "Ayrım:" +msgstr "Varyasyon" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21687,9 +21417,8 @@ msgid "End Cap Mode" msgstr "Yapışma Kipi:" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Border" -msgstr "Klasör yeniden adlandırma:" +msgstr "Kenar" #: scene/2d/line_2d.cpp msgid "Sharp Limit" @@ -21743,9 +21472,8 @@ msgid "Target Desired Distance" msgstr "" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Path Max Distance" -msgstr "Uzaklık Seç:" +msgstr "Yol Maksimum Mesafesi" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy @@ -21771,9 +21499,8 @@ msgid "Time Horizon" msgstr "Yatay Yansıt" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Max Speed" -msgstr "Hız:" +msgstr "Maksimum Hız" #: scene/2d/navigation_agent_2d.cpp #, fuzzy @@ -21817,9 +21544,8 @@ msgstr "Seyahat" #: scene/2d/node_2d.cpp scene/2d/polygon_2d.cpp scene/3d/spatial.cpp #: scene/main/canvas_layer.cpp -#, fuzzy msgid "Rotation Degrees" -msgstr "%s Düzey Dönüyor." +msgstr "Dönüş Açıları" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy @@ -21827,14 +21553,12 @@ msgid "Global Rotation" msgstr "Genel Sabit" #: scene/2d/node_2d.cpp -#, fuzzy msgid "Global Rotation Degrees" -msgstr "%s Düzey Dönüyor." +msgstr "Genel Dönüş Açıları" #: scene/2d/node_2d.cpp -#, fuzzy msgid "Global Scale" -msgstr "Rastgele Ölçek:" +msgstr "Küresel Ölçek" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy @@ -22022,9 +21746,8 @@ msgid "Mass" msgstr "" #: scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Inertia" -msgstr "Dikey:" +msgstr "Eylemsizlik" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -22308,9 +22031,8 @@ msgid "Compatibility Mode" msgstr "Öncelik Kipi" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Centered Textures" -msgstr "Ana Özellikler:" +msgstr "MerkezlenmiÅŸ Dokular" #: scene/2d/tile_map.cpp msgid "Cell Clip UV" @@ -22434,9 +22156,8 @@ msgid "ARVROrigin requires an ARVRCamera child node." msgstr "ARVROrigin bir ARVRCamera alt düğümü gerektirir." #: scene/3d/arvr_nodes.cpp servers/arvr_server.cpp -#, fuzzy msgid "World Scale" -msgstr "Rastgele Ölçek:" +msgstr "Dünya ÖlçeÄŸi" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22465,9 +22186,8 @@ msgid "Emission Angle" msgstr "Emisyon Renkleri" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Degrees" -msgstr "%s Düzey Dönüyor." +msgstr "Açılar" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22578,9 +22298,8 @@ msgid "Generate" msgstr "Genel" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Max Size" -msgstr "Boyut:" +msgstr "Maksimum Boyut" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22588,9 +22307,8 @@ msgid "Custom Sky" msgstr "ÖzelSınıf" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Sky Rotation Degrees" -msgstr "%s Düzey Dönüyor." +msgstr "Özel Gökyüzü Dönüş Açıları" #: scene/3d/baked_lightmap.cpp scene/3d/ray_cast.cpp #, fuzzy @@ -22909,14 +22627,12 @@ msgstr "Beyaz Modüle Etme Kuvveti" #: scene/3d/label_3d.cpp scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Font" -msgstr "Yazı Tipleri" +msgstr "Yazı Tipi" #: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Horizontal Alignment" -msgstr "Yatay:" +msgstr "Yatay Hizalama" #: scene/3d/label_3d.cpp #, fuzzy @@ -23026,9 +22742,8 @@ msgid "Software Skinning" msgstr "" #: scene/3d/mesh_instance.cpp -#, fuzzy msgid "Transform Normals" -msgstr "Dönüşüm Durduruldu." +msgstr "Dönüşüm Normalleri" #: scene/3d/navigation.cpp msgid "" @@ -23239,9 +22954,8 @@ msgid "Angular Limit Upper" msgstr "DoÄŸrusal" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Lower" -msgstr "Maks. Açısal Hata:" +msgstr "Açısal Limit Alt" #: scene/3d/physics_body.cpp #, fuzzy @@ -23406,9 +23120,8 @@ msgid "Exclude Nodes" msgstr "Düğümleri Sil" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Params" -msgstr "Parametre DeÄŸiÅŸtirildi:" +msgstr "Parametreler" #: scene/3d/physics_joint.cpp msgid "Angular Limit" @@ -23436,7 +23149,7 @@ msgstr "Yörünge Görünümü SaÄŸ" #: scene/3d/physics_joint.cpp #, fuzzy msgid "Max Impulse" -msgstr "Hız:" +msgstr "Maksimum İtme" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23444,14 +23157,12 @@ msgid "Linear Limit" msgstr "DoÄŸrusal" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Upper Distance" -msgstr "Uzaklık Seç:" +msgstr "Üst Mesafe" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Lower Distance" -msgstr "Uzaklık Seç:" +msgstr "Alt Mesafe" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23499,9 +23210,8 @@ msgid "Linear Motor X" msgstr "EtkinleÅŸtir" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Force Limit" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "Kuvvet Sınırı" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23619,9 +23329,8 @@ msgid "Dispatch Mode" msgstr "" #: scene/3d/proximity_group.cpp -#, fuzzy msgid "Grid Radius" -msgstr "Yarıçap:" +msgstr "Izgara Yarıçapı" #: scene/3d/ray_cast.cpp #, fuzzy @@ -23908,14 +23617,12 @@ msgid "Parent Collision Ignore" msgstr "Temas Çokgeni OluÅŸtur" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Simulation Precision" -msgstr "Animasyon aÄŸacı geçersizdir." +msgstr "Simülasyon Hassasiyeti" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Total Mass" -msgstr "Toplam:" +msgstr "Toplam Kütle" #: scene/3d/soft_body.cpp msgid "Linear Stiffness" @@ -23984,7 +23691,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp msgid "Opacity" -msgstr "" +msgstr "Åžeffaflık" #: scene/3d/sprite_3d.cpp scene/resources/material.cpp #, fuzzy @@ -24039,9 +23746,8 @@ msgid "Use As Steering" msgstr "" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Wheel" -msgstr "Tekerlek Yukarı." +msgstr "Tekerlek" #: scene/3d/vehicle_body.cpp msgid "Roll Influence" @@ -24111,9 +23817,8 @@ msgstr "" #: scene/3d/visual_instance.cpp scene/animation/skeleton_ik.cpp #: scene/resources/material.cpp -#, fuzzy msgid "Min Distance" -msgstr "Uzaklık Seç:" +msgstr "Minimum Mesafe" #: scene/3d/visual_instance.cpp msgid "Min Hysteresis" @@ -24162,31 +23867,30 @@ msgstr "Düğümü Çırp" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Fadein Time" -msgstr "X-Sönülme Süresi (sn):" +msgstr "Solma Süresi" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Fadeout Time" -msgstr "X-Sönülme Süresi (sn):" +msgstr "Kararma Süresi" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Auto Restart" -msgstr "KendiliÄŸinden Yeniden BaÅŸlat:" +msgstr "Otomatik Yeniden BaÅŸlat" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Autorestart" -msgstr "KendiliÄŸinden Yeniden BaÅŸlat:" +msgstr "Otomatik Yeniden BaÅŸlatma" #: scene/animation/animation_blend_tree.cpp msgid "Delay" msgstr "" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Random Delay" -msgstr "Rastgele EÄŸilme:" +msgstr "Rastgele Gecikme" #: scene/animation/animation_blend_tree.cpp #, fuzzy @@ -24196,7 +23900,7 @@ msgstr "DeÄŸer:" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Blend Amount" -msgstr "DeÄŸer:" +msgstr "Karıştırma Miktarı" #: scene/animation/animation_blend_tree.cpp #, fuzzy @@ -24212,7 +23916,7 @@ msgstr "GiriÅŸ Portu Ekle" #: scene/animation/animation_node_state_machine.cpp #, fuzzy msgid "Xfade Time" -msgstr "X-Sönülme Süresi (sn):" +msgstr "X-Sönülme Süresi" #: scene/animation/animation_node_state_machine.cpp #, fuzzy @@ -24258,9 +23962,8 @@ msgid "Current Animation Position" msgstr "Animasyon Noktası Ekle" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Playback Options" -msgstr "Sınıf Seçenekleri:" +msgstr "Oynatma Seçenekleri" #: scene/animation/animation_player.cpp #, fuzzy @@ -24304,7 +24007,7 @@ msgstr "AnimationOynatıcı kök düğümü geçerli bir düğüm deÄŸil." #: scene/animation/animation_tree.cpp #, fuzzy msgid "Tree Root" -msgstr "Kök Düğüm OluÅŸtur:" +msgstr "AÄŸaç Kökü" #: scene/animation/animation_tree.cpp #, fuzzy @@ -24562,9 +24265,8 @@ msgid "Grow Direction" msgstr "Yönler" #: scene/gui/control.cpp scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Min Size" -msgstr "Kontur Boyutu:" +msgstr "Minimum Boyut" #: scene/gui/control.cpp #, fuzzy @@ -24620,18 +24322,16 @@ msgid "Mouse" msgstr "" #: scene/gui/control.cpp -#, fuzzy msgid "Default Cursor Shape" -msgstr "Varsayılan Bus YerleÅŸim Düzenini Yükle." +msgstr "Varsayılan İmleç Åžekli" #: scene/gui/control.cpp msgid "Pass On Modal Close Click" msgstr "" #: scene/gui/control.cpp -#, fuzzy msgid "Size Flags" -msgstr "Boyut: " +msgstr "Boyut Etiketleri" #: scene/gui/control.cpp #, fuzzy @@ -24784,9 +24484,8 @@ msgid "Fixed Column Width" msgstr "" #: scene/gui/item_list.cpp -#, fuzzy msgid "Icon Scale" -msgstr "Rastgele Ölçek:" +msgstr "Simge ÖlçeÄŸi" #: scene/gui/item_list.cpp #, fuzzy @@ -24799,9 +24498,8 @@ msgid "V Align" msgstr "Ata" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp -#, fuzzy msgid "Visible Characters" -msgstr "Geçerli karakterler:" +msgstr "Görünür Karakterler" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp #, fuzzy @@ -24825,9 +24523,8 @@ msgid "Secret" msgstr "" #: scene/gui/line_edit.cpp -#, fuzzy msgid "Secret Character" -msgstr "Geçerli karakterler:" +msgstr "Gizli Karakter" #: scene/gui/line_edit.cpp msgid "Expand To Text Length" @@ -24884,16 +24581,15 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "Karet" +msgstr "İmleç" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Blink Speed" -msgstr "Hız:" +msgstr "Yanıp Sönme Hızı" #: scene/gui/link_button.cpp msgid "Underline" @@ -24980,9 +24676,8 @@ msgid "Allow Search" msgstr "Ara" #: scene/gui/progress_bar.cpp -#, fuzzy msgid "Percent" -msgstr "Yakın zamanda:" +msgstr "Yüzde" #: scene/gui/range.cpp msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." @@ -24999,9 +24694,8 @@ msgid "Max Value" msgstr "DeÄŸer" #: scene/gui/range.cpp -#, fuzzy msgid "Page" -msgstr "Sayfa: " +msgstr "Sayfa" #: scene/gui/range.cpp #, fuzzy @@ -25042,9 +24736,8 @@ msgid "Absolute Index" msgstr "Kendinden Girintili" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Elapsed Time" -msgstr "Süreleri Karıştır:" +msgstr "Geçen Süre" #: scene/gui/rich_text_effect.cpp #, fuzzy @@ -25052,9 +24745,8 @@ msgid "Env" msgstr "BitiÅŸ" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Character" -msgstr "Geçerli karakterler:" +msgstr "Karakter" #: scene/gui/rich_text_label.cpp msgid "BBCode" @@ -25065,9 +24757,8 @@ msgid "Meta Underlined" msgstr "" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Tab Size" -msgstr "Boyut:" +msgstr "Sekme Boyutu" #: scene/gui/rich_text_label.cpp #, fuzzy @@ -25143,17 +24834,15 @@ msgstr "Renk Seç" #: scene/gui/slider.cpp #, fuzzy msgid "Ticks On Borders" -msgstr "Klasör yeniden adlandırma:" +msgstr "Kenarlar Üzerindeki İşaretler" #: scene/gui/spin_box.cpp -#, fuzzy msgid "Prefix" -msgstr "Ön Ek:" +msgstr "Ön Ek" #: scene/gui/spin_box.cpp -#, fuzzy msgid "Suffix" -msgstr "Son Ek (Suffix) :" +msgstr "Son Ek" #: scene/gui/split_container.cpp #, fuzzy @@ -25175,9 +24864,8 @@ msgid "Tab Align" msgstr "" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp -#, fuzzy msgid "Current Tab" -msgstr "Geçerli:" +msgstr "Geçerli Sekme" #: scene/gui/tab_container.cpp #, fuzzy @@ -25189,9 +24877,8 @@ msgid "All Tabs In Front" msgstr "" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp -#, fuzzy msgid "Drag To Rearrange Enabled" -msgstr "Düzenlemek için Sürükle-Bırak." +msgstr "Sürükleyerek Yeniden Düzenleme AktifleÅŸtirildi" #: scene/gui/tab_container.cpp msgid "Use Hidden Tabs For Min Size" @@ -25240,19 +24927,17 @@ msgid "Wrap Enabled" msgstr "Etkin" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Scroll Vertical" -msgstr "Dikey:" +msgstr "Dikey Kaydırma" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Scroll Horizontal" -msgstr "Yatay:" +msgstr "Yatay Kaydırma" #: scene/gui/text_edit.cpp #, fuzzy msgid "Draw" -msgstr "Çizim ÇaÄŸrıları:" +msgstr "Çiz" #: scene/gui/text_edit.cpp #, fuzzy @@ -25312,7 +24997,7 @@ msgstr "" #: scene/gui/texture_progress.cpp #, fuzzy msgid "Fill Mode" -msgstr "Oynatma Modu:" +msgstr "Doldurma Modu" #: scene/gui/texture_progress.cpp scene/resources/material.cpp msgid "Tint" @@ -25328,9 +25013,8 @@ msgid "Initial Angle" msgstr "EtkinleÅŸtir" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Fill Degrees" -msgstr "%s Düzey Dönüyor." +msgstr "Dolgu AÅŸamaları" #: scene/gui/texture_progress.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -25381,9 +25065,8 @@ msgid "Hide Folding" msgstr "Pasif Düğme" #: scene/gui/tree.cpp -#, fuzzy msgid "Hide Root" -msgstr "Kök Düğüm OluÅŸtur:" +msgstr "Kökü Gizle" #: scene/gui/tree.cpp msgid "Drop Mode Flags" @@ -25437,9 +25120,8 @@ msgid "Max Redirects" msgstr "" #: scene/main/http_request.cpp -#, fuzzy msgid "Timeout" -msgstr "Zaman aşımı." +msgstr "Zaman Aşımı" #: scene/main/node.cpp msgid "" @@ -25567,9 +25249,8 @@ msgid "Draw 2D Outlines" msgstr "Anahat OluÅŸtur" #: scene/main/scene_tree.cpp servers/visual_server.cpp -#, fuzzy msgid "Reflections" -msgstr "Yönler" +msgstr "Yansımalar" #: scene/main/scene_tree.cpp #, fuzzy @@ -25631,9 +25312,8 @@ msgstr "" "döngüsünü kullanmayı tercih edin." #: scene/main/timer.cpp -#, fuzzy msgid "Autostart" -msgstr "KendiliÄŸinden Yeniden BaÅŸlat:" +msgstr "Otomatik baÅŸlatma" #: scene/main/viewport.cpp #, fuzzy @@ -25961,9 +25641,8 @@ msgid "On Disabled" msgstr "Pasif Öge" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Off" -msgstr "Kaydırma:" +msgstr "Kapat" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26046,9 +25725,8 @@ msgid "Space" msgstr "Ana Sahne" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folded" -msgstr "Dosya:" +msgstr "Katlanmış" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26207,9 +25885,8 @@ msgid "Labeled Separator Right" msgstr "İsimli Ayraç" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Separator" -msgstr "Renk operatörü." +msgstr "Yazı Tipi Ayracı" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26217,9 +25894,8 @@ msgid "Font Color Accel" msgstr "Renk Öğesini Yeniden Adlandır" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Separator" -msgstr "Renk operatörü." +msgstr "Yazı Tipi Rengi Ayracı" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26389,14 +26065,12 @@ msgid "Draw Guides" msgstr "Kılavuz çizgilerini göster" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Border" -msgstr "Dikey:" +msgstr "Kaydırma Kenarlığı" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Speed" -msgstr "Izgarayı Kaydır:" +msgstr "Kaydırma Hızı" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26466,9 +26140,8 @@ msgid "Large" msgstr "Hedef" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folder" -msgstr "Dosya:" +msgstr "Klasör" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26506,9 +26179,8 @@ msgid "Label Width" msgstr "Soldan Görünüm" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Screen Picker" -msgstr "Screen Etkisi operatörü." +msgstr "Ekran Seçici" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26671,7 +26343,7 @@ msgstr "Yola Odaklan" #: scene/resources/dynamic_font.cpp #, fuzzy msgid "Outline Size" -msgstr "Kontur Boyutu:" +msgstr "Kontur Boyutu" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -26684,14 +26356,12 @@ msgid "Use Mipmaps" msgstr "sinyaller" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Extra Spacing" -msgstr "İlave Seçenekler:" +msgstr "Ekstra BoÅŸluk" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Char" -msgstr "Geçerli karakterler:" +msgstr "karakter" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -26722,9 +26392,8 @@ msgid "Sky Rotation" msgstr "Dönme Adımı:" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Rotation Degrees" -msgstr "%s Düzey Dönüyor." +msgstr "Gökyüzü Dönüş Açıları" #: scene/resources/environment.cpp msgid "Canvas Max Layer" @@ -26749,14 +26418,13 @@ msgid "Fog" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Sun Color" -msgstr "Dosya Depolama:" +msgstr "GüneÅŸ Rengi" #: scene/resources/environment.cpp #, fuzzy msgid "Sun Amount" -msgstr "DeÄŸer:" +msgstr "GüneÅŸ Miktarı" #: scene/resources/environment.cpp #, fuzzy @@ -26845,14 +26513,13 @@ msgid "Max Steps" msgstr "Adım" #: scene/resources/environment.cpp -#, fuzzy msgid "Fade In" -msgstr "Açılma (sn):" +msgstr "Solma" #: scene/resources/environment.cpp #, fuzzy msgid "Fade Out" -msgstr "Karartma (sn):" +msgstr "Kararma" #: scene/resources/environment.cpp #, fuzzy @@ -26870,7 +26537,7 @@ msgstr "" #: scene/resources/environment.cpp #, fuzzy msgid "Radius 2" -msgstr "Yarıçap:" +msgstr "Yarıçap 2" #: scene/resources/environment.cpp msgid "Intensity 2" @@ -26899,14 +26566,12 @@ msgid "DOF Far Blur" msgstr "" #: scene/resources/environment.cpp scene/resources/material.cpp -#, fuzzy msgid "Distance" -msgstr "Uzaklık Seç:" +msgstr "Mesafe" #: scene/resources/environment.cpp -#, fuzzy msgid "Transition" -msgstr "GeçiÅŸ: " +msgstr "GeçiÅŸ" #: scene/resources/environment.cpp msgid "DOF Near Blur" @@ -26984,14 +26649,12 @@ msgid "Brightness" msgstr "Işık" #: scene/resources/environment.cpp -#, fuzzy msgid "Saturation" -msgstr "Ayrım:" +msgstr "Doygunluk" #: scene/resources/environment.cpp -#, fuzzy msgid "Color Correction" -msgstr "Renk iÅŸlevi." +msgstr "Renk Düzeltme" #: scene/resources/font.cpp #, fuzzy @@ -27073,9 +26736,8 @@ msgid "Disable Ambient Light" msgstr "SaÄŸa Girintile" #: scene/resources/material.cpp -#, fuzzy msgid "Ensure Correct Normals" -msgstr "Dönüşüm Durduruldu." +msgstr "DoÄŸru Normalleri SaÄŸla" #: scene/resources/material.cpp msgid "Albedo Tex MSDF" @@ -27095,9 +26757,8 @@ msgid "Is sRGB" msgstr "" #: scene/resources/material.cpp servers/visual_server.cpp -#, fuzzy msgid "Parameters" -msgstr "Parametre DeÄŸiÅŸtirildi:" +msgstr "Parametreler" #: scene/resources/material.cpp #, fuzzy @@ -27139,9 +26800,8 @@ msgid "Grow" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Grow Amount" -msgstr "DeÄŸer:" +msgstr "Büyüme Miktarı" #: scene/resources/material.cpp msgid "Use Alpha Scissor" @@ -27244,7 +26904,7 @@ msgstr "" #: scene/resources/material.cpp #, fuzzy msgid "Transmission" -msgstr "GeçiÅŸ: " +msgstr "Aktarma" #: scene/resources/material.cpp #, fuzzy @@ -27312,14 +26972,12 @@ msgid "NavMesh Transform" msgstr "Dönüşümü Temizle" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Color Format" -msgstr "Renk operatörü." +msgstr "Renk Biçimi" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Transform Format" -msgstr "Dönüşüm Durduruldu." +msgstr "Dönüşüm Biçimi" #: scene/resources/multimesh.cpp msgid "Custom Data Format" @@ -27335,9 +26993,8 @@ msgid "Visible Instance Count" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sampling" -msgstr "Ölçekleniyor: " +msgstr "Örnekleme" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27345,9 +27002,8 @@ msgid "Partition Type" msgstr "DeÄŸiÅŸken Tipini Ayarla" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Parsed Geometry Type" -msgstr "Geometri Ayrıştırılıyor..." +msgstr "ÇözümlenmiÅŸ Geometri Tipi" #: scene/resources/navigation_mesh.cpp msgid "Source Geometry Mode" @@ -27363,9 +27019,8 @@ msgid "Cells" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Agents" -msgstr "Ana Sahne DeÄŸiÅŸtirgenleri:" +msgstr "Ajanlar" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" @@ -27404,9 +27059,8 @@ msgid "Details" msgstr "Varsayılanı Göster" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sample Distance" -msgstr "Uzaklık Seç:" +msgstr "Örnek Mesafe" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27437,7 +27091,7 @@ msgstr "Kaydırma:" #: scene/resources/occluder_shape.cpp msgid "Spheres" -msgstr "" +msgstr "Küreler" #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" @@ -27477,14 +27131,12 @@ msgid "Color Modifier" msgstr "Serbest Bakış Hız DeÄŸiÅŸtirici" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Point Texture" -msgstr "Emisyon Noktaları:" +msgstr "Nokta Dokusu" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Normal Texture" -msgstr "Emisyon Kaynağı: " +msgstr "Normal Doku" #: scene/resources/particles_material.cpp #, fuzzy @@ -27497,9 +27149,8 @@ msgid "Point Count" msgstr "GiriÅŸ Portu Ekle" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Scale Random" -msgstr "Ölçek Oranı:" +msgstr "Rastgele Ölçeklendir" #: scene/resources/particles_material.cpp #, fuzzy @@ -27515,9 +27166,8 @@ msgid "Absorbent" msgstr "" #: scene/resources/plane_shape.cpp -#, fuzzy msgid "Plane" -msgstr "Sekme:" +msgstr "Uçak" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -27541,9 +27191,8 @@ msgid "Subdivide Depth" msgstr "" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Top Radius" -msgstr "Yarıçap:" +msgstr "Üst Yarıçap" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -27556,8 +27205,9 @@ msgid "Left To Right" msgstr "SaÄŸ Üst" #: scene/resources/primitive_meshes.cpp +#, fuzzy msgid "Is Hemisphere" -msgstr "" +msgstr "Yarım Küre Mi" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -27606,9 +27256,8 @@ msgid "Top Color" msgstr "Sonraki Zemin" #: scene/resources/sky.cpp -#, fuzzy msgid "Horizon Color" -msgstr "Dosya Depolama:" +msgstr "Horizon Renk" #: scene/resources/sky.cpp #, fuzzy @@ -27688,9 +27337,8 @@ msgid "Base Texture" msgstr "Dokuyu Kaldır" #: scene/resources/texture.cpp -#, fuzzy msgid "Image Size" -msgstr "Sayfa: " +msgstr "Görüntü Boyutu" #: scene/resources/texture.cpp #, fuzzy @@ -27718,9 +27366,8 @@ msgid "Lossy Storage Quality" msgstr "Yakala" #: scene/resources/texture.cpp -#, fuzzy msgid "From" -msgstr "Oynatma Modu:" +msgstr "Kimden" #: scene/resources/texture.cpp #, fuzzy @@ -27890,7 +27537,7 @@ msgstr "Deneme" #: scene/resources/world.cpp scene/resources/world_2d.cpp #, fuzzy msgid "Default Edge Connection Margin" -msgstr "BaÄŸlantıyı Düzenle:" +msgstr "Varsayılan Kenar BaÄŸlantı Marjı" #: scene/resources/world_2d.cpp msgid "Canvas" @@ -28076,7 +27723,7 @@ msgstr "" #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp #, fuzzy msgid "FFT Size" -msgstr "Boyut:" +msgstr "FFT Boyutu" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Predelay" @@ -28104,9 +27751,8 @@ msgid "Pan Pullout" msgstr "" #: servers/audio/effects/audio_effect_stereo_enhance.cpp -#, fuzzy msgid "Time Pullout (ms)" -msgstr "Zaman aşımı." +msgstr "Zaman Çıkışı (ms)" #: servers/audio/effects/audio_effect_stereo_enhance.cpp msgid "Surround" @@ -28292,9 +27938,8 @@ msgid "Constants cannot be modified." msgstr "Sabit deÄŸerler deÄŸiÅŸtirilemez." #: servers/visual/visual_server_scene.cpp -#, fuzzy msgid "Spatial Partitioning" -msgstr "Bölümleniyor..." +msgstr "Uzaysal Ayırma" #: servers/visual_server.cpp #, fuzzy @@ -28458,7 +28103,7 @@ msgstr "Ara DeÄŸerleme Kipi" #: servers/visual_server.cpp #, fuzzy msgid "OpenGL" -msgstr "Aç" +msgstr "OpenGL" #: servers/visual_server.cpp msgid "Batching Send Null" @@ -28467,7 +28112,7 @@ msgstr "" #: servers/visual_server.cpp #, fuzzy msgid "Batching Stream" -msgstr "Tümden Yeniden Adlandır" +msgstr "Yığınlama Akışı" #: servers/visual_server.cpp msgid "Legacy Orphan Buffers" @@ -28482,13 +28127,14 @@ msgid "Batching" msgstr "Yığınlama" #: servers/visual_server.cpp +#, fuzzy msgid "Use Batching" -msgstr "" +msgstr "Yığınlama Kullan" #: servers/visual_server.cpp #, fuzzy msgid "Use Batching In Editor" -msgstr "Editörün güncellenmesi" +msgstr "Editörde Yığınlama Kullan" #: servers/visual_server.cpp msgid "Single Rect Fallback" @@ -28507,13 +28153,13 @@ msgid "Scissor Area Threshold" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Max Join Items" -msgstr "Öğeleri Yönet..." +msgstr "Maksimum BirleÅŸen Maddeler" #: servers/visual_server.cpp +#, fuzzy msgid "Batch Buffer Size" -msgstr "" +msgstr "Yığınlama Arabellek Boyutu" #: servers/visual_server.cpp msgid "Item Reordering Lookahead" @@ -28526,7 +28172,7 @@ msgstr "" #: servers/visual_server.cpp #, fuzzy msgid "Diagnose Frame" -msgstr "Çerçeveyi Yapıştır" +msgstr "Kareyi Tespit Et" #: servers/visual_server.cpp msgid "GLES2" @@ -28586,7 +28232,7 @@ msgstr "Emilme Ayırmayı Görüntüle" #: servers/visual_server.cpp msgid "Max Active Spheres" -msgstr "Maks. Aktif Küre Sayısı" +msgstr "Maksimum Aktif Küre Sayısı" #: servers/visual_server.cpp msgid "Max Active Polygons" @@ -28598,8 +28244,9 @@ msgid "Shader Compilation Mode" msgstr "Ara DeÄŸerleme Kipi" #: servers/visual_server.cpp +#, fuzzy msgid "Max Simultaneous Compiles" -msgstr "" +msgstr "Maksimum EÅŸzamanlı Derleme" #: servers/visual_server.cpp msgid "Log Active Async Compiles Count" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index d87aa168d7..fe0bc96c04 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -11,7 +11,7 @@ # ОлекÑандр Пилипчук <pilipchukap@rambler.ru>, 2018. # Kirill Omelchenko <kirill.omelchenko@gmail.com>, 2018. # ÐлекÑандр <ol-vin@mail.ru>, 2018. -# Богдан Матвіїв <bomtvv@gmail.com>, 2019. +# Богдан Матвіїв <bomtvv@gmail.com>, 2019, 2022. # Tymofij Lytvynenko <till.svit@gmail.com>, 2020, 2021. # Vladislav Glinsky <cl0ne@mithril.org.ua>, 2020. # Микола Тимошенко <9081@ukr.net>, 2020. @@ -29,7 +29,7 @@ msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-26 01:55+0000\n" +"PO-Revision-Date: 2022-08-25 13:04+0000\n" "Last-Translator: Artem <artem@molotov.work>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" @@ -412,9 +412,8 @@ msgid "Command" msgstr "Команда" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (фізичний)" +msgstr "Фізичний" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -469,7 +468,7 @@ msgstr "ТиÑк" #: core/os/input_event.cpp #, fuzzy msgid "Pen Inverted" -msgstr "Інвертувати" +msgstr "Перо перевернуте" #: core/os/input_event.cpp msgid "Relative" @@ -2757,9 +2756,8 @@ msgid "Project export for platform:" msgstr "ЕкÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð¸:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Завершено з помилками." +msgstr "Завершено з попередженнÑми." #: editor/editor_export.cpp msgid "Completed successfully." @@ -4492,6 +4490,7 @@ msgstr "Різні проєктні або Ñценографічні інÑтр #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Проєкт" @@ -4635,7 +4634,7 @@ msgid "" msgstr "" "Якщо цей параметр увімкнено, будь-Ñкі зміни, внеÑені у Ñцену в редакторі, " "будуть відтворені у запущеному проєкті.\n" -"При віддаленому викориÑтанні на приÑтрої, це більш ефективно з мережевою " +"При віддаленому викориÑтанні на приÑтрої, це ефективніше з мережевою " "файловою ÑиÑтемою." #: editor/editor_node.cpp @@ -4651,7 +4650,7 @@ msgid "" msgstr "" "Якщо цей параметр увімкнено, будь-Ñкий Ñкрипт, Ñкий буде збережено, буде " "перезавантажено у запущеному проєкті.\n" -"При віддаленому викориÑтанні на приÑтрої, це більш ефективно з мережевою " +"При віддаленому викориÑтанні на приÑтрої, це ефективніше з мережевою " "файловою ÑиÑтемою." #: editor/editor_node.cpp @@ -5499,11 +5498,12 @@ msgstr "Додаткові кнопки миші Ð´Ð»Ñ Ð½Ð°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ñ— Ð¶ÑƒÑ #: editor/editor_settings.cpp #, fuzzy msgid "Drag And Drop Selection" -msgstr "Вибір GridMap" +msgstr "ПеретÑгніть виділеннÑ" #: editor/editor_settings.cpp +#, fuzzy msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "ЗалишитиÑÑ Ð² редакторі Ñкриптів на вибраному вузлі" #: editor/editor_settings.cpp msgid "Appearance" @@ -7269,7 +7269,8 @@ msgid "8 Bit" msgstr "8-бітова" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Моно" @@ -9366,7 +9367,7 @@ msgstr "ПлаÑкий 0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "Площина 1" +msgstr "ПлоÑкий 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -11618,9 +11619,8 @@ msgid "New Animation" msgstr "Ðова анімаціÑ" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Фільтрувати методи" +msgstr "Фільтрувати анімації" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -15270,16 +15270,19 @@ msgstr "" msgid "Make Local" msgstr "Зробити локальним" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "Цю унікальну назву у Ñцені вже викориÑтано іншим вузлом." - #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +#, fuzzy +msgid "Enable Scene Unique Name(s)" msgstr "Увімкнути унікальну назву Ñцени" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Unique names already used by another node in the scene:" +msgstr "Цю унікальну назву у Ñцені вже викориÑтано іншим вузлом." + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Вимкнути унікальна назва Ñцени" #: editor/scene_tree_dock.cpp @@ -15480,6 +15483,10 @@ msgid "Button Group" msgstr "Група кнопок" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "Вимкнути унікальна назва Ñцени" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(Джерело з'єднаннÑ)" @@ -15558,6 +15565,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Ðекоректна назва вузла. Ðе можна викориÑтовувати такі Ñимволи:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "Цю унікальну назву у Ñцені вже викориÑтано іншим вузлом." + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Перейменувати вузол" @@ -16837,12 +16848,14 @@ msgid "Sparse Indices Component Type" msgstr "Тип компонентів індекÑів розÑіюваннÑ" #: modules/gltf/gltf_accessor.cpp +#, fuzzy msgid "Sparse Values Buffer View" -msgstr "" +msgstr "Буферне Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·Ñ€Ñ–Ð´Ð¶ÐµÐ½Ð¸Ñ… значень" #: modules/gltf/gltf_accessor.cpp +#, fuzzy msgid "Sparse Values Byte Offset" -msgstr "" +msgstr "Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð±Ð°Ð¹Ñ‚Ñ–Ð² розріджених значень" #: modules/gltf/gltf_buffer_view.cpp msgid "Buffer" @@ -16854,7 +16867,7 @@ msgstr "Байтова довжина" #: modules/gltf/gltf_buffer_view.cpp msgid "Byte Stride" -msgstr "" +msgstr "Байтовий крок" #: modules/gltf/gltf_buffer_view.cpp msgid "Indices" @@ -16953,8 +16966,9 @@ msgid "Joints Original" msgstr "Початок з'єднаннÑ" #: modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Inverse Binds" -msgstr "" +msgstr "Зворотні зв'Ñзки" #: modules/gltf/gltf_skin.cpp msgid "Non Joints" @@ -17340,6 +17354,21 @@ msgstr "Зібрати рішеннÑ" msgid "Auto Update Project" msgstr "Проєкт без назви" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Показана назва" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Виберіть каталог" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Виберіть каталог" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Кінець траÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтека Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ виключеннÑ" @@ -19132,6 +19161,11 @@ msgstr "Ðетиповий колір тла" msgid "Custom BG Color" msgstr "Ðетиповий колір тла" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "ЕкÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–ÐºÑ‚Ð¾Ð³Ñ€Ð°Ð¼Ð¸" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19984,6 +20018,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Ðекоректна Ñкорочена назва пакунка." @@ -20218,7 +20258,7 @@ msgstr "" #: platform/windows/export/export.cpp msgid "Windows" -msgstr "Вікна" +msgstr "Windows" #: platform/windows/export/export.cpp msgid "Rcedit" @@ -25748,7 +25788,7 @@ msgstr "7" #: scene/resources/environment.cpp msgid "Bloom" -msgstr "ЦвітіннÑ" +msgstr "СвітіннÑ" #: scene/resources/environment.cpp msgid "HDR Threshold" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index a428250cc7..d09218a600 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -4449,6 +4449,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "" @@ -7232,7 +7233,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15193,18 +15195,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "ریموٹ " -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "ریموٹ " #: editor/scene_tree_dock.cpp @@ -15404,6 +15406,11 @@ msgstr "" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "ریموٹ " + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr ".تمام کا انتخاب" @@ -15468,6 +15475,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -17334,6 +17345,20 @@ msgstr ".تمام کا انتخاب" msgid "Auto Update Project" msgstr ".تمام کا انتخاب" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "ایکشن منتقل کریں" + +#: modules/mono/godotsharp_dirs.cpp +msgid "Solution Directory" +msgstr "" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "سب سکریپشن بنائیں" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19109,6 +19134,11 @@ msgstr "ایکشن منتقل کریں" msgid "Custom BG Color" msgstr "ایکشن منتقل کریں" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr ".سپورٹ" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19931,6 +19961,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 0a6885872f..2a0fadcf9f 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -21,13 +21,14 @@ # IoeCmcomc <hopdaigia2004@gmail.com>, 2021, 2022. # Hung <hungthitkhia@gmail.com>, 2021. # PaweÅ‚ Fertyk <pfertyk@pfertyk.me>, 2022. +# MInhTriet <luckyblockblack@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-05-10 13:14+0000\n" -"Last-Translator: PaweÅ‚ Fertyk <pfertyk@pfertyk.me>\n" +"PO-Revision-Date: 2022-08-17 18:20+0000\n" +"Last-Translator: MInhTriet <luckyblockblack@gmail.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot/vi/>\n" "Language: vi\n" @@ -35,44 +36,44 @@ 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.12.1\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "" +msgstr "Trình Ä‘iá»u khiển mà n hình" #: core/bind/core_bind.cpp msgid "Clipboard" -msgstr "Bảng tạm" +msgstr "Bá»™ nhá»› tạm" #: core/bind/core_bind.cpp msgid "Current Screen" -msgstr "Mà n hình hiện tại" +msgstr "Mà n hình hiện có" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "Mã thoát" +msgstr "Mã lá»—i" #: core/bind/core_bind.cpp msgid "V-Sync Enabled" -msgstr "Sá» dụng V-Sync" +msgstr "V-sync Enabled" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "V-Sync thông qua Compositor" #: core/bind/core_bind.cpp main/main.cpp +#, fuzzy msgid "Delta Smoothing" -msgstr "Là m mượt delta" +msgstr "Delta smoothing" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode" -msgstr "Chế độ Di chuyển" +msgstr "Chế độ tiết kiệm cá»§a bá»™ vi xá» lý" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "" +msgstr "Chế độ tiết kiệm năng lượng bá»™ vi xá» lý (tÃnh bằng µsec)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" @@ -80,11 +81,11 @@ msgstr "Giữ mà n hình mở" #: core/bind/core_bind.cpp msgid "Min Window Size" -msgstr "Cỡ cá»a sổ tối thiểu" +msgstr "KÃnh cỡ nhá» nhất cá»§a mà n hình" #: core/bind/core_bind.cpp msgid "Max Window Size" -msgstr "Cỡ cá»a sổ tối Ä‘a" +msgstr "KÃch cỡ tối Ä‘a cá»§a mà n hình" #: core/bind/core_bind.cpp msgid "Screen Orientation" @@ -97,11 +98,11 @@ msgstr "Cá»a sổ" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Borderless" -msgstr "Trà n viá»n" +msgstr "Không có viá»n cá»a sổ" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "Báºt độ trong suốt má»—i Ä‘iểm ảnh" +msgstr "Chế độ trong suốt từng pixel đã được báºt" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Fullscreen" @@ -109,11 +110,11 @@ msgstr "Toà n mà n hình" #: core/bind/core_bind.cpp msgid "Maximized" -msgstr "Äã cá»±c đại hoá" +msgstr "Äã phóng to" #: core/bind/core_bind.cpp msgid "Minimized" -msgstr "Äã cá»±c tiểu hoá" +msgstr "Äã thu nhá»" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp @@ -142,7 +143,7 @@ msgstr "KÃch thước" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "" +msgstr "Hoán đổi endian" #: core/bind/core_bind.cpp msgid "Editor Hint" @@ -158,7 +159,7 @@ msgstr "Số lần lặp má»—i giây" #: core/bind/core_bind.cpp msgid "Target FPS" -msgstr "FPS mục tiêu:" +msgstr "FPS cần đạt tá»›i" #: core/bind/core_bind.cpp #, fuzzy @@ -4516,6 +4517,7 @@ msgstr "Dá»± án ngoà i lá» hoặc các công cụ toà n phân cảnh." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "Dá»± Ãn" @@ -7393,7 +7395,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15491,18 +15494,19 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Tên Node:" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Unique names already used by another node in the scene:" +msgstr "Tên đã được sá» dụng bởi func/var/signal khác:" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "Tên Node:" #: editor/scene_tree_dock.cpp @@ -15705,6 +15709,11 @@ msgstr "Thêm và o Nhóm" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Tên Node:" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "Kết nối bị lá»—i" @@ -15780,6 +15789,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "Tên nút không hợp lệ, các ký tá»± sau bị cấm:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "Äổi tên nút" @@ -17713,6 +17726,21 @@ msgstr "Chá»n tất cả" msgid "Auto Update Project" msgstr "Dá»± án không tên" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "Hiển thị tất cả" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "Chá»n má»™t Thư mục" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "Chá»n má»™t Thư mục" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19579,6 +19607,11 @@ msgstr "Cắt các nút" msgid "Custom BG Color" msgstr "Cắt các nút" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "Mở rá»™ng Tất cả" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20436,6 +20469,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "Gói có tên ngắn không hợp lệ." diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index f25a372128..86a37e167f 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -89,7 +89,7 @@ msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2022-07-29 01:36+0000\n" +"PO-Revision-Date: 2022-08-25 13:04+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" @@ -2791,9 +2791,8 @@ msgid "Project export for platform:" msgstr "针对平å°å¯¼å‡ºé¡¹ç›®ï¼š" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "已完æˆï¼Œå˜åœ¨é”™è¯¯ã€‚" +msgstr "已完æˆï¼Œå˜åœ¨è¦å‘Šã€‚" #: editor/editor_export.cpp msgid "Completed successfully." @@ -4466,6 +4465,7 @@ msgstr "其他项目或全场景工具。" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "项目" @@ -7189,7 +7189,8 @@ msgid "8 Bit" msgstr "8 ä½" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -15020,16 +15021,19 @@ msgstr "" msgid "Make Local" msgstr "转为本地" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "该场景ä¸å·²æœ‰ä½¿ç”¨è¯¥å”¯ä¸€å称的节点。" - #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +#, fuzzy +msgid "Enable Scene Unique Name(s)" msgstr "å¯ç”¨åœºæ™¯å”¯ä¸€åç§°" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Unique names already used by another node in the scene:" +msgstr "该场景ä¸å·²æœ‰ä½¿ç”¨è¯¥å”¯ä¸€å称的节点。" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "ç¦ç”¨åœºæ™¯å”¯ä¸€åç§°" #: editor/scene_tree_dock.cpp @@ -15223,6 +15227,10 @@ msgid "Button Group" msgstr "按钮组" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "ç¦ç”¨åœºæ™¯å”¯ä¸€åç§°" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "ï¼ˆè¿žæŽ¥æ¥æºï¼‰" @@ -15300,6 +15308,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "节点åç§°æ— æ•ˆï¼Œä¸å…许包å«ä»¥ä¸‹å—符:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "该场景ä¸å·²æœ‰ä½¿ç”¨è¯¥å”¯ä¸€å称的节点。" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "é‡å‘½å节点" @@ -17073,6 +17085,21 @@ msgstr "构建解决方案" msgid "Auto Update Project" msgstr "自动更新项目" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "显示åç§°" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "选择目录" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "选择目录" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "å†…éƒ¨å¼‚å¸¸å †æ ˆè¿½æœ”ç»“æŸ" @@ -18773,6 +18800,11 @@ msgstr "使用自定义背景色" msgid "Custom BG Color" msgstr "自定义背景色" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "å¯¼å‡ºå›¾æ ‡" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp msgid "Prepare Templates" @@ -19557,6 +19589,12 @@ msgid "Show Name On Square 310 X 310" msgstr "åœ¨æ£æ–¹å½¢ 310×310 上显示åç§°" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "æ— æ•ˆçš„åŒ…çŸå称。" @@ -19681,21 +19719,17 @@ msgid "Could not find wine executable at \"%s\"." msgstr "æ— æ³•åœ¨â€œ%sâ€æ‰¾åˆ° wine 坿‰§è¡Œæ–‡ä»¶ã€‚" #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start rcedit executable. Configure rcedit path in the Editor " "Settings (Export > Windows > Rcedit), or disable \"Application > Modify " "Resources\" in the export preset." msgstr "" -"æ— æ³•å¯åЍ rcedit 坿‰§è¡Œæ–‡ä»¶ï¼Œè¯·åœ¨ç¼–辑器设置ä¸é…ç½® rcedit 路径(导出 > Windows " -"> Rcedit)。" +"æ— æ³•å¯åЍ rcedit 坿‰§è¡Œæ–‡ä»¶ã€‚请在编辑器设置ä¸é…ç½® rcedit 路径(导出 > Windows " +"> Rcedit),或在导出预设ä¸ç¦ç”¨â€œåº”用 > 修改资æºâ€ã€‚" #: platform/windows/export/export.cpp -#, fuzzy msgid "rcedit failed to modify executable: %s." -msgstr "" -"rcedit ä¿®æ”¹å¯æ‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š\n" -"%s" +msgstr "rcedit ä¿®æ”¹å¯æ‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š%s。" #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -19714,21 +19748,17 @@ msgid "Invalid timestamp server." msgstr "时间戳æœåŠ¡å™¨æ— æ•ˆã€‚" #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start signtool executable. Configure signtool path in the Editor " "Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " "export preset." msgstr "" -"æ— æ³•å¯åЍ signtool 坿‰§è¡Œæ–‡ä»¶ï¼Œè¯·åœ¨ç¼–辑器设置ä¸é…ç½® signtool 路径(导出 > " -"Windows > Signtool)。" +"æ— æ³•å¯åЍ signtool 坿‰§è¡Œæ–‡ä»¶ã€‚请在编辑器设置ä¸é…ç½® signtool 路径(导出 > " +"Windows > Signtool),或在导出预设ä¸ç¦ç”¨â€œä»£ç ç¾åâ€ã€‚" #: platform/windows/export/export.cpp -#, fuzzy msgid "Signtool failed to sign executable: %s." -msgstr "" -"Signtool ç¾å坿‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š\n" -"%s" +msgstr "Signtool ç¾å坿‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š%s。" #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." @@ -21505,7 +21535,7 @@ msgstr "ConcavePolygonShape åªæ”¯æŒé™æ€æ¨¡å¼ä¸‹çš„ RigidBody。" #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." -msgstr "æ— ç‰©å¯è§ï¼Œå› ä¸ºæ²¡æœ‰æŒ‡å®šç½‘æ ¼ã€‚" +msgstr "æœªæŒ‡å®šç½‘æ ¼ï¼Œæ— å¯è§å†…容。" #: scene/3d/cpu_particles.cpp msgid "" @@ -23470,7 +23500,7 @@ msgstr "最å°å€¼" #: scene/gui/range.cpp scene/resources/curve.cpp msgid "Max Value" -msgstr "最大之" +msgstr "最大值" #: scene/gui/range.cpp msgid "Page" @@ -23486,11 +23516,11 @@ msgstr "èˆå…¥" #: scene/gui/range.cpp msgid "Allow Greater" -msgstr "å…许更多" +msgstr "å…许更大" #: scene/gui/range.cpp msgid "Allow Lesser" -msgstr "å…许更少" +msgstr "å…许更å°" #: scene/gui/reference_rect.cpp msgid "Border Color" @@ -25296,11 +25326,11 @@ msgstr "公告æ¿ä¿æŒç¼©æ”¾" #: scene/resources/material.cpp msgid "Grow" -msgstr "å‘å…‰" +msgstr "生长" #: scene/resources/material.cpp msgid "Grow Amount" -msgstr "å‘å…‰é‡" +msgstr "生长é‡" #: scene/resources/material.cpp msgid "Use Alpha Scissor" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 79760d0de7..f8529ea3ca 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -4,13 +4,14 @@ # This file is distributed under the same license as the Godot source code. # Wesley (zx-wt) <ZX_WT@ymail.com>, 2016-2017, 2020. # cnieFIT <dtotncq@gmail.com>, 2019. +# Peppa Pig <hansongming88@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-05-01 11:43+0000\n" -"Last-Translator: zx-wt <ZX_WT@ymail.com>\n" +"PO-Revision-Date: 2022-08-23 03:39+0000\n" +"Last-Translator: Peppa Pig <hansongming88@gmail.com>\n" "Language-Team: Chinese (Traditional, Hong Kong) <https://hosted.weblate.org/" "projects/godot-engine/godot/zh_Hant_HK/>\n" "Language: zh_HK\n" @@ -18,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.0.2\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -36,7 +37,7 @@ msgstr "未儲å˜ç•¶å‰å ´æ™¯ã€‚ä»è¦é–‹å•Ÿï¼Ÿ" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "退出ç " #: core/bind/core_bind.cpp #, fuzzy @@ -4660,6 +4661,7 @@ msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "專案" @@ -7583,7 +7585,8 @@ msgid "8 Bit" msgstr "" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "" @@ -15840,18 +15843,18 @@ msgstr "" msgid "Make Local" msgstr "" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "" - #: editor/scene_tree_dock.cpp #, fuzzy -msgid "Enable Scene Unique Name" +msgid "Enable Scene Unique Name(s)" msgstr "Nodeå稱" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +#: editor/scene_tree_dock.cpp +msgid "Unique names already used by another node in the scene:" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy -msgid "Disable Scene Unique Name" +msgid "Disable Scene Unique Name(s)" msgstr "Nodeå稱" #: editor/scene_tree_dock.cpp @@ -16061,6 +16064,11 @@ msgstr "按éµ" #: editor/scene_tree_editor.cpp #, fuzzy +msgid "Disable Scene Unique Name" +msgstr "Nodeå稱" + +#: editor/scene_tree_editor.cpp +#, fuzzy msgid "(Connecting From)" msgstr "連到..." @@ -16125,6 +16133,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "" @@ -18052,6 +18064,21 @@ msgstr "所有é¸é …" msgid "Auto Update Project" msgstr "專案" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "全部å–代" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "鏿“‡è³‡æ–™å¤¾" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "鏿“‡è³‡æ–™å¤¾" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -19877,6 +19904,11 @@ msgstr "貼上" msgid "Custom BG Color" msgstr "貼上" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "全部展開" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -20725,6 +20757,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp #, fuzzy msgid "Invalid package short name." msgstr "無效å稱" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 8ad86d4b2a..994c49156e 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -36,13 +36,14 @@ # è˜è˜ <rrt467778@gmail.com>, 2022. # marktwtn <marktwtn@gmail.com>, 2022. # Shi-Xun Hong <jimmy3421@gmail.com>, 2022. +# Hugel <qihu@nfschina.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-31 18:34+0000\n" -"Last-Translator: BinotaLIU <me@binota.org>\n" +"PO-Revision-Date: 2022-09-07 06:16+0000\n" +"Last-Translator: Chia-Hsiang Cheng <cche0109@student.monash.edu>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -50,7 +51,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.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -2743,9 +2744,8 @@ msgid "Project export for platform:" msgstr "專案匯出平å°ï¼š" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "已完æˆï¼Œå˜åœ¨éŒ¯èª¤ã€‚" +msgstr "完æˆä¸¦å¸¶æœ‰è¦å‘Šã€‚" #: editor/editor_export.cpp msgid "Completed successfully." @@ -4147,7 +4147,7 @@ msgstr "刪除é…ç½®" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "é è¨" +msgstr "默èª" #: editor/editor_node.cpp editor/editor_resource_picker.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp @@ -4420,6 +4420,7 @@ msgstr "å…¶ä»–å°ˆæ¡ˆæˆ–å…¨å ´æ™¯å…±é€šå·¥å…·ã€‚" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp modules/mono/editor/csharp_project.cpp +#: modules/mono/godotsharp_dirs.cpp msgid "Project" msgstr "專案" @@ -7142,7 +7143,8 @@ msgid "8 Bit" msgstr "8ä½å…ƒçµ„" #: editor/import/resource_importer_wav.cpp main/main.cpp -#: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp +#: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp +#: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" msgstr "Mono" @@ -14973,16 +14975,19 @@ msgstr "" msgid "Make Local" msgstr "轉為本地" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Another node already uses this unique name in the scene." -msgstr "å¦ä¸€å€‹ç¯€é»žå·²åœ¨è©²å ´æ™¯ä¸ä½¿ç”¨äº†é€™å€‹ä¸å¯é‡è¤‡çš„å稱。" - #: editor/scene_tree_dock.cpp -msgid "Enable Scene Unique Name" +#, fuzzy +msgid "Enable Scene Unique Name(s)" msgstr "å•Ÿç”¨å ´æ™¯ç¨ç«‹å稱" -#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -msgid "Disable Scene Unique Name" +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Unique names already used by another node in the scene:" +msgstr "å¦ä¸€å€‹ç¯€é»žå·²åœ¨è©²å ´æ™¯ä¸ä½¿ç”¨äº†é€™å€‹ä¸å¯é‡è¤‡çš„å稱。" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Disable Scene Unique Name(s)" msgstr "åœç”¨å ´æ™¯ç¨ç«‹å稱" #: editor/scene_tree_dock.cpp @@ -15176,6 +15181,10 @@ msgid "Button Group" msgstr "按éµåˆ†çµ„" #: editor/scene_tree_editor.cpp +msgid "Disable Scene Unique Name" +msgstr "åœç”¨å ´æ™¯ç¨ç«‹å稱" + +#: editor/scene_tree_editor.cpp msgid "(Connecting From)" msgstr "(連接自)" @@ -15253,6 +15262,10 @@ msgid "Invalid node name, the following characters are not allowed:" msgstr "無效的節點å稱,å稱ä¸å¯åŒ…å«ä¸‹åˆ—å—元:" #: editor/scene_tree_editor.cpp +msgid "Another node already uses this unique name in the scene." +msgstr "å¦ä¸€å€‹ç¯€é»žå·²åœ¨è©²å ´æ™¯ä¸ä½¿ç”¨äº†é€™å€‹ä¸å¯é‡è¤‡çš„å稱。" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" msgstr "釿–°å‘½å節點" @@ -15669,47 +15682,44 @@ msgid "Navigation Edge Disabled" msgstr "å·²ç¦ç”¨å°Žèˆªé‚Šç•Œ" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Solid" -msgstr "導航模å¼" +msgstr "導航實體" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Solid Disabled" -msgstr "導航模å¼" +msgstr "åœç”¨å°Žèˆªå¯¦é«”" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body A" -msgstr "" +msgstr "關節形體A" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body B" -msgstr "" +msgstr "關節形體B" #: editor/spatial_editor_gizmos.cpp msgid "Room Edge" -msgstr "" +msgstr "空間邊緣" #: editor/spatial_editor_gizmos.cpp msgid "Room Overlap" -msgstr "" +msgstr "空間é‡ç–Š" #: editor/spatial_editor_gizmos.cpp msgid "Set Room Point Position" msgstr "è¨å®šç©ºé–“控制點ä½ç½®" #: editor/spatial_editor_gizmos.cpp scene/3d/portal.cpp -#, fuzzy msgid "Portal Margin" -msgstr "è¨å®šå¤–邊è·" +msgstr "å…¥å£é‚Šè·" #: editor/spatial_editor_gizmos.cpp msgid "Portal Edge" -msgstr "" +msgstr "å…¥å£é‚Šç·£" #: editor/spatial_editor_gizmos.cpp msgid "Portal Arrow" -msgstr "" +msgstr "å…¥å£ç®é " #: editor/spatial_editor_gizmos.cpp msgid "Set Portal Point Position" @@ -15717,18 +15727,16 @@ msgstr "è¨å®šå…¥å£æŽ§åˆ¶é»žä½ç½®" #: editor/spatial_editor_gizmos.cpp msgid "Portal Front" -msgstr "" +msgstr "入壿£é¢" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Portal Back" -msgstr "上一é " +msgstr "å…¥å£èƒŒé¢" #: editor/spatial_editor_gizmos.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp -#, fuzzy msgid "Occluder" -msgstr "鮿“‹æ¨¡å¼" +msgstr "鮿“‹å™¨" #: editor/spatial_editor_gizmos.cpp msgid "Set Occluder Sphere Radius" @@ -15739,109 +15747,98 @@ msgid "Set Occluder Sphere Position" msgstr "è¨å®šé®æ“‹çƒé«”ä½ç½®" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Polygon Point Position" -msgstr "è¨å®šå…¥å£æŽ§åˆ¶é»žä½ç½®" +msgstr "è¨å®šé®æ“‹å™¨å¤šé‚Šå½¢é ‚點ä½ç½®" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Hole Point Position" -msgstr "è¨å®šæ›²ç·šæŽ§åˆ¶é»žä½ç½®" +msgstr "è¨å®šé®æ“‹å™¨ç©ºæ´žé ‚點ä½ç½®" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Front" -msgstr "建立é®å…‰å¤šé‚Šå½¢" +msgstr "鮿“‹å™¨å¤šé‚Šå½¢æ£é¢" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Back" -msgstr "建立é®å…‰å¤šé‚Šå½¢" +msgstr "鮿“‹å™¨å¤šé‚Šå½¢èƒŒé¢" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Hole" -msgstr "建立é®å…‰å¤šé‚Šå½¢" +msgstr "鮿“‹å™¨ç©ºæ´ž" #: main/main.cpp msgid "Godot Physics" -msgstr "" +msgstr "Godot 物ç†" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp msgid "Use BVH" -msgstr "" +msgstr "使用 BVH" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp -#, fuzzy msgid "BVH Collision Margin" -msgstr "碰撞模å¼" +msgstr "BVH 碰撞邊è·" #: main/main.cpp -#, fuzzy msgid "Crash Handler" -msgstr "è¨å®šè™•ç†ç¨‹å¼" +msgstr "當機處ç†å¸¸å¼" #: main/main.cpp -#, fuzzy msgid "Multithreaded Server" -msgstr "多節點組" +msgstr "多執行緒伺æœå™¨" #: main/main.cpp msgid "RID Pool Prealloc" -msgstr "" +msgstr "RID集å€é é…ç½®" #: main/main.cpp -#, fuzzy msgid "Debugger stdout" -msgstr "除錯工具" +msgstr "除錯工具標準輸出" #: main/main.cpp msgid "Max Chars Per Second" -msgstr "" +msgstr "æ¯ç§’最大å—元數" #: main/main.cpp msgid "Max Messages Per Frame" -msgstr "" +msgstr "æ¯å½±æ ¼æœ€å¤§è¨Šæ¯æ•¸" #: main/main.cpp msgid "Max Errors Per Second" -msgstr "" +msgstr "æ¯ç§’最大錯誤數" #: main/main.cpp msgid "Max Warnings Per Second" -msgstr "" +msgstr "æ¯ç§’最大è¦å‘Šæ•¸" #: main/main.cpp msgid "Flush stdout On Print" -msgstr "" +msgstr "åˆ—å°æ™‚刷新標準輸出" #: main/main.cpp servers/visual_server.cpp msgid "Logging" -msgstr "" +msgstr "記錄" #: main/main.cpp msgid "File Logging" -msgstr "" +msgstr "檔案記錄" #: main/main.cpp -#, fuzzy msgid "Enable File Logging" -msgstr "啟用æ¢ä»¶ç¯©é¸" +msgstr "啟用檔案紀錄" #: main/main.cpp -#, fuzzy msgid "Log Path" -msgstr "複製路徑" +msgstr "紀錄路徑" #: main/main.cpp msgid "Max Log Files" -msgstr "" +msgstr "最大紀錄檔案數" #: main/main.cpp msgid "Driver" -msgstr "" +msgstr "驅動程å¼" #: main/main.cpp msgid "Driver Name" @@ -15849,85 +15846,77 @@ msgstr "é©…å‹•å稱" #: main/main.cpp msgid "Fallback To GLES2" -msgstr "" +msgstr "回é™è‡³ GLES2" #: main/main.cpp msgid "Use Nvidia Rect Flicker Workaround" -msgstr "" +msgstr "使用Nvidia Recté–ƒçˆè§£æ±ºæ–¹æ³•" #: main/main.cpp msgid "DPI" -msgstr "" +msgstr "DPI" #: main/main.cpp msgid "Allow hiDPI" -msgstr "" +msgstr "å…許 hiDPI" #: main/main.cpp -#, fuzzy msgid "V-Sync" -msgstr "åŒæ¥" +msgstr "åž‚ç›´åŒæ¥" #: main/main.cpp -#, fuzzy msgid "Use V-Sync" -msgstr "使用å¸é™„" +msgstr "ä½¿ç”¨åž‚ç›´åŒæ¥" #: main/main.cpp msgid "Per Pixel Transparency" -msgstr "" +msgstr "æ¯åƒç´ 逿˜Žåº¦" #: main/main.cpp msgid "Allowed" -msgstr "" +msgstr "å…許" #: main/main.cpp msgid "Intended Usage" -msgstr "" +msgstr "é æœŸç”¨é€”" #: main/main.cpp -#, fuzzy msgid "Framebuffer Allocation" -msgstr "完整顯示所é¸" +msgstr "å½±æ ¼ç·©è¡å€åˆ†é…" #: main/main.cpp platform/uwp/os_uwp.cpp -#, fuzzy msgid "Energy Saving" -msgstr "ä¿å˜æ™‚發生錯誤" +msgstr "節能" #: main/main.cpp msgid "Threads" -msgstr "" +msgstr "執行緒" #: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h -#, fuzzy msgid "Thread Model" -msgstr "åˆ‡æ›æ¨¡å¼" +msgstr "執行緒模型" #: main/main.cpp msgid "Thread Safe BVH" -msgstr "" +msgstr "執行緒安全 BVH" #: main/main.cpp msgid "Handheld" -msgstr "" +msgstr "攜帶型" #: main/main.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp -#, fuzzy msgid "Orientation" -msgstr "線上說明文件" +msgstr "æ–¹å‘" #: main/main.cpp scene/gui/scroll_container.cpp scene/gui/text_edit.cpp #: scene/main/scene_tree.cpp scene/register_scene_types.cpp -#, fuzzy msgid "Common" -msgstr "社群" +msgstr "常見" #: main/main.cpp -#, fuzzy msgid "Physics FPS" -msgstr "物ç†å½±æ ¼ %" +msgstr "ç‰©ç† FPS" #: main/main.cpp msgid "Force FPS" @@ -15935,87 +15924,81 @@ msgstr "強制 FPS" #: main/main.cpp msgid "Enable Pause Aware Picking" -msgstr "" +msgstr "å•Ÿç”¨æš«åœæ„ŸçŸ¥æ‹¾å–" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp #: scene/main/viewport.cpp scene/register_scene_types.cpp msgid "GUI" -msgstr "" +msgstr "圖形使用者介é¢" #: main/main.cpp msgid "Drop Mouse On GUI Input Disabled" -msgstr "" +msgstr "åœç”¨ GUI è¼¸å…¥æ™‚é‡‹æ”¾æ»‘é¼ éµ" #: main/main.cpp msgid "stdout" -msgstr "" +msgstr "標準輸出" #: main/main.cpp msgid "Print FPS" -msgstr "" +msgstr "åˆ—å° FPS" #: main/main.cpp msgid "Verbose stdout" -msgstr "" +msgstr "詳細標準輸出" #: main/main.cpp scene/main/scene_tree.cpp scene/resources/multimesh.cpp -#, fuzzy msgid "Physics Interpolation" -msgstr "æ’值模å¼" +msgstr "ç‰©ç†æ’值" #: main/main.cpp -#, fuzzy msgid "Enable Warnings" -msgstr "啟用æ¢ä»¶ç¯©é¸" +msgstr "啟用è¦å‘Š" #: main/main.cpp -#, fuzzy msgid "Frame Delay Msec" -msgstr "完整顯示所é¸" +msgstr "å½±æ ¼å»¶é²æ¯«ç§’" #: main/main.cpp msgid "Low Processor Mode" -msgstr "" +msgstr "低處ç†å™¨æ¨¡å¼" #: main/main.cpp msgid "Delta Sync After Draw" -msgstr "" +msgstr "繪製後的差é‡åŒæ¥" #: main/main.cpp msgid "iOS" -msgstr "" +msgstr "iOS" #: main/main.cpp msgid "Hide Home Indicator" -msgstr "" +msgstr "éš±è— Home æ©«æ¢" #: main/main.cpp -#, fuzzy msgid "Input Devices" -msgstr "所有è£ç½®" +msgstr "輸入è£ç½®" #: main/main.cpp -#, fuzzy msgid "Pointing" -msgstr "點" +msgstr "指點" #: main/main.cpp msgid "Touch Delay" -msgstr "" +msgstr "觸控延é²" #: main/main.cpp servers/visual_server.cpp msgid "GLES3" -msgstr "" +msgstr "GLES3" #: main/main.cpp servers/visual_server.cpp -#, fuzzy msgid "Shaders" msgstr "著色器" #: main/main.cpp msgid "Debug Shader Fallbacks" -msgstr "" +msgstr "åµéŒ¯è‘—色器後備" #: main/main.cpp scene/3d/baked_lightmap.cpp scene/3d/camera.cpp #: scene/3d/world_environment.cpp scene/main/scene_tree.cpp @@ -16025,86 +16008,79 @@ msgstr "環境" #: main/main.cpp msgid "Default Clear Color" -msgstr "" +msgstr "é è¨æ¸…除é¡è‰²" #: main/main.cpp msgid "Boot Splash" -msgstr "" +msgstr "啟動畫é¢" #: main/main.cpp -#, fuzzy msgid "Show Image" -msgstr "顯示骨骼" +msgstr "顯示圖åƒ" #: main/main.cpp msgid "Image" -msgstr "" +msgstr "圖åƒ" #: main/main.cpp msgid "Fullsize" -msgstr "" +msgstr "全尺寸" #: main/main.cpp scene/resources/dynamic_font.cpp msgid "Use Filter" msgstr "使用篩é¸å™¨" #: main/main.cpp scene/resources/style_box.cpp -#, fuzzy msgid "BG Color" -msgstr "é¡è‰²" +msgstr "背景é¡è‰²" #: main/main.cpp -#, fuzzy msgid "macOS Native Icon" -msgstr "è¨å®šåœ–塊圖示" +msgstr "macOS 原生圖標" #: main/main.cpp msgid "Windows Native Icon" -msgstr "" +msgstr "Windows 原生圖標" #: main/main.cpp msgid "Buffering" -msgstr "" +msgstr "ç·©è¡" #: main/main.cpp msgid "Agile Event Flushing" -msgstr "" +msgstr "æ•æ·äº‹ä»¶åˆ·æ–°" #: main/main.cpp msgid "Emulate Touch From Mouse" -msgstr "" +msgstr "ä»¥æ»‘é¼ æ¨¡æ“¬è§¸æŽ§" #: main/main.cpp msgid "Emulate Mouse From Touch" -msgstr "" +msgstr "ä»¥è§¸æŽ§æ¨¡æ“¬æ»‘é¼ " #: main/main.cpp -#, fuzzy msgid "Mouse Cursor" -msgstr "æ»‘é¼ æŒ‰éˆ•" +msgstr "æ»‘é¼ æ¸¸æ¨™" #: main/main.cpp -#, fuzzy msgid "Custom Image" -msgstr "剪下節點" +msgstr "自定義圖åƒ" #: main/main.cpp msgid "Custom Image Hotspot" -msgstr "" +msgstr "自定義圖åƒç†±é»ž" #: main/main.cpp msgid "Tooltip Position Offset" msgstr "工具æç¤ºä½ç½®åç§»" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Debugger Agent" -msgstr "除錯工具" +msgstr "除錯工具代ç†" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Wait For Debugger" -msgstr "除錯工具" +msgstr "ç‰å¾…除錯工具" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Wait Timeout" @@ -16112,60 +16088,58 @@ msgstr "ç‰å¾…逾時" #: main/main.cpp msgid "Runtime" -msgstr "" +msgstr "執行階段" #: main/main.cpp msgid "Unhandled Exception Policy" -msgstr "" +msgstr "未處ç†çš„例外方é‡" #: main/main.cpp -#, fuzzy msgid "Main Loop Type" -msgstr "尋找節點型別" +msgstr "主迴圈類型" #: main/main.cpp scene/gui/texture_progress.cpp #: scene/gui/viewport_container.cpp msgid "Stretch" -msgstr "" +msgstr "伸縮" #: main/main.cpp -#, fuzzy msgid "Aspect" -msgstr "å±¬æ€§é¢æ¿" +msgstr "æ–¹ä½" #: main/main.cpp msgid "Shrink" -msgstr "" +msgstr "收縮" #: main/main.cpp scene/main/scene_tree.cpp msgid "Auto Accept Quit" -msgstr "" +msgstr "自動接å—退出" #: main/main.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Quit On Go Back" -msgstr "上一é " +msgstr "返回時退出" #: main/main.cpp scene/main/viewport.cpp #, fuzzy msgid "Snap Controls To Pixels" -msgstr "å¸é™„至節點å´é‚Š" +msgstr "å¸é™„控制至åƒç´ " #: main/main.cpp msgid "Dynamic Fonts" -msgstr "" +msgstr "å‹•æ…‹å—é«”" #: main/main.cpp msgid "Use Oversampling" -msgstr "" +msgstr "使用éŽå–樣" #: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp +#, fuzzy msgid "Active Soft World" -msgstr "" +msgstr "ç•¶å‰è»Ÿä¸–界" #: modules/csg/csg_gizmos.cpp msgid "CSG" -msgstr "" +msgstr "CSG" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -16184,35 +16158,30 @@ msgid "Change Torus Outer Radius" msgstr "更改環é¢å¤–åŠå¾‘" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Operation" -msgstr "é¸é …" +msgstr "æ“作" #: modules/csg/csg_shape.cpp msgid "Calculate Tangents" -msgstr "" +msgstr "計算切線" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Use Collision" -msgstr "碰撞" +msgstr "使用碰撞" #: modules/csg/csg_shape.cpp servers/physics_2d_server.cpp -#, fuzzy msgid "Collision Layer" -msgstr "碰撞模å¼" +msgstr "碰撞層" #: modules/csg/csg_shape.cpp scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp #: scene/3d/ray_cast.cpp scene/3d/spring_arm.cpp #: scene/resources/navigation_mesh.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Mask" -msgstr "碰撞模å¼" +msgstr "碰撞é®ç½©" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Invert Faces" -msgstr "轉æ›å¤§å°å¯«" +msgstr "å轉表é¢" #: modules/csg/csg_shape.cpp scene/2d/navigation_agent_2d.cpp #: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_agent.cpp @@ -16230,84 +16199,74 @@ msgid "Radial Segments" msgstr "徑呿®µæ•¸" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Rings" -msgstr "è¦å‘Š" +msgstr "環數" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Smooth Faces" -msgstr "平滑æ’值" +msgstr "光滑表é¢" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Sides" -msgstr "顯示åƒè€ƒç·š" +msgstr "邊數" #: modules/csg/csg_shape.cpp msgid "Cone" -msgstr "" +msgstr "éŒé«”" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Inner Radius" -msgstr "更改環é¢å…§åŠå¾‘" +msgstr "å…§åŠå¾‘" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Outer Radius" -msgstr "更改環é¢å¤–åŠå¾‘" +msgstr "外åŠå¾‘" #: modules/csg/csg_shape.cpp msgid "Ring Sides" -msgstr "" +msgstr "環邊數" #: modules/csg/csg_shape.cpp scene/2d/collision_polygon_2d.cpp #: scene/2d/light_occluder_2d.cpp scene/2d/polygon_2d.cpp #: scene/3d/collision_polygon.cpp -#, fuzzy msgid "Polygon" msgstr "多邊形" #: modules/csg/csg_shape.cpp msgid "Spin Degrees" -msgstr "" +msgstr "旋轉度數" #: modules/csg/csg_shape.cpp msgid "Spin Sides" -msgstr "" +msgstr "旋轉邊數" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Node" -msgstr "貼上節點" +msgstr "路徑節點" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Interval Type" -msgstr "å»ºç«‹å…§éƒ¨é ‚é»ž" +msgstr "路徑間隔類型" #: modules/csg/csg_shape.cpp msgid "Path Interval" -msgstr "" +msgstr "路徑間隔" #: modules/csg/csg_shape.cpp msgid "Path Simplify Angle" -msgstr "" +msgstr "路徑簡化角度" #: modules/csg/csg_shape.cpp msgid "Path Rotation" msgstr "路徑旋轉" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Local" -msgstr "轉為本地" +msgstr "路徑本地" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Continuous U" -msgstr "連續" +msgstr "路徑連續 U" #: modules/csg/csg_shape.cpp msgid "Path U Distance" @@ -16318,73 +16277,65 @@ msgid "Path Joined" msgstr "路徑接åˆ" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Compression Mode" -msgstr "碰撞模å¼" +msgstr "壓縮模å¼" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Transfer Channel" -msgstr "修改變æ›" +msgstr "傳輸通é“" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Channel Count" -msgstr "實體" +msgstr "é€šé“æ•¸" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Always Ordered" -msgstr "æ°¸é é¡¯ç¤ºç¶²æ ¼" +msgstr "æ°¸é æŽ’åº" #: modules/enet/networked_multiplayer_enet.cpp msgid "Server Relay" -msgstr "" +msgstr "伺æœå™¨ä¸ç¹¼" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Verify" -msgstr "" +msgstr "DTLS é©—è‰" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Hostname" -msgstr "" +msgstr "DTLS 主機å" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Use DTLS" -msgstr "使用å¸é™„" +msgstr "使用 DTLS" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "FBX" -msgstr "" +msgstr "FBX" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "Use FBX" -msgstr "" +msgstr "使用 FBX" #: modules/gdnative/gdnative.cpp msgid "Config File" msgstr "組態檔案" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Load Once" -msgstr "載入資æº" +msgstr "載入一次" #: modules/gdnative/gdnative.cpp #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Singleton" -msgstr "骨架" +msgstr "單例" #: modules/gdnative/gdnative.cpp msgid "Symbol Prefix" msgstr "符號å‰ç¶´" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Reloadable" -msgstr "釿–°è¼‰å…¥" +msgstr "å¯é‡æ–°è¼‰å…¥" #: modules/gdnative/gdnative.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp @@ -16449,9 +16400,8 @@ msgid "Script Class" msgstr "腳本類別" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Icon Path" -msgstr "èšç„¦è·¯å¾‘" +msgstr "圖示路徑" #: modules/gdnative/register_types.cpp msgid "GDNative" @@ -16459,34 +16409,33 @@ msgstr "GDNative" #: modules/gdscript/editor/gdscript_highlighter.cpp #: modules/gdscript/gdscript.cpp -#, fuzzy msgid "GDScript" -msgstr "腳本" +msgstr "GDScript" #: modules/gdscript/editor/gdscript_highlighter.cpp +#, fuzzy msgid "Function Definition Color" -msgstr "" +msgstr "函數定義é¡è‰²" #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Node Path Color" -msgstr "複製節點路徑" +msgstr "節點路徑é¡è‰²" #: modules/gdscript/gdscript.cpp modules/visual_script/visual_script.cpp msgid "Max Call Stack" -msgstr "" +msgstr "最大呼å«å †ç–Š" #: modules/gdscript/gdscript.cpp msgid "Treat Warnings As Errors" -msgstr "" +msgstr "å°‡è¦å‘Šè¦–為錯誤" #: modules/gdscript/gdscript.cpp msgid "Exclude Addons" -msgstr "" +msgstr "排除外掛程å¼" #: modules/gdscript/gdscript.cpp msgid "Autocomplete Setters And Getters" -msgstr "" +msgstr "è‡ªå‹•å®Œæˆ Setters å’Œ Getters" #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" @@ -16529,17 +16478,16 @@ msgid "Language Server" msgstr "語言伺æœå™¨" #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Enable Smart Resolve" -msgstr "無法解æž" +msgstr "啟用智慧解æž" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Show Native Symbols In Editor" -msgstr "" +msgstr "在編輯器ä¸é¡¯ç¤ºåŽŸç”Ÿç¬¦è™Ÿ" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Use Thread" -msgstr "" +msgstr "使用執行緒" #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp msgid "Export Mesh GLTF2" @@ -16550,50 +16498,44 @@ msgid "Export GLTF..." msgstr "匯出GLTF..." #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Buffer View" -msgstr "後視圖" +msgstr "ç·©è¡å€è¦–圖" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp msgid "Byte Offset" msgstr "å—節åç§»" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Component Type" -msgstr "元件" +msgstr "元件類型" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Normalized" -msgstr "æ ¼å¼" +msgstr "標準化" #: modules/gltf/gltf_accessor.cpp msgid "Count" msgstr "數é‡" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Min" -msgstr "MiB" +msgstr "最å°å€¼" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Max" -msgstr "æ··åˆ (Mix)" +msgstr "最大值" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Count" -msgstr "實體" +msgstr "ç¨€ç–æ•¸é‡" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Buffer View" -msgstr "" +msgstr "稀ç–索引緩è¡å€è¦–圖" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Byte Offset" -msgstr "" +msgstr "稀ç–索引ä½å…ƒçµ„åç§»" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Component Type" @@ -16601,30 +16543,27 @@ msgstr "稀ç–é ‚é»žå…ƒä»¶åž‹åˆ¥" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" -msgstr "" +msgstr "稀ç–值緩è¡å€è¦–圖" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Byte Offset" -msgstr "" +msgstr "稀ç–值ä½å…ƒçµ„åç§»" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Buffer" -msgstr "後視圖" +msgstr "ç·©è¡å€" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Byte Length" -msgstr "é è¨ä¸»é¡Œ" +msgstr "ä½å…ƒçµ„長度" #: modules/gltf/gltf_buffer_view.cpp msgid "Byte Stride" -msgstr "" +msgstr "ä½å…ƒçµ„è·¨è·" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Indices" -msgstr "所有è£ç½®" +msgstr "索引" #: modules/gltf/gltf_camera.cpp msgid "FOV Size" @@ -16632,12 +16571,11 @@ msgstr "FOV 大å°" #: modules/gltf/gltf_camera.cpp msgid "Zfar" -msgstr "" +msgstr "Zfar" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "Znear" -msgstr "線性" +msgstr "Znear" #: modules/gltf/gltf_light.cpp scene/2d/canvas_modulate.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp scene/2d/polygon_2d.cpp @@ -16647,14 +16585,13 @@ msgstr "線性" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/particles_material.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Color" msgstr "é¡è‰²" #: modules/gltf/gltf_light.cpp scene/3d/reflection_probe.cpp #: scene/resources/environment.cpp msgid "Intensity" -msgstr "" +msgstr "強度" #: modules/gltf/gltf_light.cpp scene/2d/light_2d.cpp scene/3d/light.cpp #, fuzzy @@ -16663,11 +16600,11 @@ msgstr "更改" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" -msgstr "" +msgstr "內圓éŒè§’" #: modules/gltf/gltf_light.cpp msgid "Outer Cone Angle" -msgstr "" +msgstr "外圓éŒè§’" #: modules/gltf/gltf_mesh.cpp #, fuzzy @@ -16689,8 +16626,9 @@ msgid "Xform" msgstr "å¹³å°" #: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp +#, fuzzy msgid "Skin" -msgstr "" +msgstr "皮膚" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp #, fuzzy @@ -16708,12 +16646,14 @@ msgid "Joints" msgstr "點" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Roots" -msgstr "" +msgstr "æ ¹" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_state.cpp +#, fuzzy msgid "Unique Names" -msgstr "" +msgstr "ç¨ç«‹å稱" #: modules/gltf/gltf_skeleton.cpp #, fuzzy @@ -16731,8 +16671,9 @@ msgid "Joints Original" msgstr "èšç„¦åŽŸé»ž" #: modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Inverse Binds" -msgstr "" +msgstr "å轉ç¶å®š" #: modules/gltf/gltf_skin.cpp #, fuzzy @@ -16740,40 +16681,47 @@ msgid "Non Joints" msgstr "移動關節" #: modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Joint I To Bone I" -msgstr "" +msgstr "關節 I 至骨骼 I" #: modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Joint I To Name" -msgstr "" +msgstr "關節 I 至å稱" #: modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Godot Skin" -msgstr "" +msgstr "Godot 外觀" #: modules/gltf/gltf_spec_gloss.cpp +#, fuzzy msgid "Diffuse Img" -msgstr "" +msgstr "漫射圖åƒ" #: modules/gltf/gltf_spec_gloss.cpp +#, fuzzy msgid "Diffuse Factor" -msgstr "" +msgstr "漫射係數" #: modules/gltf/gltf_spec_gloss.cpp +#, fuzzy msgid "Gloss Factor" -msgstr "" +msgstr "光澤係數" #: modules/gltf/gltf_spec_gloss.cpp msgid "Specular Factor" msgstr "é¡é¢å射係數" #: modules/gltf/gltf_spec_gloss.cpp +#, fuzzy msgid "Spec Gloss Img" -msgstr "" +msgstr "è¦æ ¼å…‰æ¾¤åœ–åƒ" #: modules/gltf/gltf_state.cpp msgid "Json" -msgstr "" +msgstr "Json" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -16791,8 +16739,9 @@ msgid "GLB Data" msgstr "åŒ…å«æ•¸æ“š" #: modules/gltf/gltf_state.cpp +#, fuzzy msgid "Use Named Skin Binds" -msgstr "" +msgstr "使用已命å的外觀ç¶å®š" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -16801,7 +16750,7 @@ msgstr "後視圖" #: modules/gltf/gltf_state.cpp msgid "Accessors" -msgstr "" +msgstr "å˜å–器" #: modules/gltf/gltf_state.cpp msgid "Scene Name" @@ -16820,11 +16769,11 @@ msgstr "功能" #: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp msgid "Images" -msgstr "" +msgstr "圖åƒ" #: modules/gltf/gltf_state.cpp msgid "Cameras" -msgstr "" +msgstr "æ”影機" #: modules/gltf/gltf_state.cpp servers/visual_server.cpp #, fuzzy @@ -16869,8 +16818,9 @@ msgid "Use In Baked Light" msgstr "烘焙光照圖" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp +#, fuzzy msgid "Cell" -msgstr "" +msgstr "單使 ¼" #: modules/gridmap/grid_map.cpp #, fuzzy @@ -16896,7 +16846,7 @@ msgstr "ä¸å¤®" #: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp #: scene/resources/material.cpp msgid "Mask" -msgstr "" +msgstr "é®ç½©" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp #, fuzzy @@ -17074,19 +17024,19 @@ msgstr "烘焙光照圖" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" -msgstr "" +msgstr "低å“質射線數" #: modules/lightmapper_cpu/register_types.cpp msgid "Medium Quality Ray Count" -msgstr "" +msgstr "ä¸ç‰å“質射線數" #: modules/lightmapper_cpu/register_types.cpp msgid "High Quality Ray Count" -msgstr "" +msgstr "高å“質射線數" #: modules/lightmapper_cpu/register_types.cpp msgid "Ultra Quality Ray Count" -msgstr "" +msgstr "超高å“é‡å°„線數" #: modules/minimp3/audio_stream_mp3.cpp #: modules/minimp3/resource_importer_mp3.cpp @@ -17096,12 +17046,13 @@ msgid "Loop Offset" msgstr "循環åç§»" #: modules/mobile_vr/mobile_vr_interface.cpp +#, fuzzy msgid "Eye Height" -msgstr "" +msgstr "眼ç›é«˜åº¦" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" -msgstr "" +msgstr "IOD" #: modules/mobile_vr/mobile_vr_interface.cpp #, fuzzy @@ -17115,15 +17066,15 @@ msgstr "顯示無陰影" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" -msgstr "" +msgstr "éŽå–樣" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K1" -msgstr "" +msgstr "K1" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K2" -msgstr "" +msgstr "K2" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -17138,6 +17089,21 @@ msgstr "建構解決方案" msgid "Auto Update Project" msgstr "未命å專案" +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Assembly Name" +msgstr "全部顯示" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "Solution Directory" +msgstr "鏿“‡è³‡æ–™å¤¾" + +#: modules/mono/godotsharp_dirs.cpp +#, fuzzy +msgid "C# Project Directory" +msgstr "鏿“‡è³‡æ–™å¤¾" + #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "å…§éƒ¨ç•°å¸¸å †ç–Šå›žæº¯çµæŸ" @@ -17209,19 +17175,21 @@ msgstr "完æˆï¼" #: modules/opensimplex/noise_texture.cpp msgid "Seamless" -msgstr "" +msgstr "無縫" #: modules/opensimplex/noise_texture.cpp msgid "As Normal Map" msgstr "作為法線貼圖" #: modules/opensimplex/noise_texture.cpp +#, fuzzy msgid "Bump Strength" -msgstr "" +msgstr "凹凸強度" #: modules/opensimplex/noise_texture.cpp +#, fuzzy msgid "Noise" -msgstr "" +msgstr "噪音" #: modules/opensimplex/noise_texture.cpp msgid "Noise Offset" @@ -17229,11 +17197,11 @@ msgstr "噪è²åç§»" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" -msgstr "" +msgstr "八度" #: modules/opensimplex/open_simplex_noise.cpp msgid "Period" -msgstr "" +msgstr "週期" #: modules/opensimplex/open_simplex_noise.cpp #, fuzzy @@ -17241,12 +17209,13 @@ msgid "Persistence" msgstr "é€è¦–" #: modules/opensimplex/open_simplex_noise.cpp +#, fuzzy msgid "Lacunarity" -msgstr "" +msgstr "空隙性" #: modules/regex/regex.cpp msgid "Subject" -msgstr "" +msgstr "å°è±¡" #: modules/regex/regex.cpp #, fuzzy @@ -17258,16 +17227,18 @@ msgid "Strings" msgstr "å—串" #: modules/upnp/upnp.cpp +#, fuzzy msgid "Discover Multicast If" -msgstr "" +msgstr "發ç¾å¤šæ’介é¢" #: modules/upnp/upnp.cpp +#, fuzzy msgid "Discover Local Port" -msgstr "" +msgstr "ç™¼ç¾æœ¬åœ°é€šè¨ŠåŸ " #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "" +msgstr "DiscoverIPv6" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -17281,7 +17252,7 @@ msgstr "è¨å®šè®Šæ•¸åž‹åˆ¥" #: modules/upnp/upnp_device.cpp msgid "IGD Control URL" -msgstr "" +msgstr "IGD 控制 URL" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -17290,7 +17261,7 @@ msgstr "è¨å®šè®Šæ•¸åž‹åˆ¥" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" -msgstr "" +msgstr "IGD 我方ä½å€" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -17653,7 +17624,7 @@ msgstr "è¨å®šè¡¨ç¤ºå¼" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "返回" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy @@ -17672,24 +17643,27 @@ msgid "Condition" msgstr "å‹•ç•«" #: modules/visual_script/visual_script_flow_control.cpp +#, fuzzy msgid "if (cond) is:" -msgstr "" +msgstr "如果(cond)是:" #: modules/visual_script/visual_script_flow_control.cpp +#, fuzzy msgid "While" -msgstr "" +msgstr "ç•¶" #: modules/visual_script/visual_script_flow_control.cpp +#, fuzzy msgid "while (cond):" -msgstr "" +msgstr "當(cond):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "è¿ä»£å™¨" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "" +msgstr "å°æ¯å€‹ (elem) 在 (input) 之ä¸:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable:" @@ -17705,7 +17679,7 @@ msgstr "è¿ä»£å™¨ç„¡æ•ˆï¼š" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "åºåˆ—" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy @@ -17723,7 +17697,7 @@ msgstr "切æ›" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" -msgstr "" +msgstr "'input' 是:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Type Cast" @@ -17731,7 +17705,7 @@ msgstr "型別轉æ›" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "是 %s?" #: modules/visual_script/visual_script_flow_control.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -17741,7 +17715,7 @@ msgstr "新增腳本" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "在 %s" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -17788,11 +17762,11 @@ msgstr "使–¼å—å…ƒ %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Multiply %s" -msgstr "" +msgstr "%s 乘以" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Divide %s" -msgstr "" +msgstr "%s 除以" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -17806,7 +17780,7 @@ msgstr "è¨å®š %s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" -msgstr "" +msgstr "å°‡ %s å‘å³ç§»å‹•" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -17814,12 +17788,14 @@ msgid "BitAnd %s" msgstr "新增 %" #: modules/visual_script/visual_script_func_nodes.cpp +#, fuzzy msgid "BitOr %s" -msgstr "" +msgstr "ä½å…ƒé‹ç®— OR %s" #: modules/visual_script/visual_script_func_nodes.cpp +#, fuzzy msgid "BitXor %s" -msgstr "" +msgstr "ä½å…ƒé ç®— XOR %s" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -17879,7 +17855,7 @@ msgstr "無效的引數:" #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" -msgstr "" +msgstr "如果 cond 則 a ,å¦å‰‡ b" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -17971,7 +17947,7 @@ msgstr "呼å«" #: modules/visual_script/visual_script_nodes.cpp scene/gui/graph_node.cpp msgid "Title" -msgstr "" +msgstr "標題" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -17995,7 +17971,7 @@ msgstr "æ“作" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "解構 %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" @@ -18021,7 +17997,7 @@ msgstr "物ç†å½±æ ¼ %" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "%s sec(s)" -msgstr "" +msgstr "%s ç§’" #: modules/visual_script/visual_script_yield_nodes.cpp scene/main/timer.cpp #, fuzzy @@ -18050,7 +18026,7 @@ msgstr "優先模å¼" #: modules/webrtc/webrtc_data_channel.h msgid "WebRTC" -msgstr "" +msgstr "WebRTC" #: modules/webrtc/webrtc_data_channel.h #, fuzzy @@ -18059,11 +18035,11 @@ msgstr "畫布多邊形索引緩è¡å€å¤§å°ï¼ˆKB)" #: modules/websocket/websocket_client.cpp msgid "Verify SSL" -msgstr "" +msgstr "é©—è‰ SSL" #: modules/websocket/websocket_client.cpp msgid "Trusted SSL Certificate" -msgstr "" +msgstr "å—信任的 SSL 憑è‰" #: modules/websocket/websocket_macros.h #, fuzzy @@ -18077,7 +18053,7 @@ msgstr "最大大å°ï¼ˆKB)" #: modules/websocket/websocket_macros.h msgid "Max In Packets" -msgstr "" +msgstr "å°åŒ…上é™" #: modules/websocket/websocket_macros.h #, fuzzy @@ -18086,7 +18062,7 @@ msgstr "最大大å°ï¼ˆKB)" #: modules/websocket/websocket_macros.h msgid "Max Out Packets" -msgstr "" +msgstr "輸出å°åŒ…上é™" #: modules/websocket/websocket_macros.h #, fuzzy @@ -18095,7 +18071,7 @@ msgstr "網路分æžå·¥å…·" #: modules/websocket/websocket_server.cpp msgid "Bind IP" -msgstr "" +msgstr "ç¶å®š IP" #: modules/websocket/websocket_server.cpp #, fuzzy @@ -18104,7 +18080,7 @@ msgstr "實體按éµ" #: modules/websocket/websocket_server.cpp platform/javascript/export/export.cpp msgid "SSL Certificate" -msgstr "" +msgstr "SSL 憑è‰" #: modules/websocket/websocket_server.cpp #, fuzzy @@ -18130,11 +18106,11 @@ msgstr "å¯é¸ç‰¹æ€§" #: modules/webxr/webxr_interface.cpp msgid "Requested Reference Space Types" -msgstr "" +msgstr "被請求的åƒç…§ç©ºé–“類型" #: modules/webxr/webxr_interface.cpp msgid "Reference Space Type" -msgstr "" +msgstr "åƒç…§ç©ºé–“類型" #: modules/webxr/webxr_interface.cpp #, fuzzy @@ -18153,7 +18129,7 @@ msgstr "智慧型å¸é™„" #: platform/android/export/export.cpp msgid "Android SDK Path" -msgstr "" +msgstr "Android SDK 路徑" #: platform/android/export/export.cpp #, fuzzy @@ -18162,31 +18138,31 @@ msgstr "除錯工具" #: platform/android/export/export.cpp msgid "Debug Keystore User" -msgstr "" +msgstr "åµéŒ¯é‡‘鑰儲å˜å€ä½¿ç”¨è€…" #: platform/android/export/export.cpp msgid "Debug Keystore Pass" -msgstr "" +msgstr "金鑰儲å˜å€åµéŒ¯å¯†ç¢¼" #: platform/android/export/export.cpp msgid "Force System User" -msgstr "" +msgstr "強制系統使用者" #: platform/android/export/export.cpp msgid "Shutdown ADB On Exit" -msgstr "" +msgstr "退出時關閉 ADB" #: platform/android/export/export_plugin.cpp msgid "Launcher Icons" -msgstr "" +msgstr "啟動器圖示" #: platform/android/export/export_plugin.cpp msgid "Main 192 X 192" -msgstr "" +msgstr "主圖示 192 X 192" #: platform/android/export/export_plugin.cpp msgid "Adaptive Foreground 432 X 432" -msgstr "" +msgstr "è‡ªé©æ‡‰å‰æ™¯ 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Adaptive Background 432 X 432" @@ -18948,6 +18924,11 @@ msgstr "剪下節點" msgid "Custom BG Color" msgstr "剪下節點" +#: platform/iphone/export/export.cpp +#, fuzzy +msgid "Export Icons" +msgstr "展開全部" + #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy @@ -19781,6 +19762,12 @@ msgid "Show Name On Square 310 X 310" msgstr "" #: platform/uwp/export/export.cpp +msgid "" +"Godot's Mono version does not support the UWP platform. Use the standard " +"build (no C# support) if you wish to target UWP." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package short name." msgstr "無效的套件段å稱。" @@ -23275,43 +23262,36 @@ msgid "Mix Mode" msgstr "Mix 節點" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Fadein Time" -msgstr "淡入與淡出時間(秒):" +msgstr "淡入時間" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Fadeout Time" -msgstr "淡入與淡出時間(秒):" +msgstr "淡出時間" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Auto Restart" -msgstr "è‡ªå‹•é‡æ–°é–‹å§‹ï¼š" +msgstr "è‡ªå‹•é‡æ–°é–‹å§‹" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Autorestart" -msgstr "è‡ªå‹•é‡æ–°é–‹å§‹ï¼š" +msgstr "è‡ªå‹•é‡æ–°é–‹å§‹" #: scene/animation/animation_blend_tree.cpp msgid "Delay" msgstr "" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Random Delay" -msgstr "隨機傾斜:" +msgstr "隨機延é²" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Add Amount" -msgstr "數é‡ï¼š" +msgstr "å¢žåŠ æ•¸é‡" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Blend Amount" -msgstr "數é‡ï¼š" +msgstr "æ··åˆé‡" #: scene/animation/animation_blend_tree.cpp #, fuzzy @@ -23325,14 +23305,12 @@ msgstr "æ–°å¢žè¼¸å…¥åŸ å£" #: scene/animation/animation_blend_tree.cpp #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Xfade Time" -msgstr "淡入與淡出時間(秒):" +msgstr "Xfade 時間" #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Switch Mode" -msgstr "仰角:" +msgstr "åˆ‡æ›æ¨¡å¼" #: scene/animation/animation_node_state_machine.cpp #, fuzzy @@ -23373,9 +23351,8 @@ msgid "Current Animation Position" msgstr "æ–°å¢žå‹•ç•«é ‚é»ž" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Playback Options" -msgstr "類別é¸é …:" +msgstr "æ’æ”¾é¸é …" #: scene/animation/animation_player.cpp #, fuzzy @@ -23415,9 +23392,8 @@ msgid "The AnimationPlayer root node is not a valid node." msgstr "AnimationPlayer çš„æ ¹ç¯€é»žä¸¦éžæœ‰æ•ˆç¯€é»žã€‚" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Tree Root" -msgstr "å»ºç«‹æ ¹ç¯€é»žï¼š" +msgstr "æ¨¹æ ¹ç¯€é»ž" #: scene/animation/animation_tree.cpp #, fuzzy @@ -23673,14 +23649,12 @@ msgid "Grow Direction" msgstr "æ–¹å‘" #: scene/gui/control.cpp scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Min Size" -msgstr "輪廓尺寸:" +msgstr "最å°å°ºå¯¸" #: scene/gui/control.cpp -#, fuzzy msgid "Pivot Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "樞ç´åç§»é‡" #: scene/gui/control.cpp #, fuzzy @@ -23740,7 +23714,7 @@ msgstr "" #: scene/gui/control.cpp msgid "Size Flags" -msgstr "å¤§å° Flag:" +msgstr "å¤§å° Flag" #: scene/gui/control.cpp #, fuzzy @@ -23788,14 +23762,12 @@ msgid "Right Disconnects" msgstr "斷開訊號連接" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Scroll Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "æ²è»¸åç§»é‡" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Snap Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "å¸é™„è·é›¢" #: scene/gui/graph_edit.cpp #, fuzzy @@ -23895,7 +23867,7 @@ msgstr "" #: scene/gui/item_list.cpp #, fuzzy msgid "Icon Scale" -msgstr "隨機縮放:" +msgstr "圖示比例" #: scene/gui/item_list.cpp #, fuzzy @@ -23908,9 +23880,8 @@ msgid "V Align" msgstr "指派" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp -#, fuzzy msgid "Visible Characters" -msgstr "å¯ä½¿ç”¨çš„å—元:" +msgstr "å¯è¦‹å—符" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp #, fuzzy @@ -23934,9 +23905,8 @@ msgid "Secret" msgstr "" #: scene/gui/line_edit.cpp -#, fuzzy msgid "Secret Character" -msgstr "å¯ä½¿ç”¨çš„å—元:" +msgstr "秘密å—å…ƒ" #: scene/gui/line_edit.cpp msgid "Expand To Text Length" @@ -24000,18 +23970,16 @@ msgid "Blink" msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Blink Speed" -msgstr "速度:" +msgstr "é–ƒçˆé€Ÿåº¦" #: scene/gui/link_button.cpp msgid "Underline" msgstr "" #: scene/gui/menu_button.cpp -#, fuzzy msgid "Switch On Hover" -msgstr "仰角:" +msgstr "æ‡¸åœæ™‚切æ›" #: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp #, fuzzy @@ -24087,9 +24055,8 @@ msgid "Allow Search" msgstr "æœå°‹" #: scene/gui/progress_bar.cpp -#, fuzzy msgid "Percent" -msgstr "最近å˜å–:" +msgstr "百分比" #: scene/gui/range.cpp msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." @@ -24148,9 +24115,8 @@ msgid "Absolute Index" msgstr "自動縮排" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Elapsed Time" -msgstr "æ··åˆæ™‚間:" +msgstr "ç¶“éŽæ™‚é–“" #: scene/gui/rich_text_effect.cpp #, fuzzy @@ -24158,9 +24124,8 @@ msgid "Env" msgstr "çµæŸ" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Character" -msgstr "å¯ä½¿ç”¨çš„å—元:" +msgstr "å—å…ƒ" #: scene/gui/rich_text_label.cpp msgid "BBCode" @@ -24171,9 +24136,8 @@ msgid "Meta Underlined" msgstr "" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Tab Size" -msgstr "大å°ï¼š" +msgstr "分é 大å°" #: scene/gui/rich_text_label.cpp #, fuzzy @@ -24194,9 +24158,8 @@ msgid "Selection Enabled" msgstr "僅æœå°‹æ‰€é¸å€åŸŸ" #: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Override Selected Font Color" -msgstr "è¨å®šæ‰€é¸ä¹‹è¨å®šæª”:" +msgstr "覆蓋所é¸å—åž‹é¡è‰²" #: scene/gui/rich_text_label.cpp #, fuzzy @@ -24224,9 +24187,8 @@ msgid "Follow Focus" msgstr "填充表é¢" #: scene/gui/scroll_container.cpp -#, fuzzy msgid "Horizontal Enabled" -msgstr "水平:" +msgstr "已啟用水平" #: scene/gui/scroll_container.cpp #, fuzzy @@ -24247,24 +24209,20 @@ msgid "Tick Count" msgstr "鏿“‡é¡è‰²" #: scene/gui/slider.cpp -#, fuzzy msgid "Ticks On Borders" -msgstr "釿–°å‘½å資料夾:" +msgstr "邊框刻度" #: scene/gui/spin_box.cpp -#, fuzzy msgid "Prefix" -msgstr "å‰ç½®ï¼š" +msgstr "å‰ç¶´" #: scene/gui/spin_box.cpp -#, fuzzy msgid "Suffix" -msgstr "後置:" +msgstr "後綴" #: scene/gui/split_container.cpp -#, fuzzy msgid "Split Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "拆分åç§»" #: scene/gui/split_container.cpp scene/gui/tree.cpp #, fuzzy @@ -24281,9 +24239,8 @@ msgid "Tab Align" msgstr "" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp -#, fuzzy msgid "Current Tab" -msgstr "ç›®å‰ï¼š" +msgstr "ç•¶å‰åˆ†é " #: scene/gui/tab_container.cpp #, fuzzy @@ -24327,7 +24284,7 @@ msgstr "è·³éŽä¸æ–·é»ž" #: scene/gui/text_edit.cpp #, fuzzy msgid "Fold Gutter" -msgstr "資料夾:" +msgstr "æ‘ºç–Šæ ¼ç·š" #: scene/gui/text_edit.cpp #, fuzzy @@ -24345,19 +24302,16 @@ msgid "Wrap Enabled" msgstr "啟用" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Scroll Vertical" -msgstr "垂直:" +msgstr "垂直滾動" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Scroll Horizontal" -msgstr "水平:" +msgstr "水平滾動" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Draw" -msgstr "繪製呼å«ï¼š" +msgstr "繪製" #: scene/gui/text_edit.cpp #, fuzzy @@ -24415,9 +24369,8 @@ msgid "Progress Offset" msgstr "" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Fill Mode" -msgstr "æ’æ”¾æ¨¡å¼ï¼š" +msgstr "填充模å¼" #: scene/gui/texture_progress.cpp scene/resources/material.cpp msgid "Tint" @@ -24485,9 +24438,8 @@ msgid "Hide Folding" msgstr "å·²åœç”¨çš„æŒ‰éˆ•" #: scene/gui/tree.cpp -#, fuzzy msgid "Hide Root" -msgstr "å»ºç«‹æ ¹ç¯€é»žï¼š" +msgstr "éš±è—æ ¹ç¯€é»ž" #: scene/gui/tree.cpp msgid "Drop Mode Flags" @@ -24585,19 +24537,16 @@ msgid "Filename" msgstr "釿–°å‘½å" #: scene/main/node.cpp -#, fuzzy msgid "Owner" -msgstr "ç‚ºä¸‹åˆ—ä¹‹æ“æœ‰è€…:" +msgstr "æ“æœ‰è€…" #: scene/main/node.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Multiplayer" -msgstr "è¨å®šå¤šå€‹ï¼š" +msgstr "多人" #: scene/main/node.cpp -#, fuzzy msgid "Custom Multiplayer" -msgstr "è¨å®šå¤šå€‹ï¼š" +msgstr "自定義多人" #: scene/main/node.cpp #, fuzzy @@ -24635,7 +24584,7 @@ msgstr "" #: scene/main/scene_tree.cpp #, fuzzy msgid "Multiplayer Poll" -msgstr "è¨å®šå¤šå€‹ï¼š" +msgstr "多人投票調查" #: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp #: scene/resources/shape_2d.cpp @@ -24676,7 +24625,7 @@ msgstr "åå°„" #: scene/main/scene_tree.cpp #, fuzzy msgid "Atlas Size" -msgstr "輪廓尺寸:" +msgstr "地圖集大å°" #: scene/main/scene_tree.cpp msgid "Atlas Subdiv" @@ -24732,9 +24681,8 @@ msgstr "" "建è°ä½¿ç”¨è…³æœ¬çš„處ç†è¿´åœˆï¼ˆProcess Loop)而éžé€™é¡žè¨ˆæ™‚器。" #: scene/main/timer.cpp -#, fuzzy msgid "Autostart" -msgstr "è‡ªå‹•é‡æ–°é–‹å§‹ï¼š" +msgstr "自動開始" #: scene/main/viewport.cpp #, fuzzy @@ -24816,9 +24764,8 @@ msgid "Debug Draw" msgstr "åµéŒ¯" #: scene/main/viewport.cpp -#, fuzzy msgid "Render Target" -msgstr "算繪引擎:" +msgstr "算繪目標" #: scene/main/viewport.cpp msgid "V Flip" @@ -24951,7 +24898,7 @@ msgstr "" #: scene/resources/concave_polygon_shape_2d.cpp #, fuzzy msgid "Segments" -msgstr "ä¸»å ´æ™¯å¼•æ•¸ï¼š" +msgstr "分段" #: scene/resources/curve.cpp #, fuzzy @@ -24992,9 +24939,8 @@ msgid "Font Color Disabled" msgstr "剪è£å·²ç¦ç”¨" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "H Separation" -msgstr "分隔:" +msgstr "水平分離" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25062,9 +25008,8 @@ msgid "On Disabled" msgstr "å·²åœç”¨çš„é …ç›®" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Off" -msgstr "å移:" +msgstr "關閉" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25082,14 +25027,12 @@ msgid "Font Outline Modulate" msgstr "強制使用白色調變" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow Offset X" -msgstr "ç¶²æ ¼ X å移:" +msgstr "é™°å½± X åç§»" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow Offset Y" -msgstr "ç¶²æ ¼ Y å移:" +msgstr "é™°å½± Y åç§»" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25147,14 +25090,12 @@ msgid "Space" msgstr "ä¸»å ´æ™¯" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folded" -msgstr "資料夾:" +msgstr "已折å " #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Fold" -msgstr "資料夾:" +msgstr "折疊" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Readonly" @@ -25273,14 +25214,12 @@ msgid "Close Highlight" msgstr "呿€§å…‰ç…§" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close H Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "關閉水平åç§»" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close V Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "關閉垂直åç§»" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25321,9 +25260,8 @@ msgid "Font Color Separator" msgstr "分隔線å—é«”é¡è‰²" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "V Separation" -msgstr "分隔:" +msgstr "垂直分隔" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25366,19 +25304,16 @@ msgid "Resizer Color" msgstr "é¡è‰²" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Title Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "標題åç§»é‡" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "關閉åç§»" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Port Offset" -msgstr "ç¶²æ ¼åç§»é‡ï¼š" +msgstr "é€£æŽ¥åŸ åç§»é‡" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25489,9 +25424,8 @@ msgid "Draw Guides" msgstr "顯示åƒè€ƒç·š" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Border" -msgstr "垂直:" +msgstr "æ²è»¸é‚Šæ¡†" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25504,9 +25438,8 @@ msgid "Icon Margin" msgstr "è¨å®šå¤–邊è·" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Separation" -msgstr "分隔:" +msgstr "行分隔" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25566,9 +25499,8 @@ msgid "Large" msgstr "目標" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folder" -msgstr "資料夾:" +msgstr "資料夾" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25668,14 +25600,12 @@ msgid "Mono Font" msgstr "ä¸»å ´æ™¯" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Table H Separation" -msgstr "分隔:" +msgstr "è¡¨æ ¼æ°´å¹³åˆ†éš”" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Table V Separation" -msgstr "分隔:" +msgstr "è¡¨æ ¼åž‚ç›´åˆ†éš”" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25769,9 +25699,8 @@ msgid "Font Path" msgstr "èšç„¦è·¯å¾‘" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Outline Size" -msgstr "輪廓尺寸:" +msgstr "輪廓尺寸" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -25784,14 +25713,12 @@ msgid "Use Mipmaps" msgstr "訊號" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Extra Spacing" -msgstr "更多é¸é …:" +msgstr "é¡å¤–é–“è·" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Char" -msgstr "å¯ä½¿ç”¨çš„å—元:" +msgstr "å—å…ƒ" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -25817,9 +25744,8 @@ msgid "Sky Orientation" msgstr "線上說明文件" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Rotation" -msgstr "旋轉æ¥é•·ï¼š" +msgstr "天空旋轉" #: scene/resources/environment.cpp msgid "Sky Rotation Degrees" @@ -25848,14 +25774,12 @@ msgid "Fog" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Sun Color" -msgstr "å„²å˜æª”案:" +msgstr "太陽é¡è‰²" #: scene/resources/environment.cpp -#, fuzzy msgid "Sun Amount" -msgstr "數é‡ï¼š" +msgstr "太陽亮度" #: scene/resources/environment.cpp #, fuzzy @@ -25944,14 +25868,12 @@ msgid "Max Steps" msgstr "æ¥é•·" #: scene/resources/environment.cpp -#, fuzzy msgid "Fade In" -msgstr "淡入(秒):" +msgstr "æ·¡å…¥" #: scene/resources/environment.cpp -#, fuzzy msgid "Fade Out" -msgstr "淡出(秒):" +msgstr "淡出" #: scene/resources/environment.cpp #, fuzzy @@ -25967,9 +25889,8 @@ msgid "SSAO" msgstr "" #: scene/resources/environment.cpp -#, fuzzy msgid "Radius 2" -msgstr "åŠå¾‘:" +msgstr "åŠå¾‘2" #: scene/resources/environment.cpp msgid "Intensity 2" @@ -25998,9 +25919,8 @@ msgid "DOF Far Blur" msgstr "" #: scene/resources/environment.cpp scene/resources/material.cpp -#, fuzzy msgid "Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "è·é›¢" #: scene/resources/environment.cpp msgid "Transition" @@ -26082,9 +26002,8 @@ msgid "Brightness" msgstr "燈光" #: scene/resources/environment.cpp -#, fuzzy msgid "Saturation" -msgstr "分隔:" +msgstr "飽和度" #: scene/resources/environment.cpp msgid "Color Correction" @@ -26093,7 +26012,7 @@ msgstr "é¡è‰²æ ¡æ£" #: scene/resources/font.cpp #, fuzzy msgid "Ascent" -msgstr "最近å˜å–:" +msgstr "上å‡" #: scene/resources/font.cpp #, fuzzy @@ -26106,9 +26025,8 @@ msgid "Raw Data" msgstr "深度" #: scene/resources/gradient.cpp -#, fuzzy msgid "Offsets" -msgstr "å移:" +msgstr "åç§»" #: scene/resources/height_map_shape.cpp msgid "Map Width" @@ -26191,9 +26109,8 @@ msgid "Is sRGB" msgstr "" #: scene/resources/material.cpp servers/visual_server.cpp -#, fuzzy msgid "Parameters" -msgstr "å·²æ›´æ”¹åƒæ•¸ï¼š" +msgstr "åƒæ•¸" #: scene/resources/material.cpp #, fuzzy @@ -26235,9 +26152,8 @@ msgid "Grow" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Grow Amount" -msgstr "數é‡ï¼š" +msgstr "生æˆé‡" #: scene/resources/material.cpp msgid "Use Alpha Scissor" @@ -26342,9 +26258,8 @@ msgid "Transmission" msgstr "è½‰å ´" #: scene/resources/material.cpp -#, fuzzy msgid "Refraction" -msgstr "分隔:" +msgstr "折射" #: scene/resources/material.cpp msgid "Detail" @@ -26429,7 +26344,7 @@ msgstr "" #: scene/resources/navigation_mesh.cpp msgid "Sampling" -msgstr "縮放:" +msgstr "å–æ¨£" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26456,7 +26371,7 @@ msgstr "" #: scene/resources/navigation_mesh.cpp #, fuzzy msgid "Agents" -msgstr "ä¸»å ´æ™¯å¼•æ•¸ï¼š" +msgstr "代ç†" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" @@ -26495,9 +26410,8 @@ msgid "Details" msgstr "顯示é è¨" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sample Distance" -msgstr "鏿“‡è·é›¢ï¼š" +msgstr "採樣è·é›¢" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26522,9 +26436,8 @@ msgid "Baking AABB" msgstr "æ£åœ¨ç”¢ç”Ÿ AABB" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Baking AABB Offset" -msgstr "å移:" +msgstr "烘焙 AABB åç§»" #: scene/resources/occluder_shape.cpp msgid "Spheres" @@ -26567,9 +26480,8 @@ msgid "Color Modifier" msgstr "放慢自由視圖速度" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Point Texture" -msgstr "發射點:" +msgstr "點紋ç†è²¼åœ–" #: scene/resources/particles_material.cpp msgid "Normal Texture" @@ -26585,9 +26497,8 @@ msgid "Point Count" msgstr "æ–°å¢žè¼¸å…¥åŸ å£" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Scale Random" -msgstr "縮放比例:" +msgstr "縮放隨機" #: scene/resources/particles_material.cpp #, fuzzy @@ -26603,9 +26514,8 @@ msgid "Absorbent" msgstr "" #: scene/resources/plane_shape.cpp -#, fuzzy msgid "Plane" -msgstr "å¹³é¢ï¼š" +msgstr "å¹³é¢" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -26629,9 +26539,8 @@ msgid "Subdivide Depth" msgstr "" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Top Radius" -msgstr "åŠå¾‘:" +msgstr "é ‚éƒ¨åŠå¾‘" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -26680,9 +26589,8 @@ msgid "Bone" msgstr "骨骼" #: scene/resources/sky.cpp -#, fuzzy msgid "Radiance Size" -msgstr "輪廓尺寸:" +msgstr "光澤大å°" #: scene/resources/sky.cpp msgid "Panorama" @@ -26694,9 +26602,8 @@ msgid "Top Color" msgstr "下一個地æ¿" #: scene/resources/sky.cpp -#, fuzzy msgid "Horizon Color" -msgstr "å„²å˜æª”案:" +msgstr "地平線é¡è‰²" #: scene/resources/sky.cpp #, fuzzy @@ -26805,9 +26712,8 @@ msgid "Lossy Storage Quality" msgstr "截å–" #: scene/resources/texture.cpp -#, fuzzy msgid "From" -msgstr "æ’æ”¾æ¨¡å¼ï¼š" +msgstr "來自" #: scene/resources/texture.cpp #, fuzzy @@ -26973,9 +26879,8 @@ msgid "Default Cell Height" msgstr "測試" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Edge Connection Margin" -msgstr "編輯連接內容:" +msgstr "é è¨é‚Šç·£é€£æŽ¥é‚Šè·" #: scene/resources/world_2d.cpp msgid "Canvas" @@ -27009,9 +26914,8 @@ msgid "Audio Stream" msgstr "å–®é¸é …" #: servers/audio/audio_stream.cpp -#, fuzzy msgid "Random Pitch" -msgstr "隨機傾斜:" +msgstr "隨機音高" #: servers/audio/effects/audio_effect_capture.cpp #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp @@ -27061,9 +26965,8 @@ msgstr "" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_panner.cpp -#, fuzzy msgid "Pan" -msgstr "å¹³é¢ï¼š" +msgstr "平移" #: servers/audio/effects/audio_effect_compressor.cpp #: servers/audio/effects/audio_effect_filter.cpp @@ -27159,9 +27062,8 @@ msgstr "" #: servers/audio/effects/audio_effect_pitch_shift.cpp #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp -#, fuzzy msgid "FFT Size" -msgstr "大å°ï¼š" +msgstr "FFT 大å°" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Predelay" @@ -27452,7 +27354,6 @@ msgid "Filter Mode" msgstr "篩é¸ç¯€é»ž" #: servers/visual_server.cpp -#, fuzzy msgid "Texture Array Reflections" msgstr "ç´‹ç†è²¼åœ–陣列åå°„" @@ -27511,22 +27412,18 @@ msgid "Use Nearest Mipmap Filter" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Skinning" msgstr "外觀變更" #: servers/visual_server.cpp -#, fuzzy msgid "Software Skinning Fallback" msgstr "軟體外觀變更後備" #: servers/visual_server.cpp -#, fuzzy msgid "Force Software Skinning" msgstr "強制軟體外觀變更" #: servers/visual_server.cpp -#, fuzzy msgid "Use Software Skinning" msgstr "使用軟體外觀變更" @@ -27587,7 +27484,6 @@ msgid "Scissor Area Threshold" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Max Join Items" msgstr "æœ€å¤§åŠ å…¥é …ç›®æ•¸" diff --git a/main/main.cpp b/main/main.cpp index 0ce3ef20be..5fd3786af9 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -141,6 +141,7 @@ static bool _start_success = false; String tablet_driver = ""; String text_driver = ""; String rendering_driver = ""; +String rendering_method = ""; static int text_driver_idx = -1; static int display_driver_idx = -1; static int audio_driver_idx = -1; @@ -353,6 +354,7 @@ void Main::print_help(const char *p_binary) { } OS::get_singleton()->print("].\n"); + OS::get_singleton()->print(" --rendering-method <renderer> Renderer name. Requires driver support.\n"); OS::get_singleton()->print(" --rendering-driver <driver> Rendering driver (depends on display driver).\n"); OS::get_singleton()->print(" --gpu-index <device_index> Use a specific GPU (run with --verbose to get available device list).\n"); OS::get_singleton()->print(" --text-driver <driver> Text driver (Fonts, BiDi, shaping)\n"); @@ -757,6 +759,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph } if (I->get() == "--audio-driver" || I->get() == "--display-driver" || + I->get() == "--rendering-method" || I->get() == "--rendering-driver") { if (I->next()) { forwardable_cli_arguments[CLI_SCOPE_TOOL].push_back(I->get()); @@ -866,43 +869,17 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph OS::get_singleton()->print("Missing display driver argument, aborting.\n"); goto error; } + } else if (I->get() == "--rendering-method") { + if (I->next()) { + rendering_method = I->next()->get(); + N = I->next()->next(); + } else { + OS::get_singleton()->print("Missing renderer name argument, aborting.\n"); + goto error; + } } else if (I->get() == "--rendering-driver") { if (I->next()) { rendering_driver = I->next()->get(); - - // as the rendering drivers available may depend on the display driver selected, - // we can't do an exhaustive check here, but we can look through all the options in - // all the display drivers for a match - - bool found = false; - for (int i = 0; i < DisplayServer::get_create_function_count(); i++) { - Vector<String> r_drivers = DisplayServer::get_create_function_rendering_drivers(i); - - for (int d = 0; d < r_drivers.size(); d++) { - if (rendering_driver == r_drivers[d]) { - found = true; - break; - } - } - } - - if (!found) { - OS::get_singleton()->print("Unknown rendering driver '%s', aborting.\nValid options are ", - rendering_driver.utf8().get_data()); - - for (int i = 0; i < DisplayServer::get_create_function_count(); i++) { - Vector<String> r_drivers = DisplayServer::get_create_function_rendering_drivers(i); - - for (int d = 0; d < r_drivers.size(); d++) { - OS::get_singleton()->print("'%s', ", r_drivers[d].utf8().get_data()); - } - } - - OS::get_singleton()->print(".\n"); - - goto error; - } - N = I->next()->next(); } else { OS::get_singleton()->print("Missing rendering driver argument, aborting.\n"); @@ -1485,45 +1462,188 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph OS::get_singleton()->set_cmdline(execpath, main_args, user_args); - // possibly be worth changing the default from vulkan to something lower spec, - // for the project manager, depending on how smooth the fallback is. + { + String driver_hints = ""; +#ifdef VULKAN_ENABLED + driver_hints = "vulkan"; +#endif - // this list is hard coded, which makes it more difficult to add new backends. - // can potentially be changed to more of a plugin system at a later date. + String default_driver = driver_hints.get_slice(",", 0); + + // For now everything defaults to vulkan when available. This can change in future updates. + GLOBAL_DEF("rendering/rendering_device/driver", default_driver); + GLOBAL_DEF("rendering/rendering_device/driver.windows", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/rendering_device/driver.windows", + PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.windows", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/rendering_device/driver.linuxbsd", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/rendering_device/driver.linuxbsd", + PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.linuxbsd", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/rendering_device/driver.android", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/rendering_device/driver.android", + PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.android", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/rendering_device/driver.ios", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/rendering_device/driver.ios", + PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.ios", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/rendering_device/driver.macos", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/rendering_device/driver.macos", + PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.macos", PROPERTY_HINT_ENUM, driver_hints)); + + driver_hints = ""; +#ifdef GLES3_ENABLED + driver_hints += "opengl3"; +#endif - // Start with Vulkan, which will be the default if enabled. + default_driver = driver_hints.get_slice(",", 0); + + GLOBAL_DEF("rendering/gl_compatibility/driver", default_driver); + GLOBAL_DEF("rendering/gl_compatibility/driver.windows", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/gl_compatibility/driver.windows", + PropertyInfo(Variant::STRING, "rendering/gl_compatibility/driver.windows", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/gl_compatibility/driver.linuxbsd", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/gl_compatibility/driver.linuxbsd", + PropertyInfo(Variant::STRING, "rendering/gl_compatibility/driver.linuxbsd", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/gl_compatibility/driver.web", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/gl_compatibility/driver.web", + PropertyInfo(Variant::STRING, "rendering/gl_compatibility/driver.web", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/gl_compatibility/driver.android", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/gl_compatibility/driver.android", + PropertyInfo(Variant::STRING, "rendering/gl_compatibility/driver.android", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/gl_compatibility/driver.ios", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/gl_compatibility/driver.ios", + PropertyInfo(Variant::STRING, "rendering/gl_compatibility/driver.ios", PROPERTY_HINT_ENUM, driver_hints)); + GLOBAL_DEF("rendering/gl_compatibility/driver.macos", default_driver); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/gl_compatibility/driver.macos", + PropertyInfo(Variant::STRING, "rendering/gl_compatibility/driver.macos", PROPERTY_HINT_ENUM, driver_hints)); + } + + // Start with RenderingDevice-based backends. Should be included if any RD driver present. #ifdef VULKAN_ENABLED - renderer_hints = "vulkan"; + renderer_hints = "forward_plus,mobile"; #endif - // And OpenGL3 next, or first if Vulkan is disabled. + // And Compatibility next, or first if Vulkan is disabled. #ifdef GLES3_ENABLED if (!renderer_hints.is_empty()) { renderer_hints += ","; } - renderer_hints += "opengl3"; + renderer_hints += "gl_compatibility"; #endif if (renderer_hints.is_empty()) { - ERR_PRINT("No rendering driver available."); + ERR_PRINT("No renderers available."); + } + + if (!rendering_method.is_empty()) { + if (rendering_method != "forward_plus" && + rendering_method != "mobile" && + rendering_method != "gl_compatibility") { + OS::get_singleton()->print("Unknown renderer name '%s', aborting. Valid options are: %s\n", rendering_method.utf8().get_data(), renderer_hints.utf8().get_data()); + goto error; + } + } + + if (!rendering_driver.is_empty()) { + // As the rendering drivers available may depend on the display driver and renderer + // selected, we can't do an exhaustive check here, but we can look through all + // the options in all the display drivers for a match. + + bool found = false; + for (int i = 0; i < DisplayServer::get_create_function_count(); i++) { + Vector<String> r_drivers = DisplayServer::get_create_function_rendering_drivers(i); + + for (int d = 0; d < r_drivers.size(); d++) { + if (rendering_driver == r_drivers[d]) { + found = true; + break; + } + } + } + + if (!found) { + OS::get_singleton()->print("Unknown rendering driver '%s', aborting.\nValid options are ", + rendering_driver.utf8().get_data()); + + for (int i = 0; i < DisplayServer::get_create_function_count(); i++) { + Vector<String> r_drivers = DisplayServer::get_create_function_rendering_drivers(i); + + for (int d = 0; d < r_drivers.size(); d++) { + OS::get_singleton()->print("'%s', ", r_drivers[d].utf8().get_data()); + } + } + + OS::get_singleton()->print(".\n"); + + goto error; + } + + // Set a default renderer if none selected. Try to choose one that matches the driver. + if (rendering_method.is_empty()) { + if (rendering_driver == "opengl3") { + rendering_method = "gl_compatibility"; + } else { + rendering_method = "forward_plus"; + } + } + + // Now validate whether the selected driver matches with the renderer. + bool valid_combination = false; + Vector<String> available_drivers; + if (rendering_method == "forward_plus" || rendering_method == "mobile") { + available_drivers.push_back("vulkan"); + } else if (rendering_method == "gl_compatibility") { + available_drivers.push_back("opengl3"); + } else { + OS::get_singleton()->print("Unknown renderer name '%s', aborting.\n", rendering_method.utf8().get_data()); + goto error; + } + + for (int i = 0; i < available_drivers.size(); i++) { + if (rendering_driver == available_drivers[i]) { + valid_combination = true; + break; + } + } + + if (!valid_combination) { + OS::get_singleton()->print("Invalid renderer/driver combination '%s' and '%s', aborting. %s only supports the following drivers ", rendering_method.utf8().get_data(), rendering_driver.utf8().get_data(), rendering_method.utf8().get_data()); + + for (int d = 0; d < available_drivers.size(); d++) { + OS::get_singleton()->print("'%s', ", available_drivers[d].utf8().get_data()); + } + + OS::get_singleton()->print(".\n"); + + goto error; + } } default_renderer = renderer_hints.get_slice(",", 0); - GLOBAL_DEF_RST("rendering/driver/driver_name", default_renderer); + GLOBAL_DEF_RST_BASIC("rendering/renderer/rendering_method", default_renderer); + GLOBAL_DEF_RST_BASIC("rendering/renderer/rendering_method.mobile", default_renderer); + GLOBAL_DEF_RST_BASIC("rendering/renderer/rendering_method.web", "gl_compatibility"); // This is a bit of a hack until we have WebGPU support. - ProjectSettings::get_singleton()->set_custom_property_info("rendering/driver/driver_name", + ProjectSettings::get_singleton()->set_custom_property_info("rendering/renderer/rendering_method", PropertyInfo(Variant::STRING, - "rendering/driver/driver_name", + "rendering/renderer/rendering_method", PROPERTY_HINT_ENUM, renderer_hints)); - // if not set on the command line + // Default to ProjectSettings default if nothing set on the command line. + if (rendering_method.is_empty()) { + rendering_method = GLOBAL_GET("rendering/renderer/rendering_method"); + } + if (rendering_driver.is_empty()) { - rendering_driver = GLOBAL_GET("rendering/driver/driver_name"); + if (rendering_method == "gl_compatibility") { + rendering_driver = GLOBAL_GET("rendering/gl_compatibility/driver"); + } else { + rendering_driver = GLOBAL_GET("rendering/rendering_device/driver"); + } } // note this is the desired rendering driver, it doesn't mean we will get it. // TODO - make sure this is updated in the case of fallbacks, so that the user interface // shows the correct driver string. OS::get_singleton()->set_current_rendering_driver_name(rendering_driver); + OS::get_singleton()->set_current_rendering_method(rendering_method); // always convert to lower case for consistency in the code rendering_driver = rendering_driver.to_lower(); @@ -2799,7 +2919,7 @@ bool Main::start() { Engine::get_singleton()->startup_benchmark_begin_measure("game_load"); // Load SSL Certificates from Project Settings (or builtin). - Crypto::load_default_certificates(GLOBAL_DEF("network/ssl/certificate_bundle_override", "")); + Crypto::load_default_certificates(GLOBAL_DEF("network/tls/certificate_bundle_override", "")); if (!game_path.is_empty()) { Node *scene = nullptr; @@ -2856,7 +2976,7 @@ bool Main::start() { if (project_manager || editor) { // Load SSL Certificates from Editor Settings (or builtin) Crypto::load_default_certificates( - EditorSettings::get_singleton()->get_setting("network/ssl/editor_ssl_certificates").operator String()); + EditorSettings::get_singleton()->get_setting("network/tls/editor_tls_certificates").operator String()); } #endif } diff --git a/methods.py b/methods.py index 1f49da7ace..78ec9b8674 100644 --- a/methods.py +++ b/methods.py @@ -77,44 +77,37 @@ def add_module_version_string(self, s): self.module_version_string += "." + s -def update_version(module_version_string=""): +def get_version_info(module_version_string="", silent=False): build_name = "custom_build" if os.getenv("BUILD_NAME") != None: build_name = str(os.getenv("BUILD_NAME")) - print("Using custom build name: " + build_name) + if not silent: + print(f"Using custom build name: '{build_name}'.") import version - # NOTE: It is safe to generate this file here, since this is still executed serially - f = open("core/version_generated.gen.h", "w") - f.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n") - f.write("#ifndef VERSION_GENERATED_GEN_H\n") - f.write("#define VERSION_GENERATED_GEN_H\n") - f.write('#define VERSION_SHORT_NAME "' + str(version.short_name) + '"\n') - f.write('#define VERSION_NAME "' + str(version.name) + '"\n') - f.write("#define VERSION_MAJOR " + str(version.major) + "\n") - f.write("#define VERSION_MINOR " + str(version.minor) + "\n") - f.write("#define VERSION_PATCH " + str(version.patch) + "\n") + version_info = { + "short_name": str(version.short_name), + "name": str(version.name), + "major": int(version.major), + "minor": int(version.minor), + "patch": int(version.patch), + "status": str(version.status), + "build": str(build_name), + "module_config": str(version.module_config) + module_version_string, + "year": int(version.year), + "website": str(version.website), + "docs_branch": str(version.docs), + } + # For dev snapshots (alpha, beta, RC, etc.) we do not commit status change to Git, # so this define provides a way to override it without having to modify the source. - godot_status = str(version.status) if os.getenv("GODOT_VERSION_STATUS") != None: - godot_status = str(os.getenv("GODOT_VERSION_STATUS")) - print("Using version status '{}', overriding the original '{}'.".format(godot_status, str(version.status))) - f.write('#define VERSION_STATUS "' + godot_status + '"\n') - f.write('#define VERSION_BUILD "' + str(build_name) + '"\n') - f.write('#define VERSION_MODULE_CONFIG "' + str(version.module_config) + module_version_string + '"\n') - f.write("#define VERSION_YEAR " + str(version.year) + "\n") - f.write('#define VERSION_WEBSITE "' + str(version.website) + '"\n') - f.write('#define VERSION_DOCS_BRANCH "' + str(version.docs) + '"\n') - f.write('#define VERSION_DOCS_URL "https://docs.godotengine.org/en/" VERSION_DOCS_BRANCH\n') - f.write("#endif // VERSION_GENERATED_GEN_H\n") - f.close() + version_info["status"] = str(os.getenv("GODOT_VERSION_STATUS")) + if not silent: + print(f"Using version status '{version_info.status}', overriding the original '{version.status}'.") - # NOTE: It is safe to generate this file here, since this is still executed serially - fhash = open("core/version_hash.gen.cpp", "w") - fhash.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n") - fhash.write('#include "core/version.h"\n') + # Parse Git hash if we're in a Git repo. githash = "" gitfolder = ".git" @@ -144,7 +137,49 @@ def update_version(module_version_string=""): else: githash = head - fhash.write('const char *const VERSION_HASH = "' + githash + '";\n') + version_info["git_hash"] = githash + + return version_info + + +def generate_version_header(module_version_string=""): + version_info = get_version_info(module_version_string) + + # NOTE: It is safe to generate these files here, since this is still executed serially. + + f = open("core/version_generated.gen.h", "w") + f.write( + """/* THIS FILE IS GENERATED DO NOT EDIT */ +#ifndef VERSION_GENERATED_GEN_H +#define VERSION_GENERATED_GEN_H +#define VERSION_SHORT_NAME "{short_name}" +#define VERSION_NAME "{name}" +#define VERSION_MAJOR {major} +#define VERSION_MINOR {minor} +#define VERSION_PATCH {patch} +#define VERSION_STATUS "{status}" +#define VERSION_BUILD "{build}" +#define VERSION_MODULE_CONFIG "{module_config}" +#define VERSION_YEAR {year} +#define VERSION_WEBSITE "{website}" +#define VERSION_DOCS_BRANCH "{docs_branch}" +#define VERSION_DOCS_URL "https://docs.godotengine.org/en/" VERSION_DOCS_BRANCH +#endif // VERSION_GENERATED_GEN_H +""".format( + **version_info + ) + ) + f.close() + + fhash = open("core/version_hash.gen.cpp", "w") + fhash.write( + """/* THIS FILE IS GENERATED DO NOT EDIT */ +#include "core/version.h" +const char *const VERSION_HASH = "{git_hash}"; +""".format( + **version_info + ) + ) fhash.close() diff --git a/misc/dist/html/editor.html b/misc/dist/html/editor.html index 7c44dd45a1..ac00270d50 100644 --- a/misc/dist/html/editor.html +++ b/misc/dist/html/editor.html @@ -259,31 +259,20 @@ >Web editor documentation</a> for usage instructions and limitations. </p> </div> - <div id="welcome-modal-description-no-cross-origin-isolation" style="display: none"> + <div id="welcome-modal-missing-description" style="display: none"> <p> - The web server does not support cross-origin isolation, - which is required for the Godot Web Editor to function. - </p> - <p> - <strong>Reasons for cross-origin isolation being disabled:</strong> - <ul> - <li id="welcome-modal-reason-not-secure"> - This page is not served from a secure context (HTTPS <i>or</i> localhost). - </li> - <li> - This page may not be served with cross-origin isolation headers - (check with the developer tools' Network tab). - </li> + <strong>The following features required by the Godot Web Editor are missing:</strong> + <ul id="welcome-modal-missing-list"> </ul> </p> <p> If you are self-hosting the web editor, refer to <a - href="https://docs.godotengine.org/en/latest/tutorials/export/exporting_for_web.html#threads" + href="https://docs.godotengine.org/en/latest/tutorials/export/exporting_for_web.html" target="_blank" rel="noopener" - >Exporting for the Web - Threads</a> for more information. + >Exporting for the Web</a> for more information. </p> </div> <div style="text-align: center"> @@ -394,16 +383,22 @@ }); } - if (!crossOriginIsolated) { + const missing = Engine.getMissingFeatures(); + if (missing.length) { // Display error dialog as threading support is required for the editor. setButtonEnabled('startButton', false); document.getElementById("welcome-modal-description").style.display = "none"; - document.getElementById("welcome-modal-description-no-cross-origin-isolation").style.display = "block"; + document.getElementById("welcome-modal-missing-description").style.display = "block"; document.getElementById("welcome-modal-dismiss").style.display = "none"; - document.getElementById("welcome-modal-reason-not-secure").style.display = window.isSecureContext ? "none" : "list-item"; + const list = document.getElementById("welcome-modal-missing-list"); + for (let i = 0; i < missing.length; i++) { + const node = document.createElement("li"); + node.innerText = missing[i]; + list.appendChild(node); + } } - if (!crossOriginIsolated || localStorage.getItem("welcomeModalDismissed") !== 'true') { + if (missing.length || localStorage.getItem("welcomeModalDismissed") !== 'true') { document.getElementById("welcome-modal").style.display = "block"; document.getElementById("welcome-modal-dismiss").focus(); } diff --git a/misc/dist/html/full-size.html b/misc/dist/html/full-size.html index f385b82f1d..d5b0050cfd 100644 --- a/misc/dist/html/full-size.html +++ b/misc/dist/html/full-size.html @@ -215,8 +215,10 @@ $GODOT_HEAD_INCLUDE initializing = false; }; - if (!Engine.isWebGLAvailable()) { - displayFailureNotice('WebGL not available'); + const missing = Engine.getMissingFeatures(); + if (missing.length !== 0) { + const missingMsg = 'Warning!\nThe following features required to run Godot projects on the Web are missing:\n'; + displayFailureNotice(missingMsg + missing.join("\n")); } else { setStatusMode('indeterminate'); engine.startGame({ diff --git a/misc/dist/shell/_godot.zsh-completion b/misc/dist/shell/_godot.zsh-completion index b17bb6e66b..2bc6fe9317 100644 --- a/misc/dist/shell/_godot.zsh-completion +++ b/misc/dist/shell/_godot.zsh-completion @@ -44,6 +44,7 @@ _arguments \ '--remote-fs-password[password for remote filesystem]:remote filesystem password' \ '--audio-driver[set the audio driver]:audio driver name' \ '--display-driver[set the display driver]:display driver name' \ + "--rendering-method[set the renderer]:renderer name:((forward_plus\:'Desktop renderer' mobile\:'Desktop and mobile renderer' gl_compatibility\:'Desktop, mobile and web renderer'))" \ "--rendering-driver[set the rendering driver]:rendering driver name:((vulkan\:'Vulkan renderer' opengl3\:'OpenGL ES 3.0 renderer' dummy\:'Dummy renderer'))" \ "--gpu-index[use a specific GPU (run with --verbose to get available device list)]:device index" \ '--text-driver[set the text driver]:text driver name' \ diff --git a/misc/dist/shell/godot.bash-completion b/misc/dist/shell/godot.bash-completion index 1ab687e1fc..bc5fa600f5 100644 --- a/misc/dist/shell/godot.bash-completion +++ b/misc/dist/shell/godot.bash-completion @@ -47,6 +47,7 @@ _complete_godot_options() { --remote-fs-password --audio-driver --display-driver +--rendering-method --rendering-driver --gpu-index --text-driver @@ -58,7 +59,6 @@ _complete_godot_options() { --always-on-top --resolution --position ---headless --single-window --debug --breakpoints @@ -112,6 +112,10 @@ _complete_godot_bash() { local IFS=$' \n\t' # shellcheck disable=SC2207 COMPREPLY=($(compgen -W "unsafe safe separate" -- "$cur")) + elif [[ $prev == "--rendering-method" ]]; then + local IFS=$' \n\t' + # shellcheck disable=SC2207 + COMPREPLY=($(compgen -W "forward_plus mobile gl_compatibility" -- "$cur")) elif [[ $prev == "--rendering-driver" ]]; then local IFS=$' \n\t' # shellcheck disable=SC2207 diff --git a/misc/dist/shell/godot.fish b/misc/dist/shell/godot.fish index d58066c135..9ac692eace 100644 --- a/misc/dist/shell/godot.fish +++ b/misc/dist/shell/godot.fish @@ -23,6 +23,13 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +function godot_rendering_method_args + # Use a function instead of a fixed string to customize the argument descriptions. + echo -e "forward_plus\tHigh-end desktop renderer" + echo -e "mobile\tHigh-end mobile/desktop renderer" + echo -e "gl_compatibility\tLow-end desktop, mobile and web renderer" +end + function godot_rendering_driver_args # Use a function instead of a fixed string to customize the argument descriptions. echo -e "vulkan\tVulkan renderer" @@ -53,6 +60,7 @@ complete -c godot -l remote-fs -d "Use a remote filesystem (<host/IP>[:<port>] a complete -c godot -l remote-fs-password -d "Password for remote filesystem" -x complete -c godot -l audio-driver -d "Set the audio driver" -x complete -c godot -l display-driver -d "Set the display driver" -x +complete -c godot -l rendering-method -d "Set the renderer" -x -a "(godot_rendering_method_args)" complete -c godot -l rendering-driver -d "Set the rendering driver" -x -a "(godot_rendering_driver_args)" complete -c godot -l gpu-index -d "Use a specific GPU (run with --verbose to get available device list)" -x complete -c godot -l text-driver -d "Set the text driver" -x diff --git a/misc/hooks/pre-commit-clang-format b/misc/hooks/pre-commit-clang-format index 44b6f59132..9570d5120b 100755 --- a/misc/hooks/pre-commit-clang-format +++ b/misc/hooks/pre-commit-clang-format @@ -76,8 +76,8 @@ fi # To get consistent formatting, we recommend contributors to use the same # clang-format version as CI. -RECOMMENDED_CLANG_FORMAT_MAJOR_MIN="12" -RECOMMENDED_CLANG_FORMAT_MAJOR_MAX="14" +RECOMMENDED_CLANG_FORMAT_MAJOR_MIN="13" +RECOMMENDED_CLANG_FORMAT_MAJOR_MAX="15" if [ ! -x "$CLANG_FORMAT" ] ; then message="Error: clang-format executable not found. Please install clang-format $RECOMMENDED_CLANG_FORMAT_MAJOR_MAX." diff --git a/modules/bmp/image_loader_bmp.cpp b/modules/bmp/image_loader_bmp.cpp index ae03abca50..cc21ed28e8 100644 --- a/modules/bmp/image_loader_bmp.cpp +++ b/modules/bmp/image_loader_bmp.cpp @@ -200,7 +200,7 @@ Error ImageLoaderBMP::convert_to_image(Ref<Image> p_image, return err; } -Error ImageLoaderBMP::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderBMP::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { bmp_header_s bmp_header; Error err = ERR_INVALID_DATA; diff --git a/modules/bmp/image_loader_bmp.h b/modules/bmp/image_loader_bmp.h index cf8346ecad..0ca54de1dc 100644 --- a/modules/bmp/image_loader_bmp.h +++ b/modules/bmp/image_loader_bmp.h @@ -83,7 +83,7 @@ protected: const bmp_header_s &p_header); public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderBMP(); }; diff --git a/modules/bmp/register_types.cpp b/modules/bmp/register_types.cpp index 7c4a2085b2..67858e9d46 100644 --- a/modules/bmp/register_types.cpp +++ b/modules/bmp/register_types.cpp @@ -32,14 +32,14 @@ #include "image_loader_bmp.h" -static ImageLoaderBMP *image_loader_bmp = nullptr; +static Ref<ImageLoaderBMP> image_loader_bmp; void initialize_bmp_module(ModuleInitializationLevel p_level) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { return; } - image_loader_bmp = memnew(ImageLoaderBMP); + image_loader_bmp.instantiate(); ImageLoader::add_image_format_loader(image_loader_bmp); } @@ -48,5 +48,6 @@ void uninitialize_bmp_module(ModuleInitializationLevel p_level) { return; } - memdelete(image_loader_bmp); + ImageLoader::remove_image_format_loader(image_loader_bmp); + image_loader_bmp.unref(); } diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml index 4a38caea52..6cf8c1a30e 100644 --- a/modules/gdscript/doc_classes/@GDScript.xml +++ b/modules/gdscript/doc_classes/@GDScript.xml @@ -35,14 +35,14 @@ <description> Asserts that the [code]condition[/code] is [code]true[/code]. If the [code]condition[/code] is [code]false[/code], an error is generated. When running from the editor, the running project will also be paused until you resume it. This can be used as a stronger form of [method @GlobalScope.push_error] for reporting errors to project developers or add-on users. [b]Note:[/b] For performance reasons, the code inside [method assert] is only executed in debug builds or when running the project from the editor. Don't include code that has side effects in an [method assert] call. Otherwise, the project will behave differently when exported in release mode. - 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. + The optional [code]message[/code] argument, if given, is shown in addition to the generic "Assertion failed" message. It must be a static string, so format strings can't be used. You can use this to provide additional details about why the assertion failed. [codeblock] # Imagine we always want speed to be between 0 and 20. var speed = -10 assert(speed < 20) # True, the program will continue assert(speed >= 0) # False, the program will stop assert(speed >= 0 and speed < 20) # You can also combine the two conditional statements in one check - assert(speed < 20, "speed = %f, but the speed limit is 20" % speed) # Show a message with clarifying details + assert(speed < 20, "the speed limit is 20") # Show a message [/codeblock] </description> </method> @@ -555,7 +555,7 @@ <annotation name="@onready"> <return type="void" /> <description> - Mark the following property as assigned on [Node]'s ready state change. Values for these properties are no assigned immediately upon the node's creation, and instead are computed and stored right before [method Node._ready]. + Mark the following property as assigned on [Node]'s ready state change. Values for these properties are not assigned immediately upon the node's creation, and instead are computed and stored right before [method Node._ready]. [codeblock] @onready var character_name: Label = $Label [/codeblock] diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index 10babad378..1cff2181af 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -1077,10 +1077,12 @@ Error GDScript::load_source_code(const String &p_path) { } source = s; + path = p_path; #ifdef TOOLS_ENABLED source_changed_cache = true; -#endif - path = p_path; + set_edited(false); + set_last_modified_time(FileAccess::get_modified_time(path)); +#endif // TOOLS_ENABLED return OK; } diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp index e37ac1dc3b..32d9aec84f 100644 --- a/modules/gdscript/gdscript_analyzer.cpp +++ b/modules/gdscript/gdscript_analyzer.cpp @@ -484,12 +484,23 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type if (parser->script_path == ScriptServer::get_global_class_path(first)) { result = parser->head->get_datatype(); } else { - Ref<GDScriptParserRef> ref = get_parser_for(ScriptServer::get_global_class_path(first)); - if (!ref.is_valid() || ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED) != OK) { - push_error(vformat(R"(Could not parse global class "%s" from "%s".)", first, ScriptServer::get_global_class_path(first)), p_type); - return GDScriptParser::DataType(); + String path = ScriptServer::get_global_class_path(first); + String ext = path.get_extension(); + if (ext == GDScriptLanguage::get_singleton()->get_extension()) { + Ref<GDScriptParserRef> ref = get_parser_for(path); + if (!ref.is_valid() || ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED) != OK) { + push_error(vformat(R"(Could not parse global class "%s" from "%s".)", first, ScriptServer::get_global_class_path(first)), p_type); + return GDScriptParser::DataType(); + } + result = ref->get_parser()->head->get_datatype(); + } else { + result.kind = GDScriptParser::DataType::SCRIPT; + result.native_type = ScriptServer::get_global_class_native_base(first); + result.script_type = ResourceLoader::load(path, "Script"); + result.script_path = path; + result.is_constant = true; + result.is_meta_type = false; } - result = ref->get_parser()->head->get_datatype(); } } else if (ProjectSettings::get_singleton()->has_autoload(first) && ProjectSettings::get_singleton()->get_autoload(first).is_singleton) { const ProjectSettings::AutoloadInfo &autoload = ProjectSettings::get_singleton()->get_autoload(first); @@ -540,12 +551,13 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type result = ref->get_parser()->head->get_datatype(); result.is_meta_type = false; } else { - Ref<GDScript> script = member.constant->initializer->reduced_value; + Ref<Script> script = member.constant->initializer->reduced_value; result.kind = GDScriptParser::DataType::SCRIPT; result.builtin_type = Variant::OBJECT; result.script_type = script; result.script_path = script->get_path(); result.native_type = script->get_instance_base_type(); + result.is_meta_type = false; } break; } @@ -2676,31 +2688,45 @@ void GDScriptAnalyzer::reduce_get_node(GDScriptParser::GetNodeNode *p_get_node) GDScriptParser::DataType GDScriptAnalyzer::make_global_class_meta_type(const StringName &p_class_name, const GDScriptParser::Node *p_source) { GDScriptParser::DataType type; - Ref<GDScriptParserRef> ref = get_parser_for(ScriptServer::get_global_class_path(p_class_name)); - if (ref.is_null()) { - push_error(vformat(R"(Could not find script for class "%s".)", p_class_name), p_source); - type.type_source = GDScriptParser::DataType::UNDETECTED; - type.kind = GDScriptParser::DataType::VARIANT; + String path = ScriptServer::get_global_class_path(p_class_name); + String ext = path.get_extension(); + if (ext == GDScriptLanguage::get_singleton()->get_extension()) { + Ref<GDScriptParserRef> ref = get_parser_for(path); + if (ref.is_null()) { + push_error(vformat(R"(Could not find script for class "%s".)", p_class_name), p_source); + type.type_source = GDScriptParser::DataType::UNDETECTED; + type.kind = GDScriptParser::DataType::VARIANT; + return type; + } + + Error err = ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED); + if (err) { + push_error(vformat(R"(Could not resolve class "%s", because of a parser error.)", p_class_name), p_source); + type.type_source = GDScriptParser::DataType::UNDETECTED; + type.kind = GDScriptParser::DataType::VARIANT; + return type; + } + + type.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; + type.kind = GDScriptParser::DataType::CLASS; + type.builtin_type = Variant::OBJECT; + type.native_type = ScriptServer::get_global_class_native_base(p_class_name); + type.class_type = ref->get_parser()->head; + type.script_path = ref->get_parser()->script_path; + type.is_constant = true; + type.is_meta_type = true; return type; - } - - Error err = ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED); - if (err) { - push_error(vformat(R"(Could not resolve class "%s", because of a parser error.)", p_class_name), p_source); - type.type_source = GDScriptParser::DataType::UNDETECTED; - type.kind = GDScriptParser::DataType::VARIANT; + } else { + type.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; + type.kind = GDScriptParser::DataType::SCRIPT; + type.builtin_type = Variant::OBJECT; + type.native_type = ScriptServer::get_global_class_native_base(p_class_name); + type.script_type = ResourceLoader::load(path, "Script"); + type.script_path = path; + type.is_constant = true; + type.is_meta_type = true; return type; } - - type.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; - type.kind = GDScriptParser::DataType::CLASS; - type.builtin_type = Variant::OBJECT; - type.native_type = ScriptServer::get_global_class_native_base(p_class_name); - type.class_type = ref->get_parser()->head; - type.script_path = ref->get_parser()->script_path; - type.is_constant = true; - type.is_meta_type = true; - return type; } void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNode *p_identifier, GDScriptParser::DataType *p_base) { @@ -3189,7 +3215,7 @@ void GDScriptAnalyzer::reduce_preload(GDScriptParser::PreloadNode *p_preload) { p_preload->resolved_path = parser->script_path.get_base_dir().path_join(p_preload->resolved_path); } p_preload->resolved_path = p_preload->resolved_path.simplify_path(); - if (!FileAccess::exists(p_preload->resolved_path)) { + if (!ResourceLoader::exists(p_preload->resolved_path)) { push_error(vformat(R"(Preload file "%s" does not exist.)", p_preload->resolved_path), p_preload->path); } else { // TODO: Don't load if validating: use completion cache. @@ -3808,7 +3834,7 @@ bool GDScriptAnalyzer::get_function_signature(GDScriptParser::Node *p_source, bo Ref<Script> base_script = p_base_type.script_type; - while (base_script.is_valid() && base_script->is_valid()) { + while (base_script.is_valid() && base_script->has_method(function_name)) { MethodInfo info = base_script->get_method_info(function_name); if (!(info == MethodInfo())) { diff --git a/modules/gdscript/gdscript_cache.cpp b/modules/gdscript/gdscript_cache.cpp index 48d5fbc569..c25f5b58d5 100644 --- a/modules/gdscript/gdscript_cache.cpp +++ b/modules/gdscript/gdscript_cache.cpp @@ -146,9 +146,7 @@ String GDScriptCache::get_source_code(const String &p_path) { Vector<uint8_t> source_file; Error err; Ref<FileAccess> f = FileAccess::open(p_path, FileAccess::READ, &err); - if (err) { - ERR_FAIL_COND_V(err, ""); - } + ERR_FAIL_COND_V(err, ""); uint64_t len = f->get_length(); source_file.resize(len + 1); diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index 888cd782fb..d8a06a8663 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -3758,6 +3758,33 @@ bool GDScriptParser::export_annotations(const AnnotationNode *p_annotation, Node return false; } break; + case GDScriptParser::DataType::CLASS: + // Can assume type is a global GDScript class. + if (!ClassDB::is_parent_class(export_type.native_type, SNAME("Resource"))) { + push_error(R"(Exported script type must extend Resource.)"); + return false; + } + variable->export_info.type = Variant::OBJECT; + variable->export_info.hint = PROPERTY_HINT_RESOURCE_TYPE; + variable->export_info.hint_string = export_type.class_type->identifier->name; + break; + case GDScriptParser::DataType::SCRIPT: { + StringName class_name; + if (export_type.script_type != nullptr && export_type.script_type.is_valid()) { + class_name = export_type.script_type->get_language()->get_global_class_name(export_type.script_type->get_path()); + } + if (class_name == StringName()) { + Ref<Script> script = ResourceLoader::load(export_type.script_path, SNAME("Script")); + if (script.is_valid()) { + class_name = script->get_language()->get_global_class_name(export_type.script_path); + } + } + if (class_name != StringName() && ClassDB::is_parent_class(ScriptServer::get_global_class_native_base(class_name), SNAME("Resource"))) { + variable->export_info.type = Variant::OBJECT; + variable->export_info.hint = PROPERTY_HINT_RESOURCE_TYPE; + variable->export_info.hint_string = class_name; + } + } break; case GDScriptParser::DataType::ENUM: { variable->export_info.type = Variant::INT; variable->export_info.hint = PROPERTY_HINT_ENUM; diff --git a/modules/gltf/SCsub b/modules/gltf/SCsub index 71f3ba58d9..5f111165fd 100644 --- a/modules/gltf/SCsub +++ b/modules/gltf/SCsub @@ -7,7 +7,7 @@ env_gltf = env_modules.Clone() # Godot source files env_gltf.add_source_files(env.modules_sources, "*.cpp") -env_gltf.add_source_files(env.modules_sources, "extensions/*.cpp") env_gltf.add_source_files(env.modules_sources, "structures/*.cpp") +SConscript("extensions/SCsub") if env["tools"]: env_gltf.add_source_files(env.modules_sources, "editor/*.cpp") diff --git a/modules/gltf/doc_classes/GLTFDocumentExtension.xml b/modules/gltf/doc_classes/GLTFDocumentExtension.xml index d2a9022445..936794976d 100644 --- a/modules/gltf/doc_classes/GLTFDocumentExtension.xml +++ b/modules/gltf/doc_classes/GLTFDocumentExtension.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="GLTFDocumentExtension" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../doc/class.xsd"> <brief_description> + [GLTFDocument] extension class. </brief_description> <description> + Extends the functionality of the [GLTFDocument] class by allowing you to run arbitrary code at various stages of GLTF import or export. </description> <tutorials> </tutorials> @@ -28,6 +30,12 @@ <description> </description> </method> + <method name="_get_supported_extensions" qualifiers="virtual"> + <return type="PackedStringArray" /> + <description> + Returns an array of the GLTF extensions supported by this GLTFDocumentExtension class. This is used to validate if a GLTF file with required extensions can be loaded. + </description> + </method> <method name="_import_node" qualifiers="virtual"> <return type="int" /> <param index="0" name="state" type="GLTFState" /> diff --git a/modules/gltf/doc_classes/GLTFNode.xml b/modules/gltf/doc_classes/GLTFNode.xml index e933e6046a..4d1aa89ac9 100644 --- a/modules/gltf/doc_classes/GLTFNode.xml +++ b/modules/gltf/doc_classes/GLTFNode.xml @@ -1,10 +1,13 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="GLTFNode" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../doc/class.xsd"> <brief_description> + GLTF node class. </brief_description> <description> + Represents a GLTF node. GLTF nodes may have names, transforms, children (other GLTF nodes), and more specialized properties (represented by their own classes). </description> <tutorials> + <link title="GLTF scene and node spec">https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_004_ScenesNodes.md"</link> </tutorials> <members> <member name="camera" type="int" setter="set_camera" getter="get_camera" default="-1"> diff --git a/modules/gltf/doc_classes/GLTFState.xml b/modules/gltf/doc_classes/GLTFState.xml index 1dbd89aed8..6c2f488c1c 100644 --- a/modules/gltf/doc_classes/GLTFState.xml +++ b/modules/gltf/doc_classes/GLTFState.xml @@ -7,6 +7,14 @@ <tutorials> </tutorials> <methods> + <method name="add_used_extension"> + <return type="void" /> + <param index="0" name="extension_name" type="String" /> + <param index="1" name="required" type="bool" /> + <description> + Appends an extension to the list of extensions used by this GLTF file during serialization. If [param required] is true, the extension will also be added to the list of required extensions. Do not run this in [method GLTFDocumentExtension._export_post], as that stage is too late to add extensions. The final list is sorted alphabetically. + </description> + </method> <method name="get_accessors"> <return type="GLTFAccessor[]" /> <description> diff --git a/modules/gltf/extensions/SCsub b/modules/gltf/extensions/SCsub new file mode 100644 index 0000000000..ad214bb79c --- /dev/null +++ b/modules/gltf/extensions/SCsub @@ -0,0 +1,9 @@ +#!/usr/bin/env python + +Import("env") +Import("env_modules") + +env_gltf = env_modules.Clone() + +# Godot source files +env_gltf.add_source_files(env.modules_sources, "*.cpp") diff --git a/modules/gltf/gltf_defines.h b/modules/gltf/gltf_defines.h index c20c87f798..9ee2397968 100644 --- a/modules/gltf/gltf_defines.h +++ b/modules/gltf/gltf_defines.h @@ -66,9 +66,9 @@ using GLTFBufferIndex = int; using GLTFBufferViewIndex = int; using GLTFCameraIndex = int; using GLTFImageIndex = int; +using GLTFLightIndex = int; using GLTFMaterialIndex = int; using GLTFMeshIndex = int; -using GLTFLightIndex = int; using GLTFNodeIndex = int; using GLTFSkeletonIndex = int; using GLTFSkinIndex = int; diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp index 6cb398b5f8..8d2e37be3a 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -191,14 +191,14 @@ Error GLTFDocument::_serialize(Ref<GLTFState> state, const String &p_path) { return Error::FAILED; } - /* STEP SERIALIZE SCENE */ + /* STEP SERIALIZE LIGHTS */ err = _serialize_lights(state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE EXTENSIONS */ - err = _serialize_extensions(state); + err = _serialize_gltf_extensions(state); if (err != OK) { return Error::FAILED; } @@ -219,9 +219,9 @@ Error GLTFDocument::_serialize(Ref<GLTFState> state, const String &p_path) { return OK; } -Error GLTFDocument::_serialize_extensions(Ref<GLTFState> state) const { - Array extensions_used; - Array extensions_required; +Error GLTFDocument::_serialize_gltf_extensions(Ref<GLTFState> state) const { + Vector<String> extensions_used = state->extensions_used; + Vector<String> extensions_required = state->extensions_required; if (!state->lights.is_empty()) { extensions_used.push_back("KHR_lights_punctual"); } @@ -230,9 +230,11 @@ Error GLTFDocument::_serialize_extensions(Ref<GLTFState> state) const { extensions_required.push_back("KHR_texture_transform"); } if (!extensions_used.is_empty()) { + extensions_used.sort(); state->json["extensionsUsed"] = extensions_used; } if (!extensions_required.is_empty()) { + extensions_required.sort(); state->json["extensionsRequired"] = extensions_required; } return OK; @@ -401,47 +403,47 @@ Error GLTFDocument::_serialize_nodes(Ref<GLTFState> state) { Array nodes; for (int i = 0; i < state->nodes.size(); i++) { Dictionary node; - Ref<GLTFNode> n = state->nodes[i]; + Ref<GLTFNode> gltf_node = state->nodes[i]; Dictionary extensions; node["extensions"] = extensions; - if (!n->get_name().is_empty()) { - node["name"] = n->get_name(); + if (!gltf_node->get_name().is_empty()) { + node["name"] = gltf_node->get_name(); } - if (n->camera != -1) { - node["camera"] = n->camera; + if (gltf_node->camera != -1) { + node["camera"] = gltf_node->camera; } - if (n->light != -1) { + if (gltf_node->light != -1) { Dictionary lights_punctual; extensions["KHR_lights_punctual"] = lights_punctual; - lights_punctual["light"] = n->light; + lights_punctual["light"] = gltf_node->light; } - if (n->mesh != -1) { - node["mesh"] = n->mesh; + if (gltf_node->mesh != -1) { + node["mesh"] = gltf_node->mesh; } - if (n->skin != -1) { - node["skin"] = n->skin; + if (gltf_node->skin != -1) { + node["skin"] = gltf_node->skin; } - if (n->skeleton != -1 && n->skin < 0) { + if (gltf_node->skeleton != -1 && gltf_node->skin < 0) { } - if (n->xform != Transform3D()) { - node["matrix"] = _xform_to_array(n->xform); + if (gltf_node->xform != Transform3D()) { + node["matrix"] = _xform_to_array(gltf_node->xform); } - if (!n->rotation.is_equal_approx(Quaternion())) { - node["rotation"] = _quaternion_to_array(n->rotation); + if (!gltf_node->rotation.is_equal_approx(Quaternion())) { + node["rotation"] = _quaternion_to_array(gltf_node->rotation); } - if (!n->scale.is_equal_approx(Vector3(1.0f, 1.0f, 1.0f))) { - node["scale"] = _vec3_to_arr(n->scale); + if (!gltf_node->scale.is_equal_approx(Vector3(1.0f, 1.0f, 1.0f))) { + node["scale"] = _vec3_to_arr(gltf_node->scale); } - if (!n->position.is_zero_approx()) { - node["translation"] = _vec3_to_arr(n->position); + if (!gltf_node->position.is_zero_approx()) { + node["translation"] = _vec3_to_arr(gltf_node->position); } - if (n->children.size()) { + if (gltf_node->children.size()) { Array children; - for (int j = 0; j < n->children.size(); j++) { - children.push_back(n->children[j]); + for (int j = 0; j < gltf_node->children.size(); j++) { + children.push_back(gltf_node->children[j]); } node["children"] = children; } @@ -450,7 +452,7 @@ Error GLTFDocument::_serialize_nodes(Ref<GLTFState> state) { Ref<GLTFDocumentExtension> ext = document_extensions[ext_i]; ERR_CONTINUE(ext.is_null()); ERR_CONTINUE(!state->scene_nodes.find(i)); - Error err = ext->export_node(state, n, state->json, state->scene_nodes[i]); + Error err = ext->export_node(state, gltf_node, node, state->scene_nodes[i]); ERR_CONTINUE(err != OK); } @@ -2673,7 +2675,7 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { } else if (a.has("JOINTS_0") && a.has("JOINTS_1")) { PackedInt32Array joints_0 = _decode_accessor_as_ints(state, a["JOINTS_0"], true); PackedInt32Array joints_1 = _decode_accessor_as_ints(state, a["JOINTS_1"], true); - ERR_FAIL_COND_V(joints_0.size() != joints_0.size(), ERR_INVALID_DATA); + ERR_FAIL_COND_V(joints_0.size() != joints_1.size(), ERR_INVALID_DATA); int32_t weight_8_count = JOINT_GROUP_SIZE * 2; Vector<int> joints; joints.resize(vertex_num * weight_8_count); @@ -5046,7 +5048,7 @@ ImporterMeshInstance3D *GLTFDocument::_generate_mesh_instance(Ref<GLTFState> sta return mi; } -Node3D *GLTFDocument::_generate_light(Ref<GLTFState> state, const GLTFNodeIndex node_index) { +Light3D *GLTFDocument::_generate_light(Ref<GLTFState> state, const GLTFNodeIndex node_index) { Ref<GLTFNode> gltf_node = state->nodes[node_index]; ERR_FAIL_INDEX_V(gltf_node->light, state->lights.size(), nullptr); @@ -5102,6 +5104,7 @@ Node3D *GLTFDocument::_generate_spatial(Ref<GLTFState> state, const GLTFNodeInde return spatial; } + void GLTFDocument::_convert_scene_node(Ref<GLTFState> state, Node *p_current, const GLTFNodeIndex p_gltf_parent, const GLTFNodeIndex p_gltf_root) { bool retflag = true; _check_visibility(p_current, retflag); @@ -6916,12 +6919,32 @@ Error GLTFDocument::append_from_file(String p_path, Ref<GLTFState> r_state, uint Error GLTFDocument::_parse_gltf_extensions(Ref<GLTFState> state) { ERR_FAIL_NULL_V(state, ERR_PARSE_ERROR); - if (state->json.has("extensionsRequired") && state->json["extensionsRequired"].get_type() == Variant::ARRAY) { - Array extensions_required = state->json["extensionsRequired"]; - if (extensions_required.find("KHR_draco_mesh_compression") != -1) { - ERR_PRINT("glTF2 extension KHR_draco_mesh_compression is not supported."); - return ERR_UNAVAILABLE; + if (state->json.has("extensionsUsed")) { + Vector<String> ext_array = state->json["extensionsUsed"]; + state->extensions_used = ext_array; + } + if (state->json.has("extensionsRequired")) { + Vector<String> ext_array = state->json["extensionsRequired"]; + state->extensions_required = ext_array; + } + HashSet<String> supported_extensions; + supported_extensions.insert("KHR_lights_punctual"); + supported_extensions.insert("KHR_materials_pbrSpecularGlossiness"); + supported_extensions.insert("KHR_texture_transform"); + for (int ext_i = 0; ext_i < document_extensions.size(); ext_i++) { + Ref<GLTFDocumentExtension> ext = document_extensions[ext_i]; + ERR_CONTINUE(ext.is_null()); + Vector<String> ext_supported_extensions = ext->get_supported_extensions(); + for (int i = 0; i < ext_supported_extensions.size(); ++i) { + supported_extensions.insert(ext_supported_extensions[i]); } } - return OK; + Error ret = Error::OK; + for (int i = 0; i < state->extensions_required.size(); i++) { + if (!supported_extensions.has(state->extensions_required[i])) { + ERR_PRINT("GLTF: Can't import file '" + state->filename + "', required extension '" + String(state->extensions_required[i]) + "' is not supported. Are you missing a GLTFDocumentExtension plugin?"); + ret = ERR_UNAVAILABLE; + } + } + return ret; } diff --git a/modules/gltf/gltf_document.h b/modules/gltf/gltf_document.h index 36a2f94a4e..750d3d403e 100644 --- a/modules/gltf/gltf_document.h +++ b/modules/gltf/gltf_document.h @@ -188,7 +188,7 @@ private: const GLTFNodeIndex bone_index); ImporterMeshInstance3D *_generate_mesh_instance(Ref<GLTFState> state, const GLTFNodeIndex node_index); Camera3D *_generate_camera(Ref<GLTFState> state, const GLTFNodeIndex node_index); - Node3D *_generate_light(Ref<GLTFState> state, const GLTFNodeIndex node_index); + Light3D *_generate_light(Ref<GLTFState> state, const GLTFNodeIndex node_index); Node3D *_generate_spatial(Ref<GLTFState> state, const GLTFNodeIndex node_index); void _assign_scene_names(Ref<GLTFState> state); template <class T> @@ -265,7 +265,7 @@ private: Dictionary _serialize_texture_transform_uv2(Ref<BaseMaterial3D> p_material); Error _serialize_version(Ref<GLTFState> state); Error _serialize_file(Ref<GLTFState> state, const String p_path); - Error _serialize_extensions(Ref<GLTFState> state) const; + Error _serialize_gltf_extensions(Ref<GLTFState> state) const; public: // https://www.itu.int/rec/R-REC-BT.601 diff --git a/modules/gltf/gltf_document_extension.cpp b/modules/gltf/gltf_document_extension.cpp index d0bd7651e0..3b952f8246 100644 --- a/modules/gltf/gltf_document_extension.cpp +++ b/modules/gltf/gltf_document_extension.cpp @@ -31,6 +31,7 @@ #include "gltf_document_extension.h" void GLTFDocumentExtension::_bind_methods() { + GDVIRTUAL_BIND(_get_supported_extensions); GDVIRTUAL_BIND(_import_preflight, "state"); GDVIRTUAL_BIND(_import_post_parse, "state"); GDVIRTUAL_BIND(_import_node, "state", "gltf_node", "json", "node"); @@ -40,6 +41,12 @@ void GLTFDocumentExtension::_bind_methods() { GDVIRTUAL_BIND(_export_post, "state"); } +Vector<String> GLTFDocumentExtension::get_supported_extensions() { + Vector<String> ret; + GDVIRTUAL_CALL(_get_supported_extensions, ret); + return ret; +} + Error GLTFDocumentExtension::import_post(Ref<GLTFState> p_state, Node *p_root) { ERR_FAIL_NULL_V(p_root, ERR_INVALID_PARAMETER); ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER); diff --git a/modules/gltf/gltf_document_extension.h b/modules/gltf/gltf_document_extension.h index 0ef9109584..d4bb3993dc 100644 --- a/modules/gltf/gltf_document_extension.h +++ b/modules/gltf/gltf_document_extension.h @@ -41,6 +41,7 @@ protected: static void _bind_methods(); public: + virtual Vector<String> get_supported_extensions(); virtual Error import_preflight(Ref<GLTFState> p_state); virtual Error import_post_parse(Ref<GLTFState> p_state); virtual Error export_post(Ref<GLTFState> p_state); @@ -48,6 +49,7 @@ public: virtual Error export_preflight(Node *p_state); virtual Error import_node(Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node, Dictionary &r_json, Node *p_node); virtual Error export_node(Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node, Dictionary &r_json, Node *p_node); + GDVIRTUAL0R(Vector<String>, _get_supported_extensions); GDVIRTUAL1R(int, _import_preflight, Ref<GLTFState>); GDVIRTUAL1R(int, _import_post_parse, Ref<GLTFState>); GDVIRTUAL4R(int, _import_node, Ref<GLTFState>, Ref<GLTFNode>, Dictionary, Node *); diff --git a/modules/gltf/gltf_state.cpp b/modules/gltf/gltf_state.cpp index 85bac446cc..a23fb39503 100644 --- a/modules/gltf/gltf_state.cpp +++ b/modules/gltf/gltf_state.cpp @@ -31,6 +31,7 @@ #include "gltf_state.h" void GLTFState::_bind_methods() { + ClassDB::bind_method(D_METHOD("add_used_extension", "extension_name", "required"), &GLTFState::add_used_extension); ClassDB::bind_method(D_METHOD("get_json"), &GLTFState::get_json); ClassDB::bind_method(D_METHOD("set_json", "json"), &GLTFState::set_json); ClassDB::bind_method(D_METHOD("get_major_version"), &GLTFState::get_major_version); @@ -112,6 +113,17 @@ void GLTFState::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "animations", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_animations", "get_animations"); // Vector<Ref<GLTFAnimation>> } +void GLTFState::add_used_extension(const String &p_extension_name, bool p_required) { + if (!extensions_used.has(p_extension_name)) { + extensions_used.push_back(p_extension_name); + } + if (p_required) { + if (!extensions_required.has(p_extension_name)) { + extensions_required.push_back(p_extension_name); + } + } +} + Dictionary GLTFState::get_json() { return json; } diff --git a/modules/gltf/gltf_state.h b/modules/gltf/gltf_state.h index 6b2d1ca228..791431f376 100644 --- a/modules/gltf/gltf_state.h +++ b/modules/gltf/gltf_state.h @@ -78,6 +78,8 @@ class GLTFState : public Resource { Vector<int> root_nodes; Vector<Ref<GLTFTexture>> textures; Vector<Ref<Texture2D>> images; + Vector<String> extensions_used; + Vector<String> extensions_required; Vector<Ref<GLTFSkin>> skins; Vector<Ref<GLTFCamera>> cameras; @@ -97,6 +99,8 @@ protected: static void _bind_methods(); public: + void add_used_extension(const String &p_extension, bool p_required = false); + Dictionary get_json(); void set_json(Dictionary p_json); diff --git a/modules/gltf/register_types.cpp b/modules/gltf/register_types.cpp index dbbccc9bcc..6e7f7d6fed 100644 --- a/modules/gltf/register_types.cpp +++ b/modules/gltf/register_types.cpp @@ -142,6 +142,11 @@ void initialize_gltf_module(ModuleInitializationLevel p_level) { GLOBAL_DEF_RST("filesystem/import/fbx/enabled", true); GDREGISTER_CLASS(EditorSceneFormatImporterBlend); GDREGISTER_CLASS(EditorSceneFormatImporterFBX); + // Can't (a priori) run external app on these platforms. + GLOBAL_DEF_RST("filesystem/import/blender/enabled.android", false); + GLOBAL_DEF_RST("filesystem/import/blender/enabled.web", false); + GLOBAL_DEF_RST("filesystem/import/fbx/enabled.android", false); + GLOBAL_DEF_RST("filesystem/import/fbx/enabled.web", false); ClassDB::set_current_api(prev_api); EditorNode::add_init_callback(_editor_init); diff --git a/modules/gridmap/doc_classes/GridMap.xml b/modules/gridmap/doc_classes/GridMap.xml index 5548006834..ed6cb8656a 100644 --- a/modules/gridmap/doc_classes/GridMap.xml +++ b/modules/gridmap/doc_classes/GridMap.xml @@ -94,6 +94,13 @@ Returns whether or not the specified layer of the [member navigation_layers] bitmask is enabled, given a [code]layer_number[/code] between 1 and 32. </description> </method> + <method name="get_navigation_map" qualifiers="const"> + <return type="RID" /> + <description> + Returns the [RID] of the navigation map this GridMap node uses for its cell baked navigation meshes. + This function returns always the map set on the GridMap node and not the map on the NavigationServer. If the map is changed directly with the NavigationServer API the GridMap node will not be aware of the map change. + </description> + </method> <method name="get_orthogonal_index_from_basis" qualifiers="const"> <return type="int" /> <param index="0" name="basis" type="Basis" /> @@ -176,6 +183,13 @@ Based on [code]value[/code], enables or disables the specified layer in the [member navigation_layers] bitmask, given a [code]layer_number[/code] between 1 and 32. </description> </method> + <method name="set_navigation_map"> + <return type="void" /> + <param index="0" name="navigation_map" type="RID" /> + <description> + Sets the [RID] of the navigation map this GridMap node should use for its cell baked navigation meshes. + </description> + </method> </methods> <members> <member name="bake_navigation" type="bool" setter="set_bake_navigation" getter="is_baking_navigation" default="false"> diff --git a/modules/gridmap/editor/grid_map_editor_plugin.cpp b/modules/gridmap/editor/grid_map_editor_plugin.cpp index 17f9832096..b5afd8507d 100644 --- a/modules/gridmap/editor/grid_map_editor_plugin.cpp +++ b/modules/gridmap/editor/grid_map_editor_plugin.cpp @@ -603,13 +603,13 @@ EditorPlugin::AfterGUIInput GridMapEditor::forward_spatial_input_event(Camera3D Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == MouseButton::WHEEL_UP && (mb->is_command_pressed() || mb->is_shift_pressed())) { + if (mb->get_button_index() == MouseButton::WHEEL_UP && (mb->is_command_or_control_pressed() || mb->is_shift_pressed())) { if (mb->is_pressed()) { floor->set_value(floor->get_value() + mb->get_factor()); } return EditorPlugin::AFTER_GUI_INPUT_STOP; // Eaten. - } else if (mb->get_button_index() == MouseButton::WHEEL_DOWN && (mb->is_command_pressed() || mb->is_shift_pressed())) { + } else if (mb->get_button_index() == MouseButton::WHEEL_DOWN && (mb->is_command_or_control_pressed() || mb->is_shift_pressed())) { if (mb->is_pressed()) { floor->set_value(floor->get_value() - mb->get_factor()); } @@ -629,7 +629,7 @@ EditorPlugin::AfterGUIInput GridMapEditor::forward_spatial_input_event(Camera3D } else if (mb->is_shift_pressed() && can_edit) { input_action = INPUT_SELECT; last_selection = selection; - } else if (mb->is_command_pressed() && can_edit) { + } else if (mb->is_command_or_control_pressed() && can_edit) { input_action = INPUT_PICK; } else { input_action = INPUT_PAINT; @@ -746,7 +746,7 @@ EditorPlugin::AfterGUIInput GridMapEditor::forward_spatial_input_event(Camera3D Ref<InputEventPanGesture> pan_gesture = p_event; if (pan_gesture.is_valid()) { - if (pan_gesture->is_alt_pressed() && (pan_gesture->is_command_pressed() || pan_gesture->is_shift_pressed())) { + if (pan_gesture->is_alt_pressed() && (pan_gesture->is_command_or_control_pressed() || pan_gesture->is_shift_pressed())) { const real_t delta = pan_gesture->get_delta().y * 0.5; accumulated_floor_delta += delta; int step = 0; @@ -807,7 +807,7 @@ void GridMapEditor::_mesh_library_palette_input(const Ref<InputEvent> &p_ie) { const Ref<InputEventMouseButton> mb = p_ie; // Zoom in/out using Ctrl + mouse wheel - if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed()) { + if (mb.is_valid() && mb->is_pressed() && mb->is_command_or_control_pressed()) { if (mb->is_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP) { size_slider->set_value(size_slider->get_value() + 0.2); } diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp index ac0755cf68..466a2efd21 100644 --- a/modules/gridmap/grid_map.cpp +++ b/modules/gridmap/grid_map.cpp @@ -226,6 +226,27 @@ bool GridMap::is_baking_navigation() { return bake_navigation; } +void GridMap::set_navigation_map(RID p_navigation_map) { + map_override = p_navigation_map; + for (const KeyValue<OctantKey, Octant *> &E : octant_map) { + Octant &g = *octant_map[E.key]; + for (KeyValue<IndexKey, Octant::NavMesh> &F : g.navmesh_ids) { + if (F.value.region.is_valid()) { + NavigationServer3D::get_singleton()->region_set_map(F.value.region, map_override); + } + } + } +} + +RID GridMap::get_navigation_map() const { + if (map_override.is_valid()) { + return map_override; + } else if (is_inside_tree()) { + return get_world_3d()->get_navigation_map(); + } + return RID(); +} + void GridMap::set_navigation_layers(uint32_t p_navigation_layers) { navigation_layers = p_navigation_layers; _recreate_octant_data(); @@ -639,10 +660,15 @@ bool GridMap::_octant_update(const OctantKey &p_key) { NavigationServer3D::get_singleton()->region_set_navmesh(region, navmesh); NavigationServer3D::get_singleton()->region_set_transform(region, get_global_transform() * nm.xform); if (is_inside_tree()) { - NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map()); + if (map_override.is_valid()) { + NavigationServer3D::get_singleton()->region_set_map(region, map_override); + } else { + NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map()); + } } nm.region = region; +#ifdef DEBUG_ENABLED // add navigation debugmesh visual instances if debug is enabled SceneTree *st = SceneTree::get_singleton(); if (st && st->is_debugging_navigation_hint()) { @@ -650,15 +676,14 @@ bool GridMap::_octant_update(const OctantKey &p_key) { RID navmesh_debug_rid = navmesh->get_debug_mesh()->get_rid(); nm.navmesh_debug_instance = RS::get_singleton()->instance_create(); RS::get_singleton()->instance_set_base(nm.navmesh_debug_instance, navmesh_debug_rid); - RS::get_singleton()->mesh_surface_set_material(navmesh_debug_rid, 0, st->get_debug_navigation_material()->get_rid()); } if (is_inside_tree()) { RS::get_singleton()->instance_set_scenario(nm.navmesh_debug_instance, get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_transform(nm.navmesh_debug_instance, get_global_transform() * nm.xform); } } +#endif // DEBUG_ENABLED } - g.navmesh_ids[E] = nm; } } @@ -757,7 +782,11 @@ void GridMap::_octant_enter_world(const OctantKey &p_key) { NavigationServer3D::get_singleton()->region_set_navigation_layers(region, navigation_layers); NavigationServer3D::get_singleton()->region_set_navmesh(region, nm); NavigationServer3D::get_singleton()->region_set_transform(region, get_global_transform() * F.value.xform); - NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map()); + if (map_override.is_valid()) { + NavigationServer3D::get_singleton()->region_set_map(region, map_override); + } else { + NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map()); + } F.value.region = region; } @@ -1022,6 +1051,9 @@ void GridMap::_bind_methods() { ClassDB::bind_method(D_METHOD("set_bake_navigation", "bake_navigation"), &GridMap::set_bake_navigation); ClassDB::bind_method(D_METHOD("is_baking_navigation"), &GridMap::is_baking_navigation); + ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &GridMap::set_navigation_map); + ClassDB::bind_method(D_METHOD("get_navigation_map"), &GridMap::get_navigation_map); + ClassDB::bind_method(D_METHOD("set_navigation_layers", "layers"), &GridMap::set_navigation_layers); ClassDB::bind_method(D_METHOD("get_navigation_layers"), &GridMap::get_navigation_layers); diff --git a/modules/gridmap/grid_map.h b/modules/gridmap/grid_map.h index 4a4e970fd3..6a53457d25 100644 --- a/modules/gridmap/grid_map.h +++ b/modules/gridmap/grid_map.h @@ -152,6 +152,7 @@ class GridMap : public Node3D { uint32_t collision_mask = 1; Ref<PhysicsMaterial> physics_material; bool bake_navigation = false; + RID map_override; uint32_t navigation_layers = 1; Transform3D last_transform; @@ -247,6 +248,9 @@ public: void set_bake_navigation(bool p_bake_navigation); bool is_baking_navigation(); + void set_navigation_map(RID p_navigation_map); + RID get_navigation_map() const; + void set_navigation_layers(uint32_t p_navigation_layers); uint32_t get_navigation_layers() const; diff --git a/modules/hdr/image_loader_hdr.cpp b/modules/hdr/image_loader_hdr.cpp index e7c6fe592d..6f0bc16a26 100644 --- a/modules/hdr/image_loader_hdr.cpp +++ b/modules/hdr/image_loader_hdr.cpp @@ -33,7 +33,7 @@ #include "core/os/os.h" #include "core/string/print_string.h" -Error ImageLoaderHDR::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderHDR::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { String header = f->get_token(); ERR_FAIL_COND_V_MSG(header != "#?RADIANCE" && header != "#?RGBE", ERR_FILE_UNRECOGNIZED, "Unsupported header information in HDR: " + header + "."); diff --git a/modules/hdr/image_loader_hdr.h b/modules/hdr/image_loader_hdr.h index 1bff05129b..5f817f0ba8 100644 --- a/modules/hdr/image_loader_hdr.h +++ b/modules/hdr/image_loader_hdr.h @@ -35,7 +35,7 @@ class ImageLoaderHDR : public ImageFormatLoader { public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderHDR(); }; diff --git a/modules/hdr/register_types.cpp b/modules/hdr/register_types.cpp index b988bf4587..18b1a73f1c 100644 --- a/modules/hdr/register_types.cpp +++ b/modules/hdr/register_types.cpp @@ -32,14 +32,14 @@ #include "image_loader_hdr.h" -static ImageLoaderHDR *image_loader_hdr = nullptr; +static Ref<ImageLoaderHDR> image_loader_hdr; void initialize_hdr_module(ModuleInitializationLevel p_level) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { return; } - image_loader_hdr = memnew(ImageLoaderHDR); + image_loader_hdr.instantiate(); ImageLoader::add_image_format_loader(image_loader_hdr); } @@ -48,5 +48,6 @@ void uninitialize_hdr_module(ModuleInitializationLevel p_level) { return; } - memdelete(image_loader_hdr); + ImageLoader::remove_image_format_loader(image_loader_hdr); + image_loader_hdr.unref(); } diff --git a/modules/jpg/image_loader_jpegd.cpp b/modules/jpg/image_loader_jpegd.cpp index 3e138bf633..ce20ac9060 100644 --- a/modules/jpg/image_loader_jpegd.cpp +++ b/modules/jpg/image_loader_jpegd.cpp @@ -104,7 +104,7 @@ Error jpeg_load_image_from_buffer(Image *p_image, const uint8_t *p_buffer, int p return OK; } -Error ImageLoaderJPG::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderJPG::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { Vector<uint8_t> src_image; uint64_t src_image_len = f->get_length(); ERR_FAIL_COND_V(src_image_len == 0, ERR_FILE_CORRUPT); diff --git a/modules/jpg/image_loader_jpegd.h b/modules/jpg/image_loader_jpegd.h index caa0461d05..f63db51521 100644 --- a/modules/jpg/image_loader_jpegd.h +++ b/modules/jpg/image_loader_jpegd.h @@ -35,7 +35,7 @@ class ImageLoaderJPG : public ImageFormatLoader { public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderJPG(); }; diff --git a/modules/jpg/register_types.cpp b/modules/jpg/register_types.cpp index b8b48a550f..7da216bbe2 100644 --- a/modules/jpg/register_types.cpp +++ b/modules/jpg/register_types.cpp @@ -32,14 +32,14 @@ #include "image_loader_jpegd.h" -static ImageLoaderJPG *image_loader_jpg = nullptr; +static Ref<ImageLoaderJPG> image_loader_jpg; void initialize_jpg_module(ModuleInitializationLevel p_level) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { return; } - image_loader_jpg = memnew(ImageLoaderJPG); + image_loader_jpg.instantiate(); ImageLoader::add_image_format_loader(image_loader_jpg); } @@ -48,5 +48,6 @@ void uninitialize_jpg_module(ModuleInitializationLevel p_level) { return; } - memdelete(image_loader_jpg); + ImageLoader::remove_image_format_loader(image_loader_jpg); + image_loader_jpg.unref(); } diff --git a/modules/mbedtls/crypto_mbedtls.h b/modules/mbedtls/crypto_mbedtls.h index 5ba7e9cbf6..f129ef6f11 100644 --- a/modules/mbedtls/crypto_mbedtls.h +++ b/modules/mbedtls/crypto_mbedtls.h @@ -39,7 +39,7 @@ #include <mbedtls/ssl.h> class CryptoMbedTLS; -class SSLContextMbedTLS; +class TLSContextMbedTLS; class CryptoKeyMbedTLS : public CryptoKey { private: mbedtls_pk_context pkey; @@ -69,7 +69,7 @@ public: _FORCE_INLINE_ void unlock() { locks--; } friend class CryptoMbedTLS; - friend class SSLContextMbedTLS; + friend class TLSContextMbedTLS; }; class X509CertificateMbedTLS : public X509Certificate { @@ -98,7 +98,7 @@ public: _FORCE_INLINE_ void unlock() { locks--; } friend class CryptoMbedTLS; - friend class SSLContextMbedTLS; + friend class TLSContextMbedTLS; }; class HMACContextMbedTLS : public HMACContext { diff --git a/modules/mbedtls/dtls_server_mbedtls.h b/modules/mbedtls/dtls_server_mbedtls.h index a6626c9f65..0c9f10b5ed 100644 --- a/modules/mbedtls/dtls_server_mbedtls.h +++ b/modules/mbedtls/dtls_server_mbedtls.h @@ -32,7 +32,7 @@ #define DTLS_SERVER_MBEDTLS_H #include "core/io/dtls_server.h" -#include "ssl_context_mbedtls.h" +#include "tls_context_mbedtls.h" class DTLSServerMbedTLS : public DTLSServer { private: diff --git a/modules/mbedtls/packet_peer_mbed_dtls.cpp b/modules/mbedtls/packet_peer_mbed_dtls.cpp index 78a06ff4a1..e84d95773d 100644 --- a/modules/mbedtls/packet_peer_mbed_dtls.cpp +++ b/modules/mbedtls/packet_peer_mbed_dtls.cpp @@ -79,7 +79,7 @@ int PacketPeerMbedDTLS::bio_recv(void *ctx, unsigned char *buf, size_t len) { } void PacketPeerMbedDTLS::_cleanup() { - ssl_ctx->clear(); + tls_ctx->clear(); base = Ref<PacketPeer>(); status = STATUS_DISCONNECTED; } @@ -91,16 +91,16 @@ int PacketPeerMbedDTLS::_set_cookie() { uint16_t port = base->get_packet_port(); memcpy(client_id, addr.get_ipv6(), 16); memcpy(&client_id[16], (uint8_t *)&port, 2); - return mbedtls_ssl_set_client_transport_id(ssl_ctx->get_context(), client_id, 18); + return mbedtls_ssl_set_client_transport_id(tls_ctx->get_context(), client_id, 18); } Error PacketPeerMbedDTLS::_do_handshake() { int ret = 0; - while ((ret = mbedtls_ssl_handshake(ssl_ctx->get_context())) != 0) { + while ((ret = mbedtls_ssl_handshake(tls_ctx->get_context())) != 0) { if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) { if (ret != MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED) { ERR_PRINT("TLS handshake error: " + itos(ret)); - SSLContextMbedTLS::print_mbedtls_error(ret); + TLSContextMbedTLS::print_mbedtls_error(ret); } _cleanup(); status = STATUS_ERROR; @@ -121,12 +121,12 @@ Error PacketPeerMbedDTLS::connect_to_peer(Ref<PacketPeerUDP> p_base, bool p_vali int ret = 0; int authmode = p_validate_certs ? MBEDTLS_SSL_VERIFY_REQUIRED : MBEDTLS_SSL_VERIFY_NONE; - Error err = ssl_ctx->init_client(MBEDTLS_SSL_TRANSPORT_DATAGRAM, authmode, p_ca_certs); + Error err = tls_ctx->init_client(MBEDTLS_SSL_TRANSPORT_DATAGRAM, authmode, p_ca_certs); ERR_FAIL_COND_V(err != OK, err); - mbedtls_ssl_set_hostname(ssl_ctx->get_context(), p_for_hostname.utf8().get_data()); - mbedtls_ssl_set_bio(ssl_ctx->get_context(), this, bio_send, bio_recv, nullptr); - mbedtls_ssl_set_timer_cb(ssl_ctx->get_context(), &timer, mbedtls_timing_set_delay, mbedtls_timing_get_delay); + mbedtls_ssl_set_hostname(tls_ctx->get_context(), p_for_hostname.utf8().get_data()); + mbedtls_ssl_set_bio(tls_ctx->get_context(), this, bio_send, bio_recv, nullptr); + mbedtls_ssl_set_timer_cb(tls_ctx->get_context(), &timer, mbedtls_timing_set_delay, mbedtls_timing_get_delay); status = STATUS_HANDSHAKING; @@ -139,13 +139,13 @@ Error PacketPeerMbedDTLS::connect_to_peer(Ref<PacketPeerUDP> p_base, bool p_vali } Error PacketPeerMbedDTLS::accept_peer(Ref<PacketPeerUDP> p_base, Ref<CryptoKey> p_key, Ref<X509Certificate> p_cert, Ref<X509Certificate> p_ca_chain, Ref<CookieContextMbedTLS> p_cookies) { - Error err = ssl_ctx->init_server(MBEDTLS_SSL_TRANSPORT_DATAGRAM, MBEDTLS_SSL_VERIFY_NONE, p_key, p_cert, p_cookies); + Error err = tls_ctx->init_server(MBEDTLS_SSL_TRANSPORT_DATAGRAM, MBEDTLS_SSL_VERIFY_NONE, p_key, p_cert, p_cookies); ERR_FAIL_COND_V(err != OK, err); base = p_base; base->set_blocking_mode(false); - mbedtls_ssl_session_reset(ssl_ctx->get_context()); + mbedtls_ssl_session_reset(tls_ctx->get_context()); int ret = _set_cookie(); if (ret != 0) { @@ -153,8 +153,8 @@ Error PacketPeerMbedDTLS::accept_peer(Ref<PacketPeerUDP> p_base, Ref<CryptoKey> ERR_FAIL_V_MSG(FAILED, "Error setting DTLS client cookie"); } - mbedtls_ssl_set_bio(ssl_ctx->get_context(), this, bio_send, bio_recv, nullptr); - mbedtls_ssl_set_timer_cb(ssl_ctx->get_context(), &timer, mbedtls_timing_set_delay, mbedtls_timing_get_delay); + mbedtls_ssl_set_bio(tls_ctx->get_context(), this, bio_send, bio_recv, nullptr); + mbedtls_ssl_set_timer_cb(tls_ctx->get_context(), &timer, mbedtls_timing_set_delay, mbedtls_timing_get_delay); status = STATUS_HANDSHAKING; @@ -173,11 +173,11 @@ Error PacketPeerMbedDTLS::put_packet(const uint8_t *p_buffer, int p_bytes) { return OK; } - int ret = mbedtls_ssl_write(ssl_ctx->get_context(), p_buffer, p_bytes); + int ret = mbedtls_ssl_write(tls_ctx->get_context(), p_buffer, p_bytes); if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) { ret = 0; // non blocking io } else if (ret <= 0) { - SSLContextMbedTLS::print_mbedtls_error(ret); + TLSContextMbedTLS::print_mbedtls_error(ret); _cleanup(); return ERR_CONNECTION_ERROR; } @@ -190,7 +190,7 @@ Error PacketPeerMbedDTLS::get_packet(const uint8_t **r_buffer, int &r_bytes) { r_bytes = 0; - int ret = mbedtls_ssl_read(ssl_ctx->get_context(), packet_buffer, PACKET_BUFFER_SIZE); + int ret = mbedtls_ssl_read(tls_ctx->get_context(), packet_buffer, PACKET_BUFFER_SIZE); if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) { ret = 0; // non blocking io } else if (ret <= 0) { @@ -200,7 +200,7 @@ Error PacketPeerMbedDTLS::get_packet(const uint8_t **r_buffer, int &r_bytes) { } else { _cleanup(); status = STATUS_ERROR; - SSLContextMbedTLS::print_mbedtls_error(ret); + TLSContextMbedTLS::print_mbedtls_error(ret); } return ERR_CONNECTION_ERROR; } @@ -220,7 +220,7 @@ void PacketPeerMbedDTLS::poll() { ERR_FAIL_COND(!base.is_valid()); - int ret = mbedtls_ssl_read(ssl_ctx->get_context(), nullptr, 0); + int ret = mbedtls_ssl_read(tls_ctx->get_context(), nullptr, 0); if (ret < 0 && ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) { if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) { @@ -229,7 +229,7 @@ void PacketPeerMbedDTLS::poll() { } else { _cleanup(); status = STATUS_ERROR; - SSLContextMbedTLS::print_mbedtls_error(ret); + TLSContextMbedTLS::print_mbedtls_error(ret); } } } @@ -237,7 +237,7 @@ void PacketPeerMbedDTLS::poll() { int PacketPeerMbedDTLS::get_available_packet_count() const { ERR_FAIL_COND_V(status != STATUS_CONNECTED, 0); - return mbedtls_ssl_get_bytes_avail(&(ssl_ctx->ssl)) > 0 ? 1 : 0; + return mbedtls_ssl_get_bytes_avail(&(tls_ctx->tls)) > 0 ? 1 : 0; } int PacketPeerMbedDTLS::get_max_packet_size() const { @@ -245,7 +245,7 @@ int PacketPeerMbedDTLS::get_max_packet_size() const { } PacketPeerMbedDTLS::PacketPeerMbedDTLS() { - ssl_ctx.instantiate(); + tls_ctx.instantiate(); } PacketPeerMbedDTLS::~PacketPeerMbedDTLS() { @@ -261,7 +261,7 @@ void PacketPeerMbedDTLS::disconnect_from_peer() { int ret = 0; // Send SSL close notification, blocking, but ignore other errors. do { - ret = mbedtls_ssl_close_notify(ssl_ctx->get_context()); + ret = mbedtls_ssl_close_notify(tls_ctx->get_context()); } while (ret == MBEDTLS_ERR_SSL_WANT_WRITE); } diff --git a/modules/mbedtls/packet_peer_mbed_dtls.h b/modules/mbedtls/packet_peer_mbed_dtls.h index 5f2f42cd30..cc79057d67 100644 --- a/modules/mbedtls/packet_peer_mbed_dtls.h +++ b/modules/mbedtls/packet_peer_mbed_dtls.h @@ -32,7 +32,7 @@ #define PACKET_PEER_MBED_DTLS_H #include "core/io/packet_peer_dtls.h" -#include "ssl_context_mbedtls.h" +#include "tls_context_mbedtls.h" #include <mbedtls/timing.h> @@ -56,7 +56,7 @@ private: void _cleanup(); protected: - Ref<SSLContextMbedTLS> ssl_ctx; + Ref<TLSContextMbedTLS> tls_ctx; mbedtls_timing_delay_context timer; Error _do_handshake(); diff --git a/modules/mbedtls/register_types.cpp b/modules/mbedtls/register_types.cpp index 2d4a18b3fc..675091b617 100644 --- a/modules/mbedtls/register_types.cpp +++ b/modules/mbedtls/register_types.cpp @@ -45,7 +45,7 @@ void initialize_mbedtls_module(ModuleInitializationLevel p_level) { } CryptoMbedTLS::initialize_crypto(); - StreamPeerMbedTLS::initialize_ssl(); + StreamPeerMbedTLS::initialize_tls(); PacketPeerMbedDTLS::initialize_dtls(); DTLSServerMbedTLS::initialize(); } @@ -57,6 +57,6 @@ void uninitialize_mbedtls_module(ModuleInitializationLevel p_level) { DTLSServerMbedTLS::finalize(); PacketPeerMbedDTLS::finalize_dtls(); - StreamPeerMbedTLS::finalize_ssl(); + StreamPeerMbedTLS::finalize_tls(); CryptoMbedTLS::finalize_crypto(); } diff --git a/modules/mbedtls/stream_peer_mbedtls.cpp b/modules/mbedtls/stream_peer_mbedtls.cpp index 0bf4ca7032..a97c6bd916 100644 --- a/modules/mbedtls/stream_peer_mbedtls.cpp +++ b/modules/mbedtls/stream_peer_mbedtls.cpp @@ -74,18 +74,18 @@ int StreamPeerMbedTLS::bio_recv(void *ctx, unsigned char *buf, size_t len) { } void StreamPeerMbedTLS::_cleanup() { - ssl_ctx->clear(); + tls_ctx->clear(); base = Ref<StreamPeer>(); status = STATUS_DISCONNECTED; } Error StreamPeerMbedTLS::_do_handshake() { int ret = 0; - while ((ret = mbedtls_ssl_handshake(ssl_ctx->get_context())) != 0) { + while ((ret = mbedtls_ssl_handshake(tls_ctx->get_context())) != 0) { if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) { // An error occurred. ERR_PRINT("TLS handshake error: " + itos(ret)); - SSLContextMbedTLS::print_mbedtls_error(ret); + TLSContextMbedTLS::print_mbedtls_error(ret); disconnect_from_stream(); status = STATUS_ERROR; return FAILED; @@ -108,11 +108,11 @@ Error StreamPeerMbedTLS::connect_to_stream(Ref<StreamPeer> p_base, bool p_valida base = p_base; int authmode = p_validate_certs ? MBEDTLS_SSL_VERIFY_REQUIRED : MBEDTLS_SSL_VERIFY_NONE; - Error err = ssl_ctx->init_client(MBEDTLS_SSL_TRANSPORT_STREAM, authmode, p_ca_certs); + Error err = tls_ctx->init_client(MBEDTLS_SSL_TRANSPORT_STREAM, authmode, p_ca_certs); ERR_FAIL_COND_V(err != OK, err); - mbedtls_ssl_set_hostname(ssl_ctx->get_context(), p_for_hostname.utf8().get_data()); - mbedtls_ssl_set_bio(ssl_ctx->get_context(), this, bio_send, bio_recv, nullptr); + mbedtls_ssl_set_hostname(tls_ctx->get_context(), p_for_hostname.utf8().get_data()); + mbedtls_ssl_set_bio(tls_ctx->get_context(), this, bio_send, bio_recv, nullptr); status = STATUS_HANDSHAKING; @@ -127,12 +127,12 @@ Error StreamPeerMbedTLS::connect_to_stream(Ref<StreamPeer> p_base, bool p_valida Error StreamPeerMbedTLS::accept_stream(Ref<StreamPeer> p_base, Ref<CryptoKey> p_key, Ref<X509Certificate> p_cert, Ref<X509Certificate> p_ca_chain) { ERR_FAIL_COND_V(p_base.is_null(), ERR_INVALID_PARAMETER); - Error err = ssl_ctx->init_server(MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_VERIFY_NONE, p_key, p_cert); + Error err = tls_ctx->init_server(MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_VERIFY_NONE, p_key, p_cert); ERR_FAIL_COND_V(err != OK, err); base = p_base; - mbedtls_ssl_set_bio(ssl_ctx->get_context(), this, bio_send, bio_recv, nullptr); + mbedtls_ssl_set_bio(tls_ctx->get_context(), this, bio_send, bio_recv, nullptr); status = STATUS_HANDSHAKING; @@ -173,7 +173,7 @@ Error StreamPeerMbedTLS::put_partial_data(const uint8_t *p_data, int p_bytes, in return OK; } - int ret = mbedtls_ssl_write(ssl_ctx->get_context(), p_data, p_bytes); + int ret = mbedtls_ssl_write(tls_ctx->get_context(), p_data, p_bytes); if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) { // Non blocking IO ret = 0; @@ -182,7 +182,7 @@ Error StreamPeerMbedTLS::put_partial_data(const uint8_t *p_data, int p_bytes, in disconnect_from_stream(); return ERR_FILE_EOF; } else if (ret <= 0) { - SSLContextMbedTLS::print_mbedtls_error(ret); + TLSContextMbedTLS::print_mbedtls_error(ret); disconnect_from_stream(); return ERR_CONNECTION_ERROR; } @@ -216,7 +216,7 @@ Error StreamPeerMbedTLS::get_partial_data(uint8_t *p_buffer, int p_bytes, int &r r_received = 0; - int ret = mbedtls_ssl_read(ssl_ctx->get_context(), p_buffer, p_bytes); + int ret = mbedtls_ssl_read(tls_ctx->get_context(), p_buffer, p_bytes); if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) { ret = 0; // non blocking io } else if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) { @@ -224,7 +224,7 @@ Error StreamPeerMbedTLS::get_partial_data(uint8_t *p_buffer, int p_bytes, int &r disconnect_from_stream(); return ERR_FILE_EOF; } else if (ret <= 0) { - SSLContextMbedTLS::print_mbedtls_error(ret); + TLSContextMbedTLS::print_mbedtls_error(ret); disconnect_from_stream(); return ERR_CONNECTION_ERROR; } @@ -245,7 +245,7 @@ void StreamPeerMbedTLS::poll() { // We could pass nullptr as second parameter, but some behaviour sanitizers don't seem to like that. // Passing a 1 byte buffer to workaround it. uint8_t byte; - int ret = mbedtls_ssl_read(ssl_ctx->get_context(), &byte, 0); + int ret = mbedtls_ssl_read(tls_ctx->get_context(), &byte, 0); if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) { // Nothing to read/write (non blocking IO) @@ -254,7 +254,7 @@ void StreamPeerMbedTLS::poll() { disconnect_from_stream(); return; } else if (ret < 0) { - SSLContextMbedTLS::print_mbedtls_error(ret); + TLSContextMbedTLS::print_mbedtls_error(ret); disconnect_from_stream(); return; } @@ -269,11 +269,11 @@ void StreamPeerMbedTLS::poll() { int StreamPeerMbedTLS::get_available_bytes() const { ERR_FAIL_COND_V(status != STATUS_CONNECTED, 0); - return mbedtls_ssl_get_bytes_avail(&(ssl_ctx->ssl)); + return mbedtls_ssl_get_bytes_avail(&(tls_ctx->tls)); } StreamPeerMbedTLS::StreamPeerMbedTLS() { - ssl_ctx.instantiate(); + tls_ctx.instantiate(); } StreamPeerMbedTLS::~StreamPeerMbedTLS() { @@ -288,7 +288,7 @@ void StreamPeerMbedTLS::disconnect_from_stream() { Ref<StreamPeerTCP> tcp = base; if (tcp.is_valid() && tcp->get_status() == StreamPeerTCP::STATUS_CONNECTED) { // We are still connected on the socket, try to send close notify. - mbedtls_ssl_close_notify(ssl_ctx->get_context()); + mbedtls_ssl_close_notify(tls_ctx->get_context()); } _cleanup(); @@ -306,12 +306,12 @@ StreamPeerTLS *StreamPeerMbedTLS::_create_func() { return memnew(StreamPeerMbedTLS); } -void StreamPeerMbedTLS::initialize_ssl() { +void StreamPeerMbedTLS::initialize_tls() { _create = _create_func; available = true; } -void StreamPeerMbedTLS::finalize_ssl() { +void StreamPeerMbedTLS::finalize_tls() { available = false; _create = nullptr; } diff --git a/modules/mbedtls/stream_peer_mbedtls.h b/modules/mbedtls/stream_peer_mbedtls.h index 12d06d05ed..9219269539 100644 --- a/modules/mbedtls/stream_peer_mbedtls.h +++ b/modules/mbedtls/stream_peer_mbedtls.h @@ -32,7 +32,7 @@ #define STREAM_PEER_MBEDTLS_H #include "core/io/stream_peer_tls.h" -#include "ssl_context_mbedtls.h" +#include "tls_context_mbedtls.h" class StreamPeerMbedTLS : public StreamPeerTLS { private: @@ -48,7 +48,7 @@ private: void _cleanup(); protected: - Ref<SSLContextMbedTLS> ssl_ctx; + Ref<TLSContextMbedTLS> tls_ctx; Error _do_handshake(); @@ -69,8 +69,8 @@ public: virtual int get_available_bytes() const; - static void initialize_ssl(); - static void finalize_ssl(); + static void initialize_tls(); + static void finalize_tls(); StreamPeerMbedTLS(); ~StreamPeerMbedTLS(); diff --git a/modules/mbedtls/ssl_context_mbedtls.cpp b/modules/mbedtls/tls_context_mbedtls.cpp index e2dad074cc..1ae7bc0436 100644 --- a/modules/mbedtls/ssl_context_mbedtls.cpp +++ b/modules/mbedtls/tls_context_mbedtls.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* ssl_context_mbedtls.cpp */ +/* tls_context_mbedtls.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "ssl_context_mbedtls.h" +#include "tls_context_mbedtls.h" static void my_debug(void *ctx, int level, const char *file, int line, @@ -37,7 +37,7 @@ static void my_debug(void *ctx, int level, fflush(stdout); } -void SSLContextMbedTLS::print_mbedtls_error(int p_ret) { +void TLSContextMbedTLS::print_mbedtls_error(int p_ret) { printf("mbedtls error: returned -0x%x\n\n", -p_ret); fflush(stdout); } @@ -82,12 +82,12 @@ CookieContextMbedTLS::~CookieContextMbedTLS() { clear(); } -/// SSLContextMbedTLS +/// TLSContextMbedTLS -Error SSLContextMbedTLS::_setup(int p_endpoint, int p_transport, int p_authmode) { +Error TLSContextMbedTLS::_setup(int p_endpoint, int p_transport, int p_authmode) { ERR_FAIL_COND_V_MSG(inited, ERR_ALREADY_IN_USE, "This SSL context is already active"); - mbedtls_ssl_init(&ssl); + mbedtls_ssl_init(&tls); mbedtls_ssl_config_init(&conf); mbedtls_ctr_drbg_init(&ctr_drbg); mbedtls_entropy_init(&entropy); @@ -110,7 +110,7 @@ Error SSLContextMbedTLS::_setup(int p_endpoint, int p_transport, int p_authmode) return OK; } -Error SSLContextMbedTLS::init_server(int p_transport, int p_authmode, Ref<CryptoKeyMbedTLS> p_pkey, Ref<X509CertificateMbedTLS> p_cert, Ref<CookieContextMbedTLS> p_cookies) { +Error TLSContextMbedTLS::init_server(int p_transport, int p_authmode, Ref<CryptoKeyMbedTLS> p_pkey, Ref<X509CertificateMbedTLS> p_cert, Ref<CookieContextMbedTLS> p_cookies) { ERR_FAIL_COND_V(!p_pkey.is_valid(), ERR_INVALID_PARAMETER); ERR_FAIL_COND_V(!p_cert.is_valid(), ERR_INVALID_PARAMETER); @@ -146,11 +146,11 @@ Error SSLContextMbedTLS::init_server(int p_transport, int p_authmode, Ref<Crypto cookies = p_cookies; mbedtls_ssl_conf_dtls_cookies(&conf, mbedtls_ssl_cookie_write, mbedtls_ssl_cookie_check, &(cookies->cookie_ctx)); } - mbedtls_ssl_setup(&ssl, &conf); + mbedtls_ssl_setup(&tls, &conf); return OK; } -Error SSLContextMbedTLS::init_client(int p_transport, int p_authmode, Ref<X509CertificateMbedTLS> p_valid_cas) { +Error TLSContextMbedTLS::init_client(int p_transport, int p_authmode, Ref<X509CertificateMbedTLS> p_valid_cas) { Error err = _setup(MBEDTLS_SSL_IS_CLIENT, p_transport, p_authmode); ERR_FAIL_COND_V(err != OK, err); @@ -172,15 +172,15 @@ Error SSLContextMbedTLS::init_client(int p_transport, int p_authmode, Ref<X509Ce // Set valid CAs mbedtls_ssl_conf_ca_chain(&conf, &(cas->cert), nullptr); - mbedtls_ssl_setup(&ssl, &conf); + mbedtls_ssl_setup(&tls, &conf); return OK; } -void SSLContextMbedTLS::clear() { +void TLSContextMbedTLS::clear() { if (!inited) { return; } - mbedtls_ssl_free(&ssl); + mbedtls_ssl_free(&tls); mbedtls_ssl_config_free(&conf); mbedtls_ctr_drbg_free(&ctr_drbg); mbedtls_entropy_free(&entropy); @@ -198,14 +198,14 @@ void SSLContextMbedTLS::clear() { inited = false; } -mbedtls_ssl_context *SSLContextMbedTLS::get_context() { +mbedtls_ssl_context *TLSContextMbedTLS::get_context() { ERR_FAIL_COND_V(!inited, nullptr); - return &ssl; + return &tls; } -SSLContextMbedTLS::SSLContextMbedTLS() { +TLSContextMbedTLS::TLSContextMbedTLS() { } -SSLContextMbedTLS::~SSLContextMbedTLS() { +TLSContextMbedTLS::~TLSContextMbedTLS() { clear(); } diff --git a/modules/mbedtls/ssl_context_mbedtls.h b/modules/mbedtls/tls_context_mbedtls.h index 5883388311..5e7b3dc46e 100644 --- a/modules/mbedtls/ssl_context_mbedtls.h +++ b/modules/mbedtls/tls_context_mbedtls.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* ssl_context_mbedtls.h */ +/* tls_context_mbedtls.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,8 +28,8 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef SSL_CONTEXT_MBEDTLS_H -#define SSL_CONTEXT_MBEDTLS_H +#ifndef TLS_CONTEXT_MBEDTLS_H +#define TLS_CONTEXT_MBEDTLS_H #include "crypto_mbedtls.h" @@ -44,10 +44,10 @@ #include <mbedtls/ssl.h> #include <mbedtls/ssl_cookie.h> -class SSLContextMbedTLS; +class TLSContextMbedTLS; class CookieContextMbedTLS : public RefCounted { - friend class SSLContextMbedTLS; + friend class TLSContextMbedTLS; protected: bool inited = false; @@ -63,7 +63,7 @@ public: ~CookieContextMbedTLS(); }; -class SSLContextMbedTLS : public RefCounted { +class TLSContextMbedTLS : public RefCounted { protected: bool inited = false; @@ -73,7 +73,7 @@ public: Ref<X509CertificateMbedTLS> certs; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; - mbedtls_ssl_context ssl; + mbedtls_ssl_context tls; mbedtls_ssl_config conf; Ref<CookieContextMbedTLS> cookies; @@ -86,8 +86,8 @@ public: mbedtls_ssl_context *get_context(); - SSLContextMbedTLS(); - ~SSLContextMbedTLS(); + TLSContextMbedTLS(); + ~TLSContextMbedTLS(); }; -#endif // SSL_CONTEXT_MBEDTLS_H +#endif // TLS_CONTEXT_MBEDTLS_H diff --git a/modules/mono/build_scripts/build_assemblies.py b/modules/mono/build_scripts/build_assemblies.py index 6f66ce9efa..d78a9c7db8 100755 --- a/modules/mono/build_scripts/build_assemblies.py +++ b/modules/mono/build_scripts/build_assemblies.py @@ -315,6 +315,8 @@ def main(): output_dir = os.path.abspath(args.godot_output_dir) + push_nupkgs_local = os.path.abspath(args.push_nupkgs_local) if args.push_nupkgs_local else None + msbuild_tool = find_any_msbuild_tool(args.mono_prefix) if msbuild_tool is None: @@ -327,7 +329,7 @@ def main(): output_dir, args.godot_platform, args.dev_debug, - args.push_nupkgs_local, + push_nupkgs_local, args.float, ) sys.exit(exit_code) diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index 990a95821e..8fd3626a20 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -2035,6 +2035,52 @@ void CSharpScript::_update_exports_values(HashMap<StringName, Variant> &values, } #endif +void GD_CLR_STDCALL CSharpScript::_add_property_info_list_callback(CSharpScript *p_script, const String *p_current_class_name, void *p_props, int32_t p_count) { + GDMonoCache::godotsharp_property_info *props = (GDMonoCache::godotsharp_property_info *)p_props; + +#ifdef TOOLS_ENABLED + p_script->exported_members_cache.push_back(PropertyInfo( + Variant::NIL, *p_current_class_name, PROPERTY_HINT_NONE, + p_script->get_path(), PROPERTY_USAGE_CATEGORY)); +#endif + + for (int i = 0; i < p_count; i++) { + const GDMonoCache::godotsharp_property_info &prop = props[i]; + + StringName name = *reinterpret_cast<const StringName *>(&prop.name); + String hint_string = *reinterpret_cast<const String *>(&prop.hint_string); + + PropertyInfo pinfo(prop.type, name, prop.hint, hint_string, prop.usage); + + p_script->member_info[name] = pinfo; + + if (prop.exported) { +#ifdef TOOLS_ENABLED + p_script->exported_members_cache.push_back(pinfo); +#endif + +#if defined(TOOLS_ENABLED) || defined(DEBUG_ENABLED) + p_script->exported_members_names.insert(name); +#endif + } + } +} + +#ifdef TOOLS_ENABLED +void GD_CLR_STDCALL CSharpScript::_add_property_default_values_callback(CSharpScript *p_script, void *p_def_vals, int32_t p_count) { + GDMonoCache::godotsharp_property_def_val_pair *def_vals = (GDMonoCache::godotsharp_property_def_val_pair *)p_def_vals; + + for (int i = 0; i < p_count; i++) { + const GDMonoCache::godotsharp_property_def_val_pair &def_val_pair = def_vals[i]; + + StringName name = *reinterpret_cast<const StringName *>(&def_val_pair.name); + Variant value = *reinterpret_cast<const Variant *>(&def_val_pair.value); + + p_script->exported_members_defval_cache[name] = value; + } +} +#endif + bool CSharpScript::_update_exports(PlaceHolderScriptInstance *p_instance_to_update) { #ifdef TOOLS_ENABLED bool is_editor = Engine::get_singleton()->is_editor_hint(); @@ -2066,49 +2112,10 @@ bool CSharpScript::_update_exports(PlaceHolderScriptInstance *p_instance_to_upda #endif if (GDMonoCache::godot_api_cache_updated) { - GDMonoCache::managed_callbacks.ScriptManagerBridge_GetPropertyInfoList(this, - [](CSharpScript *p_script, const String *p_current_class_name, GDMonoCache::godotsharp_property_info *p_props, int32_t p_count) { -#ifdef TOOLS_ENABLED - p_script->exported_members_cache.push_back(PropertyInfo( - Variant::NIL, *p_current_class_name, PROPERTY_HINT_NONE, - p_script->get_path(), PROPERTY_USAGE_CATEGORY)); -#endif - - for (int i = 0; i < p_count; i++) { - const GDMonoCache::godotsharp_property_info &prop = p_props[i]; - - StringName name = *reinterpret_cast<const StringName *>(&prop.name); - String hint_string = *reinterpret_cast<const String *>(&prop.hint_string); - - PropertyInfo pinfo(prop.type, name, prop.hint, hint_string, prop.usage); - - p_script->member_info[name] = pinfo; - - if (prop.exported) { + GDMonoCache::managed_callbacks.ScriptManagerBridge_GetPropertyInfoList(this, &_add_property_info_list_callback); #ifdef TOOLS_ENABLED - p_script->exported_members_cache.push_back(pinfo); -#endif - -#if defined(TOOLS_ENABLED) || defined(DEBUG_ENABLED) - p_script->exported_members_names.insert(name); -#endif - } - } - }); - -#ifdef TOOLS_ENABLED - GDMonoCache::managed_callbacks.ScriptManagerBridge_GetPropertyDefaultValues(this, - [](CSharpScript *p_script, GDMonoCache::godotsharp_property_def_val_pair *p_def_vals, int32_t p_count) { - for (int i = 0; i < p_count; i++) { - const GDMonoCache::godotsharp_property_def_val_pair &def_val_pair = p_def_vals[i]; - - StringName name = *reinterpret_cast<const StringName *>(&def_val_pair.name); - Variant value = *reinterpret_cast<const Variant *>(&def_val_pair.value); - - p_script->exported_members_defval_cache[name] = value; - } - }); + GDMonoCache::managed_callbacks.ScriptManagerBridge_GetPropertyDefaultValues(this, &_add_property_default_values_callback); #endif } } diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h index f2844a051d..d469c28d4a 100644 --- a/modules/mono/csharp_script.h +++ b/modules/mono/csharp_script.h @@ -133,6 +133,10 @@ class CSharpScript : public Script { void _clear(); + static void GD_CLR_STDCALL _add_property_info_list_callback(CSharpScript *p_script, const String *p_current_class_name, void *p_props, int32_t p_count); +#ifdef TOOLS_ENABLED + static void GD_CLR_STDCALL _add_property_default_values_callback(CSharpScript *p_script, void *p_def_vals, int32_t p_count); +#endif bool _update_exports(PlaceHolderScriptInstance *p_instance_to_update = nullptr); CSharpInstance *_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, bool p_is_ref_counted, Callable::CallError &r_error); diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets index bff9760b32..859ea52c93 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets @@ -17,7 +17,7 @@ <!-- C# source generators --> <ItemGroup Condition=" '$(DisableImplicitGodotGeneratorReferences)' != 'true' "> - <PackageReference Include="Godot.SourceGenerators" Version="$(PackageFloatingVersion_Godot)" /> + <PackageReference Include="Godot.SourceGenerators" Version="$(PackageVersion_Godot_SourceGenerators)" /> </ItemGroup> <!-- Godot API references --> diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalUtils.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalUtils.cs index efdd50098e..f31ded4d77 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalUtils.cs +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalUtils.cs @@ -156,6 +156,10 @@ namespace Godot.SourceGenerators else if (typeKind == TypeKind.Array) { var arrayType = (IArrayTypeSymbol)type; + + if (arrayType.Rank != 1) + return null; + var elementType = arrayType.ElementType; switch (elementType.SpecialType) @@ -177,8 +181,8 @@ namespace Godot.SourceGenerators if (elementType.SimpleDerivesFrom(typeCache.GodotObjectType)) return MarshalType.GodotObjectOrDerivedArray; - if (elementType.ContainingAssembly.Name == "GodotSharp" && - elementType.ContainingNamespace.Name == "Godot") + if (elementType.ContainingAssembly?.Name == "GodotSharp" && + elementType.ContainingNamespace?.Name == "Godot") { switch (elementType) { diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptSignalsGenerator.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptSignalsGenerator.cs index 1df41a905b..eeda1042ca 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptSignalsGenerator.cs +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptSignalsGenerator.cs @@ -235,6 +235,8 @@ namespace Godot.SourceGenerators .Append(signalName) .Append(";\n"); + source.Append($" /// <inheritdoc cref=\"{signalDelegate.DelegateSymbol.FullQualifiedName()}\"/>\n"); + source.Append(" public event ") .Append(signalDelegate.DelegateSymbol.FullQualifiedName()) .Append(" ") diff --git a/modules/mono/editor/GodotTools/GodotTools.Shared/GenerateGodotNupkgsVersions.targets b/modules/mono/editor/GodotTools/GodotTools.Shared/GenerateGodotNupkgsVersions.targets index 4baae77b34..37bd4a0be0 100644 --- a/modules/mono/editor/GodotTools/GodotTools.Shared/GenerateGodotNupkgsVersions.targets +++ b/modules/mono/editor/GodotTools/GodotTools.Shared/GenerateGodotNupkgsVersions.targets @@ -21,10 +21,13 @@ Outputs="$(GeneratedGodotNupkgsVersionsFile)"> <PropertyGroup> <GenerateGodotNupkgsVersionsCode><![CDATA[ -namespace $(RootNamespace) { - public class GeneratedGodotNupkgsVersions { +namespace $(RootNamespace) +{ + public class GeneratedGodotNupkgsVersions + { public const string GodotNETSdk = "$(PackageVersion_Godot_NET_Sdk)"%3b public const string GodotSourceGenerators = "$(PackageVersion_Godot_SourceGenerators)"%3b + public const string GodotSharp = "$(PackageVersion_GodotSharp)"%3b } } ]]></GenerateGodotNupkgsVersionsCode> diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildOutputView.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildOutputView.cs index ad4fce8daa..4d40724a83 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildOutputView.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildOutputView.cs @@ -69,51 +69,41 @@ namespace GodotTools.Build private void LoadIssuesFromFile(string csvFile) { - using (var file = new Godot.File()) + using var file = FileAccess.Open(csvFile, FileAccess.ModeFlags.Read); + + if (file == null) + return; + + while (!file.EofReached()) { - try - { - Error openError = file.Open(csvFile, Godot.File.ModeFlags.Read); + string[] csvColumns = file.GetCsvLine(); - if (openError != Error.Ok) - return; + if (csvColumns.Length == 1 && string.IsNullOrEmpty(csvColumns[0])) + return; - while (!file.EofReached()) - { - string[] csvColumns = file.GetCsvLine(); - - if (csvColumns.Length == 1 && string.IsNullOrEmpty(csvColumns[0])) - return; - - if (csvColumns.Length != 7) - { - GD.PushError($"Expected 7 columns, got {csvColumns.Length}"); - continue; - } - - var issue = new BuildIssue - { - Warning = csvColumns[0] == "warning", - File = csvColumns[1], - Line = int.Parse(csvColumns[2]), - Column = int.Parse(csvColumns[3]), - Code = csvColumns[4], - Message = csvColumns[5], - ProjectFile = csvColumns[6] - }; - - if (issue.Warning) - WarningCount += 1; - else - ErrorCount += 1; - - _issues.Add(issue); - } - } - finally + if (csvColumns.Length != 7) { - file.Close(); // Disposing it is not enough. We need to call Close() + GD.PushError($"Expected 7 columns, got {csvColumns.Length}"); + continue; } + + var issue = new BuildIssue + { + Warning = csvColumns[0] == "warning", + File = csvColumns[1], + Line = int.Parse(csvColumns[2]), + Column = int.Parse(csvColumns[3]), + Code = csvColumns[4], + Message = csvColumns[5], + ProjectFile = csvColumns[6] + }; + + if (issue.Warning) + WarningCount += 1; + else + ErrorCount += 1; + + _issues.Add(issue); } } diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/DotNetFinder.cs b/modules/mono/editor/GodotTools/GodotTools/Build/DotNetFinder.cs index 7bce53308c..b437c7e742 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/DotNetFinder.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/DotNetFinder.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; +using System.Runtime.InteropServices; using JetBrains.Annotations; using OS = GodotTools.Utils.OS; @@ -16,6 +17,23 @@ namespace GodotTools.Build // In the future, this method may do more than just search in PATH. We could look in // known locations or use Godot's linked nethost to search from the hostfxr location. + if (OS.IsMacOS) + { + if (RuntimeInformation.OSArchitecture == Architecture.X64) + { + string dotnet_x64 = "/usr/local/share/dotnet/x64/dotnet"; // Look for x64 version, when running under Rosetta 2. + if (File.Exists(dotnet_x64)) + { + return dotnet_x64; + } + } + string dotnet = "/usr/local/share/dotnet/dotnet"; // Look for native version. + if (File.Exists(dotnet)) + { + return dotnet; + } + } + return OS.PathWhich("dotnet"); } diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs b/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs index 4041026426..237ac85267 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs @@ -122,7 +122,7 @@ namespace GodotTools.Build { base._Ready(); - CustomMinimumSize = new Vector2(0, 228) * EditorScale; + CustomMinimumSize = new Vector2i(0, (int)(228 * EditorScale)); SizeFlagsVertical = (int)SizeFlags.ExpandFill; var toolBarHBox = new HBoxContainer { SizeFlagsHorizontal = (int)SizeFlags.ExpandFill }; diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs b/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs index d2e0e128b5..fe309b8102 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs @@ -22,71 +22,13 @@ namespace GodotTools.Build public static string GodotFallbackFolderPath => Path.Combine(GodotSharpDirs.MonoUserDir, "GodotNuGetFallbackFolder"); - private static void AddFallbackFolderToNuGetConfig(string nuGetConfigPath, string name, string path) - { - var xmlDoc = new XmlDocument(); - xmlDoc.Load(nuGetConfigPath); - - const string nuGetConfigRootName = "configuration"; - - var rootNode = xmlDoc.DocumentElement; - - if (rootNode == null) - { - // No root node, create it - rootNode = xmlDoc.CreateElement(nuGetConfigRootName); - xmlDoc.AppendChild(rootNode); - - // Since this can be considered pretty much a new NuGet.Config, add the default nuget.org source as well - XmlElement nugetOrgSourceEntry = xmlDoc.CreateElement("add"); - nugetOrgSourceEntry.Attributes.Append(xmlDoc.CreateAttribute("key")).Value = "nuget.org"; - nugetOrgSourceEntry.Attributes.Append(xmlDoc.CreateAttribute("value")).Value = - "https://api.nuget.org/v3/index.json"; - nugetOrgSourceEntry.Attributes.Append(xmlDoc.CreateAttribute("protocolVersion")).Value = "3"; - rootNode.AppendChild(xmlDoc.CreateElement("packageSources")).AppendChild(nugetOrgSourceEntry); - } - else - { - // Check that the root node is the expected one - if (rootNode.Name != nuGetConfigRootName) - throw new FormatException("Invalid root Xml node for NuGet.Config. " + - $"Expected '{nuGetConfigRootName}' got '{rootNode.Name}'."); - } - - var fallbackFoldersNode = rootNode["fallbackPackageFolders"] ?? - rootNode.AppendChild(xmlDoc.CreateElement("fallbackPackageFolders")); - - // Check if it already has our fallback package folder - for (var xmlNode = fallbackFoldersNode.FirstChild; xmlNode != null; xmlNode = xmlNode.NextSibling) - { - if (xmlNode.NodeType != XmlNodeType.Element) - continue; - - var xmlElement = (XmlElement)xmlNode; - if (xmlElement.Name == "add" && - xmlElement.Attributes["key"]?.Value == name && - xmlElement.Attributes["value"]?.Value == path) - { - return; - } - } - - XmlElement newEntry = xmlDoc.CreateElement("add"); - newEntry.Attributes.Append(xmlDoc.CreateAttribute("key")).Value = name; - newEntry.Attributes.Append(xmlDoc.CreateAttribute("value")).Value = path; - - fallbackFoldersNode.AppendChild(newEntry); - - xmlDoc.Save(nuGetConfigPath); - } - /// <summary> - /// Returns all the paths where the user NuGet.Config files can be found. + /// Returns all the paths where the Godot.Offline.Config files can be found. /// Does not determine whether the returned files exist or not. /// </summary> - private static string[] GetAllUserNuGetConfigFilePaths() + private static string[] GetAllGodotNuGetConfigFilePaths() { - // Where to find 'NuGet/NuGet.Config': + // Where to find 'NuGet/config/Godot.Offline.Config': // // - Mono/.NETFramework (standalone NuGet): // Uses Environment.SpecialFolder.ApplicationData @@ -98,10 +40,12 @@ namespace GodotTools.Build string applicationData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + const string configFileName = "Godot.Offline.Config"; + if (Utils.OS.IsWindows) { // %APPDATA% for both - return new[] { Path.Combine(applicationData, "NuGet", "NuGet.Config") }; + return new[] { Path.Combine(applicationData, "NuGet", "config", configFileName) }; } var paths = new string[2]; @@ -111,20 +55,20 @@ namespace GodotTools.Build string dotnetCliHome = Environment.GetEnvironmentVariable("DOTNET_CLI_HOME"); if (!string.IsNullOrEmpty(dotnetCliHome)) { - paths[0] = Path.Combine(dotnetCliHome, ".nuget", "NuGet", "NuGet.Config"); + paths[0] = Path.Combine(dotnetCliHome, ".nuget", "NuGet", "config", configFileName); } else { string home = Environment.GetEnvironmentVariable("HOME"); if (string.IsNullOrEmpty(home)) throw new InvalidOperationException("Required environment variable 'HOME' is not set."); - paths[0] = Path.Combine(home, ".nuget", "NuGet", "NuGet.Config"); + paths[0] = Path.Combine(home, ".nuget", "NuGet", "config", configFileName); } // Mono/.NETFramework (standalone NuGet) // ApplicationData is $HOME/.config on Linux/macOS - paths[1] = Path.Combine(applicationData, "NuGet", "NuGet.Config"); + paths[1] = Path.Combine(applicationData, "NuGet", "config", configFileName); return paths; } @@ -141,28 +85,26 @@ namespace GodotTools.Build // The nuspec is not lower case inside the nupkg but must be made lower case when extracted. /// <summary> - /// Adds the specified fallback folder to the user NuGet.Config files, + /// Adds the specified fallback folder to the Godot.Offline.Config files, /// for both standalone NuGet (Mono/.NETFramework) and dotnet CLI NuGet. /// </summary> - public static void AddFallbackFolderToUserNuGetConfigs(string name, string path) + public static void AddFallbackFolderToGodotNuGetConfigs(string name, string path) { - foreach (string nuGetConfigPath in GetAllUserNuGetConfigFilePaths()) + // Make sure the fallback folder exists to avoid error: + // MSB4018: The "ResolvePackageAssets" task failed unexpectedly. + System.IO.Directory.CreateDirectory(path); + + foreach (string nuGetConfigPath in GetAllGodotNuGetConfigFilePaths()) { - if (!System.IO.File.Exists(nuGetConfigPath)) - { - // It doesn't exist, so we create a default one - const string defaultConfig = @"<?xml version=""1.0"" encoding=""utf-8""?> + string defaultConfig = @$"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> - <packageSources> - <add key=""nuget.org"" value=""https://api.nuget.org/v3/index.json"" protocolVersion=""3"" /> - </packageSources> + <fallbackPackageFolders> + <add key=""{name}"" value=""{path}"" /> + </fallbackPackageFolders> </configuration> "; - System.IO.Directory.CreateDirectory(Path.GetDirectoryName(nuGetConfigPath)); - System.IO.File.WriteAllText(nuGetConfigPath, defaultConfig, Encoding.UTF8); // UTF-8 with BOM - } - - AddFallbackFolderToNuGetConfig(nuGetConfigPath, name, path); + System.IO.Directory.CreateDirectory(Path.GetDirectoryName(nuGetConfigPath)); + System.IO.File.WriteAllText(nuGetConfigPath, defaultConfig, Encoding.UTF8); // UTF-8 with BOM } } @@ -189,6 +131,7 @@ namespace GodotTools.Build string destDir = Path.Combine(fallbackFolder, packageIdLower, packageVersionLower); string nupkgDestPath = Path.Combine(destDir, $"{packageIdLower}.{packageVersionLower}.nupkg"); string nupkgSha512DestPath = Path.Combine(destDir, $"{packageIdLower}.{packageVersionLower}.nupkg.sha512"); + string nupkgMetadataDestPath = Path.Combine(destDir, ".nupkg.metadata"); if (File.Exists(nupkgDestPath) && File.Exists(nupkgSha512DestPath)) return; // Already added (for speed we don't check if every file is properly extracted) @@ -197,12 +140,18 @@ namespace GodotTools.Build // Generate .nupkg.sha512 file - using (var alg = SHA512.Create()) - { - alg.ComputeHash(File.ReadAllBytes(nupkgPath)); - string base64Hash = Convert.ToBase64String(alg.Hash); - File.WriteAllText(nupkgSha512DestPath, base64Hash); - } + byte[] hash = SHA512.HashData(File.ReadAllBytes(nupkgPath)); + string base64Hash = Convert.ToBase64String(hash); + File.WriteAllText(nupkgSha512DestPath, base64Hash); + + // Generate .nupkg.metadata file + // Spec: https://github.com/NuGet/Home/wiki/Nupkg-Metadata-File + + File.WriteAllText(nupkgMetadataDestPath, @$"{{ + ""version"": 2, + ""contentHash"": ""{base64Hash}"", + ""source"": null +}}"); // Extract nupkg ExtractNupkg(destDir, nupkgPath, packageId, packageVersion); @@ -251,7 +200,7 @@ namespace GodotTools.Build entryFullName.EndsWith(".nupkg.sha512", StringComparison.OrdinalIgnoreCase) || entryFullName.EndsWith(".nupkg.metadata", StringComparison.OrdinalIgnoreCase) || // Nuspec at root level. We already extracted it previously but in lower case. - entryFullName.IndexOf('/') == -1 && entryFullName.EndsWith(".nuspec")) + !entryFullName.Contains('/') && entryFullName.EndsWith(".nuspec")) { continue; } @@ -297,6 +246,8 @@ namespace GodotTools.Build { ("Godot.NET.Sdk", GeneratedGodotNupkgsVersions.GodotNETSdk), ("Godot.SourceGenerators", GeneratedGodotNupkgsVersions.GodotSourceGenerators), + ("GodotSharp", GeneratedGodotNupkgsVersions.GodotSharp), + ("GodotSharpEditor", GeneratedGodotNupkgsVersions.GodotSharp), }; } } diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs index 1cfaea3ec9..89364d1c02 100644 --- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs +++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs @@ -123,7 +123,7 @@ namespace GodotTools try { string fallbackFolder = NuGetUtils.GodotFallbackFolderPath; - NuGetUtils.AddFallbackFolderToUserNuGetConfigs(NuGetUtils.GodotFallbackFolderName, + NuGetUtils.AddFallbackFolderToGodotNuGetConfigs(NuGetUtils.GodotFallbackFolderName, fallbackFolder); NuGetUtils.AddBundledPackagesToFallbackFolder(fallbackFolder); } @@ -497,7 +497,7 @@ namespace GodotTools try { // At startup we make sure NuGet.Config files have our Godot NuGet fallback folder included - NuGetUtils.AddFallbackFolderToUserNuGetConfigs(NuGetUtils.GodotFallbackFolderName, + NuGetUtils.AddFallbackFolderToGodotNuGetConfigs(NuGetUtils.GodotFallbackFolderName, NuGetUtils.GodotFallbackFolderPath); } catch (Exception e) diff --git a/modules/mono/editor/bindings_generator.cpp b/modules/mono/editor/bindings_generator.cpp index c27bb959fe..95a44d3b7e 100644 --- a/modules/mono/editor/bindings_generator.cpp +++ b/modules/mono/editor/bindings_generator.cpp @@ -2229,6 +2229,35 @@ Error BindingsGenerator::_generate_cs_signal(const BindingsGenerator::TypeInterf // Generate signal { + p_output.append(MEMBER_BEGIN "/// <summary>\n"); + p_output.append(INDENT1 "/// "); + p_output.append("Represents the method that handles the "); + p_output.append("<see cref=\"" BINDINGS_NAMESPACE "." + p_itype.proxy_name + "." + p_isignal.proxy_name + "\"/>"); + p_output.append(" event of a "); + p_output.append("<see cref=\"" BINDINGS_NAMESPACE "." + p_itype.proxy_name + "\"/>"); + p_output.append(" class.\n"); + p_output.append(INDENT1 "/// </summary>"); + + if (p_isignal.is_deprecated) { + if (p_isignal.deprecation_message.is_empty()) { + WARN_PRINT("An empty deprecation message is discouraged. Signal: '" + p_isignal.proxy_name + "'."); + } + + p_output.append(MEMBER_BEGIN "[Obsolete(\""); + p_output.append(p_isignal.deprecation_message); + p_output.append("\")]"); + } + + String delegate_name = p_isignal.proxy_name; + delegate_name += "EventHandler"; // Delegate name is [SignalName]EventHandler + + // Generate delegate + p_output.append(MEMBER_BEGIN "public delegate void "); + p_output.append(delegate_name); + p_output.append("("); + p_output.append(arguments_sig); + p_output.append(");\n"); + if (p_isignal.method_doc && p_isignal.method_doc->description.size()) { String xml_summary = bbcode_to_xml(fix_doc_description(p_isignal.method_doc->description), &p_itype); Vector<String> summary_lines = xml_summary.length() ? xml_summary.split("\n") : Vector<String>(); @@ -2247,25 +2276,11 @@ Error BindingsGenerator::_generate_cs_signal(const BindingsGenerator::TypeInterf } if (p_isignal.is_deprecated) { - if (p_isignal.deprecation_message.is_empty()) { - WARN_PRINT("An empty deprecation message is discouraged. Signal: '" + p_isignal.proxy_name + "'."); - } - p_output.append(MEMBER_BEGIN "[Obsolete(\""); p_output.append(p_isignal.deprecation_message); p_output.append("\")]"); } - String delegate_name = p_isignal.proxy_name; - delegate_name += "EventHandler"; // Delegate name is [SignalName]EventHandler - - // Generate delegate - p_output.append(MEMBER_BEGIN "public delegate void "); - p_output.append(delegate_name); - p_output.append("("); - p_output.append(arguments_sig); - p_output.append(");\n"); - // TODO: // Could we assume the StringName instance of signal name will never be freed (it's stored in ClassDB) before the managed world is unloaded? // If so, we could store the pointer we get from `data_unique_pointer()` instead of allocating StringName here. diff --git a/modules/mono/editor/editor_internal_calls.cpp b/modules/mono/editor/editor_internal_calls.cpp index 6f42ad6916..91392c8f79 100644 --- a/modules/mono/editor/editor_internal_calls.cpp +++ b/modules/mono/editor/editor_internal_calls.cpp @@ -152,7 +152,7 @@ bool godot_icall_Internal_ScriptEditorEdit(Resource *p_resource, int32_t p_line, } void godot_icall_Internal_EditorNodeShowScriptScreen() { - EditorNode::get_singleton()->call("_editor_select", EditorNode::EDITOR_SCRIPT); + EditorNode::get_singleton()->editor_select(EditorNode::EDITOR_SCRIPT); } void godot_icall_Internal_EditorRunPlay() { diff --git a/modules/mono/editor/hostfxr_resolver.cpp b/modules/mono/editor/hostfxr_resolver.cpp index bdc8fac8b5..ea5978b2cd 100644 --- a/modules/mono/editor/hostfxr_resolver.cpp +++ b/modules/mono/editor/hostfxr_resolver.cpp @@ -82,7 +82,7 @@ namespace { String get_hostfxr_file_name() { #if defined(WINDOWS_ENABLED) || defined(UWP_ENABLED) return "hostfxr.dll"; -#elif defined(OSX_ENABLED) || defined(IOS_ENABLED) +#elif defined(MACOS_ENABLED) || defined(IOS_ENABLED) return "libhostfxr.dylib"; #else return "libhostfxr.so"; @@ -197,7 +197,7 @@ bool get_default_installation_dir(String &r_dotnet_root) { r_dotnet_root = path::join(program_files_dir, "dotnet"); return true; -#elif defined(TARGET_OSX) +#elif defined(MACOS_ENABLED) r_dotnet_root = "/usr/local/share/dotnet"; #if defined(__x86_64) || defined(__x86_64__) || defined(__amd64__) || defined(_M_X64) diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs index 44f951e314..d77baab24b 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs @@ -1245,12 +1245,12 @@ namespace Godot /// <summary> /// If the string is a path, this concatenates <paramref name="file"/> /// at the end of the string as a subpath. - /// E.g. <c>"this/is".PlusFile("path") == "this/is/path"</c>. + /// E.g. <c>"this/is".PathJoin("path") == "this/is/path"</c>. /// </summary> /// <param name="instance">The path that will be concatenated.</param> /// <param name="file">File name to concatenate with the path.</param> /// <returns>The concatenated path with the given file name.</returns> - public static string PlusFile(this string instance, string file) + public static string PathJoin(this string instance, string file) { if (instance.Length > 0 && instance[instance.Length - 1] == '/') return instance + file; diff --git a/modules/mono/mono_gd/gd_mono.h b/modules/mono/mono_gd/gd_mono.h index 43811a4325..21252a5dca 100644 --- a/modules/mono/mono_gd/gd_mono.h +++ b/modules/mono/mono_gd/gd_mono.h @@ -35,11 +35,13 @@ #include "../godotsharp_defs.h" +#ifndef GD_CLR_STDCALL #ifdef WIN32 #define GD_CLR_STDCALL __stdcall #else #define GD_CLR_STDCALL #endif +#endif namespace gdmono { @@ -56,8 +58,6 @@ struct PluginCallbacks { } // namespace gdmono -#undef GD_CLR_STDCALL - class GDMono { bool runtime_initialized; bool finalizing_scripts_domain; diff --git a/modules/mono/mono_gd/gd_mono_cache.h b/modules/mono/mono_gd/gd_mono_cache.h index ca3a6c95a7..13b599fe55 100644 --- a/modules/mono/mono_gd/gd_mono_cache.h +++ b/modules/mono/mono_gd/gd_mono_cache.h @@ -47,11 +47,13 @@ class CSharpScript; namespace GDMonoCache { +#ifndef GD_CLR_STDCALL #ifdef WIN32 #define GD_CLR_STDCALL __stdcall #else #define GD_CLR_STDCALL #endif +#endif struct godotsharp_property_info { godot_string_name name; // Not owned @@ -68,8 +70,8 @@ struct godotsharp_property_def_val_pair { }; struct ManagedCallbacks { - using Callback_ScriptManagerBridge_GetPropertyInfoList_Add = void(GD_CLR_STDCALL *)(CSharpScript *p_script, const String *, godotsharp_property_info *p_props, int32_t p_count); - using Callback_ScriptManagerBridge_GetPropertyDefaultValues_Add = void(GD_CLR_STDCALL *)(CSharpScript *p_script, godotsharp_property_def_val_pair *p_def_vals, int32_t p_count); + using Callback_ScriptManagerBridge_GetPropertyInfoList_Add = void(GD_CLR_STDCALL *)(CSharpScript *p_script, const String *, void *p_props, int32_t p_count); + using Callback_ScriptManagerBridge_GetPropertyDefaultValues_Add = void(GD_CLR_STDCALL *)(CSharpScript *p_script, void *p_def_vals, int32_t p_count); using FuncSignalAwaiter_SignalCallback = void(GD_CLR_STDCALL *)(GCHandleIntPtr, const Variant **, int32_t, bool *); using FuncDelegateUtils_InvokeWithVariantArgs = void(GD_CLR_STDCALL *)(GCHandleIntPtr, const Variant **, uint32_t, const Variant *); @@ -145,6 +147,4 @@ void update_godot_api_cache(const ManagedCallbacks &p_managed_callbacks); } // namespace GDMonoCache -#undef GD_CLR_STDCALL - #endif // GD_MONO_CACHE_H diff --git a/modules/multiplayer/multiplayer_spawner.cpp b/modules/multiplayer/multiplayer_spawner.cpp index 6f60318b3b..9d28feef09 100644 --- a/modules/multiplayer/multiplayer_spawner.cpp +++ b/modules/multiplayer/multiplayer_spawner.cpp @@ -86,23 +86,41 @@ void MultiplayerSpawner::_get_property_list(List<PropertyInfo> *p_list) const { } } #endif + +PackedStringArray MultiplayerSpawner::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); + + if (spawn_path.is_empty() || !has_node(spawn_path)) { + warnings.push_back(RTR("A valid NodePath must be set in the \"Spawn Path\" property in order for MultiplayerSpawner to be able to spawn Nodes.")); + } + bool has_scenes = get_spawnable_scene_count() > 0; + // Can't check if method is overriden in placeholder scripts. + bool has_placeholder_script = get_script_instance() && get_script_instance()->is_placeholder(); + if (!has_scenes && !GDVIRTUAL_IS_OVERRIDDEN(_spawn_custom) && !has_placeholder_script) { + warnings.push_back(RTR("A list of PackedScenes must be set in the \"Auto Spawn List\" property in order for MultiplayerSpawner to automatically spawn them remotely when added as child of \"spawn_path\".")); + warnings.push_back(RTR("Alternatively, a Script implementing the function \"_spawn_custom\" must be set for this MultiplayerSpawner, and \"spawn\" must be called explicitly in code.")); + } + return warnings; +} + void MultiplayerSpawner::add_spawnable_scene(const String &p_path) { SpawnableScene sc; sc.path = p_path; if (Engine::get_singleton()->is_editor_hint()) { ERR_FAIL_COND(!FileAccess::exists(p_path)); - } else { - sc.cache = ResourceLoader::load(p_path); - ERR_FAIL_COND_MSG(sc.cache.is_null(), "Invalid spawnable scene: " + p_path); } spawnable_scenes.push_back(sc); } + int MultiplayerSpawner::get_spawnable_scene_count() const { return spawnable_scenes.size(); } + String MultiplayerSpawner::get_spawnable_scene(int p_idx) const { + ERR_FAIL_INDEX_V(p_idx, (int)spawnable_scenes.size(), ""); return spawnable_scenes[p_idx].path; } + void MultiplayerSpawner::clear_spawnable_scenes() { spawnable_scenes.clear(); } @@ -270,9 +288,12 @@ const Variant MultiplayerSpawner::get_spawn_argument(const ObjectID &p_id) const Node *MultiplayerSpawner::instantiate_scene(int p_id) { ERR_FAIL_COND_V_MSG(spawn_limit && spawn_limit <= tracked_nodes.size(), nullptr, "Spawn limit reached!"); ERR_FAIL_UNSIGNED_INDEX_V((uint32_t)p_id, spawnable_scenes.size(), nullptr); - Ref<PackedScene> scene = spawnable_scenes[p_id].cache; - ERR_FAIL_COND_V(scene.is_null(), nullptr); - return scene->instantiate(); + SpawnableScene &sc = spawnable_scenes[p_id]; + if (sc.cache.is_null()) { + sc.cache = ResourceLoader::load(sc.path); + } + ERR_FAIL_COND_V_MSG(sc.cache.is_null(), nullptr, "Invalid spawnable scene: " + sc.path); + return sc.cache->instantiate(); } Node *MultiplayerSpawner::instantiate_custom(const Variant &p_data) { diff --git a/modules/multiplayer/multiplayer_spawner.h b/modules/multiplayer/multiplayer_spawner.h index fc3befc2d4..587c99efd1 100644 --- a/modules/multiplayer/multiplayer_spawner.h +++ b/modules/multiplayer/multiplayer_spawner.h @@ -91,6 +91,8 @@ protected: void _get_property_list(List<PropertyInfo> *p_list) const; #endif public: + PackedStringArray get_configuration_warnings() const override; + Node *get_spawn_node() const { return spawn_node.is_valid() ? Object::cast_to<Node>(ObjectDB::get_instance(spawn_node)) : nullptr; } diff --git a/modules/multiplayer/multiplayer_synchronizer.cpp b/modules/multiplayer/multiplayer_synchronizer.cpp index eee1495c14..2c3ebccaeb 100644 --- a/modules/multiplayer/multiplayer_synchronizer.cpp +++ b/modules/multiplayer/multiplayer_synchronizer.cpp @@ -94,6 +94,16 @@ void MultiplayerSynchronizer::_update_process() { } } +PackedStringArray MultiplayerSynchronizer::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); + + if (root_path.is_empty() || !has_node(root_path)) { + warnings.push_back(RTR("A valid NodePath must be set in the \"Root Path\" property in order for MultiplayerSynchronizer to be able to synchronize properties.")); + } + + return warnings; +} + Error MultiplayerSynchronizer::get_state(const List<NodePath> &p_properties, Object *p_obj, Vector<Variant> &r_variant, Vector<const Variant *> &r_variant_ptrs) { ERR_FAIL_COND_V(!p_obj, ERR_INVALID_PARAMETER); r_variant.resize(p_properties.size()); diff --git a/modules/multiplayer/multiplayer_synchronizer.h b/modules/multiplayer/multiplayer_synchronizer.h index e84d41db86..f10a95a1d4 100644 --- a/modules/multiplayer/multiplayer_synchronizer.h +++ b/modules/multiplayer/multiplayer_synchronizer.h @@ -66,6 +66,8 @@ public: static Error get_state(const List<NodePath> &p_properties, Object *p_obj, Vector<Variant> &r_variant, Vector<const Variant *> &r_variant_ptrs); static Error set_state(const List<NodePath> &p_properties, Object *p_obj, const Vector<Variant> &p_state); + PackedStringArray get_configuration_warnings() const override; + void set_replication_interval(double p_interval); double get_replication_interval() const; uint64_t get_replication_interval_msec() const; diff --git a/modules/navigation/navigation_mesh_generator.cpp b/modules/navigation/navigation_mesh_generator.cpp index cfb8e0cd42..f989fc45a5 100644 --- a/modules/navigation/navigation_mesh_generator.cpp +++ b/modules/navigation/navigation_mesh_generator.cpp @@ -209,6 +209,9 @@ void NavigationMeshGenerator::_parse_geometry(const Transform3D &p_navmesh_trans for (uint32_t shape_owner : shape_owners) { const int shape_count = static_body->shape_owner_get_shape_count(shape_owner); for (int i = 0; i < shape_count; i++) { + if (static_body->is_shape_owner_disabled(i)) { + continue; + } Ref<Shape3D> s = static_body->shape_owner_get_shape(shape_owner, i); if (s.is_null()) { continue; diff --git a/modules/openxr/openxr_api.cpp b/modules/openxr/openxr_api.cpp index 92d074cb75..94095eb61c 100644 --- a/modules/openxr/openxr_api.cpp +++ b/modules/openxr/openxr_api.cpp @@ -1557,7 +1557,7 @@ void OpenXRAPI::end_frame() { XrCompositionLayerProjection projection_layer = { XR_TYPE_COMPOSITION_LAYER_PROJECTION, // type nullptr, // next - layers_list.size() > 1 ? XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT | XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT : XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT, // layerFlags + layers_list.size() > 0 ? XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT | XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT : XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT, // layerFlags play_space, // space view_count, // viewCount projection_views, // views diff --git a/modules/svg/image_loader_svg.cpp b/modules/svg/image_loader_svg.cpp index 5f839bd979..f43f2784c7 100644 --- a/modules/svg/image_loader_svg.cpp +++ b/modules/svg/image_loader_svg.cpp @@ -35,6 +35,12 @@ #include <thorvg.h> +HashMap<Color, Color> ImageLoaderSVG::forced_color_map = HashMap<Color, Color>(); + +void ImageLoaderSVG::set_forced_color_map(const HashMap<Color, Color> &p_color_map) { + forced_color_map = p_color_map; +} + void ImageLoaderSVG::_replace_color_property(const HashMap<Color, Color> &p_color_map, const String &p_prefix, String &r_string) { // Replace colors in the SVG based on what is passed in `p_color_map`. // Used to change the colors of editor icons based on the used theme. @@ -136,9 +142,15 @@ void ImageLoaderSVG::get_recognized_extensions(List<String> *p_extensions) const p_extensions->push_back("svg"); } -Error ImageLoaderSVG::load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, uint32_t p_flags, float p_scale) { +Error ImageLoaderSVG::load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { String svg = p_fileaccess->get_as_utf8_string(); - create_image_from_string(p_image, svg, p_scale, false, HashMap<Color, Color>()); + + if (p_flags & FLAG_CONVERT_COLORS) { + create_image_from_string(p_image, svg, p_scale, false, forced_color_map); + } else { + create_image_from_string(p_image, svg, p_scale, false, HashMap<Color, Color>()); + } + ERR_FAIL_COND_V(p_image->is_empty(), FAILED); if (p_flags & FLAG_FORCE_LINEAR) { p_image->srgb_to_linear(); diff --git a/modules/svg/image_loader_svg.h b/modules/svg/image_loader_svg.h index fc89b63edb..b0b0963c15 100644 --- a/modules/svg/image_loader_svg.h +++ b/modules/svg/image_loader_svg.h @@ -34,12 +34,16 @@ #include "core/io/image_loader.h" class ImageLoaderSVG : public ImageFormatLoader { + static HashMap<Color, Color> forced_color_map; + void _replace_color_property(const HashMap<Color, Color> &p_color_map, const String &p_prefix, String &r_string); public: + static void set_forced_color_map(const HashMap<Color, Color> &p_color_map); + void create_image_from_string(Ref<Image> p_image, String p_string, float p_scale, bool p_upsample, const HashMap<Color, Color> &p_color_map); - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, uint32_t p_flags, float p_scale) override; + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) override; virtual void get_recognized_extensions(List<String> *p_extensions) const override; }; diff --git a/modules/svg/register_types.cpp b/modules/svg/register_types.cpp index 5b4d1d31ca..323b1d652a 100644 --- a/modules/svg/register_types.cpp +++ b/modules/svg/register_types.cpp @@ -34,7 +34,7 @@ #include <thorvg.h> -static ImageLoaderSVG *image_loader_svg = nullptr; +static Ref<ImageLoaderSVG> image_loader_svg; void initialize_svg_module(ModuleInitializationLevel p_level) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { @@ -45,7 +45,8 @@ void initialize_svg_module(ModuleInitializationLevel p_level) { if (tvg::Initializer::init(tvgEngine, 1) != tvg::Result::Success) { return; } - image_loader_svg = memnew(ImageLoaderSVG); + + image_loader_svg.instantiate(); ImageLoader::add_image_format_loader(image_loader_svg); } @@ -54,9 +55,12 @@ void uninitialize_svg_module(ModuleInitializationLevel p_level) { return; } - if (!image_loader_svg) { + if (image_loader_svg.is_null()) { + // It failed to initialize so it was not added. return; } - memdelete(image_loader_svg); + + ImageLoader::remove_image_format_loader(image_loader_svg); + image_loader_svg.unref(); tvg::Initializer::term(tvg::CanvasEngine::Sw); } diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index 7aebeafe70..b0f414f7f0 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -45,7 +45,6 @@ using namespace godot; // Headers for building as built-in module. #include "core/config/project_settings.h" -#include "core/core_bind.h" #include "core/error/error_macros.h" #include "core/object/worker_thread_pool.h" #include "core/string/print_string.h" @@ -53,8 +52,6 @@ using namespace godot; #include "modules/modules_enabled.gen.h" // For freetype, msdfgen. -using namespace core_bind; - #endif // Built-in ICU data. @@ -408,13 +405,12 @@ bool TextServerAdvanced::load_support_data(const String &p_filename) { if (!icu_data_loaded) { String filename = (p_filename.is_empty()) ? String("res://") + _MKSTR(ICU_DATA_NAME) : p_filename; - Ref<File> f; - f.instantiate(); - if (f->open(filename, File::READ) != OK) { + Ref<FileAccess> f = FileAccess::open(filename, FileAccess::READ); + if (f.is_null()) { return false; } uint64_t len = f->get_length(); - PackedByteArray icu_data = f->get_buffer(len); + PackedByteArray icu_data = f->_get_buffer(len); UErrorCode err = U_ZERO_ERROR; udata_setCommonData(icu_data.ptr(), &err); @@ -455,16 +451,15 @@ bool TextServerAdvanced::save_support_data(const String &p_filename) const { // Store data to the res file if it's available. - Ref<File> f; - f.instantiate(); - if (f->open(p_filename, File::WRITE) != OK) { + Ref<FileAccess> f = FileAccess::open(p_filename, FileAccess::WRITE); + if (f.is_null()) { return false; } PackedByteArray icu_data; icu_data.resize(U_ICUDATA_SIZE); memcpy(icu_data.ptrw(), U_ICUDATA_ENTRY_POINT, U_ICUDATA_SIZE); - f->store_buffer(icu_data); + f->_store_buffer(icu_data); return true; #else @@ -1940,12 +1935,12 @@ int64_t TextServerAdvanced::font_get_face_count(const RID &p_font_rid) const { fargs.flags = FT_OPEN_MEMORY; fargs.stream = &stream; - FT_Face tmp_face; + FT_Face tmp_face = nullptr; error = FT_Open_Face(ft_library, &fargs, -1, &tmp_face); if (error == 0) { face_count = tmp_face->num_faces; + FT_Done_Face(tmp_face); } - FT_Done_Face(tmp_face); #endif } diff --git a/modules/text_server_fb/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index 4d599dbcb5..23662bf2c4 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -1039,12 +1039,12 @@ int64_t TextServerFallback::font_get_face_count(const RID &p_font_rid) const { fargs.flags = FT_OPEN_MEMORY; fargs.stream = &stream; - FT_Face tmp_face; + FT_Face tmp_face = nullptr; error = FT_Open_Face(ft_library, &fargs, -1, &tmp_face); if (error == 0) { face_count = tmp_face->num_faces; + FT_Done_Face(tmp_face); } - FT_Done_Face(tmp_face); #endif } diff --git a/modules/tga/image_loader_tga.cpp b/modules/tga/image_loader_tga.cpp index 16d9bf7b93..00ba32eae1 100644 --- a/modules/tga/image_loader_tga.cpp +++ b/modules/tga/image_loader_tga.cpp @@ -230,7 +230,7 @@ Error ImageLoaderTGA::convert_to_image(Ref<Image> p_image, const uint8_t *p_buff return OK; } -Error ImageLoaderTGA::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderTGA::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { Vector<uint8_t> src_image; uint64_t src_image_len = f->get_length(); ERR_FAIL_COND_V(src_image_len == 0, ERR_FILE_CORRUPT); diff --git a/modules/tga/image_loader_tga.h b/modules/tga/image_loader_tga.h index d95c5ff30b..b257ed110d 100644 --- a/modules/tga/image_loader_tga.h +++ b/modules/tga/image_loader_tga.h @@ -73,7 +73,7 @@ class ImageLoaderTGA : public ImageFormatLoader { static Error convert_to_image(Ref<Image> p_image, const uint8_t *p_buffer, const tga_header_s &p_header, const uint8_t *p_palette, const bool p_is_monochrome, size_t p_input_size); public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderTGA(); }; diff --git a/modules/tga/register_types.cpp b/modules/tga/register_types.cpp index 520ed5f799..3a9d2324e7 100644 --- a/modules/tga/register_types.cpp +++ b/modules/tga/register_types.cpp @@ -32,14 +32,14 @@ #include "image_loader_tga.h" -static ImageLoaderTGA *image_loader_tga = nullptr; +static Ref<ImageLoaderTGA> image_loader_tga; void initialize_tga_module(ModuleInitializationLevel p_level) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { return; } - image_loader_tga = memnew(ImageLoaderTGA); + image_loader_tga.instantiate(); ImageLoader::add_image_format_loader(image_loader_tga); } @@ -48,5 +48,6 @@ void uninitialize_tga_module(ModuleInitializationLevel p_level) { return; } - memdelete(image_loader_tga); + ImageLoader::remove_image_format_loader(image_loader_tga); + image_loader_tga.unref(); } diff --git a/modules/tinyexr/image_loader_tinyexr.cpp b/modules/tinyexr/image_loader_tinyexr.cpp index 6f61251f9b..5c43bfc8b7 100644 --- a/modules/tinyexr/image_loader_tinyexr.cpp +++ b/modules/tinyexr/image_loader_tinyexr.cpp @@ -37,7 +37,7 @@ #include "thirdparty/tinyexr/tinyexr.h" -Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { Vector<uint8_t> src_image; uint64_t src_image_len = f->get_length(); ERR_FAIL_COND_V(src_image_len == 0, ERR_FILE_CORRUPT); diff --git a/modules/tinyexr/image_loader_tinyexr.h b/modules/tinyexr/image_loader_tinyexr.h index 8da2a0d4af..ab34a59da5 100644 --- a/modules/tinyexr/image_loader_tinyexr.h +++ b/modules/tinyexr/image_loader_tinyexr.h @@ -35,7 +35,7 @@ class ImageLoaderTinyEXR : public ImageFormatLoader { public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderTinyEXR(); }; diff --git a/modules/tinyexr/register_types.cpp b/modules/tinyexr/register_types.cpp index c5897f37c3..b1a9f18e3b 100644 --- a/modules/tinyexr/register_types.cpp +++ b/modules/tinyexr/register_types.cpp @@ -33,14 +33,14 @@ #include "image_loader_tinyexr.h" #include "image_saver_tinyexr.h" -static ImageLoaderTinyEXR *image_loader_tinyexr = nullptr; +static Ref<ImageLoaderTinyEXR> image_loader_tinyexr; void initialize_tinyexr_module(ModuleInitializationLevel p_level) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { return; } - image_loader_tinyexr = memnew(ImageLoaderTinyEXR); + image_loader_tinyexr.instantiate(); ImageLoader::add_image_format_loader(image_loader_tinyexr); Image::save_exr_func = save_exr; @@ -52,7 +52,8 @@ void uninitialize_tinyexr_module(ModuleInitializationLevel p_level) { return; } - memdelete(image_loader_tinyexr); + ImageLoader::remove_image_format_loader(image_loader_tinyexr); + image_loader_tinyexr.unref(); Image::save_exr_func = nullptr; } diff --git a/modules/webp/image_loader_webp.cpp b/modules/webp/image_loader_webp.cpp index 705ab508ab..dd387db554 100644 --- a/modules/webp/image_loader_webp.cpp +++ b/modules/webp/image_loader_webp.cpp @@ -48,7 +48,7 @@ static Ref<Image> _webp_mem_loader_func(const uint8_t *p_png, int p_size) { return img; } -Error ImageLoaderWebP::load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale) { +Error ImageLoaderWebP::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) { Vector<uint8_t> src_image; uint64_t src_image_len = f->get_length(); ERR_FAIL_COND_V(src_image_len == 0, ERR_FILE_CORRUPT); diff --git a/modules/webp/image_loader_webp.h b/modules/webp/image_loader_webp.h index d868ae3f7f..0522e4ef91 100644 --- a/modules/webp/image_loader_webp.h +++ b/modules/webp/image_loader_webp.h @@ -35,7 +35,7 @@ class ImageLoaderWebP : public ImageFormatLoader { public: - virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, uint32_t p_flags, float p_scale); + virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderWebP(); }; diff --git a/modules/webp/register_types.cpp b/modules/webp/register_types.cpp index 29f633743e..e523f43cfe 100644 --- a/modules/webp/register_types.cpp +++ b/modules/webp/register_types.cpp @@ -33,7 +33,7 @@ #include "image_loader_webp.h" #include "resource_saver_webp.h" -static ImageLoaderWebP *image_loader_webp = nullptr; +static Ref<ImageLoaderWebP> image_loader_webp; static Ref<ResourceSaverWebP> resource_saver_webp; void initialize_webp_module(ModuleInitializationLevel p_level) { @@ -41,9 +41,10 @@ void initialize_webp_module(ModuleInitializationLevel p_level) { return; } - image_loader_webp = memnew(ImageLoaderWebP); - resource_saver_webp.instantiate(); + image_loader_webp.instantiate(); ImageLoader::add_image_format_loader(image_loader_webp); + + resource_saver_webp.instantiate(); ResourceSaver::add_resource_format_saver(resource_saver_webp); } @@ -52,7 +53,9 @@ void uninitialize_webp_module(ModuleInitializationLevel p_level) { return; } - memdelete(image_loader_webp); + ImageLoader::remove_image_format_loader(image_loader_webp); + image_loader_webp.unref(); + ResourceSaver::remove_resource_format_saver(resource_saver_webp); resource_saver_webp.unref(); } diff --git a/modules/webrtc/doc_classes/WebRTCPeerConnection.xml b/modules/webrtc/doc_classes/WebRTCPeerConnection.xml index e99aeb4f51..4ecc71ddbb 100644 --- a/modules/webrtc/doc_classes/WebRTCPeerConnection.xml +++ b/modules/webrtc/doc_classes/WebRTCPeerConnection.xml @@ -67,6 +67,18 @@ Returns the connection state. See [enum ConnectionState]. </description> </method> + <method name="get_gathering_state" qualifiers="const"> + <return type="int" enum="WebRTCPeerConnection.GatheringState" /> + <description> + Returns the ICE [enum GatheringState] of the connection. This lets you detect, for example, when collection of ICE candidates has finished. + </description> + </method> + <method name="get_signaling_state" qualifiers="const"> + <return type="int" enum="WebRTCPeerConnection.SignalingState" /> + <description> + Returns the [enum SignalingState] on the local end of the connection while connecting or reconnecting to another peer. + </description> + </method> <method name="initialize"> <return type="int" enum="Error" /> <param index="0" name="configuration" type="Dictionary" default="{}" /> @@ -165,5 +177,32 @@ <constant name="STATE_CLOSED" value="5" enum="ConnectionState"> The peer connection is closed (after calling [method close] for example). </constant> + <constant name="GATHERING_STATE_NEW" value="0" enum="GatheringState"> + The peer connection was just created and hasn't done any networking yet. + </constant> + <constant name="GATHERING_STATE_GATHERING" value="1" enum="GatheringState"> + The ICE agent is in the process of gathering candidates for the connection. + </constant> + <constant name="GATHERING_STATE_COMPLETE" value="2" enum="GatheringState"> + The ICE agent has finished gathering candidates. If something happens that requires collecting new candidates, such as a new interface being added or the addition of a new ICE server, the state will revert to gathering to gather those candidates. + </constant> + <constant name="SIGNALING_STATE_STABLE" value="0" enum="SignalingState"> + There is no ongoing exchange of offer and answer underway. This may mean that the [WebRTCPeerConnection] is new ([constant STATE_NEW]) or that negotiation is complete and a connection has been established ([constant STATE_CONNECTED]). + </constant> + <constant name="SIGNALING_STATE_HAVE_LOCAL_OFFER" value="1" enum="SignalingState"> + The local peer has called [method set_local_description], passing in SDP representing an offer (usually created by calling [method create_offer]), and the offer has been applied successfully. + </constant> + <constant name="SIGNALING_STATE_HAVE_REMOTE_OFFER" value="2" enum="SignalingState"> + The remote peer has created an offer and used the signaling server to deliver it to the local peer, which has set the offer as the remote description by calling [method set_remote_description]. + </constant> + <constant name="SIGNALING_STATE_HAVE_LOCAL_PRANSWER" value="3" enum="SignalingState"> + The offer sent by the remote peer has been applied and an answer has been created and applied by calling [method set_local_description]. This provisional answer describes the supported media formats and so forth, but may not have a complete set of ICE candidates included. Further candidates will be delivered separately later. + </constant> + <constant name="SIGNALING_STATE_HAVE_REMOTE_PRANSWER" value="4" enum="SignalingState"> + A provisional answer has been received and successfully applied in response to an offer previously sent and established by calling [method set_local_description]. + </constant> + <constant name="SIGNALING_STATE_CLOSED" value="5" enum="SignalingState"> + The [WebRTCPeerConnection] has been closed. + </constant> </constants> </class> diff --git a/modules/webrtc/doc_classes/WebRTCPeerConnectionExtension.xml b/modules/webrtc/doc_classes/WebRTCPeerConnectionExtension.xml index 3c4bf18a76..474d2f6a89 100644 --- a/modules/webrtc/doc_classes/WebRTCPeerConnectionExtension.xml +++ b/modules/webrtc/doc_classes/WebRTCPeerConnectionExtension.xml @@ -37,6 +37,16 @@ <description> </description> </method> + <method name="_get_gathering_state" qualifiers="virtual const"> + <return type="int" enum="WebRTCPeerConnection.GatheringState" /> + <description> + </description> + </method> + <method name="_get_signaling_state" qualifiers="virtual const"> + <return type="int" enum="WebRTCPeerConnection.SignalingState" /> + <description> + </description> + </method> <method name="_initialize" qualifiers="virtual"> <return type="int" enum="Error" /> <param index="0" name="p_config" type="Dictionary" /> diff --git a/modules/webrtc/library_godot_webrtc.js b/modules/webrtc/library_godot_webrtc.js index e57e4299e0..e6604eecd7 100644 --- a/modules/webrtc/library_godot_webrtc.js +++ b/modules/webrtc/library_godot_webrtc.js @@ -220,64 +220,123 @@ mergeInto(LibraryManager.library, GodotRTCDataChannel); const GodotRTCPeerConnection = { $GodotRTCPeerConnection__deps: ['$IDHandler', '$GodotRuntime', '$GodotRTCDataChannel'], $GodotRTCPeerConnection: { - onstatechange: function (p_id, p_conn, callback, event) { - const ref = IDHandler.get(p_id); - if (!ref) { - return; - } - let state; - switch (p_conn.iceConnectionState) { - case 'new': - state = 0; - break; - case 'checking': - state = 1; - break; - case 'connected': - case 'completed': - state = 2; - break; - case 'disconnected': - state = 3; - break; - case 'failed': - state = 4; - break; - case 'closed': - default: - state = 5; - break; - } - callback(state); + // Enums + ConnectionState: { + 'new': 0, + 'connecting': 1, + 'connected': 2, + 'disconnected': 3, + 'failed': 4, + 'closed': 5, }, - onicecandidate: function (p_id, callback, event) { - const ref = IDHandler.get(p_id); - if (!ref || !event.candidate) { - return; + ConnectionStateCompat: { + // Using values from IceConnectionState for browsers that do not support ConnectionState (notably Firefox). + 'new': 0, + 'checking': 1, + 'connected': 2, + 'completed': 2, + 'disconnected': 3, + 'failed': 4, + 'closed': 5, + }, + + IceGatheringState: { + 'new': 0, + 'gathering': 1, + 'complete': 2, + }, + + SignalingState: { + 'stable': 0, + 'have-local-offer': 1, + 'have-remote-offer': 2, + 'have-local-pranswer': 3, + 'have-remote-pranswer': 4, + 'closed': 5, + }, + + // Callbacks + create: function (config, onConnectionChange, onSignalingChange, onIceGatheringChange, onIceCandidate, onDataChannel) { + let conn = null; + try { + conn = new RTCPeerConnection(config); + } catch (e) { + GodotRuntime.error(e); + return 0; } - const c = event.candidate; - const candidate_str = GodotRuntime.allocString(c.candidate); - const mid_str = GodotRuntime.allocString(c.sdpMid); - callback(mid_str, c.sdpMLineIndex, candidate_str); - GodotRuntime.free(candidate_str); - GodotRuntime.free(mid_str); + const id = IDHandler.add(conn); + + if ('connectionState' in conn && conn['connectionState'] !== undefined) { + // Use "connectionState" if supported + conn.onconnectionstatechange = function (event) { + if (!IDHandler.get(id)) { + return; + } + onConnectionChange(GodotRTCPeerConnection.ConnectionState[conn.connectionState] || 0); + }; + } else { + // Fall back to using "iceConnectionState" when "connectionState" is not supported (notably Firefox). + conn.oniceconnectionstatechange = function (event) { + if (!IDHandler.get(id)) { + return; + } + onConnectionChange(GodotRTCPeerConnection.ConnectionStateCompat[conn.iceConnectionState] || 0); + }; + } + conn.onicegatheringstatechange = function (event) { + if (!IDHandler.get(id)) { + return; + } + onIceGatheringChange(GodotRTCPeerConnection.IceGatheringState[conn.iceGatheringState] || 0); + }; + conn.onsignalingstatechange = function (event) { + if (!IDHandler.get(id)) { + return; + } + onSignalingChange(GodotRTCPeerConnection.SignalingState[conn.signalingState] || 0); + }; + conn.onicecandidate = function (event) { + if (!IDHandler.get(id)) { + return; + } + const c = event.candidate; + if (!c || !c.candidate) { + return; + } + const candidate_str = GodotRuntime.allocString(c.candidate); + const mid_str = GodotRuntime.allocString(c.sdpMid); + onIceCandidate(mid_str, c.sdpMLineIndex, candidate_str); + GodotRuntime.free(candidate_str); + GodotRuntime.free(mid_str); + }; + conn.ondatachannel = function (event) { + if (!IDHandler.get(id)) { + return; + } + const cid = IDHandler.add(event.channel); + onDataChannel(cid); + }; + return id; }, - ondatachannel: function (p_id, callback, event) { - const ref = IDHandler.get(p_id); - if (!ref) { + destroy: function (p_id) { + const conn = IDHandler.get(p_id); + if (!conn) { return; } - - const cid = IDHandler.add(event.channel); - callback(cid); + conn.onconnectionstatechange = null; + conn.oniceconnectionstatechange = null; + conn.onicegatheringstatechange = null; + conn.onsignalingstatechange = null; + conn.onicecandidate = null; + conn.ondatachannel = null; + IDHandler.remove(p_id); }, onsession: function (p_id, callback, session) { - const ref = IDHandler.get(p_id); - if (!ref) { + if (!IDHandler.get(p_id)) { return; } const type_str = GodotRuntime.allocString(session.type); @@ -297,27 +356,19 @@ const GodotRTCPeerConnection = { }, }, - godot_js_rtc_pc_create__sig: 'iiiiii', - godot_js_rtc_pc_create: function (p_config, p_ref, p_on_state_change, p_on_candidate, p_on_datachannel) { - const onstatechange = GodotRuntime.get_func(p_on_state_change).bind(null, p_ref); - const oncandidate = GodotRuntime.get_func(p_on_candidate).bind(null, p_ref); - const ondatachannel = GodotRuntime.get_func(p_on_datachannel).bind(null, p_ref); - - const config = JSON.parse(GodotRuntime.parseString(p_config)); - let conn = null; - try { - conn = new RTCPeerConnection(config); - } catch (e) { - GodotRuntime.error(e); - return 0; - } - - const base = GodotRTCPeerConnection; - const id = IDHandler.add(conn); - conn.oniceconnectionstatechange = base.onstatechange.bind(null, id, conn, onstatechange); - conn.onicecandidate = base.onicecandidate.bind(null, id, oncandidate); - conn.ondatachannel = base.ondatachannel.bind(null, id, ondatachannel); - return id; + godot_js_rtc_pc_create__sig: 'iiiiiiii', + godot_js_rtc_pc_create: function (p_config, p_ref, p_on_connection_state_change, p_on_ice_gathering_state_change, p_on_signaling_state_change, p_on_ice_candidate, p_on_datachannel) { + const wrap = function (p_func) { + return GodotRuntime.get_func(p_func).bind(null, p_ref); + }; + return GodotRTCPeerConnection.create( + JSON.parse(GodotRuntime.parseString(p_config)), + wrap(p_on_connection_state_change), + wrap(p_on_signaling_state_change), + wrap(p_on_ice_gathering_state_change), + wrap(p_on_ice_candidate), + wrap(p_on_datachannel) + ); }, godot_js_rtc_pc_close__sig: 'vi', @@ -331,14 +382,7 @@ const GodotRTCPeerConnection = { godot_js_rtc_pc_destroy__sig: 'vi', godot_js_rtc_pc_destroy: function (p_id) { - const ref = IDHandler.get(p_id); - if (!ref) { - return; - } - ref.oniceconnectionstatechange = null; - ref.onicecandidate = null; - ref.ondatachannel = null; - IDHandler.remove(p_id); + GodotRTCPeerConnection.destroy(p_id); }, godot_js_rtc_pc_offer_create__sig: 'viiii', diff --git a/modules/webrtc/webrtc_peer_connection.cpp b/modules/webrtc/webrtc_peer_connection.cpp index d885b9262b..5aa891d35c 100644 --- a/modules/webrtc/webrtc_peer_connection.cpp +++ b/modules/webrtc/webrtc_peer_connection.cpp @@ -69,6 +69,8 @@ void WebRTCPeerConnection::_bind_methods() { ClassDB::bind_method(D_METHOD("close"), &WebRTCPeerConnection::close); ClassDB::bind_method(D_METHOD("get_connection_state"), &WebRTCPeerConnection::get_connection_state); + ClassDB::bind_method(D_METHOD("get_gathering_state"), &WebRTCPeerConnection::get_gathering_state); + ClassDB::bind_method(D_METHOD("get_signaling_state"), &WebRTCPeerConnection::get_signaling_state); ADD_SIGNAL(MethodInfo("session_description_created", PropertyInfo(Variant::STRING, "type"), PropertyInfo(Variant::STRING, "sdp"))); ADD_SIGNAL(MethodInfo("ice_candidate_created", PropertyInfo(Variant::STRING, "media"), PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::STRING, "name"))); @@ -80,6 +82,17 @@ void WebRTCPeerConnection::_bind_methods() { BIND_ENUM_CONSTANT(STATE_DISCONNECTED); BIND_ENUM_CONSTANT(STATE_FAILED); BIND_ENUM_CONSTANT(STATE_CLOSED); + + BIND_ENUM_CONSTANT(GATHERING_STATE_NEW); + BIND_ENUM_CONSTANT(GATHERING_STATE_GATHERING); + BIND_ENUM_CONSTANT(GATHERING_STATE_COMPLETE); + + BIND_ENUM_CONSTANT(SIGNALING_STATE_STABLE); + BIND_ENUM_CONSTANT(SIGNALING_STATE_HAVE_LOCAL_OFFER); + BIND_ENUM_CONSTANT(SIGNALING_STATE_HAVE_REMOTE_OFFER); + BIND_ENUM_CONSTANT(SIGNALING_STATE_HAVE_LOCAL_PRANSWER); + BIND_ENUM_CONSTANT(SIGNALING_STATE_HAVE_REMOTE_PRANSWER); + BIND_ENUM_CONSTANT(SIGNALING_STATE_CLOSED); } WebRTCPeerConnection::WebRTCPeerConnection() { diff --git a/modules/webrtc/webrtc_peer_connection.h b/modules/webrtc/webrtc_peer_connection.h index 122ea3d00f..76f29f9d68 100644 --- a/modules/webrtc/webrtc_peer_connection.h +++ b/modules/webrtc/webrtc_peer_connection.h @@ -47,6 +47,21 @@ public: STATE_CLOSED }; + enum GatheringState { + GATHERING_STATE_NEW, + GATHERING_STATE_GATHERING, + GATHERING_STATE_COMPLETE, + }; + + enum SignalingState { + SIGNALING_STATE_STABLE, + SIGNALING_STATE_HAVE_LOCAL_OFFER, + SIGNALING_STATE_HAVE_REMOTE_OFFER, + SIGNALING_STATE_HAVE_LOCAL_PRANSWER, + SIGNALING_STATE_HAVE_REMOTE_PRANSWER, + SIGNALING_STATE_CLOSED, + }; + private: static StringName default_extension; @@ -57,6 +72,8 @@ public: static void set_default_extension(const StringName &p_name); virtual ConnectionState get_connection_state() const = 0; + virtual GatheringState get_gathering_state() const = 0; + virtual SignalingState get_signaling_state() const = 0; virtual Error initialize(Dictionary p_config = Dictionary()) = 0; virtual Ref<WebRTCDataChannel> create_data_channel(String p_label, Dictionary p_options = Dictionary()) = 0; @@ -74,5 +91,7 @@ public: }; VARIANT_ENUM_CAST(WebRTCPeerConnection::ConnectionState); +VARIANT_ENUM_CAST(WebRTCPeerConnection::GatheringState); +VARIANT_ENUM_CAST(WebRTCPeerConnection::SignalingState); #endif // WEBRTC_PEER_CONNECTION_H diff --git a/modules/webrtc/webrtc_peer_connection_extension.cpp b/modules/webrtc/webrtc_peer_connection_extension.cpp index 54143e4b79..592a1f8a97 100644 --- a/modules/webrtc/webrtc_peer_connection_extension.cpp +++ b/modules/webrtc/webrtc_peer_connection_extension.cpp @@ -32,6 +32,8 @@ void WebRTCPeerConnectionExtension::_bind_methods() { GDVIRTUAL_BIND(_get_connection_state); + GDVIRTUAL_BIND(_get_gathering_state); + GDVIRTUAL_BIND(_get_signaling_state); GDVIRTUAL_BIND(_initialize, "p_config"); GDVIRTUAL_BIND(_create_data_channel, "p_label", "p_config"); GDVIRTUAL_BIND(_create_offer); diff --git a/modules/webrtc/webrtc_peer_connection_extension.h b/modules/webrtc/webrtc_peer_connection_extension.h index 0c324ca45f..085069debb 100644 --- a/modules/webrtc/webrtc_peer_connection_extension.h +++ b/modules/webrtc/webrtc_peer_connection_extension.h @@ -53,6 +53,8 @@ public: /** GDExtension **/ EXBIND0RC(ConnectionState, get_connection_state); + EXBIND0RC(GatheringState, get_gathering_state); + EXBIND0RC(SignalingState, get_signaling_state); EXBIND1R(Error, initialize, Dictionary); EXBIND0R(Error, create_offer); EXBIND2R(Error, set_remote_description, String, String); diff --git a/modules/webrtc/webrtc_peer_connection_js.cpp b/modules/webrtc/webrtc_peer_connection_js.cpp index f48705253b..a371312ae9 100644 --- a/modules/webrtc/webrtc_peer_connection_js.cpp +++ b/modules/webrtc/webrtc_peer_connection_js.cpp @@ -51,6 +51,16 @@ void WebRTCPeerConnectionJS::_on_connection_state_changed(void *p_obj, int p_sta peer->_conn_state = (ConnectionState)p_state; } +void WebRTCPeerConnectionJS::_on_gathering_state_changed(void *p_obj, int p_state) { + WebRTCPeerConnectionJS *peer = static_cast<WebRTCPeerConnectionJS *>(p_obj); + peer->_gathering_state = (GatheringState)p_state; +} + +void WebRTCPeerConnectionJS::_on_signaling_state_changed(void *p_obj, int p_state) { + WebRTCPeerConnectionJS *peer = static_cast<WebRTCPeerConnectionJS *>(p_obj); + peer->_signaling_state = (SignalingState)p_state; +} + void WebRTCPeerConnectionJS::_on_error(void *p_obj) { ERR_PRINT("RTCPeerConnection error!"); } @@ -100,7 +110,7 @@ Error WebRTCPeerConnectionJS::initialize(Dictionary p_config) { _conn_state = STATE_NEW; String config = Variant(p_config).to_json_string(); - _js_id = godot_js_rtc_pc_create(config.utf8().get_data(), this, &_on_connection_state_changed, &_on_ice_candidate, &_on_data_channel); + _js_id = godot_js_rtc_pc_create(config.utf8().get_data(), this, &_on_connection_state_changed, &_on_gathering_state_changed, &_on_signaling_state_changed, &_on_ice_candidate, &_on_data_channel); return _js_id ? OK : FAILED; } @@ -117,14 +127,19 @@ Error WebRTCPeerConnectionJS::poll() { return OK; } +WebRTCPeerConnection::GatheringState WebRTCPeerConnectionJS::get_gathering_state() const { + return _gathering_state; +} + +WebRTCPeerConnection::SignalingState WebRTCPeerConnectionJS::get_signaling_state() const { + return _signaling_state; +} + WebRTCPeerConnection::ConnectionState WebRTCPeerConnectionJS::get_connection_state() const { return _conn_state; } WebRTCPeerConnectionJS::WebRTCPeerConnectionJS() { - _conn_state = STATE_NEW; - _js_id = 0; - Dictionary config; initialize(config); } diff --git a/modules/webrtc/webrtc_peer_connection_js.h b/modules/webrtc/webrtc_peer_connection_js.h index 50266129e4..e62ad6af28 100644 --- a/modules/webrtc/webrtc_peer_connection_js.h +++ b/modules/webrtc/webrtc_peer_connection_js.h @@ -37,11 +37,13 @@ extern "C" { typedef void (*RTCOnIceConnectionStateChange)(void *p_obj, int p_state); +typedef void (*RTCOnIceGatheringStateChange)(void *p_obj, int p_state); +typedef void (*RTCOnSignalingStateChange)(void *p_obj, int p_state); typedef void (*RTCOnIceCandidate)(void *p_obj, const char *p_mid, int p_mline_idx, const char *p_candidate); typedef void (*RTCOnDataChannel)(void *p_obj, int p_id); typedef void (*RTCOnSession)(void *p_obj, const char *p_type, const char *p_sdp); typedef void (*RTCOnError)(void *p_obj); -extern int godot_js_rtc_pc_create(const char *p_config, void *p_obj, RTCOnIceConnectionStateChange p_on_state_change, RTCOnIceCandidate p_on_candidate, RTCOnDataChannel p_on_datachannel); +extern int godot_js_rtc_pc_create(const char *p_config, void *p_obj, RTCOnIceConnectionStateChange p_on_connection_state_change, RTCOnIceGatheringStateChange p_on_gathering_state_change, RTCOnSignalingStateChange p_on_signaling_state_change, RTCOnIceCandidate p_on_candidate, RTCOnDataChannel p_on_datachannel); extern void godot_js_rtc_pc_close(int p_id); extern void godot_js_rtc_pc_destroy(int p_id); extern void godot_js_rtc_pc_offer_create(int p_id, void *p_obj, RTCOnSession p_on_session, RTCOnError p_on_error); @@ -55,10 +57,14 @@ class WebRTCPeerConnectionJS : public WebRTCPeerConnection { GDCLASS(WebRTCPeerConnectionJS, WebRTCPeerConnection); private: - int _js_id; - ConnectionState _conn_state; + int _js_id = 0; + ConnectionState _conn_state = STATE_NEW; + GatheringState _gathering_state = GATHERING_STATE_NEW; + SignalingState _signaling_state = SIGNALING_STATE_STABLE; static void _on_connection_state_changed(void *p_obj, int p_state); + static void _on_gathering_state_changed(void *p_obj, int p_state); + static void _on_signaling_state_changed(void *p_obj, int p_state); static void _on_ice_candidate(void *p_obj, const char *p_mid_name, int p_mline_idx, const char *p_candidate); static void _on_data_channel(void *p_obj, int p_channel); static void _on_session_created(void *p_obj, const char *p_type, const char *p_session); @@ -66,6 +72,8 @@ private: public: virtual ConnectionState get_connection_state() const override; + virtual GatheringState get_gathering_state() const override; + virtual SignalingState get_signaling_state() const override; virtual Error initialize(Dictionary configuration = Dictionary()) override; virtual Ref<WebRTCDataChannel> create_data_channel(String p_channel_name, Dictionary p_channel_config = Dictionary()) override; diff --git a/modules/websocket/doc_classes/WebSocketClient.xml b/modules/websocket/doc_classes/WebSocketClient.xml index 7d73194ea9..1978d2e7c6 100644 --- a/modules/websocket/doc_classes/WebSocketClient.xml +++ b/modules/websocket/doc_classes/WebSocketClient.xml @@ -24,8 +24,8 @@ If [code]true[/code] is passed as [code]gd_mp_api[/code], the client will behave like a multiplayer peer for the [MultiplayerAPI], connections to non-Godot servers will not work, and [signal data_received] will not be emitted. 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]). You can optionally pass a list of [code]custom_headers[/code] to be added to the handshake HTTP request. - [b]Note:[/b] To avoid mixed content warnings or errors in Web, you may have to use a [code]url[/code] that starts with [code]wss://[/code] (secure) instead of [code]ws://[/code]. When doing so, make sure to use the fully qualified domain name that matches the one defined in the server's SSL certificate. Do not connect directly via the IP address for [code]wss://[/code] connections, as it won't match with the SSL certificate. - [b]Note:[/b] Specifying [code]custom_headers[/code] is not supported in Web exports due to browsers restrictions. + [b]Note:[/b] To avoid mixed content warnings or errors in Web, you may have to use a [code]url[/code] that starts with [code]wss://[/code] (secure) instead of [code]ws://[/code]. When doing so, make sure to use the fully qualified domain name that matches the one defined in the server's TLS certificate. Do not connect directly via the IP address for [code]wss://[/code] connections, as it won't match with the TLS certificate. + [b]Note:[/b] Specifying [code]custom_headers[/code] is not supported in Web exports due to browsers' restrictions. </description> </method> <method name="disconnect_from_host"> @@ -50,12 +50,12 @@ </method> </methods> <members> - <member name="trusted_ssl_certificate" type="X509Certificate" setter="set_trusted_ssl_certificate" getter="get_trusted_ssl_certificate"> - 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. - [b]Note:[/b] Specifying a custom [code]trusted_ssl_certificate[/code] is not supported in Web exports due to browsers restrictions. + <member name="trusted_tls_certificate" type="X509Certificate" setter="set_trusted_tls_certificate" getter="get_trusted_tls_certificate"> + If specified, this [X509Certificate] will be the only one accepted when connecting to an TLS host. Any other certificate provided by the server will be regarded as invalid. + [b]Note:[/b] Specifying a custom [code]trusted_tls_certificate[/code] is not supported in Web exports due to browsers' restrictions. </member> - <member name="verify_ssl" type="bool" setter="set_verify_ssl_enabled" getter="is_verify_ssl_enabled"> - If [code]true[/code], SSL certificate verification is enabled. + <member name="verify_tls" type="bool" setter="set_verify_tls_enabled" getter="is_verify_tls_enabled"> + If [code]true[/code], TLS certificate verification is enabled. [b]Note:[/b] You must specify the certificates to be used in the Project Settings for it to work when exported. </member> </members> diff --git a/modules/websocket/doc_classes/WebSocketServer.xml b/modules/websocket/doc_classes/WebSocketServer.xml index 19c36700e6..07a55b73f1 100644 --- a/modules/websocket/doc_classes/WebSocketServer.xml +++ b/modules/websocket/doc_classes/WebSocketServer.xml @@ -79,16 +79,16 @@ 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. </member> <member name="ca_chain" type="X509Certificate" setter="set_ca_chain" getter="get_ca_chain"> - 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. + When using TLS (see [member private_key] and [member tls_certificate]), you can set this to a valid [X509Certificate] to be provided as additional CA chain information during the TLS handshake. </member> <member name="handshake_timeout" type="float" setter="set_handshake_timeout" getter="get_handshake_timeout" default="3.0"> The time in seconds before a pending client (i.e. a client that has not yet finished the HTTP handshake) is considered stale and forcefully disconnected. </member> <member name="private_key" type="CryptoKey" setter="set_private_key" getter="get_private_key"> - 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). + When set to a valid [CryptoKey] (along with [member tls_certificate]) will cause the server to require TLS instead of regular TCP (i.e. the [code]wss://[/code] protocol). </member> - <member name="ssl_certificate" type="X509Certificate" setter="set_ssl_certificate" getter="get_ssl_certificate"> - 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). + <member name="tls_certificate" type="X509Certificate" setter="set_tls_certificate" getter="get_tls_certificate"> + When set to a valid [X509Certificate] (along with [member private_key]) will cause the server to require TLS instead of regular TCP (i.e. the [code]wss://[/code] protocol). </member> </members> <signals> diff --git a/modules/websocket/emws_client.cpp b/modules/websocket/emws_client.cpp index 65e0703c00..933a1f43e9 100644 --- a/modules/websocket/emws_client.cpp +++ b/modules/websocket/emws_client.cpp @@ -65,7 +65,7 @@ void EMWSClient::_esws_on_close(void *obj, int code, const char *reason, int was client->_on_disconnect(was_clean != 0); } -Error EMWSClient::connect_to_host(String p_host, String p_path, uint16_t p_port, bool p_ssl, const Vector<String> p_protocols, const Vector<String> p_custom_headers) { +Error EMWSClient::connect_to_host(String p_host, String p_path, uint16_t p_port, bool p_tls, const Vector<String> p_protocols, const Vector<String> p_custom_headers) { if (_js_id) { godot_js_websocket_destroy(_js_id); _js_id = 0; @@ -84,9 +84,9 @@ Error EMWSClient::connect_to_host(String p_host, String p_path, uint16_t p_port, if (p_custom_headers.size()) { WARN_PRINT_ONCE("Custom headers are not supported in Web platform."); } - if (p_ssl) { + if (p_tls) { str = "wss://"; - if (ssl_cert.is_valid()) { + if (tls_cert.is_valid()) { WARN_PRINT_ONCE("Custom SSL certificate is not supported in Web platform."); } } diff --git a/modules/websocket/emws_client.h b/modules/websocket/emws_client.h index ff63a76753..cdcec31e19 100644 --- a/modules/websocket/emws_client.h +++ b/modules/websocket/emws_client.h @@ -54,7 +54,7 @@ private: public: Error set_buffers(int p_in_buffer, int p_in_packets, int p_out_buffer, int p_out_packets) override; - Error connect_to_host(String p_host, String p_path, uint16_t p_port, bool p_ssl, const Vector<String> p_protocol = Vector<String>(), const Vector<String> p_custom_headers = Vector<String>()) override; + Error connect_to_host(String p_host, String p_path, uint16_t p_port, bool p_tls, const Vector<String> p_protocol = Vector<String>(), const Vector<String> p_custom_headers = Vector<String>()) override; Ref<WebSocketPeer> get_peer(int p_peer_id) const override; void disconnect_from_host(int p_code = 1000, String p_reason = "") override; IPAddress get_connected_host() const override; diff --git a/modules/websocket/websocket_client.cpp b/modules/websocket/websocket_client.cpp index 2734b4b88f..0b2d5d1918 100644 --- a/modules/websocket/websocket_client.cpp +++ b/modules/websocket/websocket_client.cpp @@ -48,34 +48,34 @@ Error WebSocketClient::connect_to_url(String p_url, const Vector<String> p_proto Error err = p_url.parse_url(scheme, host, port, path); ERR_FAIL_COND_V_MSG(err != OK, err, "Invalid URL: " + p_url); - bool ssl = false; + bool tls = false; if (scheme == "wss://") { - ssl = true; + tls = true; } if (port == 0) { - port = ssl ? 443 : 80; + port = tls ? 443 : 80; } if (path.is_empty()) { path = "/"; } - return connect_to_host(host, path, port, ssl, p_protocols, p_custom_headers); + return connect_to_host(host, path, port, tls, p_protocols, p_custom_headers); } -void WebSocketClient::set_verify_ssl_enabled(bool p_verify_ssl) { - verify_ssl = p_verify_ssl; +void WebSocketClient::set_verify_tls_enabled(bool p_verify_tls) { + verify_tls = p_verify_tls; } -bool WebSocketClient::is_verify_ssl_enabled() const { - return verify_ssl; +bool WebSocketClient::is_verify_tls_enabled() const { + return verify_tls; } -Ref<X509Certificate> WebSocketClient::get_trusted_ssl_certificate() const { - return ssl_cert; +Ref<X509Certificate> WebSocketClient::get_trusted_tls_certificate() const { + return tls_cert; } -void WebSocketClient::set_trusted_ssl_certificate(Ref<X509Certificate> p_cert) { +void WebSocketClient::set_trusted_tls_certificate(Ref<X509Certificate> p_cert) { ERR_FAIL_COND(get_connection_status() != CONNECTION_DISCONNECTED); - ssl_cert = p_cert; + tls_cert = p_cert; } bool WebSocketClient::is_server() const { @@ -123,15 +123,15 @@ void WebSocketClient::_bind_methods() { ClassDB::bind_method(D_METHOD("disconnect_from_host", "code", "reason"), &WebSocketClient::disconnect_from_host, DEFVAL(1000), DEFVAL("")); ClassDB::bind_method(D_METHOD("get_connected_host"), &WebSocketClient::get_connected_host); ClassDB::bind_method(D_METHOD("get_connected_port"), &WebSocketClient::get_connected_port); - ClassDB::bind_method(D_METHOD("set_verify_ssl_enabled", "enabled"), &WebSocketClient::set_verify_ssl_enabled); - ClassDB::bind_method(D_METHOD("is_verify_ssl_enabled"), &WebSocketClient::is_verify_ssl_enabled); + ClassDB::bind_method(D_METHOD("set_verify_tls_enabled", "enabled"), &WebSocketClient::set_verify_tls_enabled); + ClassDB::bind_method(D_METHOD("is_verify_tls_enabled"), &WebSocketClient::is_verify_tls_enabled); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "verify_ssl", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_verify_ssl_enabled", "is_verify_ssl_enabled"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "verify_tls", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_verify_tls_enabled", "is_verify_tls_enabled"); - ClassDB::bind_method(D_METHOD("get_trusted_ssl_certificate"), &WebSocketClient::get_trusted_ssl_certificate); - ClassDB::bind_method(D_METHOD("set_trusted_ssl_certificate", "cert"), &WebSocketClient::set_trusted_ssl_certificate); + ClassDB::bind_method(D_METHOD("get_trusted_tls_certificate"), &WebSocketClient::get_trusted_tls_certificate); + ClassDB::bind_method(D_METHOD("set_trusted_tls_certificate", "cert"), &WebSocketClient::set_trusted_tls_certificate); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "trusted_ssl_certificate", PROPERTY_HINT_RESOURCE_TYPE, "X509Certificate", PROPERTY_USAGE_NONE), "set_trusted_ssl_certificate", "get_trusted_ssl_certificate"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "trusted_tls_certificate", PROPERTY_HINT_RESOURCE_TYPE, "X509Certificate", PROPERTY_USAGE_NONE), "set_trusted_tls_certificate", "get_trusted_tls_certificate"); ADD_SIGNAL(MethodInfo("data_received")); ADD_SIGNAL(MethodInfo("connection_established", PropertyInfo(Variant::STRING, "protocol"))); diff --git a/modules/websocket/websocket_client.h b/modules/websocket/websocket_client.h index d6c072ae16..e747aee4e4 100644 --- a/modules/websocket/websocket_client.h +++ b/modules/websocket/websocket_client.h @@ -42,20 +42,20 @@ class WebSocketClient : public WebSocketMultiplayerPeer { protected: Ref<WebSocketPeer> _peer; - bool verify_ssl = true; - Ref<X509Certificate> ssl_cert; + bool verify_tls = true; + Ref<X509Certificate> tls_cert; static void _bind_methods(); public: Error connect_to_url(String p_url, const Vector<String> p_protocols = Vector<String>(), bool gd_mp_api = false, const Vector<String> p_custom_headers = Vector<String>()); - void set_verify_ssl_enabled(bool p_verify_ssl); - bool is_verify_ssl_enabled() const; - Ref<X509Certificate> get_trusted_ssl_certificate() const; - void set_trusted_ssl_certificate(Ref<X509Certificate> p_cert); + void set_verify_tls_enabled(bool p_verify_tls); + bool is_verify_tls_enabled() const; + Ref<X509Certificate> get_trusted_tls_certificate() const; + void set_trusted_tls_certificate(Ref<X509Certificate> p_cert); - virtual Error connect_to_host(String p_host, String p_path, uint16_t p_port, bool p_ssl, const Vector<String> p_protocol = Vector<String>(), const Vector<String> p_custom_headers = Vector<String>()) = 0; + virtual Error connect_to_host(String p_host, String p_path, uint16_t p_port, bool p_tls, const Vector<String> p_protocol = Vector<String>(), const Vector<String> p_custom_headers = Vector<String>()) = 0; virtual void disconnect_from_host(int p_code = 1000, String p_reason = "") = 0; virtual IPAddress get_connected_host() const = 0; virtual uint16_t get_connected_port() const = 0; diff --git a/modules/websocket/websocket_macros.h b/modules/websocket/websocket_macros.h index a01ae65c56..b03bd8f45c 100644 --- a/modules/websocket/websocket_macros.h +++ b/modules/websocket/websocket_macros.h @@ -35,34 +35,32 @@ #define DEF_PKT_SHIFT 10 #define DEF_BUF_SHIFT 16 -/* clang-format off */ -#define GDCICLASS(CNAME) \ -public:\ - static CNAME *(*_create)();\ -\ - static Ref<CNAME > create_ref() {\ -\ - if (!_create)\ - return Ref<CNAME >();\ - return Ref<CNAME >(_create());\ - }\ -\ - static CNAME *create() {\ -\ - if (!_create)\ - return nullptr;\ - return _create();\ - }\ -protected:\ +#define GDCICLASS(CNAME) \ +public: \ + static CNAME *(*_create)(); \ + \ + static Ref<CNAME> create_ref() { \ + if (!_create) \ + return Ref<CNAME>(); \ + return Ref<CNAME>(_create()); \ + } \ + \ + static CNAME *create() { \ + if (!_create) \ + return nullptr; \ + return _create(); \ + } \ + \ +protected: #define GDCINULL(CNAME) \ -CNAME *(*CNAME::_create)() = nullptr; + CNAME *(*CNAME::_create)() = nullptr; -#define GDCIIMPL(IMPNAME, CNAME) \ -public:\ - static CNAME *_create() { return memnew(IMPNAME); }\ - static void make_default() { CNAME::_create = IMPNAME::_create; }\ -protected:\ -/* clang-format on */ +#define GDCIIMPL(IMPNAME, CNAME) \ +public: \ + static CNAME *_create() { return memnew(IMPNAME); } \ + static void make_default() { CNAME::_create = IMPNAME::_create; } \ + \ +protected: #endif // WEBSOCKET_MACROS_H diff --git a/modules/websocket/websocket_server.cpp b/modules/websocket/websocket_server.cpp index b7851b02c4..25a6e420fc 100644 --- a/modules/websocket/websocket_server.cpp +++ b/modules/websocket/websocket_server.cpp @@ -58,9 +58,9 @@ void WebSocketServer::_bind_methods() { ClassDB::bind_method(D_METHOD("set_private_key", "key"), &WebSocketServer::set_private_key); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "private_key", PROPERTY_HINT_RESOURCE_TYPE, "CryptoKey", PROPERTY_USAGE_NONE), "set_private_key", "get_private_key"); - ClassDB::bind_method(D_METHOD("get_ssl_certificate"), &WebSocketServer::get_ssl_certificate); - ClassDB::bind_method(D_METHOD("set_ssl_certificate", "cert"), &WebSocketServer::set_ssl_certificate); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "ssl_certificate", PROPERTY_HINT_RESOURCE_TYPE, "X509Certificate", PROPERTY_USAGE_NONE), "set_ssl_certificate", "get_ssl_certificate"); + ClassDB::bind_method(D_METHOD("get_tls_certificate"), &WebSocketServer::get_tls_certificate); + ClassDB::bind_method(D_METHOD("set_tls_certificate", "cert"), &WebSocketServer::set_tls_certificate); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "tls_certificate", PROPERTY_HINT_RESOURCE_TYPE, "X509Certificate", PROPERTY_USAGE_NONE), "set_tls_certificate", "get_tls_certificate"); ClassDB::bind_method(D_METHOD("get_ca_chain"), &WebSocketServer::get_ca_chain); ClassDB::bind_method(D_METHOD("set_ca_chain", "ca_chain"), &WebSocketServer::set_ca_chain); @@ -95,13 +95,13 @@ void WebSocketServer::set_private_key(Ref<CryptoKey> p_key) { private_key = p_key; } -Ref<X509Certificate> WebSocketServer::get_ssl_certificate() const { - return ssl_cert; +Ref<X509Certificate> WebSocketServer::get_tls_certificate() const { + return tls_cert; } -void WebSocketServer::set_ssl_certificate(Ref<X509Certificate> p_cert) { +void WebSocketServer::set_tls_certificate(Ref<X509Certificate> p_cert) { ERR_FAIL_COND(is_listening()); - ssl_cert = p_cert; + tls_cert = p_cert; } Ref<X509Certificate> WebSocketServer::get_ca_chain() const { diff --git a/modules/websocket/websocket_server.h b/modules/websocket/websocket_server.h index ac04c4e57e..de23ee884d 100644 --- a/modules/websocket/websocket_server.h +++ b/modules/websocket/websocket_server.h @@ -46,7 +46,7 @@ protected: static void _bind_methods(); Ref<CryptoKey> private_key; - Ref<X509Certificate> ssl_cert; + Ref<X509Certificate> tls_cert; Ref<X509Certificate> ca_chain; uint32_t handshake_timeout = 3000; @@ -74,8 +74,8 @@ public: Ref<CryptoKey> get_private_key() const; void set_private_key(Ref<CryptoKey> p_key); - Ref<X509Certificate> get_ssl_certificate() const; - void set_ssl_certificate(Ref<X509Certificate> p_cert); + Ref<X509Certificate> get_tls_certificate() const; + void set_tls_certificate(Ref<X509Certificate> p_cert); Ref<X509Certificate> get_ca_chain() const; void set_ca_chain(Ref<X509Certificate> p_ca_chain); diff --git a/modules/websocket/wsl_client.cpp b/modules/websocket/wsl_client.cpp index 290108706b..50ef53e267 100644 --- a/modules/websocket/wsl_client.cpp +++ b/modules/websocket/wsl_client.cpp @@ -161,7 +161,7 @@ bool WSLClient::_verify_headers(String &r_protocol) { return true; } -Error WSLClient::connect_to_host(String p_host, String p_path, uint16_t p_port, bool p_ssl, const Vector<String> p_protocols, const Vector<String> p_custom_headers) { +Error WSLClient::connect_to_host(String p_host, String p_path, uint16_t p_port, bool p_tls, const Vector<String> p_protocols, const Vector<String> p_custom_headers) { ERR_FAIL_COND_V(_connection.is_valid(), ERR_ALREADY_IN_USE); ERR_FAIL_COND_V(p_path.is_empty(), ERR_INVALID_PARAMETER); @@ -196,7 +196,7 @@ Error WSLClient::connect_to_host(String p_host, String p_path, uint16_t p_port, return err; } _connection = _tcp; - _use_ssl = p_ssl; + _use_tls = p_tls; _host = p_host; _port = p_port; // Strip edges from protocols. @@ -209,7 +209,7 @@ Error WSLClient::connect_to_host(String p_host, String p_path, uint16_t p_port, _key = WSLPeer::generate_key(); String request = "GET " + p_path + " HTTP/1.1\r\n"; String port = ""; - if ((p_port != 80 && !p_ssl) || (p_port != 443 && p_ssl)) { + if ((p_port != 80 && !p_tls) || (p_port != 443 && p_tls)) { port = ":" + itos(p_port); } request += "Host: " + p_host + port + "\r\n"; @@ -288,27 +288,27 @@ void WSLClient::poll() { break; case StreamPeerTCP::STATUS_CONNECTED: { _ip_candidates.clear(); - Ref<StreamPeerTLS> ssl; - if (_use_ssl) { + Ref<StreamPeerTLS> tls; + if (_use_tls) { if (_connection == _tcp) { // Start SSL handshake - ssl = Ref<StreamPeerTLS>(StreamPeerTLS::create()); - ERR_FAIL_COND_MSG(ssl.is_null(), "SSL is not available in this build."); - ssl->set_blocking_handshake_enabled(false); - if (ssl->connect_to_stream(_tcp, verify_ssl, _host, ssl_cert) != OK) { + tls = Ref<StreamPeerTLS>(StreamPeerTLS::create()); + ERR_FAIL_COND_MSG(tls.is_null(), "SSL is not available in this build."); + tls->set_blocking_handshake_enabled(false); + if (tls->connect_to_stream(_tcp, verify_tls, _host, tls_cert) != OK) { disconnect_from_host(); _on_error(); return; } - _connection = ssl; + _connection = tls; } else { - ssl = static_cast<Ref<StreamPeerTLS>>(_connection); - ERR_FAIL_COND(ssl.is_null()); // Bug? - ssl->poll(); + tls = static_cast<Ref<StreamPeerTLS>>(_connection); + ERR_FAIL_COND(tls.is_null()); // Bug? + tls->poll(); } - if (ssl->get_status() == StreamPeerTLS::STATUS_HANDSHAKING) { + if (tls->get_status() == StreamPeerTLS::STATUS_HANDSHAKING) { return; // Need more polling. - } else if (ssl->get_status() != StreamPeerTLS::STATUS_CONNECTED) { + } else if (tls->get_status() != StreamPeerTLS::STATUS_CONNECTED) { disconnect_from_host(); _on_error(); return; // Error. @@ -356,7 +356,7 @@ void WSLClient::disconnect_from_host(int p_code, String p_reason) { _key = ""; _host = ""; _protocols.clear(); - _use_ssl = false; + _use_tls = false; _request = ""; _requested = 0; diff --git a/modules/websocket/wsl_client.h b/modules/websocket/wsl_client.h index dc4397f04a..dfb989fdd3 100644 --- a/modules/websocket/wsl_client.h +++ b/modules/websocket/wsl_client.h @@ -65,7 +65,7 @@ private: uint16_t _port = 0; Array _ip_candidates; Vector<String> _protocols; - bool _use_ssl = false; + bool _use_tls = false; IP::ResolverID _resolver_id = IP::RESOLVER_INVALID_ID; void _do_handshake(); @@ -73,7 +73,7 @@ private: public: Error set_buffers(int p_in_buffer, int p_in_packets, int p_out_buffer, int p_out_packets) override; - Error connect_to_host(String p_host, String p_path, uint16_t p_port, bool p_ssl, const Vector<String> p_protocol = Vector<String>(), const Vector<String> p_custom_headers = Vector<String>()) override; + Error connect_to_host(String p_host, String p_path, uint16_t p_port, bool p_tls, const Vector<String> p_protocol = Vector<String>(), const Vector<String> p_custom_headers = Vector<String>()) override; int get_max_packet_size() const override; Ref<WebSocketPeer> get_peer(int p_peer_id) const override; void disconnect_from_host(int p_code = 1000, String p_reason = "") override; diff --git a/modules/websocket/wsl_server.cpp b/modules/websocket/wsl_server.cpp index ddef360cf5..01dcd53839 100644 --- a/modules/websocket/wsl_server.cpp +++ b/modules/websocket/wsl_server.cpp @@ -102,16 +102,16 @@ Error WSLServer::PendingPeer::do_handshake(const Vector<String> p_protocols, uin return ERR_TIMEOUT; } - if (use_ssl) { - Ref<StreamPeerTLS> ssl = static_cast<Ref<StreamPeerTLS>>(connection); - if (ssl.is_null()) { + if (use_tls) { + Ref<StreamPeerTLS> tls = static_cast<Ref<StreamPeerTLS>>(connection); + if (tls.is_null()) { ERR_FAIL_V_MSG(ERR_BUG, "Couldn't get StreamPeerTLS for WebSocket handshake."); } - ssl->poll(); - if (ssl->get_status() == StreamPeerTLS::STATUS_HANDSHAKING) { + tls->poll(); + if (tls->get_status() == StreamPeerTLS::STATUS_HANDSHAKING) { return ERR_BUSY; - } else if (ssl->get_status() != StreamPeerTLS::STATUS_CONNECTED) { - print_verbose(vformat("WebSocket SSL connection error during handshake (StreamPeerTLS status code %d).", ssl->get_status())); + } else if (tls->get_status() != StreamPeerTLS::STATUS_CONNECTED) { + print_verbose(vformat("WebSocket SSL connection error during handshake (StreamPeerTLS status code %d).", tls->get_status())); return FAILED; } } @@ -247,12 +247,12 @@ void WSLServer::poll() { } Ref<PendingPeer> peer = memnew(PendingPeer); - if (private_key.is_valid() && ssl_cert.is_valid()) { - Ref<StreamPeerTLS> ssl = Ref<StreamPeerTLS>(StreamPeerTLS::create()); - ssl->set_blocking_handshake_enabled(false); - ssl->accept_stream(conn, private_key, ssl_cert, ca_chain); - peer->connection = ssl; - peer->use_ssl = true; + if (private_key.is_valid() && tls_cert.is_valid()) { + Ref<StreamPeerTLS> tls = Ref<StreamPeerTLS>(StreamPeerTLS::create()); + tls->set_blocking_handshake_enabled(false); + tls->accept_stream(conn, private_key, tls_cert, ca_chain); + peer->connection = tls; + peer->use_tls = true; } else { peer->connection = conn; } diff --git a/modules/websocket/wsl_server.h b/modules/websocket/wsl_server.h index ce91cfe888..df0c1dc68a 100644 --- a/modules/websocket/wsl_server.h +++ b/modules/websocket/wsl_server.h @@ -51,7 +51,7 @@ private: public: Ref<StreamPeerTCP> tcp; Ref<StreamPeer> connection; - bool use_ssl = false; + bool use_tls = false; uint64_t time = 0; uint8_t req_buf[WSL_MAX_HEADER_SIZE] = {}; diff --git a/modules/webxr/config.py b/modules/webxr/config.py index f676ef3483..8d75e7f531 100644 --- a/modules/webxr/config.py +++ b/modules/webxr/config.py @@ -1,5 +1,5 @@ def can_build(env, platform): - return not env["disable_3d"] + return env["opengl3"] and not env["disable_3d"] def configure(env): diff --git a/modules/webxr/godot_webxr.h b/modules/webxr/godot_webxr.h index 52104895d4..34d068be3e 100644 --- a/modules/webxr/godot_webxr.h +++ b/modules/webxr/godot_webxr.h @@ -65,8 +65,7 @@ extern int godot_webxr_get_view_count(); extern int *godot_webxr_get_render_target_size(); extern float *godot_webxr_get_transform_for_eye(int p_eye); extern float *godot_webxr_get_projection_for_eye(int p_eye); -extern int godot_webxr_get_external_texture_for_eye(int p_eye); -extern void godot_webxr_commit_for_eye(int p_eye); +extern void godot_webxr_commit_for_eye(int p_eye, unsigned int p_destination_fbo); extern void godot_webxr_sample_controller_data(); extern int godot_webxr_get_controller_count(); diff --git a/modules/webxr/native/library_godot_webxr.js b/modules/webxr/native/library_godot_webxr.js index c4b21defce..9b75796ee5 100644 --- a/modules/webxr/native/library_godot_webxr.js +++ b/modules/webxr/native/library_godot_webxr.js @@ -32,9 +32,6 @@ const GodotWebXR = { $GodotWebXR: { gl: null, - texture_ids: [null, null], - textures: [null, null], - session: null, space: null, frame: null, @@ -77,110 +74,6 @@ const GodotWebXR = { }, 0); }, - // Some custom WebGL code for blitting our eye textures to the - // framebuffer we get from WebXR. - shaderProgram: null, - programInfo: null, - buffer: null, - // Vertex shader source. - vsSource: ` - const vec2 scale = vec2(0.5, 0.5); - attribute vec4 aVertexPosition; - - varying highp vec2 vTextureCoord; - - void main () { - gl_Position = aVertexPosition; - vTextureCoord = aVertexPosition.xy * scale + scale; - } - `, - // Fragment shader source. - fsSource: ` - varying highp vec2 vTextureCoord; - - uniform sampler2D uSampler; - - void main() { - gl_FragColor = texture2D(uSampler, vTextureCoord); - } - `, - - initShaderProgram: (gl, vsSource, fsSource) => { - const vertexShader = GodotWebXR.loadShader(gl, gl.VERTEX_SHADER, vsSource); - const fragmentShader = GodotWebXR.loadShader(gl, gl.FRAGMENT_SHADER, fsSource); - - const shaderProgram = gl.createProgram(); - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - GodotRuntime.error(`Unable to initialize the shader program: ${gl.getProgramInfoLog(shaderProgram)}`); - return null; - } - - return shaderProgram; - }, - loadShader: (gl, type, source) => { - const shader = gl.createShader(type); - gl.shaderSource(shader, source); - gl.compileShader(shader); - - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - GodotRuntime.error(`An error occurred compiling the shader: ${gl.getShaderInfoLog(shader)}`); - gl.deleteShader(shader); - return null; - } - - return shader; - }, - initBuffer: (gl) => { - const positionBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); - const positions = [ - -1.0, -1.0, - 1.0, -1.0, - -1.0, 1.0, - 1.0, 1.0, - ]; - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW); - return positionBuffer; - }, - blitTexture: (gl, texture) => { - if (GodotWebXR.shaderProgram === null) { - GodotWebXR.shaderProgram = GodotWebXR.initShaderProgram(gl, GodotWebXR.vsSource, GodotWebXR.fsSource); - GodotWebXR.programInfo = { - program: GodotWebXR.shaderProgram, - attribLocations: { - vertexPosition: gl.getAttribLocation(GodotWebXR.shaderProgram, 'aVertexPosition'), - }, - uniformLocations: { - uSampler: gl.getUniformLocation(GodotWebXR.shaderProgram, 'uSampler'), - }, - }; - GodotWebXR.buffer = GodotWebXR.initBuffer(gl); - } - - const orig_program = gl.getParameter(gl.CURRENT_PROGRAM); - gl.useProgram(GodotWebXR.shaderProgram); - - gl.bindBuffer(gl.ARRAY_BUFFER, GodotWebXR.buffer); - gl.vertexAttribPointer(GodotWebXR.programInfo.attribLocations.vertexPosition, 2, gl.FLOAT, false, 0, 0); - gl.enableVertexAttribArray(GodotWebXR.programInfo.attribLocations.vertexPosition); - - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.uniform1i(GodotWebXR.programInfo.uniformLocations.uSampler, 0); - - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - - // Restore state. - gl.bindTexture(gl.TEXTURE_2D, null); - gl.disableVertexAttribArray(GodotWebXR.programInfo.attribLocations.vertexPosition); - gl.bindBuffer(gl.ARRAY_BUFFER, null); - gl.useProgram(orig_program); - }, - // Holds the controllers list between function calls. controllers: [], @@ -370,22 +263,6 @@ const GodotWebXR = { .catch((e) => { }); } - // Clean-up the textures we allocated for each view. - const gl = GodotWebXR.gl; - for (let i = 0; i < GodotWebXR.textures.length; i++) { - const texture = GodotWebXR.textures[i]; - if (texture !== null) { - gl.deleteTexture(texture); - } - GodotWebXR.textures[i] = null; - - const texture_id = GodotWebXR.texture_ids[i]; - if (texture_id !== null) { - GL.textures[texture_id] = null; - } - GodotWebXR.texture_ids[i] = null; - } - GodotWebXR.session = null; GodotWebXR.space = null; GodotWebXR.frame = null; @@ -460,50 +337,9 @@ const GodotWebXR = { return buf; }, - godot_webxr_get_external_texture_for_eye__proxy: 'sync', - godot_webxr_get_external_texture_for_eye__sig: 'ii', - godot_webxr_get_external_texture_for_eye: function (p_eye) { - if (!GodotWebXR.session) { - return 0; - } - - const view_index = (p_eye === 2 /* ARVRInterface::EYE_RIGHT */) ? 1 : 0; - if (GodotWebXR.texture_ids[view_index]) { - return GodotWebXR.texture_ids[view_index]; - } - - // Check pose separately and after returning the cached texture id, - // because we won't get a pose in some cases if we lose tracking, and - // we don't want to return 0 just because tracking was lost. - if (!GodotWebXR.pose) { - return 0; - } - - const glLayer = GodotWebXR.session.renderState.baseLayer; - const view = GodotWebXR.pose.views[view_index]; - const viewport = glLayer.getViewport(view); - const gl = GodotWebXR.gl; - - const texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, viewport.width, viewport.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.bindTexture(gl.TEXTURE_2D, null); - - const texture_id = GL.getNewId(GL.textures); - GL.textures[texture_id] = texture; - GodotWebXR.textures[view_index] = texture; - GodotWebXR.texture_ids[view_index] = texture_id; - return texture_id; - }, - godot_webxr_commit_for_eye__proxy: 'sync', - godot_webxr_commit_for_eye__sig: 'vi', - godot_webxr_commit_for_eye: function (p_eye) { + godot_webxr_commit_for_eye__sig: 'vii', + godot_webxr_commit_for_eye: function (p_eye, p_destination_fbo) { if (!GodotWebXR.session || !GodotWebXR.pose) { return; } @@ -514,18 +350,29 @@ const GodotWebXR = { const viewport = glLayer.getViewport(view); const gl = GodotWebXR.gl; + const framebuffer = GL.framebuffers[p_destination_fbo]; + const orig_framebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING); - const orig_viewport = gl.getParameter(gl.VIEWPORT); + const orig_read_framebuffer = gl.getParameter(gl.READ_FRAMEBUFFER_BINDING); + const orig_read_buffer = gl.getParameter(gl.READ_BUFFER); + const orig_draw_framebuffer = gl.getParameter(gl.DRAW_FRAMEBUFFER_BINDING); - // Bind to WebXR's framebuffer. - gl.bindFramebuffer(gl.FRAMEBUFFER, glLayer.framebuffer); - gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); + // Copy from Godot render target into framebuffer from WebXR. + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + gl.bindFramebuffer(gl.READ_FRAMEBUFFER, framebuffer); + gl.readBuffer(gl.COLOR_ATTACHMENT0); + gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, glLayer.framebuffer); - GodotWebXR.blitTexture(gl, GodotWebXR.textures[view_index]); + // Flip Y upside down on destination. + gl.blitFramebuffer(0, 0, viewport.width, viewport.height, + viewport.x, viewport.height, viewport.width, viewport.y, + gl.COLOR_BUFFER_BIT, gl.NEAREST); // Restore state. gl.bindFramebuffer(gl.FRAMEBUFFER, orig_framebuffer); - gl.viewport(orig_viewport[0], orig_viewport[1], orig_viewport[2], orig_viewport[3]); + gl.bindFramebuffer(gl.READ_FRAMEBUFFER, orig_read_framebuffer); + gl.readBuffer(orig_read_buffer); + gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, orig_draw_framebuffer); }, godot_webxr_sample_controller_data__proxy: 'sync', diff --git a/modules/webxr/webxr_interface_js.cpp b/modules/webxr/webxr_interface_js.cpp index 7d97dbfa0b..d0c7484aa1 100644 --- a/modules/webxr/webxr_interface_js.cpp +++ b/modules/webxr/webxr_interface_js.cpp @@ -34,9 +34,11 @@ #include "core/input/input.h" #include "core/os/os.h" +#include "drivers/gles3/storage/texture_storage.h" #include "emscripten.h" #include "godot_webxr.h" #include "servers/rendering/renderer_compositor.h" +#include "servers/rendering/rendering_server_globals.h" #include <stdlib.h> @@ -232,6 +234,8 @@ bool WebXRInterfaceJS::initialize() { } // we must create a tracker for our head + head_transform.basis = Basis(); + head_transform.origin = Vector3(); head_tracker.instantiate(); head_tracker->set_tracker_type(XRServer::TRACKER_HEAD); head_tracker->set_tracker_name("head"); @@ -334,15 +338,17 @@ Transform3D WebXRInterfaceJS::get_camera_transform() { XRServer *xr_server = XRServer::get_singleton(); ERR_FAIL_NULL_V(xr_server, transform_for_eye); - float *js_matrix = godot_webxr_get_transform_for_eye(0); - if (!initialized || js_matrix == nullptr) { - return transform_for_eye; - } + if (initialized) { + float world_scale = xr_server->get_world_scale(); - transform_for_eye = _js_matrix_to_transform(js_matrix); - free(js_matrix); + // just scale our origin point of our transform + Transform3D _head_transform = head_transform; + _head_transform.origin *= world_scale; + + transform_for_eye = (xr_server->get_reference_frame()) * _head_transform; + } - return xr_server->get_reference_frame() * transform_for_eye; + return transform_for_eye; }; Transform3D WebXRInterfaceJS::get_transform_for_view(uint32_t p_view, const Transform3D &p_cam_transform) { @@ -360,6 +366,14 @@ Transform3D WebXRInterfaceJS::get_transform_for_view(uint32_t p_view, const Tran transform_for_eye = _js_matrix_to_transform(js_matrix); free(js_matrix); + float world_scale = xr_server->get_world_scale(); + // Scale only the center point of our eye transform, so we don't scale the + // distance between the eyes. + Transform3D _head_transform = head_transform; + transform_for_eye.origin -= _head_transform.origin; + _head_transform.origin *= world_scale; + transform_for_eye.origin += _head_transform.origin; + return p_cam_transform * xr_server->get_reference_frame() * transform_for_eye; }; @@ -394,29 +408,33 @@ Vector<BlitToScreen> WebXRInterfaceJS::post_draw_viewport(RID p_render_target, c return blit_to_screen; } - // @todo Refactor this to be based on "views" rather than "eyes". - godot_webxr_commit_for_eye(1); - if (godot_webxr_get_view_count() > 1) { - godot_webxr_commit_for_eye(2); + GLES3::TextureStorage *texture_storage = dynamic_cast<GLES3::TextureStorage *>(RSG::texture_storage); + if (!texture_storage) { + return blit_to_screen; } + GLES3::RenderTarget *rt = texture_storage->get_render_target(p_render_target); + + // @todo Support multiple eyes! + godot_webxr_commit_for_eye(1, rt->fbo); + return blit_to_screen; }; void WebXRInterfaceJS::process() { if (initialized) { - godot_webxr_sample_controller_data(); - + // Get the "head" position. + float *js_matrix = godot_webxr_get_transform_for_eye(0); + if (js_matrix != nullptr) { + head_transform = _js_matrix_to_transform(js_matrix); + free(js_matrix); + } if (head_tracker.is_valid()) { - // TODO set default pose to our head location (i.e. get_camera_transform without world scale and reference frame applied) - // head_tracker->set_pose("default", head_transform, Vector3(), Vector3()); + head_tracker->set_pose("default", head_transform, Vector3(), Vector3()); } + godot_webxr_sample_controller_data(); int controller_count = godot_webxr_get_controller_count(); - if (controller_count == 0) { - return; - } - for (int i = 0; i < controller_count; i++) { _update_tracker(i); } diff --git a/modules/webxr/webxr_interface_js.h b/modules/webxr/webxr_interface_js.h index dbe89dad83..319adc2ac9 100644 --- a/modules/webxr/webxr_interface_js.h +++ b/modules/webxr/webxr_interface_js.h @@ -45,6 +45,7 @@ class WebXRInterfaceJS : public WebXRInterface { private: bool initialized; Ref<XRPositionalTracker> head_tracker; + Transform3D head_transform; String session_mode; String required_features; diff --git a/platform/android/android_input_handler.cpp b/platform/android/android_input_handler.cpp index 6427346365..454bcd2eda 100644 --- a/platform/android/android_input_handler.cpp +++ b/platform/android/android_input_handler.cpp @@ -118,20 +118,31 @@ void AndroidInputHandler::process_key_event(int p_keycode, int p_physical_keycod Input::get_singleton()->parse_input_event(ev); } -void AndroidInputHandler::process_touch(int p_event, int p_pointer, const Vector<AndroidInputHandler::TouchPos> &p_points) { +void AndroidInputHandler::_parse_all_touch(bool p_pressed) { + if (touch.size()) { + //end all if exist + for (int i = 0; i < touch.size(); i++) { + Ref<InputEventScreenTouch> ev; + ev.instantiate(); + ev->set_index(touch[i].id); + ev->set_pressed(p_pressed); + ev->set_position(touch[i].pos); + Input::get_singleton()->parse_input_event(ev); + } + } +} + +void AndroidInputHandler::_release_all_touch() { + _parse_all_touch(false); + touch.clear(); +} + +void AndroidInputHandler::process_touch_event(int p_event, int p_pointer, const Vector<TouchPos> &p_points) { switch (p_event) { case AMOTION_EVENT_ACTION_DOWN: { //gesture begin - if (touch.size()) { - //end all if exist - for (int i = 0; i < touch.size(); i++) { - Ref<InputEventScreenTouch> ev; - ev.instantiate(); - ev->set_index(touch[i].id); - ev->set_pressed(false); - ev->set_position(touch[i].pos); - Input::get_singleton()->parse_input_event(ev); - } - } + // Release any remaining touches or mouse event + _release_mouse_event_info(); + _release_all_touch(); touch.resize(p_points.size()); for (int i = 0; i < p_points.size(); i++) { @@ -140,18 +151,13 @@ void AndroidInputHandler::process_touch(int p_event, int p_pointer, const Vector } //send touch - for (int i = 0; i < touch.size(); i++) { - Ref<InputEventScreenTouch> ev; - ev.instantiate(); - ev->set_index(touch[i].id); - ev->set_pressed(true); - ev->set_position(touch[i].pos); - Input::get_singleton()->parse_input_event(ev); - } + _parse_all_touch(true); } break; case AMOTION_EVENT_ACTION_MOVE: { //motion - ERR_FAIL_COND(touch.size() != p_points.size()); + if (touch.size() != p_points.size()) { + return; + } for (int i = 0; i < touch.size(); i++) { int idx = -1; @@ -180,18 +186,7 @@ void AndroidInputHandler::process_touch(int p_event, int p_pointer, const Vector } break; case AMOTION_EVENT_ACTION_CANCEL: case AMOTION_EVENT_ACTION_UP: { //release - if (touch.size()) { - //end all if exist - for (int i = 0; i < touch.size(); i++) { - Ref<InputEventScreenTouch> ev; - ev.instantiate(); - ev->set_index(touch[i].id); - ev->set_pressed(false); - ev->set_position(touch[i].pos); - Input::get_singleton()->parse_input_event(ev); - } - touch.clear(); - } + _release_all_touch(); } break; case AMOTION_EVENT_ACTION_POINTER_DOWN: { // add touch for (int i = 0; i < p_points.size(); i++) { @@ -229,88 +224,118 @@ void AndroidInputHandler::process_touch(int p_event, int p_pointer, const Vector } } -void AndroidInputHandler::process_hover(int p_type, Point2 p_pos) { - // https://developer.android.com/reference/android/view/MotionEvent.html#ACTION_HOVER_ENTER - switch (p_type) { +void AndroidInputHandler::_parse_mouse_event_info(MouseButton event_buttons_mask, bool p_pressed, bool p_double_click, bool p_source_mouse_relative) { + if (!mouse_event_info.valid) { + return; + } + + Ref<InputEventMouseButton> ev; + ev.instantiate(); + _set_key_modifier_state(ev); + if (p_source_mouse_relative) { + ev->set_position(hover_prev_pos); + ev->set_global_position(hover_prev_pos); + } else { + ev->set_position(mouse_event_info.pos); + ev->set_global_position(mouse_event_info.pos); + hover_prev_pos = mouse_event_info.pos; + } + ev->set_pressed(p_pressed); + MouseButton changed_button_mask = MouseButton(buttons_state ^ event_buttons_mask); + + buttons_state = event_buttons_mask; + + ev->set_button_index(_button_index_from_mask(changed_button_mask)); + ev->set_button_mask(event_buttons_mask); + ev->set_double_click(p_double_click); + Input::get_singleton()->parse_input_event(ev); +} + +void AndroidInputHandler::_release_mouse_event_info(bool p_source_mouse_relative) { + _parse_mouse_event_info(MouseButton::NONE, false, false, p_source_mouse_relative); + mouse_event_info.valid = false; +} + +void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_android_buttons_mask, Point2 p_event_pos, Vector2 p_delta, bool p_double_click, bool p_source_mouse_relative) { + MouseButton event_buttons_mask = _android_button_mask_to_godot_button_mask(p_event_android_buttons_mask); + switch (p_event_action) { case AMOTION_EVENT_ACTION_HOVER_MOVE: // hover move case AMOTION_EVENT_ACTION_HOVER_ENTER: // hover enter case AMOTION_EVENT_ACTION_HOVER_EXIT: { // hover exit + // https://developer.android.com/reference/android/view/MotionEvent.html#ACTION_HOVER_ENTER Ref<InputEventMouseMotion> ev; ev.instantiate(); _set_key_modifier_state(ev); - ev->set_position(p_pos); - ev->set_global_position(p_pos); - ev->set_relative(p_pos - hover_prev_pos); + ev->set_position(p_event_pos); + ev->set_global_position(p_event_pos); + ev->set_relative(p_event_pos - hover_prev_pos); Input::get_singleton()->parse_input_event(ev); - hover_prev_pos = p_pos; + hover_prev_pos = p_event_pos; } break; - } -} -void AndroidInputHandler::process_mouse_event(int input_device, int event_action, int event_android_buttons_mask, Point2 event_pos, float event_vertical_factor, float event_horizontal_factor) { - MouseButton event_buttons_mask = _android_button_mask_to_godot_button_mask(event_android_buttons_mask); - switch (event_action) { - case AMOTION_EVENT_ACTION_BUTTON_PRESS: - case AMOTION_EVENT_ACTION_BUTTON_RELEASE: { - Ref<InputEventMouseButton> ev; - ev.instantiate(); - _set_key_modifier_state(ev); - if ((input_device & AINPUT_SOURCE_MOUSE) == AINPUT_SOURCE_MOUSE) { - ev->set_position(event_pos); - ev->set_global_position(event_pos); - } else { - ev->set_position(hover_prev_pos); - ev->set_global_position(hover_prev_pos); - } - ev->set_pressed(event_action == AMOTION_EVENT_ACTION_BUTTON_PRESS); - MouseButton changed_button_mask = MouseButton(buttons_state ^ event_buttons_mask); + case AMOTION_EVENT_ACTION_DOWN: + case AMOTION_EVENT_ACTION_BUTTON_PRESS: { + // Release any remaining touches or mouse event + _release_mouse_event_info(); + _release_all_touch(); - buttons_state = event_buttons_mask; + mouse_event_info.valid = true; + mouse_event_info.pos = p_event_pos; + _parse_mouse_event_info(event_buttons_mask, true, p_double_click, p_source_mouse_relative); + } break; - ev->set_button_index(_button_index_from_mask(changed_button_mask)); - ev->set_button_mask(event_buttons_mask); - Input::get_singleton()->parse_input_event(ev); + case AMOTION_EVENT_ACTION_UP: + case AMOTION_EVENT_ACTION_CANCEL: + case AMOTION_EVENT_ACTION_BUTTON_RELEASE: { + _release_mouse_event_info(p_source_mouse_relative); } break; case AMOTION_EVENT_ACTION_MOVE: { + if (!mouse_event_info.valid) { + return; + } + Ref<InputEventMouseMotion> ev; ev.instantiate(); _set_key_modifier_state(ev); - if ((input_device & AINPUT_SOURCE_MOUSE) == AINPUT_SOURCE_MOUSE) { - ev->set_position(event_pos); - ev->set_global_position(event_pos); - ev->set_relative(event_pos - hover_prev_pos); - hover_prev_pos = event_pos; - } else { + if (p_source_mouse_relative) { ev->set_position(hover_prev_pos); ev->set_global_position(hover_prev_pos); - ev->set_relative(event_pos); + ev->set_relative(p_event_pos); + } else { + ev->set_position(p_event_pos); + ev->set_global_position(p_event_pos); + ev->set_relative(p_event_pos - hover_prev_pos); + mouse_event_info.pos = p_event_pos; + hover_prev_pos = p_event_pos; } ev->set_button_mask(event_buttons_mask); Input::get_singleton()->parse_input_event(ev); } break; + case AMOTION_EVENT_ACTION_SCROLL: { Ref<InputEventMouseButton> ev; ev.instantiate(); - if ((input_device & AINPUT_SOURCE_MOUSE) == AINPUT_SOURCE_MOUSE) { - ev->set_position(event_pos); - ev->set_global_position(event_pos); - } else { + _set_key_modifier_state(ev); + if (p_source_mouse_relative) { ev->set_position(hover_prev_pos); ev->set_global_position(hover_prev_pos); + } else { + ev->set_position(p_event_pos); + ev->set_global_position(p_event_pos); } ev->set_pressed(true); buttons_state = event_buttons_mask; - if (event_vertical_factor > 0) { - _wheel_button_click(event_buttons_mask, ev, MouseButton::WHEEL_UP, event_vertical_factor); - } else if (event_vertical_factor < 0) { - _wheel_button_click(event_buttons_mask, ev, MouseButton::WHEEL_DOWN, -event_vertical_factor); + if (p_delta.y > 0) { + _wheel_button_click(event_buttons_mask, ev, MouseButton::WHEEL_UP, p_delta.y); + } else if (p_delta.y < 0) { + _wheel_button_click(event_buttons_mask, ev, MouseButton::WHEEL_DOWN, -p_delta.y); } - if (event_horizontal_factor > 0) { - _wheel_button_click(event_buttons_mask, ev, MouseButton::WHEEL_RIGHT, event_horizontal_factor); - } else if (event_horizontal_factor < 0) { - _wheel_button_click(event_buttons_mask, ev, MouseButton::WHEEL_LEFT, -event_horizontal_factor); + if (p_delta.x > 0) { + _wheel_button_click(event_buttons_mask, ev, MouseButton::WHEEL_RIGHT, p_delta.x); + } else if (p_delta.x < 0) { + _wheel_button_click(event_buttons_mask, ev, MouseButton::WHEEL_LEFT, -p_delta.x); } } break; } @@ -329,18 +354,22 @@ void AndroidInputHandler::_wheel_button_click(MouseButton event_buttons_mask, co Input::get_singleton()->parse_input_event(evdd); } -void AndroidInputHandler::process_double_tap(int event_android_button_mask, Point2 p_pos) { - MouseButton event_button_mask = _android_button_mask_to_godot_button_mask(event_android_button_mask); - Ref<InputEventMouseButton> ev; - ev.instantiate(); - _set_key_modifier_state(ev); - ev->set_position(p_pos); - ev->set_global_position(p_pos); - ev->set_pressed(event_button_mask != MouseButton::NONE); - ev->set_button_index(_button_index_from_mask(event_button_mask)); - ev->set_button_mask(event_button_mask); - ev->set_double_click(true); - Input::get_singleton()->parse_input_event(ev); +void AndroidInputHandler::process_magnify(Point2 p_pos, float p_factor) { + Ref<InputEventMagnifyGesture> magnify_event; + magnify_event.instantiate(); + _set_key_modifier_state(magnify_event); + magnify_event->set_position(p_pos); + magnify_event->set_factor(p_factor); + Input::get_singleton()->parse_input_event(magnify_event); +} + +void AndroidInputHandler::process_pan(Point2 p_pos, Vector2 p_delta) { + Ref<InputEventPanGesture> pan_event; + pan_event.instantiate(); + _set_key_modifier_state(pan_event); + pan_event->set_position(p_pos); + pan_event->set_delta(p_delta); + Input::get_singleton()->parse_input_event(pan_event); } MouseButton AndroidInputHandler::_button_index_from_mask(MouseButton button_mask) { diff --git a/platform/android/android_input_handler.h b/platform/android/android_input_handler.h index 6dfab7def8..88490f0407 100644 --- a/platform/android/android_input_handler.h +++ b/platform/android/android_input_handler.h @@ -44,6 +44,11 @@ public: Point2 pos; }; + struct MouseEventInfo { + bool valid = false; + Point2 pos; + }; + enum { JOY_EVENT_BUTTON = 0, JOY_EVENT_AXIS = 1, @@ -68,6 +73,7 @@ private: MouseButton buttons_state = MouseButton::NONE; Vector<TouchPos> touch; + MouseEventInfo mouse_event_info; Point2 hover_prev_pos; // needed to calculate the relative position on hover events void _set_key_modifier_state(Ref<InputEventWithModifiers> ev); @@ -77,11 +83,19 @@ private: void _wheel_button_click(MouseButton event_buttons_mask, const Ref<InputEventMouseButton> &ev, MouseButton wheel_button, float factor); + void _parse_mouse_event_info(MouseButton event_buttons_mask, bool p_pressed, bool p_double_click, bool p_source_mouse_relative); + + void _release_mouse_event_info(bool p_source_mouse_relative = false); + + void _parse_all_touch(bool p_pressed); + + void _release_all_touch(); + public: - void process_touch(int p_event, int p_pointer, const Vector<TouchPos> &p_points); - void process_hover(int p_type, Point2 p_pos); - void process_mouse_event(int input_device, int event_action, int event_android_buttons_mask, Point2 event_pos, float event_vertical_factor = 0, float event_horizontal_factor = 0); - void process_double_tap(int event_android_button_mask, Point2 p_pos); + void process_mouse_event(int p_event_action, int p_event_android_buttons_mask, Point2 p_event_pos, Vector2 p_delta, bool p_double_click, bool p_source_mouse_relative); + void process_touch_event(int p_event, int p_pointer, const Vector<TouchPos> &p_points); + void process_magnify(Point2 p_pos, float p_factor); + void process_pan(Point2 p_pos, Vector2 p_delta); void process_joy_event(JoypadEvent p_event); void process_key_event(int p_keycode, int p_physical_keycode, int p_unicode, bool p_pressed); }; diff --git a/platform/android/detect.py b/platform/android/detect.py index ad63821162..a31bba745f 100644 --- a/platform/android/detect.py +++ b/platform/android/detect.py @@ -132,6 +132,19 @@ def configure(env): env.Append(CPPDEFINES=["_DEBUG"]) env.Append(CPPFLAGS=["-UNDEBUG"]) + # LTO + + if env["lto"] == "auto": # LTO benefits for Android (size, performance) haven't been clearly established yet. + env["lto"] = "none" + + if env["lto"] != "none": + if env["lto"] == "thin": + env.Append(CCFLAGS=["-flto=thin"]) + env.Append(LINKFLAGS=["-flto=thin"]) + else: + env.Append(CCFLAGS=["-flto"]) + env.Append(LINKFLAGS=["-flto"]) + # Compiler configuration env["SHLIBSUFFIX"] = ".so" diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index 5bbe0ffab6..f4c4e985fe 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -36,6 +36,7 @@ #include "export_plugin.h" void register_android_exporter() { +#ifndef ANDROID_ENABLED EDITOR_DEF("export/android/android_sdk_path", ""); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/android/android_sdk_path", PROPERTY_HINT_GLOBAL_DIR)); EDITOR_DEF("export/android/debug_keystore", ""); @@ -47,6 +48,7 @@ void register_android_exporter() { EDITOR_DEF("export/android/shutdown_adb_on_exit", true); EDITOR_DEF("export/android/one_click_deploy_clear_previous_install", false); +#endif Ref<EditorExportPlatformAndroid> exporter = Ref<EditorExportPlatformAndroid>(memnew(EditorExportPlatformAndroid)); EditorExport::get_singleton()->add_export_platform(exporter); diff --git a/platform/android/export/export_plugin.cpp b/platform/android/export/export_plugin.cpp index 0f8ef3f7d6..366bd1c48c 100644 --- a/platform/android/export/export_plugin.cpp +++ b/platform/android/export/export_plugin.cpp @@ -569,16 +569,15 @@ bool EditorExportPlatformAndroid::_should_compress_asset(const String &p_path, c } zip_fileinfo EditorExportPlatformAndroid::get_zip_fileinfo() { - OS::Time time = OS::get_singleton()->get_time(); - OS::Date date = OS::get_singleton()->get_date(); + OS::DateTime dt = OS::get_singleton()->get_datetime(); zip_fileinfo zipfi; - zipfi.tmz_date.tm_hour = time.hour; - zipfi.tmz_date.tm_mday = date.day; - zipfi.tmz_date.tm_min = time.minute; - zipfi.tmz_date.tm_mon = date.month - 1; // tm_mon is zero indexed - zipfi.tmz_date.tm_sec = time.second; - zipfi.tmz_date.tm_year = date.year; + zipfi.tmz_date.tm_year = dt.year; + zipfi.tmz_date.tm_mon = dt.month - 1; // tm_mon is zero indexed + zipfi.tmz_date.tm_mday = dt.day; + zipfi.tmz_date.tm_hour = dt.hour; + zipfi.tmz_date.tm_min = dt.minute; + zipfi.tmz_date.tm_sec = dt.second; zipfi.dosDate = 0; zipfi.external_fa = 0; zipfi.internal_fa = 0; @@ -1670,14 +1669,7 @@ Vector<String> EditorExportPlatformAndroid::get_enabled_abis(const Ref<EditorExp } void EditorExportPlatformAndroid::get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) const { - String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); - if (driver == "opengl3") { - r_features->push_back("etc"); - } - // FIXME: Review what texture formats are used for Vulkan. - if (driver == "vulkan") { - r_features->push_back("etc2"); - } + r_features->push_back("etc2"); Vector<String> abis = get_enabled_abis(p_preset); for (int i = 0; i < abis.size(); ++i) { diff --git a/platform/android/export/gradle_export_util.cpp b/platform/android/export/gradle_export_util.cpp index 8d370a31a4..2f53942f76 100644 --- a/platform/android/export/gradle_export_util.cpp +++ b/platform/android/export/gradle_export_util.cpp @@ -189,9 +189,7 @@ String bool_to_string(bool v) { } String _get_gles_tag() { - bool min_gles3 = ProjectSettings::get_singleton()->get("rendering/driver/driver_name") == "GLES3" && - !ProjectSettings::get_singleton()->get("rendering/driver/fallback_to_gles2"); - return min_gles3 ? " <uses-feature android:glEsVersion=\"0x00030000\" android:required=\"true\" />\n" : ""; + return " <uses-feature android:glEsVersion=\"0x00030000\" android:required=\"true\" />\n"; } String _get_screen_sizes_tag(const Ref<EditorExportPreset> &p_preset) { diff --git a/platform/android/file_access_android.cpp b/platform/android/file_access_android.cpp index ace7636e6c..d6cd62e9f5 100644 --- a/platform/android/file_access_android.cpp +++ b/platform/android/file_access_android.cpp @@ -42,7 +42,7 @@ String FileAccessAndroid::get_path_absolute() const { return absolute_path; } -Error FileAccessAndroid::_open(const String &p_path, int p_mode_flags) { +Error FileAccessAndroid::open_internal(const String &p_path, int p_mode_flags) { _close(); path_src = p_path; diff --git a/platform/android/file_access_android.h b/platform/android/file_access_android.h index 8d7ade8ead..55f8fbe0f4 100644 --- a/platform/android/file_access_android.h +++ b/platform/android/file_access_android.h @@ -49,7 +49,7 @@ class FileAccessAndroid : public FileAccess { public: static AAssetManager *asset_manager; - virtual Error _open(const String &p_path, int p_mode_flags) override; // open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; // open a file virtual bool is_open() const override; // true when file is open /// returns the path for the current open file diff --git a/platform/android/file_access_filesystem_jandroid.cpp b/platform/android/file_access_filesystem_jandroid.cpp index 56561cb616..c2ee3389ae 100644 --- a/platform/android/file_access_filesystem_jandroid.cpp +++ b/platform/android/file_access_filesystem_jandroid.cpp @@ -61,7 +61,7 @@ String FileAccessFilesystemJAndroid::get_path_absolute() const { return absolute_path; } -Error FileAccessFilesystemJAndroid::_open(const String &p_path, int p_mode_flags) { +Error FileAccessFilesystemJAndroid::open_internal(const String &p_path, int p_mode_flags) { if (is_open()) { _close(); } diff --git a/platform/android/file_access_filesystem_jandroid.h b/platform/android/file_access_filesystem_jandroid.h index 76d7db6e3a..815ab36516 100644 --- a/platform/android/file_access_filesystem_jandroid.h +++ b/platform/android/file_access_filesystem_jandroid.h @@ -60,7 +60,7 @@ class FileAccessFilesystemJAndroid : public FileAccess { void _set_eof(bool eof); public: - virtual Error _open(const String &p_path, int p_mode_flags) override; ///< open a file + virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open /// returns the path for the current open file diff --git a/platform/android/java/app/config.gradle b/platform/android/java/app/config.gradle index fbd97fae0b..0346625e4b 100644 --- a/platform/android/java/app/config.gradle +++ b/platform/android/java/app/config.gradle @@ -127,16 +127,36 @@ ext.generateGodotLibraryVersion = { List<String> requiredKeys -> if (requiredKeys.empty) { libraryVersionName = map.values().join(".") try { + if (map.containsKey("status")) { + int statusCode = 0 + String statusValue = map["status"] + if (statusValue == null) { + statusCode = 0 + } else if (statusValue.startsWith("alpha")) { + statusCode = 1 + } else if (statusValue.startsWith("beta")) { + statusCode = 2 + } else if (statusValue.startsWith("rc")) { + statusCode = 3 + } else if (statusValue.startsWith("stable")) { + statusCode = 4 + } else { + statusCode = 0 + } + + libraryVersionCode = statusCode + } + if (map.containsKey("patch")) { - libraryVersionCode = Integer.parseInt(map["patch"]) + libraryVersionCode += Integer.parseInt(map["patch"]) * 10 } if (map.containsKey("minor")) { - libraryVersionCode += (Integer.parseInt(map["minor"]) * 100) + libraryVersionCode += (Integer.parseInt(map["minor"]) * 1000) } if (map.containsKey("major")) { - libraryVersionCode += (Integer.parseInt(map["major"]) * 10000) + libraryVersionCode += (Integer.parseInt(map["major"]) * 100000) } } catch (NumberFormatException ignore) { libraryVersionCode = 1 diff --git a/platform/android/java/editor/build.gradle b/platform/android/java/editor/build.gradle index 729966ee69..9152492e9d 100644 --- a/platform/android/java/editor/build.gradle +++ b/platform/android/java/editor/build.gradle @@ -12,6 +12,25 @@ dependencies { implementation "androidx.window:window:1.0.0" } +ext { + // Build number added as a suffix to the version code, and incremented for each build/upload to + // the Google Play store. + // This should be reset on each stable release of Godot. + editorBuildNumber = 0 + // Value by which the Godot version code should be offset by to make room for the build number + editorBuildNumberOffset = 100 +} + +def generateVersionCode() { + int libraryVersionCode = getGodotLibraryVersionCode() + return (libraryVersionCode * editorBuildNumberOffset) + editorBuildNumber +} + +def generateVersionName() { + String libraryVersionName = getGodotLibraryVersionName() + return libraryVersionName + ".$editorBuildNumber" +} + android { compileSdkVersion versions.compileSdk buildToolsVersion versions.buildTools @@ -20,8 +39,8 @@ android { defaultConfig { // The 'applicationId' suffix allows to install Godot 3.x(v3) and 4.x(v4) on the same device applicationId "org.godotengine.editor.v4" - versionCode getGodotLibraryVersionCode() - versionName getGodotLibraryVersionName() + versionCode generateVersionCode() + versionName generateVersionName() minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk diff --git a/platform/android/java/editor/src/main/AndroidManifest.xml b/platform/android/java/editor/src/main/AndroidManifest.xml index abf506a83c..6aa5f06f31 100644 --- a/platform/android/java/editor/src/main/AndroidManifest.xml +++ b/platform/android/java/editor/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ <supports-screens android:largeScreens="true" android:normalScreens="true" - android:smallScreens="true" + android:smallScreens="false" android:xlargeScreens="true" /> <uses-feature diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt index 740f3f48d3..489a81fc1a 100644 --- a/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt +++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt @@ -77,6 +77,12 @@ open class GodotEditor : FullScreenGodotApp() { } super.onCreate(savedInstanceState) + + // Enable long press, panning and scaling gestures + godotFragment?.renderView?.inputHandler?.apply { + enableLongPress(enableLongPressGestures()) + enablePanningAndScalingGestures(enablePanAndScaleGestures()) + } } private fun updateCommandLineParams(args: Array<String>?) { @@ -148,6 +154,16 @@ open class GodotEditor : FullScreenGodotApp() { */ protected open fun overrideOrientationRequest() = true + /** + * Enable long press gestures for the Godot Android editor. + */ + protected open fun enableLongPressGestures() = true + + /** + * Enable pan and scale gestures for the Godot Android editor. + */ + protected open fun enablePanAndScaleGestures() = true + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) // Check if we got the MANAGE_EXTERNAL_STORAGE permission diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotGame.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotGame.kt index 783095f93a..b9536a7066 100644 --- a/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotGame.kt +++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotGame.kt @@ -35,4 +35,8 @@ package org.godotengine.editor */ class GodotGame : GodotEditor() { override fun overrideOrientationRequest() = false + + override fun enableLongPressGestures() = false + + override fun enablePanAndScaleGestures() = false } diff --git a/platform/android/java/lib/res/values/strings.xml b/platform/android/java/lib/res/values/strings.xml index 010006b81e..f5a4ab1071 100644 --- a/platform/android/java/lib/res/values/strings.xml +++ b/platform/android/java/lib/res/values/strings.xml @@ -12,6 +12,8 @@ <string name="text_button_resume">Resume Download</string> <string name="text_button_cancel">Cancel</string> <string name="text_button_cancel_verify">Cancel Verification</string> + <string name="text_error_title">Error!</string> + <string name="error_engine_setup_message">Unable to setup the Godot Engine! Aborting…</string> <!-- APK Expansion Strings --> 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 28e689e63a..92e5e59496 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/Godot.java +++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.java @@ -57,6 +57,7 @@ import android.content.SharedPreferences.Editor; import android.content.pm.ConfigurationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.Resources; import android.graphics.Point; import android.graphics.Rect; import android.hardware.Sensor; @@ -69,6 +70,7 @@ import android.os.Environment; import android.os.Messenger; import android.os.VibrationEffect; import android.os.Vibrator; +import android.util.Log; import android.view.Display; import android.view.LayoutInflater; import android.view.Surface; @@ -85,6 +87,8 @@ import android.widget.TextView; import androidx.annotation.CallSuper; import androidx.annotation.Keep; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; import androidx.fragment.app.Fragment; import com.google.android.vending.expansion.downloader.DownloadProgressInfo; @@ -105,6 +109,8 @@ import java.util.List; import java.util.Locale; public class Godot extends Fragment implements SensorEventListener, IDownloaderClient { + private static final String TAG = Godot.class.getSimpleName(); + private IStub mDownloaderClientStub; private TextView mStatusText; private TextView mProgressFraction; @@ -250,7 +256,7 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC * Used by the native code (java_godot_lib_jni.cpp) to complete initialization of the GLSurfaceView view and renderer. */ @Keep - private void onVideoInit() { + private boolean onVideoInit() { final Activity activity = getActivity(); containerLayout = new FrameLayout(activity); containerLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); @@ -262,13 +268,17 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC // ...add to FrameLayout containerLayout.addView(editText); - GodotLib.setup(command_line); + if (!GodotLib.setup(command_line)) { + Log.e(TAG, "Unable to setup the Godot engine! Aborting..."); + alert(R.string.error_engine_setup_message, R.string.text_error_title, this::forceQuit); + return false; + } - final String videoDriver = GodotLib.getGlobal("rendering/driver/driver_name"); - if (videoDriver.equals("vulkan")) { - mRenderView = new GodotVulkanRenderView(activity, this); - } else { + final String renderer = GodotLib.getGlobal("rendering/renderer/rendering_method"); + if (renderer.equals("gl_compatibility")) { mRenderView = new GodotGLRenderView(activity, this, xrMode, use_debug_opengl); + } else { + mRenderView = new GodotVulkanRenderView(activity, this); } View view = mRenderView.getView(); @@ -303,6 +313,7 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC } } } + return true; } public void setKeepScreenOn(final boolean p_enabled) { @@ -344,13 +355,27 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC } public void alert(final String message, final String title) { + alert(message, title, null); + } + + private void alert(@StringRes int messageResId, @StringRes int titleResId, @Nullable Runnable okCallback) { + Resources res = getResources(); + alert(res.getString(messageResId), res.getString(titleResId), okCallback); + } + + private void alert(final String message, final String title, @Nullable Runnable okCallback) { final Activity activity = getActivity(); runOnUiThread(() -> { AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setMessage(message).setTitle(title); builder.setPositiveButton( "OK", - (dialog, id) -> dialog.cancel()); + (dialog, id) -> { + if (okCallback != null) { + okCallback.run(); + } + dialog.cancel(); + }); AlertDialog dialog = builder.create(); dialog.show(); }); @@ -471,7 +496,7 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); mGyroscope = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); - GodotLib.initialize(activity, + godot_initialized = GodotLib.initialize(activity, this, activity.getAssets(), io, @@ -482,8 +507,6 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC tts); result_callback = null; - - godot_initialized = true; } @Override @@ -1023,7 +1046,7 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC } @Keep - private GodotRenderView getRenderView() { // used by native side to get renderView + public GodotRenderView getRenderView() { // used by native side to get renderView return mRenderView; } diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java b/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java index 08da1b1832..513021f1d1 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java @@ -31,7 +31,6 @@ package org.godotengine.godot; import org.godotengine.godot.gl.GLSurfaceView; import org.godotengine.godot.gl.GodotRenderer; -import org.godotengine.godot.input.GodotGestureHandler; import org.godotengine.godot.input.GodotInputHandler; import org.godotengine.godot.utils.GLUtils; import org.godotengine.godot.xr.XRMode; @@ -46,7 +45,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.graphics.PixelFormat; import android.os.Build; -import android.view.GestureDetector; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.PointerIcon; @@ -75,7 +73,6 @@ import androidx.annotation.Keep; public class GodotGLRenderView extends GLSurfaceView implements GodotRenderView { private final Godot godot; private final GodotInputHandler inputHandler; - private final GestureDetector detector; private final GodotRenderer godotRenderer; private PointerIcon pointerIcon; @@ -85,7 +82,6 @@ public class GodotGLRenderView extends GLSurfaceView implements GodotRenderView this.godot = godot; this.inputHandler = new GodotInputHandler(this); - this.detector = new GestureDetector(context, new GodotGestureHandler(this)); this.godotRenderer = new GodotRenderer(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { pointerIcon = PointerIcon.getSystemIcon(getContext(), PointerIcon.TYPE_DEFAULT); @@ -132,7 +128,6 @@ public class GodotGLRenderView extends GLSurfaceView implements GodotRenderView @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); - this.detector.onTouchEvent(event); return inputHandler.onTouchEvent(event); } @@ -156,6 +151,24 @@ public class GodotGLRenderView extends GLSurfaceView implements GodotRenderView return inputHandler.onGenericMotionEvent(event); } + @Override + public void onPointerCaptureChange(boolean hasCapture) { + super.onPointerCaptureChange(hasCapture); + inputHandler.onPointerCaptureChange(hasCapture); + } + + @Override + public void requestPointerCapture() { + super.requestPointerCapture(); + inputHandler.onPointerCaptureChange(true); + } + + @Override + public void releasePointerCapture() { + super.releasePointerCapture(); + inputHandler.onPointerCaptureChange(false); + } + /** * called from JNI to change pointer icon */ 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 f855fc6cf6..26aad867b1 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java @@ -54,7 +54,7 @@ public class GodotLib { /** * Invoked on the main thread to initialize Godot native layer. */ - public static native void initialize(Activity activity, + public static native boolean initialize(Activity activity, Godot p_instance, AssetManager p_asset_manager, GodotIO godotIO, @@ -74,7 +74,7 @@ public class GodotLib { * Invoked on the GL thread to complete setup for the Godot native layer logic. * @param p_cmdline Command line arguments used to configure Godot native layer components. */ - public static native void setup(String[] p_cmdline); + public static native boolean setup(String[] p_cmdline); /** * Invoked on the GL thread when the underlying Android surface has changed size. @@ -92,7 +92,7 @@ public class GodotLib { public static native void newcontext(Surface p_surface); /** - * Forward {@link Activity#onBackPressed()} event from the main thread to the GL thread. + * Forward {@link Activity#onBackPressed()} event. */ public static native void back(); @@ -108,63 +108,60 @@ public class GodotLib { public static native void ttsCallback(int event, int id, int pos); /** - * Forward touch events from the main thread to the GL thread. + * Forward touch events. */ - public static native void touch(int inputDevice, int event, int pointer, int pointerCount, float[] positions); - public static native void touch(int inputDevice, int event, int pointer, int pointerCount, float[] positions, int buttonsMask); - public static native void touch(int inputDevice, int event, int pointer, int pointerCount, float[] positions, int buttonsMask, float verticalFactor, float horizontalFactor); + public static native void dispatchTouchEvent(int event, int pointer, int pointerCount, float[] positions); /** - * Forward hover events from the main thread to the GL thread. + * Dispatch mouse events */ - public static native void hover(int type, float x, float y); + public static native void dispatchMouseEvent(int event, int buttonMask, float x, float y, float deltaX, float deltaY, boolean doubleClick, boolean sourceMouseRelative); - /** - * Forward double_tap events from the main thread to the GL thread. - */ - public static native void doubleTap(int buttonMask, int x, int y); + public static native void magnify(float x, float y, float factor); + + public static native void pan(float x, float y, float deltaX, float deltaY); /** - * Forward accelerometer sensor events from the main thread to the GL thread. + * Forward accelerometer sensor events. * @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent) */ public static native void accelerometer(float x, float y, float z); /** - * Forward gravity sensor events from the main thread to the GL thread. + * Forward gravity sensor events. * @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent) */ public static native void gravity(float x, float y, float z); /** - * Forward magnetometer sensor events from the main thread to the GL thread. + * Forward magnetometer sensor events. * @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent) */ public static native void magnetometer(float x, float y, float z); /** - * Forward gyroscope sensor events from the main thread to the GL thread. + * Forward gyroscope sensor events. * @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent) */ public static native void gyroscope(float x, float y, float z); /** - * Forward regular key events from the main thread to the GL thread. + * Forward regular key events. */ public static native void key(int p_keycode, int p_physical_keycode, int p_unicode, boolean p_pressed); /** - * Forward game device's key events from the main thread to the GL thread. + * Forward game device's key events. */ public static native void joybutton(int p_device, int p_but, boolean p_pressed); /** - * Forward joystick devices axis motion events from the main thread to the GL thread. + * Forward joystick devices axis motion events. */ public static native void joyaxis(int p_device, int p_axis, float p_value); /** - * Forward joystick devices hat motion events from the main thread to the GL thread. + * Forward joystick devices hat motion events. */ public static native void joyhat(int p_device, int p_hat_x, int p_hat_y); diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java b/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java index c386a2d2eb..fa6c3280b9 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java @@ -30,7 +30,6 @@ package org.godotengine.godot; -import org.godotengine.godot.input.GodotGestureHandler; import org.godotengine.godot.input.GodotInputHandler; import org.godotengine.godot.vulkan.VkRenderer; import org.godotengine.godot.vulkan.VkSurfaceView; @@ -38,7 +37,6 @@ import org.godotengine.godot.vulkan.VkSurfaceView; import android.annotation.SuppressLint; import android.content.Context; import android.os.Build; -import android.view.GestureDetector; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.PointerIcon; @@ -49,7 +47,6 @@ import androidx.annotation.Keep; public class GodotVulkanRenderView extends VkSurfaceView implements GodotRenderView { private final Godot godot; private final GodotInputHandler mInputHandler; - private final GestureDetector mGestureDetector; private final VkRenderer mRenderer; private PointerIcon pointerIcon; @@ -58,7 +55,6 @@ public class GodotVulkanRenderView extends VkSurfaceView implements GodotRenderV this.godot = godot; mInputHandler = new GodotInputHandler(this); - mGestureDetector = new GestureDetector(context, new GodotGestureHandler(this)); mRenderer = new VkRenderer(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { pointerIcon = PointerIcon.getSystemIcon(getContext(), PointerIcon.TYPE_DEFAULT); @@ -106,7 +102,6 @@ public class GodotVulkanRenderView extends VkSurfaceView implements GodotRenderV @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); - mGestureDetector.onTouchEvent(event); return mInputHandler.onTouchEvent(event); } @@ -130,6 +125,24 @@ public class GodotVulkanRenderView extends VkSurfaceView implements GodotRenderV return mInputHandler.onGenericMotionEvent(event); } + @Override + public void requestPointerCapture() { + super.requestPointerCapture(); + mInputHandler.onPointerCaptureChange(true); + } + + @Override + public void releasePointerCapture() { + super.releasePointerCapture(); + mInputHandler.onPointerCaptureChange(false); + } + + @Override + public void onPointerCaptureChange(boolean hasCapture) { + super.onPointerCaptureChange(hasCapture); + mInputHandler.onPointerCaptureChange(hasCapture); + } + /** * called from JNI to change pointer icon */ diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.kt b/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.kt new file mode 100644 index 0000000000..9715c31fc1 --- /dev/null +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.kt @@ -0,0 +1,289 @@ +/*************************************************************************/ +/* GodotGestureHandler.kt */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 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.input + +import android.os.Build +import android.view.GestureDetector.SimpleOnGestureListener +import android.view.InputDevice +import android.view.MotionEvent +import android.view.ScaleGestureDetector +import android.view.ScaleGestureDetector.OnScaleGestureListener +import org.godotengine.godot.GodotLib + +/** + * Handles regular and scale gesture input related events for the [GodotView] view. + * + * @See https://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener + * @See https://developer.android.com/reference/android/view/ScaleGestureDetector.OnScaleGestureListener + */ +internal class GodotGestureHandler : SimpleOnGestureListener(), OnScaleGestureListener { + + companion object { + private val TAG = GodotGestureHandler::class.java.simpleName + } + + /** + * Enable pan and scale gestures + */ + var panningAndScalingEnabled = false + + private var doubleTapInProgress = false + private var dragInProgress = false + private var scaleInProgress = false + private var contextClickInProgress = false + private var pointerCaptureInProgress = false + + override fun onDown(event: MotionEvent): Boolean { + // Don't send / register a down event while we're in the middle of a double-tap + if (!doubleTapInProgress) { + // Send the down event + GodotInputHandler.handleMotionEvent(event) + } + return true + } + + override fun onSingleTapUp(event: MotionEvent): Boolean { + GodotInputHandler.handleMotionEvent(event) + return true + } + + override fun onLongPress(event: MotionEvent) { + contextClickRouter(event) + } + + private fun contextClickRouter(event: MotionEvent) { + if (scaleInProgress) { + return + } + + // Cancel the previous down event + GodotInputHandler.handleMotionEvent( + event.source, + MotionEvent.ACTION_CANCEL, + event.buttonState, + event.x, + event.y + ) + + // Turn a context click into a single tap right mouse button click. + GodotInputHandler.handleMouseEvent( + MotionEvent.ACTION_DOWN, + MotionEvent.BUTTON_SECONDARY, + event.x, + event.y + ) + contextClickInProgress = true + } + + fun onPointerCaptureChange(hasCapture: Boolean) { + if (pointerCaptureInProgress == hasCapture) { + return + } + + if (!hasCapture) { + // Dispatch a mouse relative ACTION_UP event to signal the end of the capture + GodotInputHandler.handleMouseEvent( + MotionEvent.ACTION_UP, + 0, + 0f, + 0f, + 0f, + 0f, + false, + true + ) + } + pointerCaptureInProgress = hasCapture + } + + fun onMotionEvent(event: MotionEvent): Boolean { + return when (event.actionMasked) { + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_BUTTON_RELEASE -> { + onActionUp(event) + } + MotionEvent.ACTION_MOVE -> { + onActionMove(event) + } + else -> false + } + } + + private fun onActionUp(event: MotionEvent): Boolean { + val sourceMouseRelative = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + event.isFromSource(InputDevice.SOURCE_MOUSE_RELATIVE) + } else { + false + } + when { + pointerCaptureInProgress -> { + return if (event.actionMasked == MotionEvent.ACTION_CANCEL) { + // Don't dispatch the ACTION_CANCEL while a capture is in progress + true + } else { + GodotInputHandler.handleMouseEvent( + MotionEvent.ACTION_UP, + event.buttonState, + event.x, + event.y, + 0f, + 0f, + false, + sourceMouseRelative + ) + pointerCaptureInProgress = false + true + } + } + dragInProgress -> { + GodotInputHandler.handleMotionEvent(event) + dragInProgress = false + return true + } + contextClickInProgress -> { + GodotInputHandler.handleMouseEvent( + event.actionMasked, + 0, + event.x, + event.y, + 0f, + 0f, + false, + sourceMouseRelative + ) + contextClickInProgress = false + return true + } + else -> return false + } + } + + private fun onActionMove(event: MotionEvent): Boolean { + if (contextClickInProgress) { + val sourceMouseRelative = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + event.isFromSource(InputDevice.SOURCE_MOUSE_RELATIVE) + } else { + false + } + GodotInputHandler.handleMouseEvent( + event.actionMasked, + MotionEvent.BUTTON_SECONDARY, + event.x, + event.y, + 0f, + 0f, + false, + sourceMouseRelative + ) + return true + } + return false + } + + override fun onDoubleTapEvent(event: MotionEvent): Boolean { + if (event.actionMasked == MotionEvent.ACTION_UP) { + doubleTapInProgress = false + } + return true + } + + override fun onDoubleTap(event: MotionEvent): Boolean { + doubleTapInProgress = true + val x = event.x + val y = event.y + val buttonMask = + if (GodotInputHandler.isMouseEvent(event)) { + event.buttonState + } else { + MotionEvent.BUTTON_PRIMARY + } + GodotInputHandler.handleMouseEvent(MotionEvent.ACTION_DOWN, buttonMask, x, y, true) + GodotInputHandler.handleMouseEvent(MotionEvent.ACTION_UP, 0, x, y, false) + + return true + } + + override fun onScroll( + originEvent: MotionEvent, + terminusEvent: MotionEvent, + distanceX: Float, + distanceY: Float + ): Boolean { + if (scaleInProgress) { + if (dragInProgress) { + // Cancel the drag + GodotInputHandler.handleMotionEvent( + originEvent.source, + MotionEvent.ACTION_CANCEL, + originEvent.buttonState, + originEvent.x, + originEvent.y + ) + dragInProgress = false + } + return true + } + + dragInProgress = true + + val x = terminusEvent.x + val y = terminusEvent.y + if (terminusEvent.pointerCount >= 2 && panningAndScalingEnabled) { + GodotLib.pan(x, y, distanceX / 5f, distanceY / 5f) + } else { + GodotInputHandler.handleMotionEvent(terminusEvent) + } + return true + } + + override fun onScale(detector: ScaleGestureDetector?): Boolean { + if (detector == null || !panningAndScalingEnabled) { + return false + } + GodotLib.magnify( + detector.focusX, + detector.focusY, + detector.scaleFactor + ) + return true + } + + override fun onScaleBegin(detector: ScaleGestureDetector?): Boolean { + if (detector == null || !panningAndScalingEnabled) { + return false + } + scaleInProgress = true + return true + } + + override fun onScaleEnd(detector: ScaleGestureDetector?) { + scaleInProgress = false + } +} 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 da15b2490c..03cb8034fa 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 @@ -41,13 +41,13 @@ import android.os.Build; import android.util.Log; import android.util.SparseArray; import android.util.SparseIntArray; +import android.view.GestureDetector; import android.view.InputDevice; -import android.view.InputDevice.MotionRange; import android.view.KeyEvent; import android.view.MotionEvent; +import android.view.ScaleGestureDetector; import java.util.Collections; -import java.util.Comparator; import java.util.HashSet; import java.util.Set; @@ -55,21 +55,49 @@ import java.util.Set; * Handles input related events for the {@link GodotRenderView} view. */ public class GodotInputHandler implements InputManager.InputDeviceListener { - private final GodotRenderView mRenderView; - private final InputManager mInputManager; - - private final String tag = this.getClass().getSimpleName(); + private static final String TAG = GodotInputHandler.class.getSimpleName(); private final SparseIntArray mJoystickIds = new SparseIntArray(4); private final SparseArray<Joystick> mJoysticksDevices = new SparseArray<>(4); + private final GodotRenderView mRenderView; + private final InputManager mInputManager; + private final GestureDetector gestureDetector; + private final ScaleGestureDetector scaleGestureDetector; + private final GodotGestureHandler godotGestureHandler; + public GodotInputHandler(GodotRenderView godotView) { + final Context context = godotView.getView().getContext(); mRenderView = godotView; - mInputManager = (InputManager)mRenderView.getView().getContext().getSystemService(Context.INPUT_SERVICE); + mInputManager = (InputManager)context.getSystemService(Context.INPUT_SERVICE); mInputManager.registerInputDeviceListener(this, null); + + this.godotGestureHandler = new GodotGestureHandler(); + this.gestureDetector = new GestureDetector(context, godotGestureHandler); + this.gestureDetector.setIsLongpressEnabled(false); + this.scaleGestureDetector = new ScaleGestureDetector(context, godotGestureHandler); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + this.scaleGestureDetector.setStylusScaleEnabled(true); + } } - private boolean isKeyEvent_GameDevice(int source) { + /** + * Enable long press events. This is false by default. + */ + public void enableLongPress(boolean enable) { + this.gestureDetector.setIsLongpressEnabled(enable); + } + + /** + * Enable multi-fingers pan & scale gestures. This is false by default. + * + * Note: This may interfere with multi-touch handling / support. + */ + public void enablePanningAndScalingGestures(boolean enable) { + this.godotGestureHandler.setPanningAndScalingEnabled(enable); + } + + private boolean isKeyEventGameDevice(int source) { // Note that keyboards are often (SOURCE_KEYBOARD | SOURCE_DPAD) if (source == (InputDevice.SOURCE_KEYBOARD | InputDevice.SOURCE_DPAD)) return false; @@ -77,6 +105,10 @@ public class GodotInputHandler implements InputManager.InputDeviceListener { return (source & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK || (source & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD || (source & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD; } + public void onPointerCaptureChange(boolean hasCapture) { + godotGestureHandler.onPointerCaptureChange(hasCapture); + } + public boolean onKeyUp(final int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return true; @@ -87,7 +119,7 @@ public class GodotInputHandler implements InputManager.InputDeviceListener { } int source = event.getSource(); - if (isKeyEvent_GameDevice(source)) { + if (isKeyEventGameDevice(source)) { // Check if the device exists final int deviceId = event.getDeviceId(); if (mJoystickIds.indexOfKey(deviceId) >= 0) { @@ -121,11 +153,10 @@ public class GodotInputHandler implements InputManager.InputDeviceListener { } int source = event.getSource(); - //Log.e(TAG, String.format("Key down! source %d, device %d, joystick %d, %d, %d", event.getDeviceId(), source, (source & InputDevice.SOURCE_JOYSTICK), (source & InputDevice.SOURCE_DPAD), (source & InputDevice.SOURCE_GAMEPAD))); final int deviceId = event.getDeviceId(); // Check if source is a game device and that the device is a registered gamepad - if (isKeyEvent_GameDevice(source)) { + if (isKeyEventGameDevice(source)) { if (event.getRepeatCount() > 0) // ignore key echo return true; @@ -145,47 +176,41 @@ public class GodotInputHandler implements InputManager.InputDeviceListener { } public boolean onTouchEvent(final MotionEvent event) { - // Mouse drag (mouse pressed and move) doesn't fire onGenericMotionEvent so this is needed - if (event.isFromSource(InputDevice.SOURCE_MOUSE)) { - if (event.getAction() != MotionEvent.ACTION_MOVE) { - // we return true because every time a mouse event is fired, the event is already handled - // in onGenericMotionEvent, so by touch event we can say that the event is also handled - return true; - } - return handleMouseEvent(event); + this.scaleGestureDetector.onTouchEvent(event); + if (this.gestureDetector.onTouchEvent(event)) { + // The gesture detector has handled the event. + return true; } - final int evcount = event.getPointerCount(); - if (evcount == 0) + if (godotGestureHandler.onMotionEvent(event)) { + // The gesture handler has handled the event. return true; + } - if (mRenderView != null) { - final float[] arr = new float[event.getPointerCount() * 3]; // pointerId1, x1, y1, pointerId2, etc... + // Drag events are handled by the [GodotGestureHandler] + if (event.getActionMasked() == MotionEvent.ACTION_MOVE) { + return true; + } - for (int i = 0; i < event.getPointerCount(); i++) { - arr[i * 3 + 0] = event.getPointerId(i); - arr[i * 3 + 1] = event.getX(i); - arr[i * 3 + 2] = event.getY(i); - } - final int action = event.getActionMasked(); - final int pointer_idx = event.getPointerId(event.getActionIndex()); - - switch (action) { - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_MOVE: - case MotionEvent.ACTION_POINTER_UP: - case MotionEvent.ACTION_POINTER_DOWN: { - GodotLib.touch(event.getSource(), action, pointer_idx, evcount, arr); - } break; - } + if (isMouseEvent(event)) { + return handleMouseEvent(event); } - return true; + + return handleTouchEvent(event); } public boolean onGenericMotionEvent(MotionEvent event) { - if (event.isFromSource(InputDevice.SOURCE_JOYSTICK) && event.getAction() == MotionEvent.ACTION_MOVE) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && gestureDetector.onGenericMotionEvent(event)) { + // The gesture detector has handled the event. + return true; + } + + if (godotGestureHandler.onMotionEvent(event)) { + // The gesture handler has handled the event. + return true; + } + + if (event.isFromSource(InputDevice.SOURCE_JOYSTICK) && event.getActionMasked() == MotionEvent.ACTION_MOVE) { // Check if the device exists final int deviceId = event.getDeviceId(); if (mJoystickIds.indexOfKey(deviceId) >= 0) { @@ -198,15 +223,14 @@ public class GodotInputHandler implements InputManager.InputDeviceListener { for (int i = 0; i < joystick.axes.size(); i++) { final int axis = joystick.axes.get(i); final float value = event.getAxisValue(axis); - /** - * As all axes are polled for each event, only fire an axis event if the value has actually changed. - * Prevents flooding Godot with repeated events. + /* + As all axes are polled for each event, only fire an axis event if the value has actually changed. + Prevents flooding Godot with repeated events. */ if (joystick.axesValues.indexOfKey(axis) < 0 || (float)joystick.axesValues.get(axis) != value) { // save value to prevent repeats joystick.axesValues.put(axis, value); - final int godotAxisIdx = i; - GodotLib.joyaxis(godotJoyId, godotAxisIdx, value); + GodotLib.joyaxis(godotJoyId, i, value); } } @@ -221,17 +245,8 @@ public class GodotInputHandler implements InputManager.InputDeviceListener { } return true; } - } else if (event.isFromSource(InputDevice.SOURCE_STYLUS)) { - final float x = event.getX(); - final float y = event.getY(); - final int type = event.getAction(); - GodotLib.hover(type, x, y); - return true; - - } else if (event.isFromSource(InputDevice.SOURCE_MOUSE) || event.isFromSource(InputDevice.SOURCE_MOUSE_RELATIVE)) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - return handleMouseEvent(event); - } + } else if (isMouseEvent(event)) { + return handleMouseEvent(event); } return false; @@ -243,7 +258,7 @@ public class GodotInputHandler implements InputManager.InputDeviceListener { for (int deviceId : deviceIds) { InputDevice device = mInputManager.getInputDevice(deviceId); if (DEBUG) { - Log.v("GodotInputHandler", String.format("init() deviceId:%d, Name:%s\n", deviceId, device.getName())); + Log.v(TAG, String.format("init() deviceId:%d, Name:%s\n", deviceId, device.getName())); } onInputDeviceAdded(deviceId); } @@ -288,13 +303,12 @@ public class GodotInputHandler implements InputManager.InputDeviceListener { joystick.name = device.getName(); //Helps with creating new joypad mappings. - Log.i(tag, "=== New Input Device: " + joystick.name); + Log.i(TAG, "=== New Input Device: " + joystick.name); Set<Integer> already = new HashSet<>(); for (InputDevice.MotionRange range : device.getMotionRanges()) { boolean isJoystick = range.isFromSource(InputDevice.SOURCE_JOYSTICK); boolean isGamepad = range.isFromSource(InputDevice.SOURCE_GAMEPAD); - //Log.i(tag, "axis: "+range.getAxis()+ ", isJoystick: "+isJoystick+", isGamepad: "+isGamepad); if (!isJoystick && !isGamepad) { continue; } @@ -306,14 +320,14 @@ public class GodotInputHandler implements InputManager.InputDeviceListener { already.add(axis); joystick.axes.add(axis); } else { - Log.w(tag, " - DUPLICATE AXIS VALUE IN LIST: " + axis); + Log.w(TAG, " - DUPLICATE AXIS VALUE IN LIST: " + axis); } } } Collections.sort(joystick.axes); for (int idx = 0; idx < joystick.axes.size(); idx++) { //Helps with creating new joypad mappings. - Log.i(tag, " - Mapping Android axis " + joystick.axes.get(idx) + " to Godot axis " + idx); + Log.i(TAG, " - Mapping Android axis " + joystick.axes.get(idx) + " to Godot axis " + idx); } mJoysticksDevices.put(deviceId, joystick); @@ -338,13 +352,6 @@ public class GodotInputHandler implements InputManager.InputDeviceListener { onInputDeviceAdded(deviceId); } - private static class RangeComparator implements Comparator<MotionRange> { - @Override - public int compare(MotionRange arg0, MotionRange arg1) { - return arg0.getAxis() - arg1.getAxis(); - } - } - public static int getGodotButton(int keyCode) { int button; switch (keyCode) { @@ -410,39 +417,113 @@ public class GodotInputHandler implements InputManager.InputDeviceListener { return button; } - private boolean handleMouseEvent(final MotionEvent event) { - switch (event.getActionMasked()) { + static boolean isMouseEvent(MotionEvent event) { + return isMouseEvent(event.getSource()); + } + + private static boolean isMouseEvent(int eventSource) { + boolean mouseSource = ((eventSource & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) || ((eventSource & InputDevice.SOURCE_STYLUS) == InputDevice.SOURCE_STYLUS); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mouseSource = mouseSource || ((eventSource & InputDevice.SOURCE_MOUSE_RELATIVE) == InputDevice.SOURCE_MOUSE_RELATIVE); + } + return mouseSource; + } + + static boolean handleMotionEvent(final MotionEvent event) { + if (isMouseEvent(event)) { + return handleMouseEvent(event); + } + + return handleTouchEvent(event); + } + + static boolean handleMotionEvent(int eventSource, int eventAction, int buttonsMask, float x, float y) { + return handleMotionEvent(eventSource, eventAction, buttonsMask, x, y, 0, 0); + } + + static boolean handleMotionEvent(int eventSource, int eventAction, int buttonsMask, float x, float y, float deltaX, float deltaY) { + if (isMouseEvent(eventSource)) { + return handleMouseEvent(eventAction, buttonsMask, x, y, deltaX, deltaY, false, false); + } + + return handleTouchEvent(eventAction, x, y); + } + + static boolean handleMouseEvent(final MotionEvent event) { + final int eventAction = event.getActionMasked(); + final float x = event.getX(); + final float y = event.getY(); + final int buttonsMask = event.getButtonState(); + + final float verticalFactor = event.getAxisValue(MotionEvent.AXIS_VSCROLL); + final float horizontalFactor = event.getAxisValue(MotionEvent.AXIS_HSCROLL); + boolean sourceMouseRelative = false; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + sourceMouseRelative = event.isFromSource(InputDevice.SOURCE_MOUSE_RELATIVE); + } + return handleMouseEvent(eventAction, buttonsMask, x, y, horizontalFactor, verticalFactor, false, sourceMouseRelative); + } + + static boolean handleMouseEvent(int eventAction, int buttonsMask, float x, float y) { + return handleMouseEvent(eventAction, buttonsMask, x, y, 0, 0, false, false); + } + + static boolean handleMouseEvent(int eventAction, int buttonsMask, float x, float y, boolean doubleClick) { + return handleMouseEvent(eventAction, buttonsMask, x, y, 0, 0, doubleClick, false); + } + + static boolean handleMouseEvent(int eventAction, int buttonsMask, float x, float y, float deltaX, float deltaY, boolean doubleClick, boolean sourceMouseRelative) { + switch (eventAction) { + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + // Zero-up the button state + buttonsMask = 0; + // FALL THROUGH + case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_HOVER_ENTER: + case MotionEvent.ACTION_HOVER_EXIT: case MotionEvent.ACTION_HOVER_MOVE: - case MotionEvent.ACTION_HOVER_EXIT: { - final float x = event.getX(); - final float y = event.getY(); - final int type = event.getAction(); - GodotLib.hover(type, x, y); - return true; - } - case MotionEvent.ACTION_BUTTON_PRESS: - case MotionEvent.ACTION_BUTTON_RELEASE: - case MotionEvent.ACTION_MOVE: { - final float x = event.getX(); - final float y = event.getY(); - final int buttonsMask = event.getButtonState(); - final int action = event.getAction(); - GodotLib.touch(event.getSource(), action, 0, 1, new float[] { 0, x, y }, buttonsMask); - return true; - } + case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_SCROLL: { - final float x = event.getX(); - final float y = event.getY(); - final int buttonsMask = event.getButtonState(); - final int action = event.getAction(); - final float verticalFactor = event.getAxisValue(MotionEvent.AXIS_VSCROLL); - final float horizontalFactor = event.getAxisValue(MotionEvent.AXIS_HSCROLL); - GodotLib.touch(event.getSource(), action, 0, 1, new float[] { 0, x, y }, buttonsMask, verticalFactor, horizontalFactor); + GodotLib.dispatchMouseEvent(eventAction, buttonsMask, x, y, deltaX, deltaY, doubleClick, sourceMouseRelative); + return true; } + } + return false; + } + + static boolean handleTouchEvent(final MotionEvent event) { + final int pointerCount = event.getPointerCount(); + if (pointerCount == 0) { + return true; + } + + final float[] positions = new float[pointerCount * 3]; // pointerId1, x1, y1, pointerId2, etc... + + for (int i = 0; i < pointerCount; i++) { + positions[i * 3 + 0] = event.getPointerId(i); + positions[i * 3 + 1] = event.getX(i); + positions[i * 3 + 2] = event.getY(i); + } + final int action = event.getActionMasked(); + final int actionPointerId = event.getPointerId(event.getActionIndex()); + + return handleTouchEvent(action, actionPointerId, pointerCount, positions); + } + + static boolean handleTouchEvent(int eventAction, float x, float y) { + return handleTouchEvent(eventAction, 0, 1, new float[] { 0, x, y }); + } + + static boolean handleTouchEvent(int eventAction, int actionPointerId, int pointerCount, float[] positions) { + switch (eventAction) { case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_UP: { - // we can safely ignore these cases because they are always come beside ACTION_BUTTON_PRESS and ACTION_BUTTON_RELEASE + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_MOVE: + case MotionEvent.ACTION_POINTER_UP: + case MotionEvent.ACTION_POINTER_DOWN: { + GodotLib.dispatchTouchEvent(eventAction, actionPointerId, pointerCount, positions); return true; } } diff --git a/platform/android/java_godot_lib_jni.cpp b/platform/android/java_godot_lib_jni.cpp index 422c05e5ce..04b69d5b86 100644 --- a/platform/android/java_godot_lib_jni.cpp +++ b/platform/android/java_godot_lib_jni.cpp @@ -79,7 +79,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setVirtualKeyboardHei } } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *env, jclass clazz, jobject p_activity, jobject p_godot_instance, jobject p_asset_manager, jobject p_godot_io, jobject p_net_utils, jobject p_directory_access_handler, jobject p_file_access_handler, jboolean p_use_apk_expansion, jobject p_godot_tts) { +JNIEXPORT jboolean JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *env, jclass clazz, jobject p_activity, jobject p_godot_instance, jobject p_asset_manager, jobject p_godot_io, jobject p_net_utils, jobject p_directory_access_handler, jobject p_file_access_handler, jboolean p_use_apk_expansion, jobject p_godot_tts) { JavaVM *jvm; env->GetJavaVM(&jvm); @@ -100,7 +100,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *en os_android = new OS_Android(godot_java, godot_io_java, p_use_apk_expansion); - godot_java->on_video_init(env); + return godot_java->on_video_init(env); } JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env, jclass clazz) { @@ -123,7 +123,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env } } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setup(JNIEnv *env, jclass clazz, jobjectArray p_cmdline) { +JNIEXPORT jboolean JNICALL Java_org_godotengine_godot_GodotLib_setup(JNIEnv *env, jclass clazz, jobjectArray p_cmdline) { setup_android_thread(); const char **cmdline = nullptr; @@ -133,10 +133,10 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setup(JNIEnv *env, jc cmdlen = env->GetArrayLength(p_cmdline); if (cmdlen) { cmdline = (const char **)memalloc((cmdlen + 1) * sizeof(const char *)); - ERR_FAIL_NULL_MSG(cmdline, "Out of memory."); + ERR_FAIL_NULL_V_MSG(cmdline, false, "Out of memory."); cmdline[cmdlen] = nullptr; j_cmdline = (jstring *)memalloc(cmdlen * sizeof(jstring)); - ERR_FAIL_NULL_MSG(j_cmdline, "Out of memory."); + ERR_FAIL_NULL_V_MSG(j_cmdline, false, "Out of memory."); for (int i = 0; i < cmdlen; i++) { jstring string = (jstring)env->GetObjectArrayElement(p_cmdline, i); @@ -161,11 +161,12 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setup(JNIEnv *env, jc // Note: --help and --version return ERR_HELP, but this should be translated to 0 if exit codes are propagated. if (err != OK) { - return; // should exit instead and print the error + return false; } java_class_wrapper = memnew(JavaClassWrapper(godot_java->get_activity())); GDREGISTER_CLASS(JNISingleton); + return true; } JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_resize(JNIEnv *env, jclass clazz, jobject p_surface, jint p_width, jint p_height) { @@ -254,7 +255,17 @@ JNIEXPORT jboolean JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, return should_swap_buffers; } -void touch_preprocessing(JNIEnv *env, jclass clazz, jint input_device, jint ev, jint pointer, jint pointer_count, jfloatArray positions, jint buttons_mask, jfloat vertical_factor, jfloat horizontal_factor) { +// Called on the UI thread +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchMouseEvent(JNIEnv *env, jclass clazz, jint p_event_type, jint p_button_mask, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y, jboolean p_double_click, jboolean p_source_mouse_relative) { + if (step.get() <= 0) { + return; + } + + input_handler->process_mouse_event(p_event_type, p_button_mask, Point2(p_x, p_y), Vector2(p_delta_x, p_delta_y), p_double_click, p_source_mouse_relative); +} + +// Called on the UI thread +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchTouchEvent(JNIEnv *env, jclass clazz, jint ev, jint pointer, jint pointer_count, jfloatArray position) { if (step.get() <= 0) { return; } @@ -262,50 +273,30 @@ void touch_preprocessing(JNIEnv *env, jclass clazz, jint input_device, jint ev, Vector<AndroidInputHandler::TouchPos> points; for (int i = 0; i < pointer_count; i++) { jfloat p[3]; - env->GetFloatArrayRegion(positions, i * 3, 3, p); + env->GetFloatArrayRegion(position, i * 3, 3, p); AndroidInputHandler::TouchPos tp; tp.pos = Point2(p[1], p[2]); tp.id = (int)p[0]; points.push_back(tp); } - if ((input_device & AINPUT_SOURCE_MOUSE) == AINPUT_SOURCE_MOUSE || (input_device & AINPUT_SOURCE_MOUSE_RELATIVE) == AINPUT_SOURCE_MOUSE_RELATIVE) { - input_handler->process_mouse_event(input_device, ev, buttons_mask, points[0].pos, vertical_factor, horizontal_factor); - } else { - input_handler->process_touch(ev, pointer, points); - } -} -// Called on the UI thread -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch__IIII_3F(JNIEnv *env, jclass clazz, jint input_device, jint ev, jint pointer, jint pointer_count, jfloatArray position) { - touch_preprocessing(env, clazz, input_device, ev, pointer, pointer_count, position); + input_handler->process_touch_event(ev, pointer, points); } // Called on the UI thread -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch__IIII_3FI(JNIEnv *env, jclass clazz, jint input_device, jint ev, jint pointer, jint pointer_count, jfloatArray position, jint buttons_mask) { - touch_preprocessing(env, clazz, input_device, ev, pointer, pointer_count, position, buttons_mask); -} - -// Called on the UI thread -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch__IIII_3FIFF(JNIEnv *env, jclass clazz, jint input_device, jint ev, jint pointer, jint pointer_count, jfloatArray position, jint buttons_mask, jfloat vertical_factor, jfloat horizontal_factor) { - touch_preprocessing(env, clazz, input_device, ev, pointer, pointer_count, position, buttons_mask, vertical_factor, horizontal_factor); -} - -// Called on the UI thread -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_hover(JNIEnv *env, jclass clazz, jint p_type, jfloat p_x, jfloat p_y) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnify(JNIEnv *env, jclass clazz, jfloat p_x, jfloat p_y, jfloat p_factor) { if (step.get() <= 0) { return; } - - input_handler->process_hover(p_type, Point2(p_x, p_y)); + input_handler->process_magnify(Point2(p_x, p_y), p_factor); } // Called on the UI thread -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_doubleTap(JNIEnv *env, jclass clazz, jint p_button_mask, jint p_x, jint p_y) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_pan(JNIEnv *env, jclass clazz, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y) { if (step.get() <= 0) { return; } - - input_handler->process_double_tap(p_button_mask, Point2(p_x, p_y)); + input_handler->process_pan(Point2(p_x, p_y), Vector2(p_delta_x, p_delta_y)); } // Called on the UI thread diff --git a/platform/android/java_godot_lib_jni.h b/platform/android/java_godot_lib_jni.h index 3c48ca0459..09fed15690 100644 --- a/platform/android/java_godot_lib_jni.h +++ b/platform/android/java_godot_lib_jni.h @@ -37,20 +37,18 @@ // These functions can be called from within JAVA and are the means by which our JAVA implementation calls back into our C++ code. // See java/src/org/godotengine/godot/GodotLib.java for the JAVA side of this (yes that's why we have the long names) extern "C" { -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *env, jclass clazz, jobject p_activity, jobject p_godot_instance, jobject p_asset_manager, jobject p_godot_io, jobject p_net_utils, jobject p_directory_access_handler, jobject p_file_access_handler, jboolean p_use_apk_expansion, jobject p_godot_tts); +JNIEXPORT jboolean JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *env, jclass clazz, jobject p_activity, jobject p_godot_instance, jobject p_asset_manager, jobject p_godot_io, jobject p_net_utils, jobject p_directory_access_handler, jobject p_file_access_handler, jboolean p_use_apk_expansion, jobject p_godot_tts); JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env, jclass clazz); -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setup(JNIEnv *env, jclass clazz, jobjectArray p_cmdline); +JNIEXPORT jboolean 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, jobject p_surface, jint p_width, jint p_height); JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *env, jclass clazz, jobject p_surface); JNIEXPORT jboolean JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, jclass clazz); JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ttsCallback(JNIEnv *env, jclass clazz, jint event, jint id, jint pos); JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_back(JNIEnv *env, jclass clazz); -void touch_preprocessing(JNIEnv *env, jclass clazz, jint input_device, jint ev, jint pointer, jint pointer_count, jfloatArray positions, jint buttons_mask = 0, jfloat vertical_factor = 0, jfloat horizontal_factor = 0); -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch__IIII_3F(JNIEnv *env, jclass clazz, jint input_device, jint ev, jint pointer, jint pointer_count, jfloatArray positions); -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch__IIII_3FI(JNIEnv *env, jclass clazz, jint input_device, jint ev, jint pointer, jint pointer_count, jfloatArray positions, jint buttons_mask); -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch__IIII_3FIFF(JNIEnv *env, jclass clazz, jint input_device, jint ev, jint pointer, jint pointer_count, jfloatArray positions, jint buttons_mask, jfloat vertical_factor, jfloat horizontal_factor); -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_hover(JNIEnv *env, jclass clazz, jint p_type, jfloat p_x, jfloat p_y); -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_doubleTap(JNIEnv *env, jclass clazz, jint p_button_mask, jint p_x, jint p_y); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchMouseEvent(JNIEnv *env, jclass clazz, jint p_event_type, jint p_button_mask, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y, jboolean p_double_click, jboolean p_source_mouse_relative); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchTouchEvent(JNIEnv *env, jclass clazz, jint ev, jint pointer, jint pointer_count, jfloatArray positions); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnify(JNIEnv *env, jclass clazz, jfloat p_x, jfloat p_y, jfloat p_factor); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_pan(JNIEnv *env, jclass clazz, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y); JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_key(JNIEnv *env, jclass clazz, jint p_keycode, jint p_physical_keycode, jint p_unicode, jboolean p_pressed); JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joybutton(JNIEnv *env, jclass clazz, jint p_device, jint p_button, jboolean p_pressed); JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyaxis(JNIEnv *env, jclass clazz, jint p_device, jint p_axis, jfloat p_value); diff --git a/platform/android/java_godot_wrapper.cpp b/platform/android/java_godot_wrapper.cpp index e3456fe4e4..07b0d75921 100644 --- a/platform/android/java_godot_wrapper.cpp +++ b/platform/android/java_godot_wrapper.cpp @@ -58,7 +58,7 @@ GodotJavaWrapper::GodotJavaWrapper(JNIEnv *p_env, jobject p_activity, jobject p_ } // get some Godot method pointers... - _on_video_init = p_env->GetMethodID(godot_class, "onVideoInit", "()V"); + _on_video_init = p_env->GetMethodID(godot_class, "onVideoInit", "()Z"); _restart = p_env->GetMethodID(godot_class, "restart", "()V"); _finish = p_env->GetMethodID(godot_class, "forceQuit", "()V"); _set_keep_screen_on = p_env->GetMethodID(godot_class, "setKeepScreenOn", "(Z)V"); @@ -125,14 +125,15 @@ GodotJavaViewWrapper *GodotJavaWrapper::get_godot_view() { return _godot_view; } -void GodotJavaWrapper::on_video_init(JNIEnv *p_env) { +bool GodotJavaWrapper::on_video_init(JNIEnv *p_env) { if (_on_video_init) { if (p_env == nullptr) { p_env = get_jni_env(); } - ERR_FAIL_NULL(p_env); - p_env->CallVoidMethod(godot_instance, _on_video_init); + ERR_FAIL_NULL_V(p_env, false); + return p_env->CallBooleanMethod(godot_instance, _on_video_init); } + return false; } void GodotJavaWrapper::on_godot_setup_completed(JNIEnv *p_env) { diff --git a/platform/android/java_godot_wrapper.h b/platform/android/java_godot_wrapper.h index bbf7c0ae33..a6c7853107 100644 --- a/platform/android/java_godot_wrapper.h +++ b/platform/android/java_godot_wrapper.h @@ -83,7 +83,7 @@ public: jobject get_class_loader(); GodotJavaViewWrapper *get_godot_view(); - void on_video_init(JNIEnv *p_env = nullptr); + bool on_video_init(JNIEnv *p_env = nullptr); void on_godot_setup_completed(JNIEnv *p_env = nullptr); void on_godot_main_loop_started(JNIEnv *p_env = nullptr); void restart(JNIEnv *p_env = nullptr); diff --git a/platform/android/os_android.cpp b/platform/android/os_android.cpp index 142dc54c45..4469c7a0f7 100644 --- a/platform/android/os_android.cpp +++ b/platform/android/os_android.cpp @@ -44,6 +44,7 @@ #include "net_socket_android.h" #include <dlfcn.h> +#include <sys/system_properties.h> #include "java_godot_io_wrapper.h" #include "java_godot_wrapper.h" @@ -175,6 +176,79 @@ String OS_Android::get_name() const { return "Android"; } +String OS_Android::get_system_property(const char *key) const { + static String value; + char value_str[PROP_VALUE_MAX]; + if (__system_property_get(key, value_str)) { + value = String(value_str); + } + return value; +} + +String OS_Android::get_distribution_name() const { + if (!get_system_property("ro.havoc.version").is_empty()) { + return "Havoc OS"; + } else if (!get_system_property("org.pex.version").is_empty()) { // Putting before "Pixel Experience", because it's derivating from it. + return "Pixel Extended"; + } else if (!get_system_property("org.pixelexperience.version").is_empty()) { + return "Pixel Experience"; + } else if (!get_system_property("ro.potato.version").is_empty()) { + return "POSP"; + } else if (!get_system_property("ro.xtended.version").is_empty()) { + return "Project-Xtended"; + } else if (!get_system_property("org.evolution.version").is_empty()) { + return "Evolution X"; + } else if (!get_system_property("ro.corvus.version").is_empty()) { + return "Corvus-Q"; + } else if (!get_system_property("ro.pa.version").is_empty()) { + return "Paranoid Android"; + } else if (!get_system_property("ro.crdroid.version").is_empty()) { + return "crDroid Android"; + } else if (!get_system_property("ro.syberia.version").is_empty()) { + return "Syberia Project"; + } else if (!get_system_property("ro.arrow.version").is_empty()) { + return "ArrowOS"; + } else if (!get_system_property("ro.lineage.version").is_empty()) { // Putting LineageOS last, just in case any derivative writes to "ro.lineage.version". + return "LineageOS"; + } + + if (!get_system_property("ro.modversion").is_empty()) { // Handles other Android custom ROMs. + return vformat("%s %s", get_name(), "Custom ROM"); + } + + // Handles stock Android. + return get_name(); +} + +String OS_Android::get_version() const { + const Vector<const char *> roms = { "ro.havoc.version", "org.pex.version", "org.pixelexperience.version", + "ro.potato.version", "ro.xtended.version", "org.evolution.version", "ro.corvus.version", "ro.pa.version", + "ro.crdroid.version", "ro.syberia.version", "ro.arrow.version", "ro.lineage.version" }; + for (int i = 0; i < roms.size(); i++) { + static String rom_version = get_system_property(roms[i]); + if (!rom_version.is_empty()) { + return rom_version; + } + } + + static String mod_version = get_system_property("ro.modversion"); // Handles other Android custom ROMs. + if (!mod_version.is_empty()) { + return mod_version; + } + + // Handles stock Android. + static String sdk_version = get_system_property("ro.build.version.sdk_int"); + static String build = get_system_property("ro.build.version.incremental"); + if (!sdk_version.is_empty()) { + if (!build.is_empty()) { + return vformat("%s.%s", sdk_version, build); + } + return sdk_version; + } + + return ""; +} + MainLoop *OS_Android::get_main_loop() const { return main_loop; } diff --git a/platform/android/os_android.h b/platform/android/os_android.h index 96c06d715c..d6546a3507 100644 --- a/platform/android/os_android.h +++ b/platform/android/os_android.h @@ -65,6 +65,8 @@ private: GodotJavaWrapper *godot_java = nullptr; GodotIOJavaWrapper *godot_io_java = nullptr; + String get_system_property(const char *key) const; + public: static const char *ANDROID_EXEC_PATH; @@ -93,6 +95,8 @@ public: virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false, String *r_resolved_path = nullptr) override; virtual String get_name() const override; + virtual String get_distribution_name() const override; + virtual String get_version() const override; virtual MainLoop *get_main_loop() const override; void main_loop_begin(); diff --git a/platform/ios/detect.py b/platform/ios/detect.py index 1a8d24d12d..d5e6ee4b46 100644 --- a/platform/ios/detect.py +++ b/platform/ios/detect.py @@ -70,9 +70,18 @@ def configure(env): env.Append(CCFLAGS=["-gdwarf-2", "-O0"]) env.Append(CPPDEFINES=["_DEBUG", ("DEBUG", 1)]) - if env["use_lto"]: - env.Append(CCFLAGS=["-flto"]) - env.Append(LINKFLAGS=["-flto"]) + ## LTO + + if env["lto"] == "auto": # Disable by default as it makes linking in Xcode very slow. + env["lto"] = "none" + + if env["lto"] != "none": + if env["lto"] == "thin": + env.Append(CCFLAGS=["-flto=thin"]) + env.Append(LINKFLAGS=["-flto=thin"]) + else: + env.Append(CCFLAGS=["-flto"]) + env.Append(LINKFLAGS=["-flto"]) ## Compiler configuration @@ -112,6 +121,10 @@ def configure(env): env.Append(CCFLAGS=["-miphoneos-version-min=11.0"]) if env["arch"] == "x86_64": + if not env["ios_simulator"]: + print("ERROR: Building for iOS with 'arch=x86_64' requires 'ios_simulator=yes'.") + sys.exit(255) + env["ENV"]["MACOSX_DEPLOYMENT_TARGET"] = "10.9" env.Append( CCFLAGS=( diff --git a/platform/ios/display_layer.mm b/platform/ios/display_layer.mm index 7c83494768..74c760ae9a 100644 --- a/platform/ios/display_layer.mm +++ b/platform/ios/display_layer.mm @@ -89,12 +89,12 @@ // FIXME: Add Vulkan support via MoltenVK. Add fallback code back? - // Create GL ES 2 context - if (GLOBAL_GET("rendering/driver/driver_name") == "opengl3") { - context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; - NSLog(@"Setting up an OpenGL ES 2.0 context."); + // Create GL ES 3 context + if (GLOBAL_GET("rendering/renderer/rendering_method") == "gl_compatibility") { + context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; + NSLog(@"Setting up an OpenGL ES 3.0 context."); if (!context) { - NSLog(@"Failed to create OpenGL ES 2.0 context!"); + NSLog(@"Failed to create OpenGL ES 3.0 context!"); return; } } diff --git a/platform/ios/display_server_ios.mm b/platform/ios/display_server_ios.mm index 74d6bc2e97..d3a0f38463 100644 --- a/platform/ios/display_server_ios.mm +++ b/platform/ios/display_server_ios.mm @@ -62,7 +62,7 @@ DisplayServerIOS::DisplayServerIOS(const String &p_rendering_driver, WindowMode // Note that we should be checking "opengl3" as the driver, might never enable this seeing OpenGL is deprecated on iOS // We are hardcoding the rendering_driver to "vulkan" down below - if (rendering_driver == "opengl_es") { + if (rendering_driver == "opengl3") { bool gl_initialization_error = false; // FIXME: Add Vulkan support via MoltenVK. Add fallback code back? @@ -163,7 +163,7 @@ Vector<String> DisplayServerIOS::get_rendering_drivers_func() { drivers.push_back("vulkan"); #endif #if defined(GLES3_ENABLED) - drivers.push_back("opengl_es"); + drivers.push_back("opengl3"); #endif return drivers; diff --git a/platform/ios/export/export_plugin.cpp b/platform/ios/export/export_plugin.cpp index 7aacb2de85..74a57dc614 100644 --- a/platform/ios/export/export_plugin.cpp +++ b/platform/ios/export/export_plugin.cpp @@ -34,7 +34,6 @@ #include "editor/editor_node.h" void EditorExportPlatformIOS::get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) const { - String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); // Vulkan and OpenGL ES 3.0 both mandate ETC2 support. r_features->push_back("etc2"); diff --git a/platform/ios/godot_view.mm b/platform/ios/godot_view.mm index 9ed219508c..ff90c05b1d 100644 --- a/platform/ios/godot_view.mm +++ b/platform/ios/godot_view.mm @@ -74,7 +74,7 @@ static const float earth_gravity = 9.80665; if ([driverName isEqualToString:@"vulkan"]) { layer = [GodotMetalLayer layer]; - } else if ([driverName isEqualToString:@"opengl_es"]) { + } else if ([driverName isEqualToString:@"opengl3"]) { if (@available(iOS 13, *)) { NSLog(@"OpenGL ES is deprecated on iOS 13"); } diff --git a/platform/ios/os_ios.h b/platform/ios/os_ios.h index 3b88f53b6a..00d91da771 100644 --- a/platform/ios/os_ios.h +++ b/platform/ios/os_ios.h @@ -100,6 +100,8 @@ public: virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String p_name, void *&p_symbol_handle, bool p_optional = false) override; virtual String get_name() const override; + virtual String get_distribution_name() const override; + virtual String get_version() const override; virtual String get_model_name() const override; virtual Error shell_open(String p_uri) override; diff --git a/platform/ios/os_ios.mm b/platform/ios/os_ios.mm index b9d186f355..a674498620 100644 --- a/platform/ios/os_ios.mm +++ b/platform/ios/os_ios.mm @@ -240,6 +240,15 @@ String OS_IOS::get_name() const { return "iOS"; } +String OS_IOS::get_distribution_name() const { + return get_name(); +} + +String OS_IOS::get_version() const { + NSOperatingSystemVersion ver = [NSProcessInfo processInfo].operatingSystemVersion; + return vformat("%d.%d.%d", (int64_t)ver.majorVersion, (int64_t)ver.minorVersion, (int64_t)ver.patchVersion); +} + String OS_IOS::get_model_name() const { String model = ios->get_model(); if (model != "") { diff --git a/platform/linuxbsd/detect.py b/platform/linuxbsd/detect.py index f5f7e65417..12d2432eea 100644 --- a/platform/linuxbsd/detect.py +++ b/platform/linuxbsd/detect.py @@ -31,7 +31,6 @@ def get_opts(): return [ EnumVariable("linker", "Linker program", "default", ("default", "bfd", "gold", "lld", "mold")), BoolVariable("use_llvm", "Use the LLVM compiler", False), - BoolVariable("use_thinlto", "Use ThinLTO (LLVM only, requires linker=lld, implies use_lto=yes)", False), BoolVariable("use_static_cpp", "Link libgcc and libstdc++ statically for better portability", True), BoolVariable("use_coverage", "Test Godot coverage", False), BoolVariable("use_ubsan", "Use LLVM/GCC compiler undefined behavior sanitizer (UBSAN)", False), @@ -129,13 +128,6 @@ def configure(env): else: env.Append(LINKFLAGS=["-fuse-ld=%s" % env["linker"]]) - if env["use_thinlto"]: - if not env["use_llvm"] or env["linker"] != "lld": - print("ThinLTO is only compatible with LLVM and the LLD linker, use `use_llvm=yes linker=lld`.") - sys.exit(255) - else: - env["use_lto"] = True # ThinLTO implies LTO - if env["use_coverage"]: env.Append(CCFLAGS=["-ftest-coverage", "-fprofile-arcs"]) env.Append(LINKFLAGS=["-ftest-coverage", "-fprofile-arcs"]) @@ -178,8 +170,16 @@ def configure(env): env.Append(CCFLAGS=["-fsanitize-recover=memory"]) env.Append(LINKFLAGS=["-fsanitize=memory"]) - if env["use_lto"]: - if env["use_thinlto"]: + # LTO + + if env["lto"] == "auto": # Full LTO for production. + env["lto"] = "full" + + if env["lto"] != "none": + if env["lto"] == "thin": + if not env["use_llvm"]: + print("ThinLTO is only compatible with LLVM, use `use_llvm=yes` or `lto=full`.") + sys.exit(255) env.Append(CCFLAGS=["-flto=thin"]) env.Append(LINKFLAGS=["-flto=thin"]) elif not env["use_llvm"] and env.GetOption("num_jobs") > 1: diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp index 0236e134fb..66dea6cf1b 100644 --- a/platform/linuxbsd/display_server_x11.cpp +++ b/platform/linuxbsd/display_server_x11.cpp @@ -397,7 +397,10 @@ void DisplayServerX11::mouse_set_mode(MouseMode p_mode) { if (mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) { //flush pending motion events _flush_mouse_motion(); - WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; + WindowID window_id = _get_focused_window_or_popup(); + if (!windows.has(window_id)) { + window_id = MAIN_WINDOW_ID; + } WindowData &window = windows[window_id]; if (XGrabPointer( @@ -433,7 +436,11 @@ void DisplayServerX11::warp_mouse(const Point2i &p_position) { if (mouse_mode == MOUSE_MODE_CAPTURED) { last_mouse_pos = p_position; } else { - WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; + WindowID window_id = _get_focused_window_or_popup(); + if (!windows.has(window_id)) { + window_id = MAIN_WINDOW_ID; + } + XWarpPointer(x11_display, None, windows[window_id].x11_window, 0, 0, 0, 0, (int)p_position.x, (int)p_position.y); } @@ -3181,6 +3188,15 @@ void DisplayServerX11::_window_changed(XEvent *event) { } } +DisplayServer::WindowID DisplayServerX11::_get_focused_window_or_popup() const { + const List<WindowID>::Element *E = popup_list.back(); + if (E) { + return E->get(); + } + + return last_focused_window; +} + void DisplayServerX11::_dispatch_input_events(const Ref<InputEvent> &p_event) { static_cast<DisplayServerX11 *>(get_singleton())->_dispatch_input_event(p_event); } @@ -3936,7 +3952,11 @@ void DisplayServerX11::process_events() { // The X11 API requires filtering one-by-one through the motion // notify events, in order to figure out which event is the one // generated by warping the mouse pointer. - WindowID focused_window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; + WindowID focused_window_id = _get_focused_window_or_popup(); + if (!windows.has(focused_window_id)) { + focused_window_id = MAIN_WINDOW_ID; + } + while (true) { if (mouse_mode == MOUSE_MODE_CAPTURED && event.xmotion.x == windows[focused_window_id].size.width / 2 && event.xmotion.y == windows[focused_window_id].size.height / 2) { //this is likely the warp event since it was warped here diff --git a/platform/linuxbsd/display_server_x11.h b/platform/linuxbsd/display_server_x11.h index ea03b2328c..a5fa7613bc 100644 --- a/platform/linuxbsd/display_server_x11.h +++ b/platform/linuxbsd/display_server_x11.h @@ -284,6 +284,8 @@ class DisplayServerX11 : public DisplayServer { Context context = CONTEXT_ENGINE; + WindowID _get_focused_window_or_popup() const; + void _send_window_event(const WindowData &wd, WindowEvent p_event); static void _dispatch_input_events(const Ref<InputEvent> &p_event); void _dispatch_input_event(const Ref<InputEvent> &p_event); diff --git a/platform/linuxbsd/gl_manager_x11.cpp b/platform/linuxbsd/gl_manager_x11.cpp index 04c1df71fb..838be2c042 100644 --- a/platform/linuxbsd/gl_manager_x11.cpp +++ b/platform/linuxbsd/gl_manager_x11.cpp @@ -256,7 +256,11 @@ void GLManager_X11::release_current() { if (!_current_window) { return; } - glXMakeCurrent(_x_windisp.x11_display, None, nullptr); + + if (!glXMakeCurrent(_x_windisp.x11_display, None, nullptr)) { + ERR_PRINT("glXMakeCurrent failed"); + } + _current_window = nullptr; } void GLManager_X11::window_make_current(DisplayServer::WindowID p_window_id) { @@ -276,7 +280,9 @@ void GLManager_X11::window_make_current(DisplayServer::WindowID p_window_id) { const GLDisplay &disp = get_display(win.gldisplay_id); - glXMakeCurrent(disp.x11_display, win.x11_window, disp.context->glx_context); + if (!glXMakeCurrent(disp.x11_display, win.x11_window, disp.context->glx_context)) { + ERR_PRINT("glXMakeCurrent failed"); + } _internal_set_current_window(&win); } @@ -290,13 +296,12 @@ void GLManager_X11::make_current() { return; } const GLDisplay &disp = get_current_display(); - glXMakeCurrent(_x_windisp.x11_display, _x_windisp.x11_window, disp.context->glx_context); + if (!glXMakeCurrent(_x_windisp.x11_display, _x_windisp.x11_window, disp.context->glx_context)) { + ERR_PRINT("glXMakeCurrent failed"); + } } void GLManager_X11::swap_buffers() { - // NO NEED TO CALL SWAP BUFFERS for each window... - // see https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glXSwapBuffers.xml - if (!_current_window) { return; } @@ -315,13 +320,6 @@ void GLManager_X11::swap_buffers() { } } - // print_line("\tswap_buffers"); - - // only for debugging without drawing anything - // glClearColor(Math::randf(), 0, 1, 1); - //glClear(GL_COLOR_BUFFER_BIT); - - //const GLDisplay &disp = get_current_display(); glXSwapBuffers(_x_windisp.x11_display, _x_windisp.x11_window); } diff --git a/platform/linuxbsd/os_linuxbsd.cpp b/platform/linuxbsd/os_linuxbsd.cpp index 61faf3061c..f4e94f1a91 100644 --- a/platform/linuxbsd/os_linuxbsd.cpp +++ b/platform/linuxbsd/os_linuxbsd.cpp @@ -50,6 +50,7 @@ #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> +#include <sys/utsname.h> #include <unistd.h> #ifdef FONTCONFIG_ENABLED @@ -205,6 +206,42 @@ String OS_LinuxBSD::get_name() const { #endif } +String OS_LinuxBSD::get_systemd_os_release_info_value(const String &key) const { + static String info; + if (info.is_empty()) { + Ref<FileAccess> f = FileAccess::open("/etc/os-release", FileAccess::READ); + if (f.is_valid()) { + while (!f->eof_reached()) { + const String line = f->get_line(); + if (line.find(key) != -1) { + return line.split("=")[1].strip_edges(); + } + } + } + } + return info; +} + +String OS_LinuxBSD::get_distribution_name() const { + static String systemd_name = get_systemd_os_release_info_value("NAME"); // returns a value for systemd users, otherwise an empty string. + if (!systemd_name.is_empty()) { + return systemd_name; + } + struct utsname uts; // returns a decent value for BSD family. + uname(&uts); + return uts.sysname; +} + +String OS_LinuxBSD::get_version() const { + static String systemd_version = get_systemd_os_release_info_value("VERSION"); // returns a value for systemd users, otherwise an empty string. + if (!systemd_version.is_empty()) { + return systemd_version; + } + struct utsname uts; // returns a decent value for BSD family. + uname(&uts); + return uts.version; +} + Error OS_LinuxBSD::shell_open(String p_uri) { Error ok; int err_code; @@ -686,10 +723,9 @@ Error OS_LinuxBSD::move_to_trash(const String &p_path) { String renamed_path = path.get_base_dir() + "/" + file_name; // Generates the .trashinfo file - OS::Date date = OS::get_singleton()->get_date(false); - OS::Time time = OS::get_singleton()->get_time(false); - String timestamp = vformat("%04d-%02d-%02dT%02d:%02d:", date.year, (int)date.month, date.day, time.hour, time.minute); - timestamp = vformat("%s%02d", timestamp, time.second); // vformat only supports up to 6 arguments. + OS::DateTime dt = OS::get_singleton()->get_datetime(false); + String timestamp = vformat("%04d-%02d-%02dT%02d:%02d:", dt.year, (int)dt.month, dt.day, dt.hour, dt.minute); + timestamp = vformat("%s%02d", timestamp, dt.second); // vformat only supports up to 6 arguments. String trash_info = "[Trash Info]\nPath=" + path.uri_encode() + "\nDeletionDate=" + timestamp + "\n"; { Error err; diff --git a/platform/linuxbsd/os_linuxbsd.h b/platform/linuxbsd/os_linuxbsd.h index d5b2321316..722d83ba19 100644 --- a/platform/linuxbsd/os_linuxbsd.h +++ b/platform/linuxbsd/os_linuxbsd.h @@ -67,6 +67,8 @@ class OS_LinuxBSD : public OS_Unix { MainLoop *main_loop = nullptr; + String get_systemd_os_release_info_value(const String &key) const; + protected: virtual void initialize() override; virtual void finalize() override; @@ -77,6 +79,8 @@ protected: public: virtual String get_name() const override; + virtual String get_distribution_name() const override; + virtual String get_version() const override; virtual MainLoop *get_main_loop() const override; diff --git a/platform/macos/SCsub b/platform/macos/SCsub index bbd461fba9..7ffb80f70b 100644 --- a/platform/macos/SCsub +++ b/platform/macos/SCsub @@ -12,6 +12,7 @@ files = [ "crash_handler_macos.mm", "macos_terminal_logger.mm", "display_server_macos.mm", + "godot_button_view.mm", "godot_content_view.mm", "godot_window_delegate.mm", "godot_window.mm", diff --git a/platform/macos/detect.py b/platform/macos/detect.py index cfd3789b41..834ac935d8 100644 --- a/platform/macos/detect.py +++ b/platform/macos/detect.py @@ -166,6 +166,21 @@ def configure(env): env["RANLIB"] = basecmd + "ranlib" env["AS"] = basecmd + "as" + # LTO + + if env["lto"] == "auto": # LTO benefits for macOS (size, performance) haven't been clearly established yet. + env["lto"] = "none" + + if env["lto"] != "none": + if env["lto"] == "thin": + env.Append(CCFLAGS=["-flto=thin"]) + env.Append(LINKFLAGS=["-flto=thin"]) + else: + env.Append(CCFLAGS=["-flto"]) + env.Append(LINKFLAGS=["-flto"]) + + # Sanitizers + if env["use_ubsan"] or env["use_asan"] or env["use_tsan"]: env.extra_suffix += ".san" env.Append(CCFLAGS=["-DSANITIZERS_ENABLED"]) @@ -199,9 +214,7 @@ def configure(env): ## Flags env.Prepend(CPPPATH=["#platform/macos"]) - env.Append( - CPPDEFINES=["MACOS_ENABLED", "UNIX_ENABLED", "APPLE_STYLE_KEYS", "COREAUDIO_ENABLED", "COREMIDI_ENABLED"] - ) + env.Append(CPPDEFINES=["MACOS_ENABLED", "UNIX_ENABLED", "COREAUDIO_ENABLED", "COREMIDI_ENABLED"]) env.Append( LINKFLAGS=[ "-framework", diff --git a/platform/macos/display_server_macos.h b/platform/macos/display_server_macos.h index 769cba2de5..a27e0d5efa 100644 --- a/platform/macos/display_server_macos.h +++ b/platform/macos/display_server_macos.h @@ -76,6 +76,7 @@ public: id window_delegate; id window_object; id window_view; + id window_button_view; Vector<Vector2> mpath; @@ -84,6 +85,9 @@ public: Size2i min_size; Size2i max_size; Size2i size; + Vector2i wb_offset = Vector2i(14, 14); + + NSRect last_frame_rect; bool im_active = false; Size2i im_position; @@ -187,6 +191,8 @@ private: Point2i _get_native_screen_position(int p_screen) const; static void _displays_arrangement_changed(CGDirectDisplayID display_id, CGDisplayChangeSummaryFlags flags, void *user_info); + WindowID _get_focused_window_or_popup() const; + static void _dispatch_input_events(const Ref<InputEvent> &p_event); void _dispatch_input_event(const Ref<InputEvent> &p_event); void _push_input(const Ref<InputEvent> &p_event); @@ -224,6 +230,7 @@ public: void window_update(WindowID p_window); void window_destroy(WindowID p_window); void window_resize(WindowID p_window, int p_width, int p_height); + void window_set_custom_window_buttons(WindowData &p_wd, bool p_enabled); virtual bool has_feature(Feature p_feature) const override; virtual String get_name() const override; @@ -387,6 +394,7 @@ public: virtual bool window_maximize_on_title_dbl_click() const override; virtual bool window_minimize_on_title_dbl_click() const override; + virtual void window_set_window_buttons_offset(const Vector2i &p_offset, WindowID p_window = MAIN_WINDOW_ID) override; virtual Vector2i window_get_safe_title_margins(WindowID p_window = MAIN_WINDOW_ID) const override; virtual Point2i ime_get_selection() const override; diff --git a/platform/macos/display_server_macos.mm b/platform/macos/display_server_macos.mm index b009007d73..e1d0d99165 100644 --- a/platform/macos/display_server_macos.mm +++ b/platform/macos/display_server_macos.mm @@ -30,6 +30,7 @@ #include "display_server_macos.h" +#include "godot_button_view.h" #include "godot_content_view.h" #include "godot_menu_delegate.h" #include "godot_menu_item.h" @@ -166,6 +167,7 @@ DisplayServerMacOS::WindowID DisplayServerMacOS::_create_window(WindowMode p_mod ERR_FAIL_COND_V_MSG(err != OK, INVALID_WINDOW_ID, "Can't create an OpenGL context"); } #endif + [wd.window_view updateLayerDelegate]; id = window_id_counter++; windows[id] = wd; } @@ -316,6 +318,15 @@ void DisplayServerMacOS::_displays_arrangement_changed(CGDirectDisplayID display } } +DisplayServer::WindowID DisplayServerMacOS::_get_focused_window_or_popup() const { + const List<WindowID>::Element *E = popup_list.back(); + if (E) { + return E->get(); + } + + return last_focused_window; +} + void DisplayServerMacOS::_dispatch_input_events(const Ref<InputEvent> &p_event) { ((DisplayServerMacOS *)(get_singleton()))->_dispatch_input_event(p_event); } @@ -1827,7 +1838,10 @@ void DisplayServerMacOS::mouse_set_mode(MouseMode p_mode) { return; } - WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; + WindowID window_id = _get_focused_window_or_popup(); + if (!windows.has(window_id)) { + window_id = MAIN_WINDOW_ID; + } WindowData &wd = windows[window_id]; if (p_mode == MOUSE_MODE_CAPTURED) { // Apple Docs state that the display parameter is not used. @@ -1942,7 +1956,10 @@ void DisplayServerMacOS::warp_mouse(const Point2i &p_position) { _THREAD_SAFE_METHOD_ if (mouse_mode != MOUSE_MODE_CAPTURED) { - WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; + WindowID window_id = _get_focused_window_or_popup(); + if (!windows.has(window_id)) { + window_id = MAIN_WINDOW_ID; + } WindowData &wd = windows[window_id]; // Local point in window coords. @@ -2623,6 +2640,14 @@ bool DisplayServerMacOS::window_minimize_on_title_dbl_click() const { return false; } +void DisplayServerMacOS::window_set_window_buttons_offset(const Vector2i &p_offset, WindowID p_window) { + _THREAD_SAFE_METHOD_ + + ERR_FAIL_COND(!windows.has(p_window)); + WindowData &wd = windows[p_window]; + wd.wb_offset = p_offset; +} + Vector2i DisplayServerMacOS::window_get_safe_title_margins(WindowID p_window) const { _THREAD_SAFE_METHOD_ @@ -2646,6 +2671,30 @@ Vector2i DisplayServerMacOS::window_get_safe_title_margins(WindowID p_window) co return Vector2i(max_x * screen_get_max_scale(), 0); } +void DisplayServerMacOS::window_set_custom_window_buttons(WindowData &p_wd, bool p_enabled) { + if (p_wd.window_button_view) { + [p_wd.window_button_view removeFromSuperview]; + p_wd.window_button_view = nil; + } + if (p_enabled) { + float window_buttons_spacing = NSMinX([[p_wd.window_object standardWindowButton:NSWindowMiniaturizeButton] frame]) - NSMinX([[p_wd.window_object standardWindowButton:NSWindowCloseButton] frame]); + + [p_wd.window_object setTitleVisibility:NSWindowTitleHidden]; + [[p_wd.window_object standardWindowButton:NSWindowZoomButton] setHidden:YES]; + [[p_wd.window_object standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES]; + [[p_wd.window_object standardWindowButton:NSWindowCloseButton] setHidden:YES]; + + p_wd.window_button_view = [[GodotButtonView alloc] initWithFrame:NSZeroRect]; + [p_wd.window_button_view initButtons:window_buttons_spacing offset:NSMakePoint(p_wd.wb_offset.x, p_wd.wb_offset.y)]; + [p_wd.window_view addSubview:p_wd.window_button_view]; + } else { + [p_wd.window_object setTitleVisibility:NSWindowTitleVisible]; + [[p_wd.window_object standardWindowButton:NSWindowZoomButton] setHidden:NO]; + [[p_wd.window_object standardWindowButton:NSWindowMiniaturizeButton] setHidden:NO]; + [[p_wd.window_object standardWindowButton:NSWindowCloseButton] setHidden:NO]; + } +} + void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window) { _THREAD_SAFE_METHOD_ @@ -2668,12 +2717,18 @@ void DisplayServerMacOS::window_set_flag(WindowFlags p_flag, bool p_enabled, Win NSRect rect = [wd.window_object frame]; if (p_enabled) { [wd.window_object setTitlebarAppearsTransparent:YES]; - [wd.window_object setTitleVisibility:NSWindowTitleHidden]; [wd.window_object setStyleMask:[wd.window_object styleMask] | NSWindowStyleMaskFullSizeContentView]; + + if (!wd.fullscreen) { + window_set_custom_window_buttons(wd, true); + } } else { [wd.window_object setTitlebarAppearsTransparent:NO]; - [wd.window_object setTitleVisibility:NSWindowTitleVisible]; [wd.window_object setStyleMask:[wd.window_object styleMask] & ~NSWindowStyleMaskFullSizeContentView]; + + if (!wd.fullscreen) { + window_set_custom_window_buttons(wd, false); + } } [wd.window_object setFrame:rect display:YES]; } break; @@ -3536,7 +3591,7 @@ DisplayServerMacOS::DisplayServerMacOS(const String &p_rendering_driver, WindowM [apple_menu addItem:[NSMenuItem separatorItem]]; - title = [NSString stringWithFormat:NSLocalizedString(@"\t\tQuit %@", nil), nsappname]; + title = [NSString stringWithFormat:NSLocalizedString(@"Quit %@", nil), nsappname]; [apple_menu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"]; // Add items to the menu bar. diff --git a/platform/macos/export/export.cpp b/platform/macos/export/export.cpp index f219616df4..5f9cf22ccf 100644 --- a/platform/macos/export/export.cpp +++ b/platform/macos/export/export.cpp @@ -33,12 +33,14 @@ #include "export_plugin.h" void register_macos_exporter() { +#ifndef ANDROID_ENABLED EDITOR_DEF("export/macos/rcodesign", ""); #ifdef WINDOWS_ENABLED EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/macos/rcodesign", PROPERTY_HINT_GLOBAL_FILE, "*.exe")); #else EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/macos/rcodesign", PROPERTY_HINT_GLOBAL_FILE)); #endif +#endif Ref<EditorExportPlatformMacOS> platform; platform.instantiate(); diff --git a/platform/macos/export/export_plugin.cpp b/platform/macos/export/export_plugin.cpp index 50104aced5..070830c486 100644 --- a/platform/macos/export/export_plugin.cpp +++ b/platform/macos/export/export_plugin.cpp @@ -1641,16 +1641,15 @@ void EditorExportPlatformMacOS::_zip_folder_recursive(zipFile &p_zip, const Stri continue; } if (da->is_link(f)) { - OS::Time time = OS::get_singleton()->get_time(); - OS::Date date = OS::get_singleton()->get_date(); + OS::DateTime dt = OS::get_singleton()->get_datetime(); zip_fileinfo zipfi; - zipfi.tmz_date.tm_hour = time.hour; - zipfi.tmz_date.tm_mday = date.day; - zipfi.tmz_date.tm_min = time.minute; - zipfi.tmz_date.tm_mon = date.month - 1; // Note: "tm" month range - 0..11, Godot month range - 1..12, https://www.cplusplus.com/reference/ctime/tm/ - zipfi.tmz_date.tm_sec = time.second; - zipfi.tmz_date.tm_year = date.year; + zipfi.tmz_date.tm_year = dt.year; + zipfi.tmz_date.tm_mon = dt.month - 1; // Note: "tm" month range - 0..11, Godot month range - 1..12, https://www.cplusplus.com/reference/ctime/tm/ + zipfi.tmz_date.tm_mday = dt.day; + zipfi.tmz_date.tm_hour = dt.hour; + zipfi.tmz_date.tm_min = dt.minute; + zipfi.tmz_date.tm_sec = dt.second; zipfi.dosDate = 0; // 0120000: symbolic link type // 0000755: permissions rwxr-xr-x @@ -1686,16 +1685,15 @@ void EditorExportPlatformMacOS::_zip_folder_recursive(zipFile &p_zip, const Stri } else { bool is_executable = (p_folder.ends_with("MacOS") && (f == p_pkg_name)) || p_folder.ends_with("Helpers") || f.ends_with(".command"); - OS::Time time = OS::get_singleton()->get_time(); - OS::Date date = OS::get_singleton()->get_date(); + OS::DateTime dt = OS::get_singleton()->get_datetime(); zip_fileinfo zipfi; - zipfi.tmz_date.tm_hour = time.hour; - zipfi.tmz_date.tm_mday = date.day; - zipfi.tmz_date.tm_min = time.minute; - zipfi.tmz_date.tm_mon = date.month - 1; // Note: "tm" month range - 0..11, Godot month range - 1..12, https://www.cplusplus.com/reference/ctime/tm/ - zipfi.tmz_date.tm_sec = time.second; - zipfi.tmz_date.tm_year = date.year; + zipfi.tmz_date.tm_year = dt.year; + zipfi.tmz_date.tm_mon = dt.month - 1; // Note: "tm" month range - 0..11, Godot month range - 1..12, https://www.cplusplus.com/reference/ctime/tm/ + zipfi.tmz_date.tm_mday = dt.day; + zipfi.tmz_date.tm_hour = dt.hour; + zipfi.tmz_date.tm_min = dt.minute; + zipfi.tmz_date.tm_sec = dt.second; zipfi.dosDate = 0; // 0100000: regular file type // 0000755: permissions rwxr-xr-x diff --git a/platform/macos/gl_manager_macos_legacy.mm b/platform/macos/gl_manager_macos_legacy.mm index e6bb7aaa85..dec4821b86 100644 --- a/platform/macos/gl_manager_macos_legacy.mm +++ b/platform/macos/gl_manager_macos_legacy.mm @@ -167,9 +167,8 @@ void GLManager_MacOS::make_current() { } void GLManager_MacOS::swap_buffers() { - for (const KeyValue<DisplayServer::WindowID, GLWindow> &E : windows) { - [E.value.context flushBuffer]; - } + GLWindow &win = windows[current_window]; + [win.context flushBuffer]; } void GLManager_MacOS::window_update(DisplayServer::WindowID p_window_id) { diff --git a/platform/macos/godot_button_view.h b/platform/macos/godot_button_view.h new file mode 100644 index 0000000000..e41910878d --- /dev/null +++ b/platform/macos/godot_button_view.h @@ -0,0 +1,51 @@ +/*************************************************************************/ +/* godot_button_view.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 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 GODOT_BUTTON_VIEW_H +#define GODOT_BUTTON_VIEW_H + +#include "servers/display_server.h" + +#import <AppKit/AppKit.h> +#import <Foundation/Foundation.h> + +@interface GodotButtonView : NSView { + NSTrackingArea *tracking_area; + NSPoint offset; + CGFloat spacing; + bool mouse_in_group; +} + +- (void)initButtons:(CGFloat)button_spacing offset:(NSPoint)button_offset; +- (void)displayButtons; + +@end + +#endif // GODOT_BUTTON_VIEW_H diff --git a/platform/macos/godot_button_view.mm b/platform/macos/godot_button_view.mm new file mode 100644 index 0000000000..ae04c02bd5 --- /dev/null +++ b/platform/macos/godot_button_view.mm @@ -0,0 +1,112 @@ +/*************************************************************************/ +/* godot_button_view.mm */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 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 "godot_button_view.h" + +@implementation GodotButtonView + +- (id)initWithFrame:(NSRect)frame { + self = [super initWithFrame:frame]; + + tracking_area = nil; + offset = NSMakePoint(8, 8); + spacing = 20; + mouse_in_group = false; + + return self; +} + +- (void)initButtons:(CGFloat)button_spacing offset:(NSPoint)button_offset { + spacing = button_spacing; + + NSButton *close_button = [NSWindow standardWindowButton:NSWindowCloseButton forStyleMask:NSWindowStyleMaskTitled]; + [close_button setFrameOrigin:NSMakePoint(0, 0)]; + [self addSubview:close_button]; + + NSButton *miniaturize_button = [NSWindow standardWindowButton:NSWindowMiniaturizeButton forStyleMask:NSWindowStyleMaskTitled]; + [miniaturize_button setFrameOrigin:NSMakePoint(spacing, 0)]; + [self addSubview:miniaturize_button]; + + NSButton *zoom_button = [NSWindow standardWindowButton:NSWindowZoomButton forStyleMask:NSWindowStyleMaskTitled]; + [zoom_button setFrameOrigin:NSMakePoint(spacing * 2, 0)]; + [self addSubview:zoom_button]; + + offset.y = button_offset.y - zoom_button.frame.size.height / 2; + offset.x = button_offset.x - zoom_button.frame.size.width / 2; + + [self setFrameSize:NSMakeSize(zoom_button.frame.origin.x + zoom_button.frame.size.width, zoom_button.frame.size.height)]; + [self displayButtons]; +} + +- (void)viewDidMoveToWindow { + if (!self.window) { + return; + } + + [self setAutoresizingMask:NSViewMaxXMargin | NSViewMinYMargin]; + [self setFrameOrigin:NSMakePoint(offset.x, self.window.frame.size.height - self.frame.size.height - offset.y)]; +} + +- (BOOL)_mouseInGroup:(NSButton *)button { + return mouse_in_group; +} + +- (void)updateTrackingAreas { + if (tracking_area != nil) { + [self removeTrackingArea:tracking_area]; + } + + NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | NSTrackingInVisibleRect; + tracking_area = [[NSTrackingArea alloc] initWithRect:NSZeroRect options:options owner:self userInfo:nil]; + + [self addTrackingArea:tracking_area]; +} + +- (void)mouseEntered:(NSEvent *)event { + [super mouseEntered:event]; + + mouse_in_group = true; + [self displayButtons]; +} + +- (void)mouseExited:(NSEvent *)event { + [super mouseExited:event]; + + mouse_in_group = false; + [self displayButtons]; +} + +- (void)displayButtons { + for (NSView *subview in self.subviews) { + [subview setNeedsDisplay:YES]; + } +} + +@end diff --git a/platform/macos/godot_content_view.h b/platform/macos/godot_content_view.h index 353305aec1..a6318ab903 100644 --- a/platform/macos/godot_content_view.h +++ b/platform/macos/godot_content_view.h @@ -45,6 +45,14 @@ #import <QuartzCore/CAMetalLayer.h> +@interface GodotContentLayerDelegate : NSObject <CALayerDelegate> { + DisplayServer::WindowID window_id; +} + +- (void)setWindowID:(DisplayServer::WindowID)wid; + +@end + @interface GodotContentView : RootView <NSTextInputClient> { DisplayServer::WindowID window_id; NSTrackingArea *tracking_area; @@ -53,12 +61,14 @@ bool mouse_down_control; bool ignore_momentum_scroll; bool last_pen_inverted; + id layer_delegate; } - (void)processScrollEvent:(NSEvent *)event button:(MouseButton)button factor:(double)factor; - (void)processPanEvent:(NSEvent *)event dx:(double)dx dy:(double)dy; - (void)processMouseEvent:(NSEvent *)event index:(MouseButton)index mask:(MouseButton)mask pressed:(bool)pressed; - (void)setWindowID:(DisplayServer::WindowID)wid; +- (void)updateLayerDelegate; - (void)cancelComposition; @end diff --git a/platform/macos/godot_content_view.mm b/platform/macos/godot_content_view.mm index dbed969901..cb70a5db86 100644 --- a/platform/macos/godot_content_view.mm +++ b/platform/macos/godot_content_view.mm @@ -32,11 +32,66 @@ #include "display_server_macos.h" #include "key_mapping_macos.h" +#include "main/main.h" + +@implementation GodotContentLayerDelegate + +- (id)init { + self = [super init]; + window_id = DisplayServer::INVALID_WINDOW_ID; + return self; +} + +- (void)setWindowID:(DisplayServerMacOS::WindowID)wid { + window_id = wid; +} + +- (void)displayLayer:(CALayer *)layer { + DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton(); + if (OS::get_singleton()->get_main_loop() && ds->get_is_resizing()) { + Main::force_redraw(); + if (!Main::is_iterating()) { // Avoid cyclic loop. + Main::iteration(); + } + } +} + +@end @implementation GodotContentView +- (void)setFrameSize:(NSSize)newSize { + DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton(); + if (ds && ds->has_window(window_id)) { + DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); + NSRect frameRect = [wd.window_object frame]; + bool left = (wd.last_frame_rect.origin.x != frameRect.origin.x); + bool top = (wd.last_frame_rect.origin.y == frameRect.origin.y); + if (left && top) { + self.layerContentsPlacement = NSViewLayerContentsPlacementBottomRight; + } else if (left && !top) { + self.layerContentsPlacement = NSViewLayerContentsPlacementTopRight; + } else if (!left && top) { + self.layerContentsPlacement = NSViewLayerContentsPlacementBottomLeft; + } else { + self.layerContentsPlacement = NSViewLayerContentsPlacementTopLeft; + } + wd.last_frame_rect = frameRect; + } + + [super setFrameSize:newSize]; + [self.layer setNeedsDisplay]; // Force "drawRect" call. +} + +- (void)updateLayerDelegate { + self.layer.delegate = layer_delegate; + self.layer.autoresizingMask = kCALayerHeightSizable | kCALayerWidthSizable; + self.layer.needsDisplayOnBoundsChange = YES; +} + - (id)init { self = [super init]; + layer_delegate = [[GodotContentLayerDelegate alloc] init]; window_id = DisplayServer::INVALID_WINDOW_ID; tracking_area = nil; ime_input_event_in_progress = false; @@ -45,6 +100,9 @@ last_pen_inverted = false; [self updateTrackingAreas]; + self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawDuringViewResize; + self.layerContentsPlacement = NSViewLayerContentsPlacementTopLeft; + if (@available(macOS 10.13, *)) { [self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeFileURL]]; #if !defined(__aarch64__) // Do not build deprectead 10.13 code on ARM. @@ -58,6 +116,7 @@ - (void)setWindowID:(DisplayServerMacOS::WindowID)wid { window_id = wid; + [layer_delegate setWindowID:window_id]; } // MARK: Backing Layer diff --git a/platform/macos/godot_window_delegate.mm b/platform/macos/godot_window_delegate.mm index 2d9329ab3c..94d40924b2 100644 --- a/platform/macos/godot_window_delegate.mm +++ b/platform/macos/godot_window_delegate.mm @@ -31,6 +31,7 @@ #include "godot_window_delegate.h" #include "display_server_macos.h" +#include "godot_button_view.h" @implementation GodotWindowDelegate @@ -76,10 +77,16 @@ DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); wd.fullscreen = true; + // Reset window size limits. [wd.window_object setContentMinSize:NSMakeSize(0, 0)]; [wd.window_object setContentMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)]; + // Reset custom window buttons. + if ([wd.window_object styleMask] & NSWindowStyleMaskFullSizeContentView) { + ds->window_set_custom_window_buttons(wd, false); + } + // Force window resize event. [self windowDidResize:notification]; } @@ -104,6 +111,11 @@ [wd.window_object setContentMaxSize:NSMakeSize(size.x, size.y)]; } + // Restore custom window buttons. + if ([wd.window_object styleMask] & NSWindowStyleMaskFullSizeContentView) { + ds->window_set_custom_window_buttons(wd, true); + } + // Restore resizability state. if (wd.resize_disabled) { [wd.window_object setStyleMask:[wd.window_object styleMask] & ~NSWindowStyleMaskResizable]; @@ -151,7 +163,9 @@ - (void)windowWillStartLiveResize:(NSNotification *)notification { DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton(); - if (ds) { + if (ds && ds->has_window(window_id)) { + DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); + wd.last_frame_rect = [wd.window_object frame]; ds->set_is_resizing(true); } } @@ -217,6 +231,10 @@ DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); + if (wd.window_button_view) { + [(GodotButtonView *)wd.window_button_view displayButtons]; + } + if (ds->mouse_get_mode() == DisplayServer::MOUSE_MODE_CAPTURED) { const NSRect content_rect = [wd.window_view frame]; NSRect point_in_window_rect = NSMakeRect(content_rect.size.width / 2, content_rect.size.height / 2, 0, 0); @@ -239,6 +257,10 @@ DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); + if (wd.window_button_view) { + [(GodotButtonView *)wd.window_button_view displayButtons]; + } + ds->release_pressed_events(); ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_OUT); } diff --git a/platform/macos/os_macos.h b/platform/macos/os_macos.h index 61db99689c..46e7c17ebe 100644 --- a/platform/macos/os_macos.h +++ b/platform/macos/os_macos.h @@ -75,6 +75,8 @@ public: virtual List<String> get_cmdline_platform_args() const override; virtual String get_name() const override; + virtual String get_distribution_name() const override; + virtual String get_version() const override; virtual void alert(const String &p_alert, const String &p_title = "ALERT!") override; diff --git a/platform/macos/os_macos.mm b/platform/macos/os_macos.mm index 35c4e4b03d..ae8534f6ab 100644 --- a/platform/macos/os_macos.mm +++ b/platform/macos/os_macos.mm @@ -56,10 +56,11 @@ _FORCE_INLINE_ String OS_MacOS::get_framework_executable(const String &p_path) { } void OS_MacOS::pre_wait_observer_cb(CFRunLoopObserverRef p_observer, CFRunLoopActivity p_activiy, void *p_context) { - // Prevent main loop from sleeping and redraw window during resize / modal popups. + // Prevent main loop from sleeping and redraw window during modal popup display. + // Do not redraw when rendering is done from the separate thread, it will conflict with the OpenGL context updates. DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton(); - if (get_singleton()->get_main_loop() && ds && (get_singleton()->get_render_thread_mode() != RENDER_SEPARATE_THREAD || !ds->get_is_resizing())) { + if (get_singleton()->get_main_loop() && ds && (get_singleton()->get_render_thread_mode() != RENDER_SEPARATE_THREAD) && !ds->get_is_resizing()) { Main::force_redraw(); if (!Main::is_iterating()) { // Avoid cyclic loop. Main::iteration(); @@ -133,6 +134,15 @@ String OS_MacOS::get_name() const { return "macOS"; } +String OS_MacOS::get_distribution_name() const { + return get_name(); +} + +String OS_MacOS::get_version() const { + NSOperatingSystemVersion ver = [NSProcessInfo processInfo].operatingSystemVersion; + return vformat("%d.%d.%d", (int64_t)ver.majorVersion, (int64_t)ver.minorVersion, (int64_t)ver.patchVersion); +} + void OS_MacOS::alert(const String &p_alert, const String &p_title) { NSAlert *window = [[NSAlert alloc] init]; NSString *ns_title = [NSString stringWithUTF8String:p_title.utf8().get_data()]; diff --git a/platform/uwp/os_uwp.cpp b/platform/uwp/os_uwp.cpp index 494f5ec4b9..8050d299f0 100644 --- a/platform/uwp/os_uwp.cpp +++ b/platform/uwp/os_uwp.cpp @@ -444,24 +444,17 @@ String OS_UWP::get_name() const { return "UWP"; } -OS::Date OS_UWP::get_date(bool p_utc) const { - SYSTEMTIME systemtime; - if (p_utc) { - GetSystemTime(&systemtime); - } else { - GetLocalTime(&systemtime); - } +String OS_UWP::get_distribution_name() const { + return get_name(); +} - Date date; - date.day = systemtime.wDay; - date.month = Month(systemtime.wMonth); - date.weekday = Weekday(systemtime.wDayOfWeek); - date.year = systemtime.wYear; - date.dst = false; - return date; +String OS_UWP::get_version() const { + winrt::hstring df_version = VersionInfo().DeviceFamilyVersion(); + static String version = String(winrt::to_string(df_version).c_str()); + return version; } -OS::Time OS_UWP::get_time(bool p_utc) const { +OS::DateTime OS_UWP::get_datetime(bool p_utc) const { SYSTEMTIME systemtime; if (p_utc) { GetSystemTime(&systemtime); @@ -469,11 +462,23 @@ OS::Time OS_UWP::get_time(bool p_utc) const { GetLocalTime(&systemtime); } - Time time; - time.hour = systemtime.wHour; - time.min = systemtime.wMinute; - time.sec = systemtime.wSecond; - return time; + //Get DST information from Windows, but only if p_utc is false. + TIME_ZONE_INFORMATION info; + bool daylight = false; + if (!p_utc && GetTimeZoneInformation(&info) == TIME_ZONE_ID_DAYLIGHT) { + daylight = true; + } + + DateTime dt; + dt.year = systemtime.wYear; + dt.month = Month(systemtime.wMonth); + dt.day = systemtime.wDay; + dt.weekday = Weekday(systemtime.wDayOfWeek); + dt.hour = systemtime.wHour; + dt.minute = systemtime.wMinute; + dt.second = systemtime.wSecond; + dt.dst = daylight; + return dt; } OS::TimeZoneInfo OS_UWP::get_time_zone_info() const { diff --git a/platform/uwp/os_uwp.h b/platform/uwp/os_uwp.h index 5a58486ee7..0c1c4a793a 100644 --- a/platform/uwp/os_uwp.h +++ b/platform/uwp/os_uwp.h @@ -183,9 +183,10 @@ public: virtual MainLoop *get_main_loop() const; virtual String get_name() const; + virtual String get_distribution_name() const; + virtual String get_version() const; - virtual Date get_date(bool p_utc) const; - virtual Time get_time(bool p_utc) const; + virtual DateTime get_datetime(bool p_utc) const; virtual TimeZoneInfo get_time_zone_info() const; virtual uint64_t get_unix_time() const; diff --git a/platform/web/.eslintrc.engine.js b/platform/web/.eslintrc.engine.js index 78df6d41d9..a76bd46b9e 100644 --- a/platform/web/.eslintrc.engine.js +++ b/platform/web/.eslintrc.engine.js @@ -5,6 +5,7 @@ module.exports = { "globals": { "InternalConfig": true, "Godot": true, + "Features": true, "Preloader": true, }, }; diff --git a/platform/web/SCsub b/platform/web/SCsub index e8d0181ede..013b734be2 100644 --- a/platform/web/SCsub +++ b/platform/web/SCsub @@ -66,6 +66,7 @@ sys_env.Depends(build[0], sys_env["JS_PRE"]) sys_env.Depends(build[0], sys_env["JS_EXTERNS"]) engine = [ + "js/engine/features.js", "js/engine/preloader.js", "js/engine/config.js", "js/engine/engine.js", diff --git a/platform/web/detect.py b/platform/web/detect.py index b1c1dd48a9..9cce73efc4 100644 --- a/platform/web/detect.py +++ b/platform/web/detect.py @@ -31,7 +31,6 @@ def get_opts(): return [ ("initial_memory", "Initial WASM memory (in MiB)", 32), BoolVariable("use_assertions", "Use Emscripten runtime assertions", False), - BoolVariable("use_thinlto", "Use ThinLTO", False), BoolVariable("use_ubsan", "Use Emscripten undefined behavior sanitizer (UBSAN)", False), BoolVariable("use_asan", "Use Emscripten address sanitizer (ASAN)", False), BoolVariable("use_lsan", "Use Emscripten leak sanitizer (LSAN)", False), @@ -110,12 +109,17 @@ def configure(env): env["ENV"] = os.environ # LTO - if env["use_thinlto"]: - env.Append(CCFLAGS=["-flto=thin"]) - env.Append(LINKFLAGS=["-flto=thin"]) - elif env["use_lto"]: - env.Append(CCFLAGS=["-flto=full"]) - env.Append(LINKFLAGS=["-flto=full"]) + + if env["lto"] == "auto": # Full LTO for production. + env["lto"] = "full" + + if env["lto"] != "none": + if env["lto"] == "thin": + env.Append(CCFLAGS=["-flto=thin"]) + env.Append(LINKFLAGS=["-flto=thin"]) + else: + env.Append(CCFLAGS=["-flto"]) + env.Append(LINKFLAGS=["-flto"]) # Sanitizers if env["use_ubsan"]: @@ -227,3 +231,7 @@ def configure(env): # Add code that allow exiting runtime. env.Append(LINKFLAGS=["-s", "EXIT_RUNTIME=1"]) + + # This workaround creates a closure that prevents the garbage collector from freeing the WebGL context. + # We also only use WebGL2, and changing context version is not widely supported anyway. + env.Append(LINKFLAGS=["-s", "GL_WORKAROUND_SAFARI_GETCONTEXT_BUG=0"]) diff --git a/platform/web/display_server_web.cpp b/platform/web/display_server_web.cpp index b36f9d14a4..f6a61b18e4 100644 --- a/platform/web/display_server_web.cpp +++ b/platform/web/display_server_web.cpp @@ -764,10 +764,10 @@ DisplayServerWeb::DisplayServerWeb(const String &p_rendering_driver, WindowMode if (wants_webgl2 && !webgl2_init_failed) { EmscriptenWebGLContextAttributes attributes; emscripten_webgl_init_context_attributes(&attributes); - //attributes.alpha = GLOBAL_GET("display/window/per_pixel_transparency/allowed"); - attributes.alpha = true; + attributes.alpha = OS::get_singleton()->is_layered_allowed(); attributes.antialias = false; attributes.majorVersion = 2; + attributes.explicitSwapControl = true; webgl_ctx = emscripten_webgl_create_context(canvas_id, &attributes); if (emscripten_webgl_make_context_current(webgl_ctx) != EMSCRIPTEN_RESULT_SUCCESS) { @@ -997,7 +997,7 @@ void DisplayServerWeb::window_set_mode(WindowMode p_mode, WindowID p_window) { } break; case WINDOW_MODE_MAXIMIZED: case WINDOW_MODE_MINIMIZED: - WARN_PRINT("WindowMode MAXIMIZED and MINIMIZED are not supported in Web platform."); + // WindowMode MAXIMIZED and MINIMIZED are not supported in Web platform. break; default: break; diff --git a/platform/web/export/editor_http_server.h b/platform/web/export/editor_http_server.h index d0e23b1a77..fa0010ec8d 100644 --- a/platform/web/export/editor_http_server.h +++ b/platform/web/export/editor_http_server.h @@ -42,18 +42,18 @@ private: Ref<TCPServer> server; HashMap<String, String> mimes; Ref<StreamPeerTCP> tcp; - Ref<StreamPeerTLS> ssl; + Ref<StreamPeerTLS> tls; Ref<StreamPeer> peer; Ref<CryptoKey> key; Ref<X509Certificate> cert; - bool use_ssl = false; + bool use_tls = false; uint64_t time = 0; uint8_t req_buf[4096]; int req_pos = 0; void _clear_client() { peer = Ref<StreamPeer>(); - ssl = Ref<StreamPeerTLS>(); + tls = Ref<StreamPeerTLS>(); tcp = Ref<StreamPeerTCP>(); memset(req_buf, 0, sizeof(req_buf)); time = 0; @@ -98,19 +98,19 @@ public: _clear_client(); } - Error listen(int p_port, IPAddress p_address, bool p_use_ssl, String p_ssl_key, String p_ssl_cert) { - use_ssl = p_use_ssl; - if (use_ssl) { + Error listen(int p_port, IPAddress p_address, bool p_use_tls, String p_tls_key, String p_tls_cert) { + use_tls = p_use_tls; + if (use_tls) { Ref<Crypto> crypto = Crypto::create(); if (crypto.is_null()) { return ERR_UNAVAILABLE; } - if (!p_ssl_key.is_empty() && !p_ssl_cert.is_empty()) { + if (!p_tls_key.is_empty() && !p_tls_cert.is_empty()) { key = Ref<CryptoKey>(CryptoKey::create()); - Error err = key->load(p_ssl_key); + Error err = key->load(p_tls_key); ERR_FAIL_COND_V(err != OK, err); cert = Ref<X509Certificate>(X509Certificate::create()); - err = cert->load(p_ssl_cert); + err = cert->load(p_tls_cert); ERR_FAIL_COND_V(err != OK, err); } else { _set_internal_certs(crypto); @@ -201,22 +201,22 @@ public: return; } - if (use_ssl) { - if (ssl.is_null()) { - ssl = Ref<StreamPeerTLS>(StreamPeerTLS::create()); - peer = ssl; - ssl->set_blocking_handshake_enabled(false); - if (ssl->accept_stream(tcp, key, cert) != OK) { + if (use_tls) { + if (tls.is_null()) { + tls = Ref<StreamPeerTLS>(StreamPeerTLS::create()); + peer = tls; + tls->set_blocking_handshake_enabled(false); + if (tls->accept_stream(tcp, key, cert) != OK) { _clear_client(); return; } } - ssl->poll(); - if (ssl->get_status() == StreamPeerTLS::STATUS_HANDSHAKING) { + tls->poll(); + if (tls->get_status() == StreamPeerTLS::STATUS_HANDSHAKING) { // Still handshaking, keep waiting. return; } - if (ssl->get_status() != StreamPeerTLS::STATUS_CONNECTED) { + if (tls->get_status() != StreamPeerTLS::STATUS_CONNECTED) { _clear_client(); return; } diff --git a/platform/web/export/export.cpp b/platform/web/export/export.cpp index 3d40f2c10d..4b4e8b2705 100644 --- a/platform/web/export/export.cpp +++ b/platform/web/export/export.cpp @@ -34,14 +34,16 @@ #include "export_plugin.h" void register_web_exporter() { +#ifndef ANDROID_ENABLED EDITOR_DEF("export/web/http_host", "localhost"); EDITOR_DEF("export/web/http_port", 8060); - EDITOR_DEF("export/web/use_ssl", false); - EDITOR_DEF("export/web/ssl_key", ""); - EDITOR_DEF("export/web/ssl_certificate", ""); + EDITOR_DEF("export/web/use_tls", false); + EDITOR_DEF("export/web/tls_key", ""); + EDITOR_DEF("export/web/tls_certificate", ""); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "export/web/http_port", PROPERTY_HINT_RANGE, "1,65535,1")); - EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/web/ssl_key", PROPERTY_HINT_GLOBAL_FILE, "*.key")); - EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/web/ssl_certificate", PROPERTY_HINT_GLOBAL_FILE, "*.crt,*.pem")); + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/web/tls_key", PROPERTY_HINT_GLOBAL_FILE, "*.key")); + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/web/tls_certificate", PROPERTY_HINT_GLOBAL_FILE, "*.crt,*.pem")); +#endif Ref<EditorExportPlatformWeb> platform; platform.instantiate(); diff --git a/platform/web/export/export_plugin.cpp b/platform/web/export/export_plugin.cpp index a2425c1500..1c327fe4b2 100644 --- a/platform/web/export/export_plugin.cpp +++ b/platform/web/export/export_plugin.cpp @@ -307,13 +307,7 @@ void EditorExportPlatformWeb::get_preset_features(const Ref<EditorExportPreset> } if (p_preset->get("vram_texture_compression/for_mobile")) { - String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); - if (driver == "opengl3") { - r_features->push_back("etc"); - } else if (driver == "vulkan") { - // FIXME: Review if this is correct. - r_features->push_back("etc2"); - } + r_features->push_back("etc2"); } r_features->push_back("wasm32"); } @@ -615,23 +609,23 @@ Error EditorExportPlatformWeb::run(const Ref<EditorExportPreset> &p_preset, int } ERR_FAIL_COND_V_MSG(!bind_ip.is_valid(), ERR_INVALID_PARAMETER, "Invalid editor setting 'export/web/http_host': '" + bind_host + "'. Try using '127.0.0.1'."); - const bool use_ssl = EDITOR_GET("export/web/use_ssl"); - const String ssl_key = EDITOR_GET("export/web/ssl_key"); - const String ssl_cert = EDITOR_GET("export/web/ssl_certificate"); + const bool use_tls = EDITOR_GET("export/web/use_tls"); + const String tls_key = EDITOR_GET("export/web/tls_key"); + const String tls_cert = EDITOR_GET("export/web/tls_certificate"); // Restart server. { MutexLock lock(server_lock); server->stop(); - err = server->listen(bind_port, bind_ip, use_ssl, ssl_key, ssl_cert); + err = server->listen(bind_port, bind_ip, use_tls, tls_key, tls_cert); } if (err != OK) { add_message(EXPORT_MESSAGE_ERROR, TTR("Run"), vformat(TTR("Error starting HTTP server: %d."), err)); return err; } - OS::get_singleton()->shell_open(String((use_ssl ? "https://" : "http://") + bind_host + ":" + itos(bind_port) + "/tmp_js_export.html")); + OS::get_singleton()->shell_open(String((use_tls ? "https://" : "http://") + bind_host + ":" + itos(bind_port) + "/tmp_js_export.html")); // FIXME: Find out how to clean up export files after running the successfully // exported game. Might not be trivial. return OK; diff --git a/platform/web/http_client_web.cpp b/platform/web/http_client_web.cpp index bfdea95f4a..d045275826 100644 --- a/platform/web/http_client_web.cpp +++ b/platform/web/http_client_web.cpp @@ -37,14 +37,14 @@ void HTTPClientWeb::_parse_headers(int p_len, const char **p_headers, void *p_re } } -Error HTTPClientWeb::connect_to_host(const String &p_host, int p_port, bool p_ssl, bool p_verify_host) { +Error HTTPClientWeb::connect_to_host(const String &p_host, int p_port, bool p_tls, bool p_verify_host) { close(); - if (p_ssl && !p_verify_host) { + if (p_tls && !p_verify_host) { WARN_PRINT("Disabling HTTPClientWeb's host verification is not supported for the Web platform, host will be verified"); } port = p_port; - use_tls = p_ssl; + use_tls = p_tls; host = p_host; diff --git a/platform/web/http_client_web.h b/platform/web/http_client_web.h index ff776d72af..5059b4693e 100644 --- a/platform/web/http_client_web.h +++ b/platform/web/http_client_web.h @@ -86,7 +86,7 @@ public: Error request(Method p_method, const String &p_url, const Vector<String> &p_headers, const uint8_t *p_body, int p_body_size) override; - Error connect_to_host(const String &p_host, int p_port = -1, bool p_ssl = false, bool p_verify_host = true) override; + Error connect_to_host(const String &p_host, int p_port = -1, bool p_tls = false, bool p_verify_host = true) override; void set_connection(const Ref<StreamPeer> &p_connection) override; Ref<StreamPeer> get_connection() const override; void close() override; diff --git a/platform/web/js/engine/config.js b/platform/web/js/engine/config.js index 9c4b6c2012..41be7b2512 100644 --- a/platform/web/js/engine/config.js +++ b/platform/web/js/engine/config.js @@ -317,7 +317,8 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused- if (!(this.canvas instanceof HTMLCanvasElement)) { const nodes = document.getElementsByTagName('canvas'); if (nodes.length && nodes[0] instanceof HTMLCanvasElement) { - this.canvas = nodes[0]; + const first = nodes[0]; + this.canvas = /** @type {!HTMLCanvasElement} */ (first); } if (!this.canvas) { throw new Error('No canvas found in page'); diff --git a/platform/web/js/engine/engine.js b/platform/web/js/engine/engine.js index 6f0d51b2be..9227aa1f05 100644 --- a/platform/web/js/engine/engine.js +++ b/platform/web/js/engine/engine.js @@ -61,20 +61,6 @@ const Engine = (function () { }; /** - * Check whether WebGL is available. Optionally, specify a particular version of WebGL to check for. - * - * @param {number=} [majorVersion=1] The major WebGL version to check for. - * @returns {boolean} If the given major version of WebGL is available. - * @function Engine.isWebGLAvailable - */ - Engine.isWebGLAvailable = function (majorVersion = 1) { - try { - return !!document.createElement('canvas').getContext(['webgl', 'webgl2'][majorVersion - 1]); - } catch (e) { /* Not available */ } - return false; - }; - - /** * Safe Engine constructor, creates a new prototype for every new instance to avoid prototype pollution. * @ignore * @constructor @@ -265,14 +251,21 @@ const Engine = (function () { // Also expose static methods as instance methods Engine.prototype['load'] = Engine.load; Engine.prototype['unload'] = Engine.unload; - Engine.prototype['isWebGLAvailable'] = Engine.isWebGLAvailable; return new Engine(initConfig); } // Closure compiler exported static methods. SafeEngine['load'] = Engine.load; SafeEngine['unload'] = Engine.unload; - SafeEngine['isWebGLAvailable'] = Engine.isWebGLAvailable; + + // Feature-detection utilities. + SafeEngine['isWebGLAvailable'] = Features.isWebGLAvailable; + SafeEngine['isFetchAvailable'] = Features.isFetchAvailable; + SafeEngine['isSecureContext'] = Features.isSecureContext; + SafeEngine['isCrossOriginIsolated'] = Features.isCrossOriginIsolated; + SafeEngine['isSharedArrayBufferAvailable'] = Features.isSharedArrayBufferAvailable; + SafeEngine['isAudioWorkletAvailable'] = Features.isAudioWorkletAvailable; + SafeEngine['getMissingFeatures'] = Features.getMissingFeatures; return SafeEngine; }()); diff --git a/platform/web/js/engine/features.js b/platform/web/js/engine/features.js new file mode 100644 index 0000000000..f91a4eff81 --- /dev/null +++ b/platform/web/js/engine/features.js @@ -0,0 +1,96 @@ +const Features = { // eslint-disable-line no-unused-vars + /** + * Check whether WebGL is available. Optionally, specify a particular version of WebGL to check for. + * + * @param {number=} [majorVersion=1] The major WebGL version to check for. + * @returns {boolean} If the given major version of WebGL is available. + * @function Engine.isWebGLAvailable + */ + isWebGLAvailable: function (majorVersion = 1) { + try { + return !!document.createElement('canvas').getContext(['webgl', 'webgl2'][majorVersion - 1]); + } catch (e) { /* Not available */ } + return false; + }, + + /** + * Check whether the Fetch API available and supports streaming responses. + * + * @returns {boolean} If the Fetch API is available and supports streaming responses. + * @function Engine.isFetchAvailable + */ + isFetchAvailable: function () { + return 'fetch' in window && 'Response' in window && 'body' in window.Response.prototype; + }, + + /** + * Check whether the engine is running in a Secure Context. + * + * @returns {boolean} If the engine is running in a Secure Context. + * @function Engine.isSecureContext + */ + isSecureContext: function () { + return window['isSecureContext'] === true; + }, + + /** + * Check whether the engine is cross origin isolated. + * This value is dependent on Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy headers sent by the server. + * + * @returns {boolean} If the engine is running in a Secure Context. + * @function Engine.isSecureContext + */ + isCrossOriginIsolated: function () { + return window['crossOriginIsolated'] === true; + }, + + /** + * Check whether SharedBufferArray is available. + * + * Most browsers require the page to be running in a secure context, and the + * the server to provide specific CORS headers for SharedArrayBuffer to be available. + * + * @returns {boolean} If SharedArrayBuffer is available. + * @function Engine.isSharedArrayBufferAvailable + */ + isSharedArrayBufferAvailable: function () { + return 'SharedArrayBuffer' in window; + }, + + /** + * Check whether the AudioContext supports AudioWorkletNodes. + * + * @returns {boolean} If AudioWorkletNode is available. + * @function Engine.isAudioWorkletAvailable + */ + isAudioWorkletAvailable: function () { + return 'AudioContext' in window && 'audioWorklet' in AudioContext.prototype; + }, + + /** + * Return an array of missing required features (as string). + * + * @returns {Array<string>} A list of human-readable missing features. + * @function Engine.getMissingFeatures + */ + getMissingFeatures: function () { + const missing = []; + if (!Features.isWebGLAvailable(2)) { + missing.push('WebGL2'); + } + if (!Features.isFetchAvailable()) { + missing.push('Fetch'); + } + if (!Features.isSecureContext()) { + missing.push('Secure Context'); + } + if (!Features.isCrossOriginIsolated()) { + missing.push('Cross Origin Isolation'); + } + if (!Features.isSharedArrayBufferAvailable()) { + missing.push('SharedArrayBuffer'); + } + // Audio is normally optional since we have a dummy fallback. + return missing; + }, +}; diff --git a/platform/web/js/libs/audio.worklet.js b/platform/web/js/libs/audio.worklet.js index ea4d8cb221..daf5c9ef12 100644 --- a/platform/web/js/libs/audio.worklet.js +++ b/platform/web/js/libs/audio.worklet.js @@ -133,6 +133,8 @@ class GodotProcessor extends AudioWorkletProcessor { this.running = false; this.output = null; this.input = null; + this.lock = null; + this.notifier = null; } else if (p_cmd === 'start_nothreads') { this.output = new RingBuffer(p_data[0], p_data[0].length, false); } else if (p_cmd === 'chunk') { diff --git a/platform/web/js/libs/library_godot_audio.js b/platform/web/js/libs/library_godot_audio.js index 756c1ac595..68e100cca0 100644 --- a/platform/web/js/libs/library_godot_audio.js +++ b/platform/web/js/libs/library_godot_audio.js @@ -339,16 +339,21 @@ const GodotAudioWorklet = { if (GodotAudioWorklet.promise === null) { return; } - GodotAudioWorklet.promise.then(function () { + const p = GodotAudioWorklet.promise; + p.then(function () { GodotAudioWorklet.worklet.port.postMessage({ 'cmd': 'stop', 'data': null, }); GodotAudioWorklet.worklet.disconnect(); + GodotAudioWorklet.worklet.port.onmessage = null; GodotAudioWorklet.worklet = null; GodotAudioWorklet.promise = null; resolve(); - }).catch(function (err) { /* aborted? */ }); + }).catch(function (err) { + // Aborted? + GodotRuntime.error(err); + }); }); }, }, diff --git a/platform/web/js/libs/library_godot_os.js b/platform/web/js/libs/library_godot_os.js index 377eec3234..ce64fb98c0 100644 --- a/platform/web/js/libs/library_godot_os.js +++ b/platform/web/js/libs/library_godot_os.js @@ -106,12 +106,14 @@ autoAddDeps(GodotConfig, '$GodotConfig'); mergeInto(LibraryManager.library, GodotConfig); const GodotFS = { - $GodotFS__deps: ['$ERRNO_CODES', '$FS', '$IDBFS', '$GodotRuntime'], + $GodotFS__deps: ['$FS', '$IDBFS', '$GodotRuntime'], $GodotFS__postset: [ 'Module["initFS"] = GodotFS.init;', 'Module["copyToFS"] = GodotFS.copy_to_fs;', ].join(''), $GodotFS: { + // ERRNO_CODES works every odd version of emscripten, but this will break too eventually. + ENOENT: 44, _idbfs: false, _syncing: false, _mount_points: [], @@ -138,8 +140,9 @@ const GodotFS = { try { FS.stat(dir); } catch (e) { - if (e.errno !== ERRNO_CODES.ENOENT) { - throw e; + if (e.errno !== GodotFS.ENOENT) { + // Let mkdirTree throw in case, we cannot trust the above check. + GodotRuntime.error(e); } FS.mkdirTree(dir); } @@ -208,8 +211,9 @@ const GodotFS = { try { FS.stat(dir); } catch (e) { - if (e.errno !== ERRNO_CODES.ENOENT) { - throw e; + if (e.errno !== GodotFS.ENOENT) { + // Let mkdirTree throw in case, we cannot trust the above check. + GodotRuntime.error(e); } FS.mkdirTree(dir); } diff --git a/platform/web/package.json b/platform/web/package.json index a57205415a..0a8d9e4334 100644 --- a/platform/web/package.json +++ b/platform/web/package.json @@ -4,7 +4,7 @@ "version": "1.0.0", "description": "Development and linting setup for Godot's Web platform code", "scripts": { - "docs": "jsdoc --template js/jsdoc2rst/ js/engine/engine.js js/engine/config.js --destination ''", + "docs": "jsdoc --template js/jsdoc2rst/ js/engine/engine.js js/engine/config.js js/engine/features.js --destination ''", "lint": "npm run lint:engine && npm run lint:libs && npm run lint:modules && npm run lint:tools", "lint:engine": "eslint \"js/engine/*.js\" --no-eslintrc -c .eslintrc.engine.js", "lint:libs": "eslint \"js/libs/*.js\" --no-eslintrc -c .eslintrc.libs.js", diff --git a/platform/web/web_main.cpp b/platform/web/web_main.cpp index 0f4411727a..287fe48c4d 100644 --- a/platform/web/web_main.cpp +++ b/platform/web/web_main.cpp @@ -55,6 +55,18 @@ void cleanup_after_sync() { emscripten_set_main_loop(exit_callback, -1, false); } +void early_cleanup() { + emscripten_cancel_main_loop(); // After this, we can exit! + int exit_code = OS_Web::get_singleton()->get_exit_code(); + memdelete(os); + os = nullptr; + emscripten_force_exit(exit_code); // No matter that we call cancel_main_loop, regular "exit" will not work, forcing. +} + +void early_cleanup_sync() { + emscripten_set_main_loop(early_cleanup, -1, false); +} + void main_loop_callback() { uint64_t current_ticks = os->get_ticks_usec(); @@ -87,7 +99,19 @@ extern EMSCRIPTEN_KEEPALIVE int godot_web_main(int argc, char *argv[]) { // We must override main when testing is enabled TEST_MAIN_OVERRIDE - Main::setup(argv[0], argc - 1, &argv[1]); + Error err = Main::setup(argv[0], argc - 1, &argv[1]); + + // Proper shutdown in case of setup failure. + if (err != OK) { + int exit_code = (int)err; + if (err == ERR_HELP) { + exit_code = 0; // Called with --help. + } + os->set_exit_code(exit_code); + // Will only exit after sync. + godot_js_os_finish_async(early_cleanup_sync); + return exit_code; + } // Ease up compatibility. ResourceLoader::set_abort_on_missing_resources(false); diff --git a/platform/windows/detect.py b/platform/windows/detect.py index 5607eab342..52a959b34a 100644 --- a/platform/windows/detect.py +++ b/platform/windows/detect.py @@ -191,7 +191,6 @@ def get_opts(): ), BoolVariable("use_mingw", "Use the Mingw compiler, even if MSVC is installed.", False), BoolVariable("use_llvm", "Use the LLVM compiler", False), - BoolVariable("use_thinlto", "Use ThinLTO", False), BoolVariable("use_static_cpp", "Link MinGW/MSVC C++ runtime libraries statically", True), BoolVariable("use_asan", "Use address sanitizer (ASAN)", False), ] @@ -449,7 +448,13 @@ def configure_msvc(env, vcvars_msvc_config): ## LTO - if env["use_lto"]: + if env["lto"] == "auto": # No LTO by default for MSVC, doesn't help. + env["lto"] = "none" + + if env["lto"] != "none": + if env["lto"] == "thin": + print("ThinLTO is only compatible with LLVM, use `use_llvm=yes` or `lto=full`.") + sys.exit(255) env.AppendUnique(CCFLAGS=["/GL"]) env.AppendUnique(ARFLAGS=["/LTCG"]) if env["progress"]: @@ -562,17 +567,24 @@ def configure_mingw(env): if try_cmd("gcc-ranlib --version", env["mingw_prefix"], env["arch"]): env["RANLIB"] = mingw_bin_prefix + "gcc-ranlib" - if env["use_lto"]: - if not env["use_llvm"] and env.GetOption("num_jobs") > 1: + ## LTO + + if env["lto"] == "auto": # Full LTO for production with MinGW. + env["lto"] = "full" + + if env["lto"] != "none": + if env["lto"] == "thin": + if not env["use_llvm"]: + print("ThinLTO is only compatible with LLVM, use `use_llvm=yes` or `lto=full`.") + sys.exit(255) + env.Append(CCFLAGS=["-flto=thin"]) + env.Append(LINKFLAGS=["-flto=thin"]) + elif not env["use_llvm"] and env.GetOption("num_jobs") > 1: env.Append(CCFLAGS=["-flto"]) env.Append(LINKFLAGS=["-flto=" + str(env.GetOption("num_jobs"))]) else: - if env["use_thinlto"]: - env.Append(CCFLAGS=["-flto=thin"]) - env.Append(LINKFLAGS=["-flto=thin"]) - else: - env.Append(CCFLAGS=["-flto"]) - env.Append(LINKFLAGS=["-flto"]) + env.Append(CCFLAGS=["-flto"]) + env.Append(LINKFLAGS=["-flto"]) env.Append(LINKFLAGS=["-Wl,--stack," + str(STACK_SIZE)]) diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index b4949de3f7..4553f31480 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -104,7 +104,10 @@ void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) { if (windows.has(MAIN_WINDOW_ID) && (p_mode == MOUSE_MODE_CAPTURED || p_mode == MOUSE_MODE_CONFINED || p_mode == MOUSE_MODE_CONFINED_HIDDEN)) { // Mouse is grabbed (captured or confined). - WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID; + WindowID window_id = _get_focused_window_or_popup(); + if (!windows.has(window_id)) { + window_id = MAIN_WINDOW_ID; + } WindowData &wd = windows[window_id]; @@ -119,11 +122,15 @@ void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) { ClientToScreen(wd.hWnd, &pos); SetCursorPos(pos.x, pos.y); SetCapture(wd.hWnd); + + _register_raw_input_devices(window_id); } } else { // Mouse is free to move around (not captured or confined). ReleaseCapture(); ClipCursor(nullptr); + + _register_raw_input_devices(INVALID_WINDOW_ID); } if (p_mode == MOUSE_MODE_HIDDEN || p_mode == MOUSE_MODE_CAPTURED || p_mode == MOUSE_MODE_CONFINED_HIDDEN) { @@ -139,6 +146,37 @@ void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) { } } +DisplayServer::WindowID DisplayServerWindows::_get_focused_window_or_popup() const { + const List<WindowID>::Element *E = popup_list.back(); + if (E) { + return E->get(); + } + + return last_focused_window; +} + +void DisplayServerWindows::_register_raw_input_devices(WindowID p_target_window) { + use_raw_input = true; + + RAWINPUTDEVICE rid[1] = {}; + rid[0].usUsagePage = 0x01; + rid[0].usUsage = 0x02; + rid[0].dwFlags = 0; + + if (p_target_window != INVALID_WINDOW_ID && windows.has(p_target_window)) { + // Follow the defined window + rid[0].hwndTarget = windows[p_target_window].hWnd; + } else { + // Follow the keyboard focus + rid[0].hwndTarget = 0; + } + + if (RegisterRawInputDevices(rid, 1, sizeof(rid[0])) == FALSE) { + // Registration failed. + use_raw_input = false; + } +} + bool DisplayServerWindows::tts_is_speaking() const { ERR_FAIL_COND_V(!tts, false); return tts->is_speaking(); @@ -194,7 +232,9 @@ DisplayServer::MouseMode DisplayServerWindows::mouse_get_mode() const { void DisplayServerWindows::warp_mouse(const Point2i &p_position) { _THREAD_SAFE_METHOD_ - if (!windows.has(last_focused_window)) { + WindowID window_id = _get_focused_window_or_popup(); + + if (!windows.has(window_id)) { return; // No focused window? } @@ -205,7 +245,7 @@ void DisplayServerWindows::warp_mouse(const Point2i &p_position) { POINT p; p.x = p_position.x; p.y = p_position.y; - ClientToScreen(windows[last_focused_window].hWnd, &p); + ClientToScreen(windows[window_id].hWnd, &p); SetCursorPos(p.x, p.y); } @@ -1496,7 +1536,7 @@ void DisplayServerWindows::cursor_set_shape(CursorShape p_shape) { IDC_HELP }; - if (cursors[p_shape] != nullptr) { + if (cursors_cache.has(p_shape)) { SetCursor(cursors[p_shape]); } else { SetCursor(LoadCursor(hInstance, win_cursors[p_shape])); @@ -1509,55 +1549,6 @@ DisplayServer::CursorShape DisplayServerWindows::cursor_get_shape() const { return cursor_shape; } -void DisplayServerWindows::GetMaskBitmaps(HBITMAP hSourceBitmap, COLORREF clrTransparent, OUT HBITMAP &hAndMaskBitmap, OUT HBITMAP &hXorMaskBitmap) { - // Get the system display DC. - HDC hDC = GetDC(nullptr); - - // Create helper DC. - HDC hMainDC = CreateCompatibleDC(hDC); - HDC hAndMaskDC = CreateCompatibleDC(hDC); - HDC hXorMaskDC = CreateCompatibleDC(hDC); - - // Get the dimensions of the source bitmap. - BITMAP bm; - GetObject(hSourceBitmap, sizeof(BITMAP), &bm); - - // Create the mask bitmaps. - hAndMaskBitmap = CreateCompatibleBitmap(hDC, bm.bmWidth, bm.bmHeight); // Color. - hXorMaskBitmap = CreateCompatibleBitmap(hDC, bm.bmWidth, bm.bmHeight); // Color. - - // Release the system display DC. - ReleaseDC(nullptr, hDC); - - // Select the bitmaps to helper DC. - HBITMAP hOldMainBitmap = (HBITMAP)SelectObject(hMainDC, hSourceBitmap); - HBITMAP hOldAndMaskBitmap = (HBITMAP)SelectObject(hAndMaskDC, hAndMaskBitmap); - HBITMAP hOldXorMaskBitmap = (HBITMAP)SelectObject(hXorMaskDC, hXorMaskBitmap); - - // Assign the monochrome AND mask bitmap pixels so that the pixels of the source bitmap - // with 'clrTransparent' will be white pixels of the monochrome bitmap. - SetBkColor(hMainDC, clrTransparent); - BitBlt(hAndMaskDC, 0, 0, bm.bmWidth, bm.bmHeight, hMainDC, 0, 0, SRCCOPY); - - // Assign the color XOR mask bitmap pixels so that the pixels of the source bitmap - // with 'clrTransparent' will be black and rest the pixels same as corresponding - // pixels of the source bitmap. - SetBkColor(hXorMaskDC, RGB(0, 0, 0)); - SetTextColor(hXorMaskDC, RGB(255, 255, 255)); - BitBlt(hXorMaskDC, 0, 0, bm.bmWidth, bm.bmHeight, hAndMaskDC, 0, 0, SRCCOPY); - BitBlt(hXorMaskDC, 0, 0, bm.bmWidth, bm.bmHeight, hMainDC, 0, 0, SRCAND); - - // Deselect bitmaps from the helper DC. - SelectObject(hMainDC, hOldMainBitmap); - SelectObject(hAndMaskDC, hOldAndMaskBitmap); - SelectObject(hXorMaskDC, hOldXorMaskBitmap); - - // Delete the helper DC. - DeleteDC(hXorMaskDC); - DeleteDC(hAndMaskDC); - DeleteDC(hMainDC); -} - void DisplayServerWindows::cursor_set_custom_image(const Ref<Resource> &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) { _THREAD_SAFE_METHOD_ @@ -1610,8 +1601,26 @@ void DisplayServerWindows::cursor_set_custom_image(const Ref<Resource> &p_cursor UINT image_size = texture_size.width * texture_size.height; // Create the BITMAP with alpha channel. - COLORREF *buffer = (COLORREF *)memalloc(sizeof(COLORREF) * image_size); - + COLORREF *buffer = nullptr; + + BITMAPV5HEADER bi; + ZeroMemory(&bi, sizeof(bi)); + bi.bV5Size = sizeof(bi); + bi.bV5Width = texture_size.width; + bi.bV5Height = -texture_size.height; + bi.bV5Planes = 1; + bi.bV5BitCount = 32; + bi.bV5Compression = BI_BITFIELDS; + bi.bV5RedMask = 0x00ff0000; + bi.bV5GreenMask = 0x0000ff00; + bi.bV5BlueMask = 0x000000ff; + bi.bV5AlphaMask = 0xff000000; + + HDC dc = GetDC(nullptr); + HBITMAP bitmap = CreateDIBSection(dc, reinterpret_cast<BITMAPINFO *>(&bi), DIB_RGB_COLORS, reinterpret_cast<void **>(&buffer), nullptr, 0); + HBITMAP mask = CreateBitmap(texture_size.width, texture_size.height, 1, 1, nullptr); + + bool fully_transparent = true; for (UINT index = 0; index < image_size; index++) { int row_index = floor(index / texture_size.width) + atlas_rect.position.y; int column_index = (index % int(texture_size.width)) + atlas_rect.position.x; @@ -1620,39 +1629,28 @@ void DisplayServerWindows::cursor_set_custom_image(const Ref<Resource> &p_cursor column_index = MIN(column_index, atlas_rect.size.width - 1); row_index = MIN(row_index, atlas_rect.size.height - 1); } + const Color &c = image->get_pixel(column_index, row_index); + fully_transparent = fully_transparent && (c.a == 0.f); - *(buffer + index) = image->get_pixel(column_index, row_index).to_argb32(); - } - - // Using 4 channels, so 4 * 8 bits. - HBITMAP bitmap = CreateBitmap(texture_size.width, texture_size.height, 1, 4 * 8, buffer); - COLORREF clrTransparent = -1; - - // Create the AND and XOR masks for the bitmap. - HBITMAP hAndMask = nullptr; - HBITMAP hXorMask = nullptr; - - GetMaskBitmaps(bitmap, clrTransparent, hAndMask, hXorMask); - - if (nullptr == hAndMask || nullptr == hXorMask) { - memfree(buffer); - DeleteObject(bitmap); - return; + *(buffer + index) = c.to_argb32(); } // Finally, create the icon. - ICONINFO iconinfo; - iconinfo.fIcon = FALSE; - iconinfo.xHotspot = p_hotspot.x; - iconinfo.yHotspot = p_hotspot.y; - iconinfo.hbmMask = hAndMask; - iconinfo.hbmColor = hXorMask; - if (cursors[p_shape]) { DestroyIcon(cursors[p_shape]); } - cursors[p_shape] = CreateIconIndirect(&iconinfo); + if (fully_transparent) { + cursors[p_shape] = nullptr; + } else { + ICONINFO iconinfo; + iconinfo.fIcon = FALSE; + iconinfo.xHotspot = p_hotspot.x; + iconinfo.yHotspot = p_hotspot.y; + iconinfo.hbmMask = mask; + iconinfo.hbmColor = bitmap; + cursors[p_shape] = CreateIconIndirect(&iconinfo); + } Vector<Variant> params; params.push_back(p_cursor); @@ -1665,17 +1663,15 @@ void DisplayServerWindows::cursor_set_custom_image(const Ref<Resource> &p_cursor } } - DeleteObject(hAndMask); - DeleteObject(hXorMask); - - memfree(buffer); + DeleteObject(mask); DeleteObject(bitmap); + ReleaseDC(nullptr, dc); } else { // Reset to default system cursor. if (cursors[p_shape]) { DestroyIcon(cursors[p_shape]); - cursors[p_shape] = nullptr; } + cursors[p_shape] = nullptr; CursorShape c = cursor_shape; cursor_shape = CURSOR_MAX; @@ -2419,14 +2415,14 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA } break; case WM_SETTINGCHANGE: { if (lParam && CompareStringOrdinal(reinterpret_cast<LPCWCH>(lParam), -1, L"ImmersiveColorSet", -1, true) == CSTR_EQUAL) { - if (is_dark_mode_supported()) { + if (is_dark_mode_supported() && dark_title_available) { BOOL value = is_dark_mode(); ::DwmSetWindowAttribute(windows[window_id].hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value)); } } } break; case WM_THEMECHANGED: { - if (is_dark_mode_supported()) { + if (is_dark_mode_supported() && dark_title_available) { BOOL value = is_dark_mode(); ::DwmSetWindowAttribute(windows[window_id].hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value)); } @@ -2527,7 +2523,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA old_y = coords.y; } - if (windows[window_id].window_has_focus && mm->get_relative() != Vector2()) { + if ((windows[window_id].window_has_focus || windows[window_id].is_popup) && mm->get_relative() != Vector2()) { Input::get_singleton()->parse_input_event(mm); } } @@ -3541,7 +3537,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, wd.pre_fs_valid = true; } - if (is_dark_mode_supported()) { + if (is_dark_mode_supported() && dark_title_available) { BOOL value = is_dark_mode(); ::DwmSetWindowAttribute(wd.hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value)); } @@ -3633,6 +3629,7 @@ WTPacketPtr DisplayServerWindows::wintab_WTPacket = nullptr; WTEnablePtr DisplayServerWindows::wintab_WTEnable = nullptr; // UXTheme API. +bool DisplayServerWindows::dark_title_available = false; bool DisplayServerWindows::ux_theme_available = false; IsDarkModeAllowedForAppPtr DisplayServerWindows::IsDarkModeAllowedForApp = nullptr; ShouldAppsUseDarkModePtr DisplayServerWindows::ShouldAppsUseDarkMode = nullptr; @@ -3725,7 +3722,21 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win // Enforce default keep screen on value. screen_set_keep_on(GLOBAL_GET("display/window/energy_saving/keep_screen_on")); - // Load UXTheme + // Load Windows version info. + OSVERSIONINFOW os_ver; + ZeroMemory(&os_ver, sizeof(OSVERSIONINFOW)); + os_ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); + + HMODULE nt_lib = LoadLibraryW(L"ntdll.dll"); + if (nt_lib) { + RtlGetVersionPtr RtlGetVersion = (RtlGetVersionPtr)GetProcAddress(nt_lib, "RtlGetVersion"); + if (RtlGetVersion) { + RtlGetVersion(&os_ver); + } + FreeLibrary(nt_lib); + } + + // Load UXTheme. HMODULE ux_theme_lib = LoadLibraryW(L"uxtheme.dll"); if (ux_theme_lib) { IsDarkModeAllowedForApp = (IsDarkModeAllowedForAppPtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(136)); @@ -3735,6 +3746,9 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win GetImmersiveUserColorSetPreference = (GetImmersiveUserColorSetPreferencePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(98)); ux_theme_available = IsDarkModeAllowedForApp && ShouldAppsUseDarkMode && GetImmersiveColorFromColorSetEx && GetImmersiveColorTypeFromName && GetImmersiveUserColorSetPreference; + if (os_ver.dwBuildNumber >= 22000) { + dark_title_available = true; + } } // Note: Wacom WinTab driver API for pen input, for devices incompatible with Windows Ink. @@ -3799,19 +3813,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win return; } - use_raw_input = true; - - RAWINPUTDEVICE Rid[1]; - - Rid[0].usUsagePage = 0x01; - Rid[0].usUsage = 0x02; - Rid[0].dwFlags = 0; - Rid[0].hwndTarget = 0; - - if (RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE) { - // Registration failed. - use_raw_input = false; - } + _register_raw_input_devices(INVALID_WINDOW_ID); #if defined(VULKAN_ENABLED) if (rendering_driver == "vulkan") { diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index dbc9821970..d85d6364bd 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -157,6 +157,7 @@ typedef bool(WINAPI *ShouldAppsUseDarkModePtr)(); typedef DWORD(WINAPI *GetImmersiveColorFromColorSetExPtr)(UINT dwImmersiveColorSet, UINT dwImmersiveColorType, bool bIgnoreHighContrast, UINT dwHighContrastCacheMode); typedef int(WINAPI *GetImmersiveColorTypeFromNamePtr)(const WCHAR *name); typedef int(WINAPI *GetImmersiveUserColorSetPreferencePtr)(bool bForceCheckRegistry, bool bSkipCheckOnFail); +typedef HRESULT(WINAPI *RtlGetVersionPtr)(OSVERSIONINFOW *lpVersionInformation); // Windows Ink API #ifndef POINTER_STRUCTURES @@ -285,6 +286,7 @@ class DisplayServerWindows : public DisplayServer { _THREAD_SAFE_CLASS_ // UXTheme API + static bool dark_title_available; static bool ux_theme_available; static IsDarkModeAllowedForAppPtr IsDarkModeAllowedForApp; static ShouldAppsUseDarkModePtr ShouldAppsUseDarkMode; @@ -309,8 +311,6 @@ class DisplayServerWindows : public DisplayServer { String tablet_driver; Vector<String> tablet_drivers; - void GetMaskBitmaps(HBITMAP hSourceBitmap, COLORREF clrTransparent, OUT HBITMAP &hAndMaskBitmap, OUT HBITMAP &hXorMaskBitmap); - enum { KEY_EVENT_BUFFER_SIZE = 512 }; @@ -466,6 +466,8 @@ class DisplayServerWindows : public DisplayServer { void _update_real_mouse_position(WindowID p_window); void _set_mouse_mode_impl(MouseMode p_mode); + WindowID _get_focused_window_or_popup() const; + void _register_raw_input_devices(WindowID p_target_window); void _process_activate_event(WindowID p_window_id, WPARAM wParam, LPARAM lParam); void _process_key_events(); diff --git a/platform/windows/export/export.cpp b/platform/windows/export/export.cpp index 20320470b8..8f91756c02 100644 --- a/platform/windows/export/export.cpp +++ b/platform/windows/export/export.cpp @@ -34,6 +34,7 @@ #include "export_plugin.h" void register_windows_exporter() { +#ifndef ANDROID_ENABLED EDITOR_DEF("export/windows/rcedit", ""); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/windows/rcedit", PROPERTY_HINT_GLOBAL_FILE, "*.exe")); #ifdef WINDOWS_ENABLED @@ -46,6 +47,7 @@ void register_windows_exporter() { EDITOR_DEF("export/windows/wine", ""); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/windows/wine", PROPERTY_HINT_GLOBAL_FILE)); #endif +#endif Ref<EditorExportPlatformWindows> platform; platform.instantiate(); diff --git a/platform/windows/gl_manager_windows.cpp b/platform/windows/gl_manager_windows.cpp index d509ff8c51..7689751f1b 100644 --- a/platform/windows/gl_manager_windows.cpp +++ b/platform/windows/gl_manager_windows.cpp @@ -289,12 +289,7 @@ void GLManager_Windows::make_current() { } void GLManager_Windows::swap_buffers() { - // on other platforms, OpenGL swaps buffers for all windows (on all displays, really?) - // Windows swaps buffers on a per-window basis - // REVISIT: this could be structurally bad, should we have "dirty" flags then? - for (KeyValue<DisplayServer::WindowID, GLWindow> &entry : _windows) { - SwapBuffers(entry.value.hDC); - } + SwapBuffers(_current_window->hDC); } Error GLManager_Windows::initialize() { diff --git a/platform/windows/godot.natvis b/platform/windows/godot.natvis index cdd1c14978..36b0919185 100644 --- a/platform/windows/godot.natvis +++ b/platform/windows/godot.natvis @@ -32,6 +32,38 @@ </Expand> </Type> + <Type Name="HashMap<*,*>"> + <Expand> + <Item Name="[size]">num_elements</Item> + <LinkedListItems> + <Size>num_elements</Size> + <HeadPointer>head_element</HeadPointer> + <NextPointer>next</NextPointer> + <ValueNode>data</ValueNode> + </LinkedListItems> + </Expand> + </Type> + + <Type Name="VMap<*,*>"> + <Expand> + <Item Condition="_cowdata._ptr" Name="[size]">*(reinterpret_cast<int*>(_cowdata._ptr) - 1)</Item> + <ArrayItems Condition="_cowdata._ptr"> + <Size>*(reinterpret_cast<int*>(_cowdata._ptr) - 1)</Size> + <ValuePointer>reinterpret_cast<VMap<$T1,$T2>::Pair*>(_cowdata._ptr)</ValuePointer> + </ArrayItems> + </Expand> + </Type> + + <Type Name="VMap<Callable,*>::Pair"> + <DisplayString Condition="dynamic_cast<CallableCustomMethodPointerBase*>(key.custom)">{dynamic_cast<CallableCustomMethodPointerBase*>(key.custom)->text}</DisplayString> + </Type> + + <!-- requires PR 64364 + <Type Name="GDScriptThreadContext"> + <DisplayString Condition="_is_main == true">main thread {_debug_thread_id}</DisplayString> + </Type> + --> + <Type Name="Variant"> <DisplayString Condition="type == Variant::NIL">nil</DisplayString> <DisplayString Condition="type == Variant::BOOL">{_data._bool}</DisplayString> @@ -55,15 +87,17 @@ <DisplayString Condition="type == Variant::OBJECT">{*(Object *)_data._mem}</DisplayString> <DisplayString Condition="type == Variant::DICTIONARY">{*(Dictionary *)_data._mem}</DisplayString> <DisplayString Condition="type == Variant::ARRAY">{*(Array *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_BYTE_ARRAY">{*(PackedByteArray *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_INT32_ARRAY">{*(PackedInt32Array *)_data._mem}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_BYTE_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<unsigned char>*>(_data.packed_array)->array}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_INT32_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<int>*>(_data.packed_array)->array}</DisplayString> + <!-- broken, will show incorrect data <DisplayString Condition="type == Variant::PACKED_INT64_ARRAY">{*(PackedInt64Array *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_FLOAT32_ARRAY">{*(PackedFloat32Array *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_FLOAT64_ARRAY">{*(PackedFloat64Array *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_STRING_ARRAY">{*(PackedStringArray *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_VECTOR2_ARRAY">{*(PackedVector2Array *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_VECTOR3_ARRAY">{*(PackedVector3Array *)_data._mem}</DisplayString> - <DisplayString Condition="type == Variant::PACKED_COLOR_ARRAY">{*(PackedColorArray *)_data._mem}</DisplayString> + --> + <DisplayString Condition="type == Variant::PACKED_FLOAT32_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<float>*>(_data.packed_array)->array}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_FLOAT64_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<double>*>(_data.packed_array)->array}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_STRING_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<String>*>(_data.packed_array)->array}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_VECTOR2_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<Vector2>*>(_data.packed_array)->array}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_VECTOR3_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<Vector3>*>(_data.packed_array)->array}</DisplayString> + <DisplayString Condition="type == Variant::PACKED_COLOR_ARRAY">{reinterpret_cast<const Variant::PackedArrayRef<Color>*>(_data.packed_array)->array}</DisplayString> <StringView Condition="type == Variant::STRING && ((String *)(_data._mem))->_cowdata._ptr">((String *)(_data._mem))->_cowdata._ptr,s32</StringView> @@ -87,7 +121,7 @@ <Item Name="[value]" Condition="type == Variant::OBJECT">*(Object *)_data._mem</Item> <Item Name="[value]" Condition="type == Variant::DICTIONARY">*(Dictionary *)_data._mem</Item> <Item Name="[value]" Condition="type == Variant::ARRAY">*(Array *)_data._mem</Item> - <Item Name="[value]" Condition="type == Variant::PACKED_BYTE_ARRAY">*(PackedByteArray *)_data._mem</Item> + <Item Name="[value]" Condition="type == Variant::PACKED_BYTE_ARRAY">reinterpret_cast<const Variant::PackedArrayRef<unsigned char>*>(_data.packed_array)->array</Item> <Item Name="[value]" Condition="type == Variant::PACKED_INT32_ARRAY">*(PackedInt32Array *)_data._mem</Item> <Item Name="[value]" Condition="type == Variant::PACKED_INT64_ARRAY">*(PackedInt64Array *)_data._mem</Item> <Item Name="[value]" Condition="type == Variant::PACKED_FLOAT32_ARRAY">*(PackedFloat32Array *)_data._mem</Item> @@ -105,6 +139,14 @@ <StringView Condition="_cowdata._ptr != 0">_cowdata._ptr,s32</StringView> </Type> + <Type Name="godot::String"> + <DisplayString>{*reinterpret_cast<void**>(opaque),s32}</DisplayString> + <Expand> + <Item Name="opaque_ptr">*reinterpret_cast<void**>(opaque)</Item> + <Item Name="string">*reinterpret_cast<void**>(opaque),s32</Item> + </Expand> + </Type> + <Type Name="StringName"> <DisplayString Condition="_data && _data->cname">{_data->cname}</DisplayString> <DisplayString Condition="_data && !_data->cname">{_data->name,s32}</DisplayString> @@ -113,6 +155,22 @@ <StringView Condition="_data && !_data->cname">_data->name,s32</StringView> </Type> + <!-- can't cast the opaque to ::StringName because Natvis does not support global namespace specifier? --> + <Type Name="godot::StringName"> + <DisplayString Condition="(*reinterpret_cast<const char***>(opaque))[1]">{(*reinterpret_cast<const char***>(opaque))[1],s8}</DisplayString> + <DisplayString Condition="!(*reinterpret_cast<const char***>(opaque))[1]">{(*reinterpret_cast<const char***>(opaque))[2],s32}</DisplayString> + <Expand> + <Item Name="opaque_ptr">*reinterpret_cast<void**>(opaque)</Item> + <Item Name="&cname">(*reinterpret_cast<const char***>(opaque))+1</Item> + <Item Name="cname">(*reinterpret_cast<const char***>(opaque))[1],s8</Item> + </Expand> + </Type> + + <Type Name="Object::SignalData"> + <DisplayString Condition="user.name._cowdata._ptr">"{user.name}" {slot_map}</DisplayString> + <DisplayString Condition="!user.name._cowdata._ptr">"{slot_map}</DisplayString> + </Type> + <Type Name="Vector2"> <DisplayString>{{{x},{y}}}</DisplayString> <Expand> @@ -149,12 +207,4 @@ <Item Name="alpha">a</Item> </Expand> </Type> - - <Type Name="Node" Inheritable="false"> - <Expand> - <Item Name="Object">(Object*)this</Item> - <Item Name="class_name">(StringName*)(((char*)this) + sizeof(Object))</Item> - <Item Name="data">(Node::Data*)(((char*)this) + sizeof(Object) + sizeof(StringName))</Item> - </Expand> - </Type> </AutoVisualizer> diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 403d53ae53..1978ec5ab6 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -290,7 +290,25 @@ String OS_Windows::get_name() const { return "Windows"; } -OS::Date OS_Windows::get_date(bool p_utc) const { +String OS_Windows::get_distribution_name() const { + return get_name(); +} + +String OS_Windows::get_version() const { + typedef LONG NTSTATUS, *PNTSTATUS; + typedef NTSTATUS(WINAPI * RtlGetVersionPtr)(PRTL_OSVERSIONINFOW); + RtlGetVersionPtr version_ptr = (RtlGetVersionPtr)GetProcAddress(GetModuleHandle("ntdll.dll"), "RtlGetVersion"); + if (version_ptr != nullptr) { + RTL_OSVERSIONINFOW fow = { 0 }; + fow.dwOSVersionInfoSize = sizeof(fow); + if (version_ptr(&fow) == 0x00000000) { + return vformat("%d.%d.%d", (int64_t)fow.dwMajorVersion, (int64_t)fow.dwMinorVersion, (int64_t)fow.dwBuildNumber); + } + } + return ""; +} + +OS::DateTime OS_Windows::get_datetime(bool p_utc) const { SYSTEMTIME systemtime; if (p_utc) { GetSystemTime(&systemtime); @@ -305,28 +323,16 @@ OS::Date OS_Windows::get_date(bool p_utc) const { daylight = true; } - Date date; - date.day = systemtime.wDay; - date.month = Month(systemtime.wMonth); - date.weekday = Weekday(systemtime.wDayOfWeek); - date.year = systemtime.wYear; - date.dst = daylight; - return date; -} - -OS::Time OS_Windows::get_time(bool p_utc) const { - SYSTEMTIME systemtime; - if (p_utc) { - GetSystemTime(&systemtime); - } else { - GetLocalTime(&systemtime); - } - - Time time; - time.hour = systemtime.wHour; - time.minute = systemtime.wMinute; - time.second = systemtime.wSecond; - return time; + DateTime dt; + dt.year = systemtime.wYear; + dt.month = Month(systemtime.wMonth); + dt.day = systemtime.wDay; + dt.weekday = Weekday(systemtime.wDayOfWeek); + dt.hour = systemtime.wHour; + dt.minute = systemtime.wMinute; + dt.second = systemtime.wSecond; + dt.dst = daylight; + return dt; } OS::TimeZoneInfo OS_Windows::get_time_zone_info() const { @@ -1146,6 +1152,21 @@ OS_Windows::OS_Windows(HINSTANCE _hInstance) { DisplayServerWindows::register_windows_driver(); + // Enable ANSI escape code support on Windows 10 v1607 (Anniversary Update) and later. + // This lets the engine and projects use ANSI escape codes to color text just like on macOS and Linux. + // + // NOTE: The engine does not use ANSI escape codes to color error/warning messages; it uses Windows API calls instead. + // Therefore, error/warning messages are still colored on Windows versions older than 10. + HANDLE stdoutHandle; + stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD outMode = 0; + outMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + + if (!SetConsoleMode(stdoutHandle, outMode)) { + // Windows 8.1 or below, or Windows 10 prior to Anniversary Update. + print_verbose("Can't set the ENABLE_VIRTUAL_TERMINAL_PROCESSING Windows console mode. `print_rich()` will not work as expected."); + } + Vector<Logger *> loggers; loggers.push_back(memnew(WindowsTerminalLogger)); _set_logger(memnew(CompositeLogger(loggers))); diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index 3e054c068c..491de2266f 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -143,11 +143,12 @@ public: virtual MainLoop *get_main_loop() const override; virtual String get_name() const override; + virtual String get_distribution_name() const override; + virtual String get_version() const override; virtual void initialize_joypads() override {} - virtual Date get_date(bool p_utc) const override; - virtual Time get_time(bool p_utc) const override; + virtual DateTime get_datetime(bool p_utc) const override; virtual TimeZoneInfo get_time_zone_info() const override; virtual double get_unix_time() const override; diff --git a/scene/2d/animated_sprite_2d.cpp b/scene/2d/animated_sprite_2d.cpp index b1b1cb23ed..7ee9861d3f 100644 --- a/scene/2d/animated_sprite_2d.cpp +++ b/scene/2d/animated_sprite_2d.cpp @@ -63,9 +63,13 @@ Rect2 AnimatedSprite2D::_edit_get_rect() const { } bool AnimatedSprite2D::_edit_use_rect() const { - if (!frames.is_valid() || !frames->has_animation(animation) || frame < 0 || frame >= frames->get_frame_count(animation)) { + if (frames.is_null() || !frames->has_animation(animation)) { return false; } + if (frame < 0 || frame >= frames->get_frame_count(animation)) { + return false; + } + Ref<Texture2D> t; if (animation) { t = frames->get_frame(animation, frame); @@ -79,7 +83,10 @@ Rect2 AnimatedSprite2D::get_anchorable_rect() const { } Rect2 AnimatedSprite2D::_get_rect() const { - if (!frames.is_valid() || !frames->has_animation(animation) || frame < 0 || frame >= frames->get_frame_count(animation)) { + if (frames.is_null() || !frames->has_animation(animation)) { + return Rect2(); + } + if (frame < 0 || frame >= frames->get_frame_count(animation)) { return Rect2(); } @@ -108,6 +115,7 @@ void AnimatedSprite2D::_validate_property(PropertyInfo &p_property) const { if (!frames.is_valid()) { return; } + if (p_property.name == "animation") { p_property.hint = PROPERTY_HINT_ENUM; List<StringName> names; @@ -137,9 +145,15 @@ void AnimatedSprite2D::_validate_property(PropertyInfo &p_property) const { p_property.hint_string = String(animation) + "," + p_property.hint_string; } } + return; } if (p_property.name == "frame") { + if (playing) { + p_property.usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY; + return; + } + p_property.hint = PROPERTY_HINT_RANGE; if (frames->has_animation(animation) && frames->get_frame_count(animation) > 0) { p_property.hint_string = "0," + itos(frames->get_frame_count(animation) - 1) + ",1"; @@ -154,54 +168,52 @@ void AnimatedSprite2D::_validate_property(PropertyInfo &p_property) const { void AnimatedSprite2D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_INTERNAL_PROCESS: { - if (frames.is_null()) { + if (frames.is_null() || !frames->has_animation(animation)) { return; } - if (!frames->has_animation(animation)) { - return; - } - if (frame < 0) { - return; + + double speed = frames->get_animation_speed(animation) * Math::abs(speed_scale); + if (speed == 0) { + return; // Do nothing. } + int last_frame = frames->get_frame_count(animation) - 1; double remaining = get_process_delta_time(); - while (remaining) { - double speed = frames->get_animation_speed(animation) * speed_scale; - if (speed == 0) { - return; // Do nothing. - } - if (timeout <= 0) { timeout = _get_frame_duration(); - int fc = frames->get_frame_count(animation); - if ((!backwards && frame >= fc - 1) || (backwards && frame <= 0)) { - if (frames->get_animation_loop(animation)) { - if (backwards) { - frame = fc - 1; - } else { - frame = 0; - } - - emit_signal(SceneStringNames::get_singleton()->animation_finished); - } else { - if (backwards) { + if (!playing_backwards) { + // Forward. + if (frame >= last_frame) { + if (frames->get_animation_loop(animation)) { frame = 0; - } else { - frame = fc - 1; - } - - if (!is_over) { - is_over = true; emit_signal(SceneStringNames::get_singleton()->animation_finished); + } else { + frame = last_frame; + if (!is_over) { + is_over = true; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } } + } else { + frame++; } } else { - if (backwards) { - frame--; + // Reversed. + if (frame <= 0) { + if (frames->get_animation_loop(animation)) { + frame = last_frame; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } else { + frame = 0; + if (!is_over) { + is_over = true; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } + } } else { - frame++; + frame--; } } @@ -217,13 +229,7 @@ void AnimatedSprite2D::_notification(int p_what) { } break; case NOTIFICATION_DRAW: { - if (frames.is_null()) { - return; - } - if (frame < 0) { - return; - } - if (!frames->has_animation(animation)) { + if (frames.is_null() || !frames->has_animation(animation)) { return; } @@ -259,14 +265,15 @@ void AnimatedSprite2D::_notification(int p_what) { void AnimatedSprite2D::set_sprite_frames(const Ref<SpriteFrames> &p_frames) { if (frames.is_valid()) { - frames->disconnect("changed", callable_mp(this, &AnimatedSprite2D::_res_changed)); + frames->disconnect(SceneStringNames::get_singleton()->changed, callable_mp(this, &AnimatedSprite2D::_res_changed)); } + frames = p_frames; if (frames.is_valid()) { - frames->connect("changed", callable_mp(this, &AnimatedSprite2D::_res_changed)); + frames->connect(SceneStringNames::get_singleton()->changed, callable_mp(this, &AnimatedSprite2D::_res_changed)); } - if (!frames.is_valid()) { + if (frames.is_null()) { frame = 0; } else { set_frame(frame); @@ -283,7 +290,7 @@ Ref<SpriteFrames> AnimatedSprite2D::get_sprite_frames() const { } void AnimatedSprite2D::set_frame(int p_frame) { - if (!frames.is_valid()) { + if (frames.is_null()) { return; } @@ -314,11 +321,16 @@ int AnimatedSprite2D::get_frame() const { } void AnimatedSprite2D::set_speed_scale(double p_speed_scale) { + if (speed_scale == p_speed_scale) { + return; + } + double elapsed = _get_frame_duration() - timeout; - speed_scale = MAX(p_speed_scale, 0.0f); + speed_scale = p_speed_scale; + playing_backwards = signbit(speed_scale) != backwards; - // We adapt the timeout so that the animation speed adapts as soon as the speed scale is changed + // We adapt the timeout so that the animation speed adapts as soon as the speed scale is changed. _reset_timeout(); timeout -= elapsed; } @@ -378,18 +390,20 @@ void AnimatedSprite2D::set_playing(bool p_playing) { playing = p_playing; _reset_timeout(); set_process_internal(playing); + notify_property_list_changed(); } bool AnimatedSprite2D::is_playing() const { return playing; } -void AnimatedSprite2D::play(const StringName &p_animation, const bool p_backwards) { +void AnimatedSprite2D::play(const StringName &p_animation, bool p_backwards) { backwards = p_backwards; + playing_backwards = signbit(speed_scale) != backwards; if (p_animation) { set_animation(p_animation); - if (frames.is_valid() && backwards && get_frame() == 0) { + if (frames.is_valid() && playing_backwards && get_frame() == 0) { set_frame(frames->get_frame_count(p_animation) - 1); } } @@ -404,7 +418,7 @@ void AnimatedSprite2D::stop() { double AnimatedSprite2D::_get_frame_duration() { if (frames.is_valid() && frames->has_animation(animation)) { - double speed = frames->get_animation_speed(animation) * speed_scale; + double speed = frames->get_animation_speed(animation) * Math::abs(speed_scale); if (speed > 0) { return 1.0 / speed; } @@ -440,11 +454,11 @@ StringName AnimatedSprite2D::get_animation() const { return animation; } -TypedArray<String> AnimatedSprite2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray AnimatedSprite2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (frames.is_null()) { - warnings.push_back(RTR("A SpriteFrames resource must be created or set in the \"Frames\" property in order for AnimatedSprite to display frames.")); + warnings.push_back(RTR("A SpriteFrames resource must be created or set in the \"Frames\" property in order for AnimatedSprite2D to display frames.")); } return warnings; diff --git a/scene/2d/animated_sprite_2d.h b/scene/2d/animated_sprite_2d.h index 0a19e250d8..11c4adb816 100644 --- a/scene/2d/animated_sprite_2d.h +++ b/scene/2d/animated_sprite_2d.h @@ -39,6 +39,7 @@ class AnimatedSprite2D : public Node2D { Ref<SpriteFrames> frames; bool playing = false; + bool playing_backwards = false; bool backwards = false; StringName animation = "default"; int frame = 0; @@ -81,7 +82,7 @@ public: void set_sprite_frames(const Ref<SpriteFrames> &p_frames); Ref<SpriteFrames> get_sprite_frames() const; - void play(const StringName &p_animation = StringName(), const bool p_backwards = false); + void play(const StringName &p_animation = StringName(), bool p_backwards = false); void stop(); void set_playing(bool p_playing); @@ -108,7 +109,7 @@ public: void set_flip_v(bool p_flip); bool is_flipped_v() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; virtual void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const override; AnimatedSprite2D(); diff --git a/scene/2d/area_2d.cpp b/scene/2d/area_2d.cpp index 3def41eaa5..b3f80b5e43 100644 --- a/scene/2d/area_2d.cpp +++ b/scene/2d/area_2d.cpp @@ -459,6 +459,16 @@ TypedArray<Area2D> Area2D::get_overlapping_areas() const { return ret; } +bool Area2D::has_overlapping_bodies() const { + ERR_FAIL_COND_V_MSG(!monitoring, false, "Can't find overlapping bodies when monitoring is off."); + return !body_map.is_empty(); +} + +bool Area2D::has_overlapping_areas() const { + ERR_FAIL_COND_V_MSG(!monitoring, false, "Can't find overlapping areas when monitoring is off."); + return !area_map.is_empty(); +} + bool Area2D::overlaps_area(Node *p_area) const { ERR_FAIL_NULL_V(p_area, false); HashMap<ObjectID, AreaState>::ConstIterator E = area_map.find(p_area->get_instance_id()); @@ -578,6 +588,9 @@ void Area2D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_overlapping_bodies"), &Area2D::get_overlapping_bodies); ClassDB::bind_method(D_METHOD("get_overlapping_areas"), &Area2D::get_overlapping_areas); + ClassDB::bind_method(D_METHOD("has_overlapping_bodies"), &Area2D::has_overlapping_bodies); + ClassDB::bind_method(D_METHOD("has_overlapping_areas"), &Area2D::has_overlapping_areas); + ClassDB::bind_method(D_METHOD("overlaps_body", "body"), &Area2D::overlaps_body); ClassDB::bind_method(D_METHOD("overlaps_area", "area"), &Area2D::overlaps_area); diff --git a/scene/2d/area_2d.h b/scene/2d/area_2d.h index 3d8d77eabb..f70f1dfc3d 100644 --- a/scene/2d/area_2d.h +++ b/scene/2d/area_2d.h @@ -180,6 +180,9 @@ public: TypedArray<Node2D> get_overlapping_bodies() const; //function for script TypedArray<Area2D> get_overlapping_areas() const; //function for script + bool has_overlapping_bodies() const; + bool has_overlapping_areas() const; + bool overlaps_area(Node *p_area) const; bool overlaps_body(Node *p_body) const; diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp index a11b2b66bf..e120aa871b 100644 --- a/scene/2d/camera_2d.cpp +++ b/scene/2d/camera_2d.cpp @@ -172,7 +172,7 @@ Transform2D Camera2D::get_camera_transform() { Point2 screen_offset = (anchor_mode == ANCHOR_MODE_DRAG_CENTER ? (screen_size * 0.5 * zoom_scale) : Point2()); real_t angle = get_global_rotation(); - if (rotating) { + if (!ignore_rotation) { screen_offset = screen_offset.rotated(angle); } @@ -204,7 +204,7 @@ Transform2D Camera2D::get_camera_transform() { Transform2D xform; xform.scale_basis(zoom_scale); - if (rotating) { + if (!ignore_rotation) { xform.set_rotation(angle); } xform.set_origin(screen_rect.position); @@ -363,15 +363,15 @@ Camera2D::AnchorMode Camera2D::get_anchor_mode() const { return anchor_mode; } -void Camera2D::set_rotating(bool p_rotating) { - rotating = p_rotating; +void Camera2D::set_ignore_rotation(bool p_ignore) { + ignore_rotation = p_ignore; Point2 old_smoothed_camera_pos = smoothed_camera_pos; _update_scroll(); smoothed_camera_pos = old_smoothed_camera_pos; } -bool Camera2D::is_rotating() const { - return rotating; +bool Camera2D::is_ignoring_rotation() const { + return ignore_rotation; } void Camera2D::set_process_callback(Camera2DProcessCallback p_mode) { @@ -668,8 +668,8 @@ void Camera2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_anchor_mode", "anchor_mode"), &Camera2D::set_anchor_mode); ClassDB::bind_method(D_METHOD("get_anchor_mode"), &Camera2D::get_anchor_mode); - ClassDB::bind_method(D_METHOD("set_rotating", "rotating"), &Camera2D::set_rotating); - ClassDB::bind_method(D_METHOD("is_rotating"), &Camera2D::is_rotating); + ClassDB::bind_method(D_METHOD("set_ignore_rotation", "ignore"), &Camera2D::set_ignore_rotation); + ClassDB::bind_method(D_METHOD("is_ignoring_rotation"), &Camera2D::is_ignoring_rotation); ClassDB::bind_method(D_METHOD("_update_scroll"), &Camera2D::_update_scroll); @@ -733,7 +733,7 @@ void Camera2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "offset", PROPERTY_HINT_NONE, "suffix:px"), "set_offset", "get_offset"); ADD_PROPERTY(PropertyInfo(Variant::INT, "anchor_mode", PROPERTY_HINT_ENUM, "Fixed TopLeft,Drag Center"), "set_anchor_mode", "get_anchor_mode"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "rotating"), "set_rotating", "is_rotating"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ignore_rotation"), "set_ignore_rotation", "is_ignoring_rotation"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "current"), "set_current", "is_current"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "zoom", PROPERTY_HINT_LINK), "set_zoom", "get_zoom"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "custom_viewport", PROPERTY_HINT_RESOURCE_TYPE, "Viewport", PROPERTY_USAGE_NONE), "set_custom_viewport", "get_custom_viewport"); diff --git a/scene/2d/camera_2d.h b/scene/2d/camera_2d.h index 78654ee606..1ce622388c 100644 --- a/scene/2d/camera_2d.h +++ b/scene/2d/camera_2d.h @@ -63,7 +63,7 @@ protected: Vector2 zoom = Vector2(1, 1); Vector2 zoom_scale = Vector2(1, 1); AnchorMode anchor_mode = ANCHOR_MODE_DRAG_CENTER; - bool rotating = false; + bool ignore_rotation = true; bool current = false; real_t smoothing = 5.0; bool smoothing_enabled = false; @@ -109,8 +109,8 @@ public: void set_anchor_mode(AnchorMode p_anchor_mode); AnchorMode get_anchor_mode() const; - void set_rotating(bool p_rotating); - bool is_rotating() const; + void set_ignore_rotation(bool p_ignore); + bool is_ignoring_rotation() const; void set_limit(Side p_side, int p_limit); int get_limit(Side p_side) const; diff --git a/scene/2d/canvas_modulate.cpp b/scene/2d/canvas_modulate.cpp index 61a17a4845..330afe4a1b 100644 --- a/scene/2d/canvas_modulate.cpp +++ b/scene/2d/canvas_modulate.cpp @@ -78,8 +78,8 @@ Color CanvasModulate::get_color() const { return color; } -TypedArray<String> CanvasModulate::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CanvasModulate::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible_in_tree() && is_inside_tree()) { List<Node *> nodes; diff --git a/scene/2d/canvas_modulate.h b/scene/2d/canvas_modulate.h index 1fd54898f8..4f522ca1c7 100644 --- a/scene/2d/canvas_modulate.h +++ b/scene/2d/canvas_modulate.h @@ -46,7 +46,7 @@ public: void set_color(const Color &p_color); Color get_color() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; CanvasModulate(); ~CanvasModulate(); diff --git a/scene/2d/collision_object_2d.cpp b/scene/2d/collision_object_2d.cpp index a79c81e8bd..23948c2fd3 100644 --- a/scene/2d/collision_object_2d.cpp +++ b/scene/2d/collision_object_2d.cpp @@ -565,8 +565,8 @@ void CollisionObject2D::_update_pickable() { } } -TypedArray<String> CollisionObject2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CollisionObject2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (shapes.is_empty()) { warnings.push_back(RTR("This node has no shape, so it can't collide or interact with other objects.\nConsider adding a CollisionShape2D or CollisionPolygon2D as a child to define its shape.")); diff --git a/scene/2d/collision_object_2d.h b/scene/2d/collision_object_2d.h index 48ea59e040..6b778d1b60 100644 --- a/scene/2d/collision_object_2d.h +++ b/scene/2d/collision_object_2d.h @@ -157,7 +157,7 @@ public: void set_pickable(bool p_enabled); bool is_pickable() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; _FORCE_INLINE_ RID get_rid() const { return rid; } diff --git a/scene/2d/collision_polygon_2d.cpp b/scene/2d/collision_polygon_2d.cpp index b69b19d30d..d06461b566 100644 --- a/scene/2d/collision_polygon_2d.cpp +++ b/scene/2d/collision_polygon_2d.cpp @@ -235,8 +235,8 @@ bool CollisionPolygon2D::_edit_is_selected_on_click(const Point2 &p_point, doubl } #endif -TypedArray<String> CollisionPolygon2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CollisionPolygon2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<CollisionObject2D>(get_parent())) { warnings.push_back(RTR("CollisionPolygon2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, CharacterBody2D, etc. to give them a shape.")); diff --git a/scene/2d/collision_polygon_2d.h b/scene/2d/collision_polygon_2d.h index e18022ab7e..066f7271c6 100644 --- a/scene/2d/collision_polygon_2d.h +++ b/scene/2d/collision_polygon_2d.h @@ -77,7 +77,7 @@ public: void set_polygon(const Vector<Point2> &p_polygon); Vector<Point2> get_polygon() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_disabled(bool p_disabled); bool is_disabled() const; diff --git a/scene/2d/collision_shape_2d.cpp b/scene/2d/collision_shape_2d.cpp index 039bfee451..7e167a3807 100644 --- a/scene/2d/collision_shape_2d.cpp +++ b/scene/2d/collision_shape_2d.cpp @@ -168,8 +168,8 @@ bool CollisionShape2D::_edit_is_selected_on_click(const Point2 &p_point, double return shape->_edit_is_selected_on_click(p_point, p_tolerance); } -TypedArray<String> CollisionShape2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CollisionShape2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<CollisionObject2D>(get_parent())) { warnings.push_back(RTR("CollisionShape2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, CharacterBody2D, etc. to give them a shape.")); diff --git a/scene/2d/collision_shape_2d.h b/scene/2d/collision_shape_2d.h index dbc81e8424..5e50420e00 100644 --- a/scene/2d/collision_shape_2d.h +++ b/scene/2d/collision_shape_2d.h @@ -72,7 +72,7 @@ public: void set_one_way_collision_margin(real_t p_margin); real_t get_one_way_collision_margin() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; CollisionShape2D(); }; diff --git a/scene/2d/cpu_particles_2d.cpp b/scene/2d/cpu_particles_2d.cpp index 4523e5dfe9..eece90190b 100644 --- a/scene/2d/cpu_particles_2d.cpp +++ b/scene/2d/cpu_particles_2d.cpp @@ -242,8 +242,8 @@ bool CPUParticles2D::get_fractional_delta() const { return fractional_delta; } -TypedArray<String> CPUParticles2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node2D::get_configuration_warnings(); +PackedStringArray CPUParticles2D::get_configuration_warnings() const { + PackedStringArray warnings = Node2D::get_configuration_warnings(); CanvasItemMaterial *mat = Object::cast_to<CanvasItemMaterial>(get_material().ptr()); diff --git a/scene/2d/cpu_particles_2d.h b/scene/2d/cpu_particles_2d.h index 3fd1c7fd0f..ea735411a8 100644 --- a/scene/2d/cpu_particles_2d.h +++ b/scene/2d/cpu_particles_2d.h @@ -282,7 +282,7 @@ public: void set_gravity(const Vector2 &p_gravity); Vector2 get_gravity() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void restart(); diff --git a/scene/2d/gpu_particles_2d.cpp b/scene/2d/gpu_particles_2d.cpp index bed68b4ee0..18f709f241 100644 --- a/scene/2d/gpu_particles_2d.cpp +++ b/scene/2d/gpu_particles_2d.cpp @@ -296,8 +296,8 @@ bool GPUParticles2D::get_interpolate() const { return interpolate; } -TypedArray<String> GPUParticles2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node2D::get_configuration_warnings(); +PackedStringArray GPUParticles2D::get_configuration_warnings() const { + PackedStringArray warnings = Node2D::get_configuration_warnings(); if (RenderingServer::get_singleton()->is_low_end()) { warnings.push_back(RTR("GPU-based particles are not supported by the OpenGL video driver.\nUse the CPUParticles2D node instead. You can use the \"Convert to CPUParticles2D\" option for this purpose.")); diff --git a/scene/2d/gpu_particles_2d.h b/scene/2d/gpu_particles_2d.h index 10ae91775f..d613b4ef51 100644 --- a/scene/2d/gpu_particles_2d.h +++ b/scene/2d/gpu_particles_2d.h @@ -145,7 +145,7 @@ public: void set_texture(const Ref<Texture2D> &p_texture); Ref<Texture2D> get_texture() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_sub_emitter(const NodePath &p_path); NodePath get_sub_emitter() const; diff --git a/scene/2d/joint_2d.cpp b/scene/2d/joint_2d.cpp index 89b6f3f9da..6000508f36 100644 --- a/scene/2d/joint_2d.cpp +++ b/scene/2d/joint_2d.cpp @@ -202,8 +202,8 @@ bool Joint2D::get_exclude_nodes_from_collision() const { return exclude_from_collision; } -TypedArray<String> Joint2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node2D::get_configuration_warnings(); +PackedStringArray Joint2D::get_configuration_warnings() const { + PackedStringArray warnings = Node2D::get_configuration_warnings(); if (!warning.is_empty()) { warnings.push_back(warning); diff --git a/scene/2d/joint_2d.h b/scene/2d/joint_2d.h index e3cd600cbd..8b145be6ae 100644 --- a/scene/2d/joint_2d.h +++ b/scene/2d/joint_2d.h @@ -62,7 +62,7 @@ protected: _FORCE_INLINE_ bool is_configured() const { return configured; } public: - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; void set_node_a(const NodePath &p_node_a); NodePath get_node_a() const; diff --git a/scene/2d/light_2d.cpp b/scene/2d/light_2d.cpp index 7eb6b43af7..90402260ed 100644 --- a/scene/2d/light_2d.cpp +++ b/scene/2d/light_2d.cpp @@ -395,8 +395,8 @@ Vector2 PointLight2D::get_texture_offset() const { return texture_offset; } -TypedArray<String> PointLight2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray PointLight2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!texture.is_valid()) { warnings.push_back(RTR("A texture with the shape of the light must be supplied to the \"Texture\" property.")); diff --git a/scene/2d/light_2d.h b/scene/2d/light_2d.h index 373cfe59fd..29870923aa 100644 --- a/scene/2d/light_2d.h +++ b/scene/2d/light_2d.h @@ -171,7 +171,7 @@ public: void set_texture_scale(real_t p_scale); real_t get_texture_scale() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; PointLight2D(); }; diff --git a/scene/2d/light_occluder_2d.cpp b/scene/2d/light_occluder_2d.cpp index 6c171383ca..67e82140e4 100644 --- a/scene/2d/light_occluder_2d.cpp +++ b/scene/2d/light_occluder_2d.cpp @@ -246,8 +246,8 @@ int LightOccluder2D::get_occluder_light_mask() const { return mask; } -TypedArray<String> LightOccluder2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray LightOccluder2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!occluder_polygon.is_valid()) { warnings.push_back(RTR("An occluder polygon must be set (or drawn) for this occluder to take effect.")); diff --git a/scene/2d/light_occluder_2d.h b/scene/2d/light_occluder_2d.h index b61e23464a..ee4d87e54b 100644 --- a/scene/2d/light_occluder_2d.h +++ b/scene/2d/light_occluder_2d.h @@ -105,7 +105,7 @@ public: void set_as_sdf_collision(bool p_enable); bool is_set_as_sdf_collision() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; LightOccluder2D(); ~LightOccluder2D(); diff --git a/scene/2d/navigation_agent_2d.cpp b/scene/2d/navigation_agent_2d.cpp index d7f75c63a4..55cebdaadc 100644 --- a/scene/2d/navigation_agent_2d.cpp +++ b/scene/2d/navigation_agent_2d.cpp @@ -368,8 +368,8 @@ void NavigationAgent2D::_avoidance_done(Vector3 p_new_velocity) { emit_signal(SNAME("velocity_computed"), velocity); } -TypedArray<String> NavigationAgent2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationAgent2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<Node2D>(get_parent())) { warnings.push_back(RTR("The NavigationAgent2D can be used only under a Node2D inheriting parent node.")); diff --git a/scene/2d/navigation_agent_2d.h b/scene/2d/navigation_agent_2d.h index 11b845665d..2fbacc4c76 100644 --- a/scene/2d/navigation_agent_2d.h +++ b/scene/2d/navigation_agent_2d.h @@ -155,7 +155,7 @@ public: void set_velocity(Vector2 p_velocity); void _avoidance_done(Vector3 p_new_velocity); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; private: void update_navigation(); diff --git a/scene/2d/navigation_link_2d.cpp b/scene/2d/navigation_link_2d.cpp index 8ba51482ee..3f7e10eaea 100644 --- a/scene/2d/navigation_link_2d.cpp +++ b/scene/2d/navigation_link_2d.cpp @@ -267,8 +267,8 @@ void NavigationLink2D::set_travel_cost(real_t p_travel_cost) { NavigationServer2D::get_singleton()->link_set_travel_cost(link, travel_cost); } -TypedArray<String> NavigationLink2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationLink2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (start_location.is_equal_approx(end_location)) { warnings.push_back(RTR("NavigationLink2D start location should be different than the end location to be useful.")); diff --git a/scene/2d/navigation_link_2d.h b/scene/2d/navigation_link_2d.h index 5990ea082c..2a5092216d 100644 --- a/scene/2d/navigation_link_2d.h +++ b/scene/2d/navigation_link_2d.h @@ -79,7 +79,7 @@ public: void set_travel_cost(real_t p_travel_cost); real_t get_travel_cost() const { return travel_cost; } - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; NavigationLink2D(); ~NavigationLink2D(); diff --git a/scene/2d/navigation_obstacle_2d.cpp b/scene/2d/navigation_obstacle_2d.cpp index a592d20cba..e46bb79551 100644 --- a/scene/2d/navigation_obstacle_2d.cpp +++ b/scene/2d/navigation_obstacle_2d.cpp @@ -38,6 +38,9 @@ void NavigationObstacle2D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_rid"), &NavigationObstacle2D::get_rid); + ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &NavigationObstacle2D::set_navigation_map); + ClassDB::bind_method(D_METHOD("get_navigation_map"), &NavigationObstacle2D::get_navigation_map); + ClassDB::bind_method(D_METHOD("set_estimate_radius", "estimate_radius"), &NavigationObstacle2D::set_estimate_radius); ClassDB::bind_method(D_METHOD("is_radius_estimated"), &NavigationObstacle2D::is_radius_estimated); ClassDB::bind_method(D_METHOD("set_radius", "radius"), &NavigationObstacle2D::set_radius); @@ -57,28 +60,26 @@ void NavigationObstacle2D::_validate_property(PropertyInfo &p_property) const { void NavigationObstacle2D::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - parent_node2d = Object::cast_to<Node2D>(get_parent()); - reevaluate_agent_radius(); - if (parent_node2d != nullptr) { - // place agent on navigation map first or else the RVO agent callback creation fails silently later - NavigationServer2D::get_singleton()->agent_set_map(get_rid(), parent_node2d->get_world_2d()->get_navigation_map()); - } + case NOTIFICATION_POST_ENTER_TREE: { + set_agent_parent(get_parent()); set_physics_process_internal(true); } break; case NOTIFICATION_EXIT_TREE: { - parent_node2d = nullptr; + set_agent_parent(nullptr); set_physics_process_internal(false); } break; case NOTIFICATION_PARENTED: { - parent_node2d = Object::cast_to<Node2D>(get_parent()); - reevaluate_agent_radius(); + if (is_inside_tree() && (get_parent() != parent_node2d)) { + set_agent_parent(get_parent()); + set_physics_process_internal(true); + } } break; case NOTIFICATION_UNPARENTED: { - parent_node2d = nullptr; + set_agent_parent(nullptr); + set_physics_process_internal(false); } break; case NOTIFICATION_PAUSED: { @@ -119,8 +120,8 @@ NavigationObstacle2D::~NavigationObstacle2D() { agent = RID(); // Pointless } -TypedArray<String> NavigationObstacle2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationObstacle2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<Node2D>(get_parent())) { warnings.push_back(RTR("The NavigationObstacle2D only serves to provide collision avoidance to a Node2D object.")); @@ -182,6 +183,35 @@ real_t NavigationObstacle2D::estimate_agent_radius() const { return 1.0; // Never a 0 radius } +void NavigationObstacle2D::set_agent_parent(Node *p_agent_parent) { + if (Object::cast_to<Node2D>(p_agent_parent) != nullptr) { + parent_node2d = Object::cast_to<Node2D>(p_agent_parent); + if (map_override.is_valid()) { + NavigationServer2D::get_singleton()->agent_set_map(get_rid(), map_override); + } else { + NavigationServer2D::get_singleton()->agent_set_map(get_rid(), parent_node2d->get_world_2d()->get_navigation_map()); + } + reevaluate_agent_radius(); + } else { + parent_node2d = nullptr; + NavigationServer2D::get_singleton()->agent_set_map(get_rid(), RID()); + } +} + +void NavigationObstacle2D::set_navigation_map(RID p_navigation_map) { + map_override = p_navigation_map; + NavigationServer2D::get_singleton()->agent_set_map(agent, map_override); +} + +RID NavigationObstacle2D::get_navigation_map() const { + if (map_override.is_valid()) { + return map_override; + } else if (parent_node2d != nullptr) { + return parent_node2d->get_world_2d()->get_navigation_map(); + } + return RID(); +} + void NavigationObstacle2D::set_estimate_radius(bool p_estimate_radius) { estimate_radius = p_estimate_radius; notify_property_list_changed(); diff --git a/scene/2d/navigation_obstacle_2d.h b/scene/2d/navigation_obstacle_2d.h index 5795c6c94f..d4c1df343f 100644 --- a/scene/2d/navigation_obstacle_2d.h +++ b/scene/2d/navigation_obstacle_2d.h @@ -38,8 +38,10 @@ class NavigationObstacle2D : public Node { GDCLASS(NavigationObstacle2D, Node); Node2D *parent_node2d = nullptr; + RID agent; RID map_before_pause; + RID map_override; bool estimate_radius = true; real_t radius = 1.0; @@ -57,6 +59,11 @@ public: return agent; } + void set_agent_parent(Node *p_agent_parent); + + void set_navigation_map(RID p_navigation_map); + RID get_navigation_map() const; + void set_estimate_radius(bool p_estimate_radius); bool is_radius_estimated() const { return estimate_radius; @@ -66,7 +73,7 @@ public: return radius; } - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; private: void initialize_agent(); diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp index ffccb95a22..b1e2875a8b 100644 --- a/scene/2d/navigation_region_2d.cpp +++ b/scene/2d/navigation_region_2d.cpp @@ -566,8 +566,8 @@ void NavigationRegion2D::_map_changed(RID p_map) { #endif // DEBUG_ENABLED } -TypedArray<String> NavigationRegion2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node2D::get_configuration_warnings(); +PackedStringArray NavigationRegion2D::get_configuration_warnings() const { + PackedStringArray warnings = Node2D::get_configuration_warnings(); if (is_visible_in_tree() && is_inside_tree()) { if (!navpoly.is_valid()) { diff --git a/scene/2d/navigation_region_2d.h b/scene/2d/navigation_region_2d.h index 3c9df91fe3..893de41a94 100644 --- a/scene/2d/navigation_region_2d.h +++ b/scene/2d/navigation_region_2d.h @@ -134,7 +134,7 @@ public: void set_navigation_polygon(const Ref<NavigationPolygon> &p_navpoly); Ref<NavigationPolygon> get_navigation_polygon() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; NavigationRegion2D(); ~NavigationRegion2D(); diff --git a/scene/2d/parallax_background.cpp b/scene/2d/parallax_background.cpp index bd5a01f5a4..f1a28b7852 100644 --- a/scene/2d/parallax_background.cpp +++ b/scene/2d/parallax_background.cpp @@ -102,9 +102,9 @@ void ParallaxBackground::_update_scroll() { } if (ignore_camera_zoom) { - l->set_base_offset_and_scale((ofs + screen_offset * (scale - 1)) / scale, 1.0, screen_offset); + l->set_base_offset_and_scale((ofs + screen_offset * (scale - 1)) / scale, 1.0); } else { - l->set_base_offset_and_scale(ofs, scale, screen_offset); + l->set_base_offset_and_scale(ofs, scale); } } } diff --git a/scene/2d/parallax_layer.cpp b/scene/2d/parallax_layer.cpp index f0aad1b8a4..01e4bf19f3 100644 --- a/scene/2d/parallax_layer.cpp +++ b/scene/2d/parallax_layer.cpp @@ -39,7 +39,7 @@ void ParallaxLayer::set_motion_scale(const Size2 &p_scale) { if (pb && is_inside_tree()) { Vector2 ofs = pb->get_final_offset(); real_t scale = pb->get_scroll_scale(); - set_base_offset_and_scale(ofs, scale, screen_offset); + set_base_offset_and_scale(ofs, scale); } } @@ -54,7 +54,7 @@ void ParallaxLayer::set_motion_offset(const Size2 &p_offset) { if (pb && is_inside_tree()) { Vector2 ofs = pb->get_final_offset(); real_t scale = pb->get_scroll_scale(); - set_base_offset_and_scale(ofs, scale, screen_offset); + set_base_offset_and_scale(ofs, scale); } } @@ -111,9 +111,7 @@ void ParallaxLayer::_notification(int p_what) { } } -void ParallaxLayer::set_base_offset_and_scale(const Point2 &p_offset, real_t p_scale, const Point2 &p_screen_offset) { - screen_offset = p_screen_offset; - +void ParallaxLayer::set_base_offset_and_scale(const Point2 &p_offset, real_t p_scale) { if (!is_inside_tree()) { return; } @@ -121,7 +119,7 @@ void ParallaxLayer::set_base_offset_and_scale(const Point2 &p_offset, real_t p_s return; } - Point2 new_ofs = (screen_offset + (p_offset - screen_offset) * motion_scale) + motion_offset * p_scale + orig_offset * p_scale; + Point2 new_ofs = p_offset * motion_scale + motion_offset * p_scale + orig_offset * p_scale; if (mirroring.x) { real_t den = mirroring.x * p_scale; @@ -139,8 +137,8 @@ void ParallaxLayer::set_base_offset_and_scale(const Point2 &p_offset, real_t p_s _update_mirroring(); } -TypedArray<String> ParallaxLayer::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray ParallaxLayer::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<ParallaxBackground>(get_parent())) { warnings.push_back(RTR("ParallaxLayer node only works when set as child of a ParallaxBackground node.")); diff --git a/scene/2d/parallax_layer.h b/scene/2d/parallax_layer.h index b4dcf0ea61..6471f56c5c 100644 --- a/scene/2d/parallax_layer.h +++ b/scene/2d/parallax_layer.h @@ -43,8 +43,6 @@ class ParallaxLayer : public Node2D { Vector2 mirroring; void _update_mirroring(); - Point2 screen_offset; - protected: void _notification(int p_what); static void _bind_methods(); @@ -59,9 +57,9 @@ public: void set_mirroring(const Size2 &p_mirroring); Size2 get_mirroring() const; - void set_base_offset_and_scale(const Point2 &p_offset, real_t p_scale, const Point2 &p_screen_offset); + void set_base_offset_and_scale(const Point2 &p_offset, real_t p_scale); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; ParallaxLayer(); }; diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp index 90b2e3d460..c1044fdf5b 100644 --- a/scene/2d/path_2d.cpp +++ b/scene/2d/path_2d.cpp @@ -256,8 +256,8 @@ void PathFollow2D::_validate_property(PropertyInfo &p_property) const { } } -TypedArray<String> PathFollow2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray PathFollow2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible_in_tree() && is_inside_tree()) { if (!Object::cast_to<Path2D>(get_parent())) { diff --git a/scene/2d/path_2d.h b/scene/2d/path_2d.h index 3d66ca1fab..5e436fb9f6 100644 --- a/scene/2d/path_2d.h +++ b/scene/2d/path_2d.h @@ -106,7 +106,7 @@ public: void set_cubic_interpolation(bool p_enable); bool get_cubic_interpolation() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; PathFollow2D() {} }; diff --git a/scene/2d/physical_bone_2d.cpp b/scene/2d/physical_bone_2d.cpp index e6933b8a40..5ff706ebb7 100644 --- a/scene/2d/physical_bone_2d.cpp +++ b/scene/2d/physical_bone_2d.cpp @@ -106,8 +106,8 @@ void PhysicalBone2D::_find_joint_child() { } } -TypedArray<String> PhysicalBone2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray PhysicalBone2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!parent_skeleton) { warnings.push_back(RTR("A PhysicalBone2D only works with a Skeleton2D or another PhysicalBone2D as a parent node!")); diff --git a/scene/2d/physical_bone_2d.h b/scene/2d/physical_bone_2d.h index 9fbfa04100..33ac0d9935 100644 --- a/scene/2d/physical_bone_2d.h +++ b/scene/2d/physical_bone_2d.h @@ -79,7 +79,7 @@ public: void set_follow_bone_when_simulating(bool p_follow); bool get_follow_bone_when_simulating() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; PhysicalBone2D(); ~PhysicalBone2D(); diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index 714d196779..16686f4fe6 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -34,8 +34,8 @@ #include "scene/scene_string_names.h" void PhysicsBody2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("move_and_collide", "distance", "test_only", "safe_margin"), &PhysicsBody2D::_move, DEFVAL(false), DEFVAL(0.08)); - ClassDB::bind_method(D_METHOD("test_move", "from", "distance", "collision", "safe_margin"), &PhysicsBody2D::test_move, DEFVAL(Variant()), DEFVAL(0.08)); + ClassDB::bind_method(D_METHOD("move_and_collide", "distance", "test_only", "safe_margin", "recovery_as_collision"), &PhysicsBody2D::_move, DEFVAL(false), DEFVAL(0.08), DEFVAL(false)); + ClassDB::bind_method(D_METHOD("test_move", "from", "distance", "collision", "safe_margin", "recovery_as_collision"), &PhysicsBody2D::test_move, DEFVAL(Variant()), DEFVAL(0.08), DEFVAL(false)); ClassDB::bind_method(D_METHOD("get_collision_exceptions"), &PhysicsBody2D::get_collision_exceptions); ClassDB::bind_method(D_METHOD("add_collision_exception_with", "body"), &PhysicsBody2D::add_collision_exception_with); @@ -54,9 +54,9 @@ PhysicsBody2D::~PhysicsBody2D() { } } -Ref<KinematicCollision2D> PhysicsBody2D::_move(const Vector2 &p_distance, bool p_test_only, real_t p_margin) { +Ref<KinematicCollision2D> PhysicsBody2D::_move(const Vector2 &p_distance, bool p_test_only, real_t p_margin, bool p_recovery_as_collision) { PhysicsServer2D::MotionParameters parameters(get_global_transform(), p_distance, p_margin); - parameters.recovery_as_collision = false; // Don't report collisions generated only from recovery. + parameters.recovery_as_collision = p_recovery_as_collision; PhysicsServer2D::MotionResult result; @@ -128,7 +128,7 @@ bool PhysicsBody2D::move_and_collide(const PhysicsServer2D::MotionParameters &p_ return colliding; } -bool PhysicsBody2D::test_move(const Transform2D &p_from, const Vector2 &p_distance, const Ref<KinematicCollision2D> &r_collision, real_t p_margin) { +bool PhysicsBody2D::test_move(const Transform2D &p_from, const Vector2 &p_distance, const Ref<KinematicCollision2D> &r_collision, real_t p_margin, bool p_recovery_as_collision) { ERR_FAIL_COND_V(!is_inside_tree(), false); PhysicsServer2D::MotionResult *r = nullptr; @@ -141,7 +141,7 @@ bool PhysicsBody2D::test_move(const Transform2D &p_from, const Vector2 &p_distan } PhysicsServer2D::MotionParameters parameters(p_from, p_distance, p_margin); - parameters.recovery_as_collision = false; // Don't report collisions generated only from recovery. + parameters.recovery_as_collision = p_recovery_as_collision; return PhysicsServer2D::get_singleton()->body_test_motion(get_rid(), parameters, r); } @@ -262,21 +262,16 @@ void AnimatableBody2D::_update_kinematic_motion() { #endif if (sync_to_physics) { - PhysicsServer2D::get_singleton()->body_set_state_sync_callback(get_rid(), this, _body_state_changed_callback); + PhysicsServer2D::get_singleton()->body_set_state_sync_callback(get_rid(), callable_mp(this, &AnimatableBody2D::_body_state_changed)); set_only_update_transform_changes(true); set_notify_local_transform(true); } else { - PhysicsServer2D::get_singleton()->body_set_state_sync_callback(get_rid(), nullptr, nullptr); + PhysicsServer2D::get_singleton()->body_set_state_sync_callback(get_rid(), Callable()); set_only_update_transform_changes(false); set_notify_local_transform(false); } } -void AnimatableBody2D::_body_state_changed_callback(void *p_instance, PhysicsDirectBodyState2D *p_state) { - AnimatableBody2D *body = static_cast<AnimatableBody2D *>(p_instance); - body->_body_state_changed(p_state); -} - void AnimatableBody2D::_body_state_changed(PhysicsDirectBodyState2D *p_state) { if (!sync_to_physics) { return; @@ -438,11 +433,6 @@ struct _RigidBody2DInOut { int local_shape = 0; }; -void RigidBody2D::_body_state_changed_callback(void *p_instance, PhysicsDirectBodyState2D *p_state) { - RigidBody2D *body = static_cast<RigidBody2D *>(p_instance); - body->_body_state_changed(p_state); -} - void RigidBody2D::_body_state_changed(PhysicsDirectBodyState2D *p_state) { set_block_transform_notify(true); // don't want notify (would feedback loop) if (!freeze || freeze_mode != FREEZE_MODE_KINEMATIC) { @@ -921,10 +911,10 @@ void RigidBody2D::_notification(int p_what) { #endif } -TypedArray<String> RigidBody2D::get_configuration_warnings() const { +PackedStringArray RigidBody2D::get_configuration_warnings() const { Transform2D t = get_transform(); - TypedArray<String> warnings = CollisionObject2D::get_configuration_warnings(); + PackedStringArray warnings = CollisionObject2D::get_configuration_warnings(); if (ABS(t.columns[0].length() - 1.0) > 0.05 || ABS(t.columns[1].length() - 1.0) > 0.05) { warnings.push_back(RTR("Size changes to RigidBody2D will be overridden by the physics engine when running.\nChange the size in children collision shapes instead.")); @@ -1079,7 +1069,7 @@ void RigidBody2D::_validate_property(PropertyInfo &p_property) const { RigidBody2D::RigidBody2D() : PhysicsBody2D(PhysicsServer2D::BODY_MODE_RIGID) { - PhysicsServer2D::get_singleton()->body_set_state_sync_callback(get_rid(), this, _body_state_changed_callback); + PhysicsServer2D::get_singleton()->body_set_state_sync_callback(get_rid(), callable_mp(this, &RigidBody2D::_body_state_changed)); } RigidBody2D::~RigidBody2D() { @@ -1144,7 +1134,6 @@ bool CharacterBody2D::move_and_slide() { if (!current_platform_velocity.is_zero_approx()) { PhysicsServer2D::MotionParameters parameters(get_global_transform(), current_platform_velocity * delta, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. parameters.exclude_bodies.insert(platform_rid); if (platform_object_id.is_valid()) { parameters.exclude_objects.insert(platform_object_id); @@ -1203,7 +1192,6 @@ void CharacterBody2D::_move_and_slide_grounded(double p_delta, bool p_was_on_flo for (int iteration = 0; iteration < max_slides; ++iteration) { PhysicsServer2D::MotionParameters parameters(get_global_transform(), motion, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. Vector2 prev_position = parameters.from.columns[2]; @@ -1360,7 +1348,6 @@ void CharacterBody2D::_move_and_slide_floating(double p_delta) { bool first_slide = true; for (int iteration = 0; iteration < max_slides; ++iteration) { PhysicsServer2D::MotionParameters parameters(get_global_transform(), motion, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. PhysicsServer2D::MotionResult result; bool collided = move_and_collide(parameters, result, false, false); @@ -1407,7 +1394,7 @@ void CharacterBody2D::_snap_on_floor(bool p_was_on_floor, bool p_vel_dir_facing_ real_t length = MAX(floor_snap_length, margin); PhysicsServer2D::MotionParameters parameters(get_global_transform(), -up_direction * length, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. + parameters.recovery_as_collision = true; // Report margin recovery as collision to improve floor detection. parameters.collide_separation_ray = true; PhysicsServer2D::MotionResult result; @@ -1443,7 +1430,7 @@ bool CharacterBody2D::_on_floor_if_snapped(bool p_was_on_floor, bool p_vel_dir_f real_t length = MAX(floor_snap_length, margin); PhysicsServer2D::MotionParameters parameters(get_global_transform(), -up_direction * length, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. + parameters.recovery_as_collision = true; // Report margin recovery as collision to improve floor detection. parameters.collide_separation_ray = true; PhysicsServer2D::MotionResult result; diff --git a/scene/2d/physics_body_2d.h b/scene/2d/physics_body_2d.h index eaba9aadad..932ec1de16 100644 --- a/scene/2d/physics_body_2d.h +++ b/scene/2d/physics_body_2d.h @@ -47,11 +47,11 @@ protected: Ref<KinematicCollision2D> motion_cache; - Ref<KinematicCollision2D> _move(const Vector2 &p_distance, bool p_test_only = false, real_t p_margin = 0.08); + Ref<KinematicCollision2D> _move(const Vector2 &p_distance, bool p_test_only = false, real_t p_margin = 0.08, bool p_recovery_as_collision = false); public: bool move_and_collide(const PhysicsServer2D::MotionParameters &p_parameters, PhysicsServer2D::MotionResult &r_result, bool p_test_only = false, bool p_cancel_sliding = true); - bool test_move(const Transform2D &p_from, const Vector2 &p_distance, const Ref<KinematicCollision2D> &r_collision = Ref<KinematicCollision2D>(), real_t p_margin = 0.08); + bool test_move(const Transform2D &p_from, const Vector2 &p_distance, const Ref<KinematicCollision2D> &r_collision = Ref<KinematicCollision2D>(), real_t p_margin = 0.08, bool p_recovery_as_collision = false); TypedArray<PhysicsBody2D> get_collision_exceptions(); void add_collision_exception_with(Node *p_node); //must be physicsbody @@ -309,7 +309,7 @@ public: TypedArray<Node2D> get_colliding_bodies() const; //function for script - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; RigidBody2D(); ~RigidBody2D(); diff --git a/scene/2d/remote_transform_2d.cpp b/scene/2d/remote_transform_2d.cpp index 6c4bfd58ce..f4343e4c03 100644 --- a/scene/2d/remote_transform_2d.cpp +++ b/scene/2d/remote_transform_2d.cpp @@ -183,8 +183,8 @@ void RemoteTransform2D::force_update_cache() { _update_cache(); } -TypedArray<String> RemoteTransform2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray RemoteTransform2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!has_node(remote_node) || !Object::cast_to<Node2D>(get_node(remote_node))) { warnings.push_back(RTR("Path property must point to a valid Node2D node to work.")); diff --git a/scene/2d/remote_transform_2d.h b/scene/2d/remote_transform_2d.h index bd352e1054..f98eec75c6 100644 --- a/scene/2d/remote_transform_2d.h +++ b/scene/2d/remote_transform_2d.h @@ -70,7 +70,7 @@ public: void force_update_cache(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; RemoteTransform2D(); }; diff --git a/scene/2d/shape_cast_2d.cpp b/scene/2d/shape_cast_2d.cpp index a25d5934ee..6222b0db14 100644 --- a/scene/2d/shape_cast_2d.cpp +++ b/scene/2d/shape_cast_2d.cpp @@ -391,8 +391,8 @@ Array ShapeCast2D::_get_collision_result() const { return ret; } -TypedArray<String> ShapeCast2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node2D::get_configuration_warnings(); +PackedStringArray ShapeCast2D::get_configuration_warnings() const { + PackedStringArray warnings = Node2D::get_configuration_warnings(); if (shape.is_null()) { warnings.push_back(RTR("This node cannot interact with other objects unless a Shape2D is assigned.")); diff --git a/scene/2d/shape_cast_2d.h b/scene/2d/shape_cast_2d.h index 660e52f189..7b55566b01 100644 --- a/scene/2d/shape_cast_2d.h +++ b/scene/2d/shape_cast_2d.h @@ -117,7 +117,7 @@ public: void remove_exception(const CollisionObject2D *p_node); void clear_exceptions(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; }; #endif // SHAPE_CAST_2D_H diff --git a/scene/2d/skeleton_2d.cpp b/scene/2d/skeleton_2d.cpp index 8f0bf22617..b5759c54f7 100644 --- a/scene/2d/skeleton_2d.cpp +++ b/scene/2d/skeleton_2d.cpp @@ -434,8 +434,8 @@ int Bone2D::get_index_in_skeleton() const { return skeleton_index; } -TypedArray<String> Bone2D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray Bone2D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!skeleton) { if (parent_bone) { warnings.push_back(RTR("This Bone2D chain should end at a Skeleton2D node.")); diff --git a/scene/2d/skeleton_2d.h b/scene/2d/skeleton_2d.h index 98fb867d99..580aed97ce 100644 --- a/scene/2d/skeleton_2d.h +++ b/scene/2d/skeleton_2d.h @@ -78,7 +78,7 @@ public: void apply_rest(); Transform2D get_skeleton_rest() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_default_length(real_t p_length); real_t get_default_length() const; diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 2d9f077df5..577284a752 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -34,6 +34,10 @@ #include "scene/resources/world_2d.h" #include "servers/navigation_server_2d.h" +#ifdef DEBUG_ENABLED +#include "servers/navigation_server_3d.h" +#endif // DEBUG_ENABLED + HashMap<Vector2i, TileSet::CellNeighbor> TileMap::TerrainConstraint::get_overlapping_coords_and_peering_bits() const { HashMap<Vector2i, TileSet::CellNeighbor> output; @@ -1656,14 +1660,6 @@ void TileMap::_navigation_update_dirty_quadrants(SelfList<TileMapQuadrant>::List ERR_FAIL_COND(!is_inside_tree()); ERR_FAIL_COND(!tile_set.is_valid()); - // Get colors for debug. - SceneTree *st = SceneTree::get_singleton(); - Color debug_navigation_color; - bool debug_navigation = st && st->is_debugging_navigation_hint(); - if (debug_navigation) { - debug_navigation_color = st->get_debug_navigation_color(); - } - Transform2D tilemap_xform = get_global_transform(); SelfList<TileMapQuadrant> *q_list_element = r_dirty_quadrant_list.first(); while (q_list_element) { @@ -1766,7 +1762,10 @@ void TileMap::_navigation_draw_quadrant_debug(TileMapQuadrant *p_quadrant) { RenderingServer *rs = RenderingServer::get_singleton(); - Color color = get_tree()->get_debug_navigation_color(); + Color color = Color(0.5, 1.0, 1.0, 1.0); +#ifdef DEBUG_ENABLED + color = NavigationServer3D::get_singleton()->get_debug_navigation_geometry_face_color(); +#endif // DEBUG_ENABLED RandomPCG rand; Vector2 quadrant_pos = map_to_local(p_quadrant->coords * get_effective_quadrant_size(p_quadrant->layer)); @@ -1862,7 +1861,6 @@ void TileMap::_scenes_update_dirty_quadrants(SelfList<TileMapQuadrant>::List &r_ Ref<PackedScene> packed_scene = scenes_collection_source->get_scene_tile_scene(c.alternative_tile); if (packed_scene.is_valid()) { Node *scene = packed_scene->instantiate(); - add_child(scene); Control *scene_as_control = Object::cast_to<Control>(scene); Node2D *scene_as_node2d = Object::cast_to<Node2D>(scene); if (scene_as_control) { @@ -1872,6 +1870,7 @@ void TileMap::_scenes_update_dirty_quadrants(SelfList<TileMapQuadrant>::List &r_ xform.set_origin(map_to_local(E_cell)); scene_as_node2d->set_transform(xform * scene_as_node2d->get_transform()); } + add_child(scene); q.scenes[E_cell] = scene->get_name(); } } @@ -3820,8 +3819,8 @@ void TileMap::draw_cells_outline(Control *p_control, RBSet<Vector2i> p_cells, Co #undef DRAW_SIDE_IF_NEEDED } -TypedArray<String> TileMap::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray TileMap::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); // Retrieve the set of Z index values with a Y-sorted layer. RBSet<int> y_sorted_z_index; diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h index a819eeab71..b1a2118c6b 100644 --- a/scene/2d/tile_map.h +++ b/scene/2d/tile_map.h @@ -406,7 +406,7 @@ public: GDVIRTUAL3(_tile_data_runtime_update, int, Vector2i, TileData *); // Configuration warnings. - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; TileMap(); ~TileMap(); diff --git a/scene/3d/area_3d.cpp b/scene/3d/area_3d.cpp index f118080009..cefa9eceff 100644 --- a/scene/3d/area_3d.cpp +++ b/scene/3d/area_3d.cpp @@ -489,6 +489,11 @@ TypedArray<Node3D> Area3D::get_overlapping_bodies() const { return ret; } +bool Area3D::has_overlapping_bodies() const { + ERR_FAIL_COND_V_MSG(!monitoring, false, "Can't find overlapping bodies when monitoring is off."); + return !body_map.is_empty(); +} + void Area3D::set_monitorable(bool p_enable) { ERR_FAIL_COND_MSG(locked || (is_inside_tree() && PhysicsServer3D::get_singleton()->is_flushing_queries()), "Function blocked during in/out signal. Use set_deferred(\"monitorable\", true/false)."); @@ -521,6 +526,11 @@ TypedArray<Area3D> Area3D::get_overlapping_areas() const { return ret; } +bool Area3D::has_overlapping_areas() const { + ERR_FAIL_COND_V_MSG(!monitoring, false, "Can't find overlapping areas when monitoring is off."); + return !area_map.is_empty(); +} + bool Area3D::overlaps_area(Node *p_area) const { ERR_FAIL_NULL_V(p_area, false); HashMap<ObjectID, AreaState>::ConstIterator E = area_map.find(p_area->get_instance_id()); @@ -686,6 +696,9 @@ void Area3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_overlapping_bodies"), &Area3D::get_overlapping_bodies); ClassDB::bind_method(D_METHOD("get_overlapping_areas"), &Area3D::get_overlapping_areas); + ClassDB::bind_method(D_METHOD("has_overlapping_bodies"), &Area3D::has_overlapping_bodies); + ClassDB::bind_method(D_METHOD("has_overlapping_areas"), &Area3D::has_overlapping_areas); + ClassDB::bind_method(D_METHOD("overlaps_body", "body"), &Area3D::overlaps_body); ClassDB::bind_method(D_METHOD("overlaps_area", "area"), &Area3D::overlaps_area); diff --git a/scene/3d/area_3d.h b/scene/3d/area_3d.h index 48364739b7..0f0bcc7ce0 100644 --- a/scene/3d/area_3d.h +++ b/scene/3d/area_3d.h @@ -201,6 +201,9 @@ public: TypedArray<Node3D> get_overlapping_bodies() const; TypedArray<Area3D> get_overlapping_areas() const; //function for script + bool has_overlapping_bodies() const; + bool has_overlapping_areas() const; + bool overlaps_area(Node *p_area) const; bool overlaps_body(Node *p_body) const; diff --git a/scene/3d/bone_attachment_3d.cpp b/scene/3d/bone_attachment_3d.cpp index b3ff6497a7..7b0a6c7e3e 100644 --- a/scene/3d/bone_attachment_3d.cpp +++ b/scene/3d/bone_attachment_3d.cpp @@ -100,8 +100,8 @@ void BoneAttachment3D::_get_property_list(List<PropertyInfo> *p_list) const { } } -TypedArray<String> BoneAttachment3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node3D::get_configuration_warnings(); +PackedStringArray BoneAttachment3D::get_configuration_warnings() const { + PackedStringArray warnings = Node3D::get_configuration_warnings(); if (use_external_skeleton) { if (external_skeleton_node_cache.is_null()) { diff --git a/scene/3d/bone_attachment_3d.h b/scene/3d/bone_attachment_3d.h index f85053e614..2db6ba6268 100644 --- a/scene/3d/bone_attachment_3d.h +++ b/scene/3d/bone_attachment_3d.h @@ -76,7 +76,7 @@ protected: #endif // TOOLS_ENABLED public: - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; void set_bone_name(const String &p_name); String get_bone_name() const; diff --git a/scene/3d/collision_object_3d.cpp b/scene/3d/collision_object_3d.cpp index f5e3e8b015..c3c1c8ba36 100644 --- a/scene/3d/collision_object_3d.cpp +++ b/scene/3d/collision_object_3d.cpp @@ -703,8 +703,8 @@ bool CollisionObject3D::get_capture_input_on_drag() const { return capture_input_on_drag; } -TypedArray<String> CollisionObject3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CollisionObject3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (shapes.is_empty()) { warnings.push_back(RTR("This node has no shape, so it can't collide or interact with other objects.\nConsider adding a CollisionShape3D or CollisionPolygon3D as a child to define its shape.")); diff --git a/scene/3d/collision_object_3d.h b/scene/3d/collision_object_3d.h index c638be9d90..1406e6c698 100644 --- a/scene/3d/collision_object_3d.h +++ b/scene/3d/collision_object_3d.h @@ -164,7 +164,7 @@ public: _FORCE_INLINE_ RID get_rid() const { return rid; } - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; CollisionObject3D(); ~CollisionObject3D(); diff --git a/scene/3d/collision_polygon_3d.cpp b/scene/3d/collision_polygon_3d.cpp index 90099d787b..81b2c85de4 100644 --- a/scene/3d/collision_polygon_3d.cpp +++ b/scene/3d/collision_polygon_3d.cpp @@ -167,8 +167,8 @@ void CollisionPolygon3D::set_margin(real_t p_margin) { } } -TypedArray<String> CollisionPolygon3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CollisionPolygon3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<CollisionObject3D>(get_parent())) { warnings.push_back(RTR("CollisionPolygon3D only serves to provide a collision shape to a CollisionObject3D derived node. Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, CharacterBody3D, etc. to give them a shape.")); diff --git a/scene/3d/collision_polygon_3d.h b/scene/3d/collision_polygon_3d.h index 74e5867a2f..bbcea539b2 100644 --- a/scene/3d/collision_polygon_3d.h +++ b/scene/3d/collision_polygon_3d.h @@ -74,7 +74,7 @@ public: real_t get_margin() const; void set_margin(real_t p_margin); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; CollisionPolygon3D(); }; diff --git a/scene/3d/collision_shape_3d.cpp b/scene/3d/collision_shape_3d.cpp index a9bc28b464..7a0001bc6f 100644 --- a/scene/3d/collision_shape_3d.cpp +++ b/scene/3d/collision_shape_3d.cpp @@ -114,8 +114,8 @@ void CollisionShape3D::resource_changed(Ref<Resource> res) { update_gizmos(); } -TypedArray<String> CollisionShape3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray CollisionShape3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<CollisionObject3D>(get_parent())) { warnings.push_back(RTR("CollisionShape3D only serves to provide a collision shape to a CollisionObject3D derived node. Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, CharacterBody3D, etc. to give them a shape.")); diff --git a/scene/3d/collision_shape_3d.h b/scene/3d/collision_shape_3d.h index 124c0d166d..70653daa19 100644 --- a/scene/3d/collision_shape_3d.h +++ b/scene/3d/collision_shape_3d.h @@ -62,7 +62,7 @@ public: void set_disabled(bool p_disabled); bool is_disabled() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; CollisionShape3D(); ~CollisionShape3D(); diff --git a/scene/3d/cpu_particles_3d.cpp b/scene/3d/cpu_particles_3d.cpp index d7bf76a6f6..ef373cf9ca 100644 --- a/scene/3d/cpu_particles_3d.cpp +++ b/scene/3d/cpu_particles_3d.cpp @@ -188,8 +188,8 @@ bool CPUParticles3D::get_fractional_delta() const { return fractional_delta; } -TypedArray<String> CPUParticles3D::get_configuration_warnings() const { - TypedArray<String> warnings = GeometryInstance3D::get_configuration_warnings(); +PackedStringArray CPUParticles3D::get_configuration_warnings() const { + PackedStringArray warnings = GeometryInstance3D::get_configuration_warnings(); bool mesh_found = false; bool anim_material_found = false; diff --git a/scene/3d/cpu_particles_3d.h b/scene/3d/cpu_particles_3d.h index d84b0aedd2..26c702172b 100644 --- a/scene/3d/cpu_particles_3d.h +++ b/scene/3d/cpu_particles_3d.h @@ -302,7 +302,7 @@ public: void set_gravity(const Vector3 &p_gravity); Vector3 get_gravity() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void restart(); diff --git a/scene/3d/decal.cpp b/scene/3d/decal.cpp index 460402ad1d..fc442986a8 100644 --- a/scene/3d/decal.cpp +++ b/scene/3d/decal.cpp @@ -158,8 +158,8 @@ void Decal::_validate_property(PropertyInfo &p_property) const { } } -TypedArray<String> Decal::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray Decal::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (textures[TEXTURE_ALBEDO].is_null() && textures[TEXTURE_NORMAL].is_null() && textures[TEXTURE_ORM].is_null() && textures[TEXTURE_EMISSION].is_null()) { warnings.push_back(RTR("The decal has no textures loaded into any of its texture properties, and will therefore not be visible.")); diff --git a/scene/3d/decal.h b/scene/3d/decal.h index 1a7d55b108..ab39350b75 100644 --- a/scene/3d/decal.h +++ b/scene/3d/decal.h @@ -65,7 +65,7 @@ protected: void _validate_property(PropertyInfo &p_property) const; public: - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; void set_extents(const Vector3 &p_extents); Vector3 get_extents() const; diff --git a/scene/3d/fog_volume.cpp b/scene/3d/fog_volume.cpp index cfee7028d4..4606e70310 100644 --- a/scene/3d/fog_volume.cpp +++ b/scene/3d/fog_volume.cpp @@ -99,8 +99,8 @@ AABB FogVolume::get_aabb() const { return AABB(); } -TypedArray<String> FogVolume::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray FogVolume::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); Ref<Environment> environment = get_viewport()->find_world_3d()->get_environment(); diff --git a/scene/3d/fog_volume.h b/scene/3d/fog_volume.h index fcdc1e2807..d79836be0e 100644 --- a/scene/3d/fog_volume.h +++ b/scene/3d/fog_volume.h @@ -62,7 +62,7 @@ public: Ref<Material> get_material() const; virtual AABB get_aabb() const override; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; FogVolume(); ~FogVolume(); diff --git a/scene/3d/gpu_particles_3d.cpp b/scene/3d/gpu_particles_3d.cpp index bd63939d74..dbbf196f7a 100644 --- a/scene/3d/gpu_particles_3d.cpp +++ b/scene/3d/gpu_particles_3d.cpp @@ -269,8 +269,8 @@ bool GPUParticles3D::get_interpolate() const { return interpolate; } -TypedArray<String> GPUParticles3D::get_configuration_warnings() const { - TypedArray<String> warnings = GeometryInstance3D::get_configuration_warnings(); +PackedStringArray GPUParticles3D::get_configuration_warnings() const { + PackedStringArray warnings = GeometryInstance3D::get_configuration_warnings(); if (RenderingServer::get_singleton()->is_low_end()) { warnings.push_back(RTR("GPU-based particles are not supported by the OpenGL video driver.\nUse the CPUParticles3D node instead. You can use the \"Convert to CPUParticles3D\" option for this purpose.")); diff --git a/scene/3d/gpu_particles_3d.h b/scene/3d/gpu_particles_3d.h index 2ad9672474..ef92218e4d 100644 --- a/scene/3d/gpu_particles_3d.h +++ b/scene/3d/gpu_particles_3d.h @@ -147,7 +147,7 @@ public: void set_draw_pass_mesh(int p_pass, const Ref<Mesh> &p_mesh); Ref<Mesh> get_draw_pass_mesh(int p_pass) const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_sub_emitter(const NodePath &p_path); NodePath get_sub_emitter() const; diff --git a/scene/3d/gpu_particles_collision_3d.cpp b/scene/3d/gpu_particles_collision_3d.cpp index 24bfa7b6de..d3f53d9c0d 100644 --- a/scene/3d/gpu_particles_collision_3d.cpp +++ b/scene/3d/gpu_particles_collision_3d.cpp @@ -503,8 +503,8 @@ Ref<Image> GPUParticlesCollisionSDF3D::bake() { return ret; } -TypedArray<String> GPUParticlesCollisionSDF3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray GPUParticlesCollisionSDF3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (bake_mask == 0) { warnings.push_back(RTR("The Bake Mask has no bits enabled, which means baking will not produce any collision for this GPUParticlesCollisionSDF3D.\nTo resolve this, enable at least one bit in the Bake Mask property.")); diff --git a/scene/3d/gpu_particles_collision_3d.h b/scene/3d/gpu_particles_collision_3d.h index 712bd015ff..548552bb70 100644 --- a/scene/3d/gpu_particles_collision_3d.h +++ b/scene/3d/gpu_particles_collision_3d.h @@ -162,7 +162,7 @@ protected: static void _bind_methods(); public: - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; void set_thickness(float p_thickness); float get_thickness() const; diff --git a/scene/3d/joint_3d.cpp b/scene/3d/joint_3d.cpp index 7dc094062b..1a18f43e7b 100644 --- a/scene/3d/joint_3d.cpp +++ b/scene/3d/joint_3d.cpp @@ -198,8 +198,8 @@ bool Joint3D::get_exclude_nodes_from_collision() const { return exclude_from_collision; } -TypedArray<String> Joint3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node3D::get_configuration_warnings(); +PackedStringArray Joint3D::get_configuration_warnings() const { + PackedStringArray warnings = Node3D::get_configuration_warnings(); if (!warning.is_empty()) { warnings.push_back(warning); diff --git a/scene/3d/joint_3d.h b/scene/3d/joint_3d.h index cb967023e8..5af427446f 100644 --- a/scene/3d/joint_3d.h +++ b/scene/3d/joint_3d.h @@ -63,7 +63,7 @@ protected: _FORCE_INLINE_ bool is_configured() const { return configured; } public: - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; void set_node_a(const NodePath &p_node_a); NodePath get_node_a() const; diff --git a/scene/3d/light_3d.cpp b/scene/3d/light_3d.cpp index e51f06e083..23fd091be6 100644 --- a/scene/3d/light_3d.cpp +++ b/scene/3d/light_3d.cpp @@ -578,8 +578,8 @@ OmniLight3D::ShadowMode OmniLight3D::get_shadow_mode() const { return shadow_mode; } -TypedArray<String> OmniLight3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray OmniLight3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!has_shadow() && get_projector().is_valid()) { warnings.push_back(RTR("Projector texture only works with shadows active.")); @@ -608,8 +608,8 @@ OmniLight3D::OmniLight3D() : set_param(PARAM_SHADOW_BIAS, 0.2); } -TypedArray<String> SpotLight3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray SpotLight3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (has_shadow() && get_param(PARAM_SPOT_ANGLE) >= 90.0) { warnings.push_back(RTR("A SpotLight3D with an angle wider than 90 degrees cannot cast shadows.")); diff --git a/scene/3d/light_3d.h b/scene/3d/light_3d.h index e43d6f0419..8da45bee79 100644 --- a/scene/3d/light_3d.h +++ b/scene/3d/light_3d.h @@ -216,7 +216,7 @@ public: void set_shadow_mode(ShadowMode p_mode); ShadowMode get_shadow_mode() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; OmniLight3D(); }; @@ -230,7 +230,7 @@ protected: static void _bind_methods(); public: - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; SpotLight3D() : Light3D(RenderingServer::LIGHT_SPOT) {} diff --git a/scene/3d/lightmap_gi.cpp b/scene/3d/lightmap_gi.cpp index b0bccc4571..555884f445 100644 --- a/scene/3d/lightmap_gi.cpp +++ b/scene/3d/lightmap_gi.cpp @@ -1418,7 +1418,8 @@ float LightmapGI::get_bias() const { } void LightmapGI::set_max_texture_size(int p_size) { - ERR_FAIL_COND(p_size < 2048); + ERR_FAIL_COND_MSG(p_size < 2048, vformat("The LightmapGI maximum texture size supplied (%d) is too small. The minimum allowed value is 2048.", p_size)); + ERR_FAIL_COND_MSG(p_size > 16384, vformat("The LightmapGI maximum texture size supplied (%d) is too large. The maximum allowed value is 16384.", p_size)); max_texture_size = p_size; } @@ -1506,7 +1507,7 @@ void LightmapGI::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "interior"), "set_interior", "is_interior"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_denoiser"), "set_use_denoiser", "is_using_denoiser"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "bias", PROPERTY_HINT_RANGE, "0.00001,0.1,0.00001,or_greater"), "set_bias", "get_bias"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "max_texture_size"), "set_max_texture_size", "get_max_texture_size"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "max_texture_size", PROPERTY_HINT_RANGE, "2048,16384,1"), "set_max_texture_size", "get_max_texture_size"); ADD_GROUP("Environment", "environment_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "environment_mode", PROPERTY_HINT_ENUM, "Disabled,Scene,Custom Sky,Custom Color"), "set_environment_mode", "get_environment_mode"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "environment_custom_sky", PROPERTY_HINT_RESOURCE_TYPE, "Sky"), "set_environment_custom_sky", "get_environment_custom_sky"); diff --git a/scene/3d/lightmap_gi.h b/scene/3d/lightmap_gi.h index 0062a4a093..1d282e92c8 100644 --- a/scene/3d/lightmap_gi.h +++ b/scene/3d/lightmap_gi.h @@ -142,16 +142,16 @@ public: private: BakeQuality bake_quality = BAKE_QUALITY_MEDIUM; bool use_denoiser = true; - int bounces = 1; + int bounces = 3; float bias = 0.0005; int max_texture_size = 16384; bool interior = false; - EnvironmentMode environment_mode = ENVIRONMENT_MODE_DISABLED; + EnvironmentMode environment_mode = ENVIRONMENT_MODE_SCENE; Ref<Sky> environment_custom_sky; - Color environment_custom_color = Color(0.2, 0.7, 1.0); + Color environment_custom_color = Color(1, 1, 1); float environment_custom_energy = 1.0; bool directional = false; - GenerateProbes gen_probes = GENERATE_PROBES_DISABLED; + GenerateProbes gen_probes = GENERATE_PROBES_SUBDIV_8; Ref<CameraAttributes> camera_attributes; Ref<LightmapGIData> light_data; diff --git a/scene/3d/navigation_agent_3d.cpp b/scene/3d/navigation_agent_3d.cpp index 34e84861a2..3476ced6ee 100644 --- a/scene/3d/navigation_agent_3d.cpp +++ b/scene/3d/navigation_agent_3d.cpp @@ -383,8 +383,8 @@ void NavigationAgent3D::_avoidance_done(Vector3 p_new_velocity) { emit_signal(SNAME("velocity_computed"), p_new_velocity); } -TypedArray<String> NavigationAgent3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationAgent3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<Node3D>(get_parent())) { warnings.push_back(RTR("The NavigationAgent3D can be used only under a Node3D inheriting parent node.")); diff --git a/scene/3d/navigation_agent_3d.h b/scene/3d/navigation_agent_3d.h index 35c1b1175a..eed6457f4a 100644 --- a/scene/3d/navigation_agent_3d.h +++ b/scene/3d/navigation_agent_3d.h @@ -167,7 +167,7 @@ public: void set_velocity(Vector3 p_velocity); void _avoidance_done(Vector3 p_new_velocity); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; private: void update_navigation(); diff --git a/scene/3d/navigation_link_3d.cpp b/scene/3d/navigation_link_3d.cpp index 47b602c966..78fe4754ea 100644 --- a/scene/3d/navigation_link_3d.cpp +++ b/scene/3d/navigation_link_3d.cpp @@ -378,8 +378,8 @@ void NavigationLink3D::set_travel_cost(real_t p_travel_cost) { NavigationServer3D::get_singleton()->link_set_travel_cost(link, travel_cost); } -TypedArray<String> NavigationLink3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationLink3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (start_location.is_equal_approx(end_location)) { warnings.push_back(RTR("NavigationLink3D start location should be different than the end location to be useful.")); diff --git a/scene/3d/navigation_link_3d.h b/scene/3d/navigation_link_3d.h index 1f88075527..1fc03546fa 100644 --- a/scene/3d/navigation_link_3d.h +++ b/scene/3d/navigation_link_3d.h @@ -84,7 +84,7 @@ public: void set_travel_cost(real_t p_travel_cost); real_t get_travel_cost() const { return travel_cost; } - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; }; #endif // NAVIGATION_LINK_3D_H diff --git a/scene/3d/navigation_obstacle_3d.cpp b/scene/3d/navigation_obstacle_3d.cpp index 953e52e591..07d8cd9289 100644 --- a/scene/3d/navigation_obstacle_3d.cpp +++ b/scene/3d/navigation_obstacle_3d.cpp @@ -37,6 +37,9 @@ void NavigationObstacle3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_rid"), &NavigationObstacle3D::get_rid); + ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &NavigationObstacle3D::set_navigation_map); + ClassDB::bind_method(D_METHOD("get_navigation_map"), &NavigationObstacle3D::get_navigation_map); + ClassDB::bind_method(D_METHOD("set_estimate_radius", "estimate_radius"), &NavigationObstacle3D::set_estimate_radius); ClassDB::bind_method(D_METHOD("is_radius_estimated"), &NavigationObstacle3D::is_radius_estimated); ClassDB::bind_method(D_METHOD("set_radius", "radius"), &NavigationObstacle3D::set_radius); @@ -56,28 +59,26 @@ void NavigationObstacle3D::_validate_property(PropertyInfo &p_property) const { void NavigationObstacle3D::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - parent_node3d = Object::cast_to<Node3D>(get_parent()); - reevaluate_agent_radius(); - if (parent_node3d != nullptr) { - // place agent on navigation map first or else the RVO agent callback creation fails silently later - NavigationServer3D::get_singleton()->agent_set_map(get_rid(), parent_node3d->get_world_3d()->get_navigation_map()); - } + case NOTIFICATION_POST_ENTER_TREE: { + set_agent_parent(get_parent()); set_physics_process_internal(true); } break; case NOTIFICATION_EXIT_TREE: { - parent_node3d = nullptr; + set_agent_parent(nullptr); set_physics_process_internal(false); } break; case NOTIFICATION_PARENTED: { - parent_node3d = Object::cast_to<Node3D>(get_parent()); - reevaluate_agent_radius(); + if (is_inside_tree() && (get_parent() != parent_node3d)) { + set_agent_parent(get_parent()); + set_physics_process_internal(true); + } } break; case NOTIFICATION_UNPARENTED: { - parent_node3d = nullptr; + set_agent_parent(nullptr); + set_physics_process_internal(false); } break; case NOTIFICATION_PAUSED: { @@ -125,8 +126,8 @@ NavigationObstacle3D::~NavigationObstacle3D() { agent = RID(); // Pointless } -TypedArray<String> NavigationObstacle3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationObstacle3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<Node3D>(get_parent())) { warnings.push_back(RTR("The NavigationObstacle3D only serves to provide collision avoidance to a Node3D inheriting parent object.")); @@ -189,6 +190,35 @@ real_t NavigationObstacle3D::estimate_agent_radius() const { return 1.0; // Never a 0 radius } +void NavigationObstacle3D::set_agent_parent(Node *p_agent_parent) { + if (Object::cast_to<Node3D>(p_agent_parent) != nullptr) { + parent_node3d = Object::cast_to<Node3D>(p_agent_parent); + if (map_override.is_valid()) { + NavigationServer3D::get_singleton()->agent_set_map(get_rid(), map_override); + } else { + NavigationServer3D::get_singleton()->agent_set_map(get_rid(), parent_node3d->get_world_3d()->get_navigation_map()); + } + reevaluate_agent_radius(); + } else { + parent_node3d = nullptr; + NavigationServer3D::get_singleton()->agent_set_map(get_rid(), RID()); + } +} + +void NavigationObstacle3D::set_navigation_map(RID p_navigation_map) { + map_override = p_navigation_map; + NavigationServer3D::get_singleton()->agent_set_map(agent, map_override); +} + +RID NavigationObstacle3D::get_navigation_map() const { + if (map_override.is_valid()) { + return map_override; + } else if (parent_node3d != nullptr) { + return parent_node3d->get_world_3d()->get_navigation_map(); + } + return RID(); +} + void NavigationObstacle3D::set_estimate_radius(bool p_estimate_radius) { estimate_radius = p_estimate_radius; notify_property_list_changed(); diff --git a/scene/3d/navigation_obstacle_3d.h b/scene/3d/navigation_obstacle_3d.h index 7f6af668b6..f242d2f99e 100644 --- a/scene/3d/navigation_obstacle_3d.h +++ b/scene/3d/navigation_obstacle_3d.h @@ -37,8 +37,10 @@ class NavigationObstacle3D : public Node { GDCLASS(NavigationObstacle3D, Node); Node3D *parent_node3d = nullptr; + RID agent; RID map_before_pause; + RID map_override; bool estimate_radius = true; real_t radius = 1.0; @@ -56,6 +58,11 @@ public: return agent; } + void set_agent_parent(Node *p_agent_parent); + + void set_navigation_map(RID p_navigation_map); + RID get_navigation_map() const; + void set_estimate_radius(bool p_estimate_radius); bool is_radius_estimated() const { return estimate_radius; @@ -65,7 +72,7 @@ public: return radius; } - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; private: void initialize_agent(); diff --git a/scene/3d/navigation_region_3d.cpp b/scene/3d/navigation_region_3d.cpp index 29ad1ba93d..bfc4353138 100644 --- a/scene/3d/navigation_region_3d.cpp +++ b/scene/3d/navigation_region_3d.cpp @@ -260,8 +260,8 @@ void NavigationRegion3D::_bake_finished(Ref<NavigationMesh> p_nav_mesh) { emit_signal(SNAME("bake_finished")); } -TypedArray<String> NavigationRegion3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray NavigationRegion3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible_in_tree() && is_inside_tree()) { if (!navmesh.is_valid()) { @@ -539,6 +539,7 @@ void NavigationRegion3D::_update_debug_edge_connections_mesh() { } Vector<Vector3> vertex_array; + vertex_array.resize(connections_count * 6); for (int i = 0; i < connections_count; i++) { Vector3 connection_pathway_start = NavigationServer3D::get_singleton()->region_get_connection_pathway_start(region, i); diff --git a/scene/3d/navigation_region_3d.h b/scene/3d/navigation_region_3d.h index ba326abb46..7d16d81d77 100644 --- a/scene/3d/navigation_region_3d.h +++ b/scene/3d/navigation_region_3d.h @@ -90,7 +90,7 @@ public: void bake_navigation_mesh(bool p_on_thread); void _bake_finished(Ref<NavigationMesh> p_nav_mesh); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; NavigationRegion3D(); ~NavigationRegion3D(); diff --git a/scene/3d/node_3d.cpp b/scene/3d/node_3d.cpp index 59ec036558..ebf26996dd 100644 --- a/scene/3d/node_3d.cpp +++ b/scene/3d/node_3d.cpp @@ -1037,6 +1037,7 @@ void Node3D::_bind_methods() { BIND_CONSTANT(NOTIFICATION_ENTER_WORLD); BIND_CONSTANT(NOTIFICATION_EXIT_WORLD); BIND_CONSTANT(NOTIFICATION_VISIBILITY_CHANGED); + BIND_CONSTANT(NOTIFICATION_LOCAL_TRANSFORM_CHANGED); BIND_ENUM_CONSTANT(ROTATION_EDIT_MODE_EULER); BIND_ENUM_CONSTANT(ROTATION_EDIT_MODE_QUATERNION); diff --git a/scene/3d/occluder_instance_3d.cpp b/scene/3d/occluder_instance_3d.cpp index 015cb9a21d..4e1ed5654a 100644 --- a/scene/3d/occluder_instance_3d.cpp +++ b/scene/3d/occluder_instance_3d.cpp @@ -682,8 +682,8 @@ OccluderInstance3D::BakeError OccluderInstance3D::bake_scene(Node *p_from_node, return BAKE_ERROR_OK; } -TypedArray<String> OccluderInstance3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray OccluderInstance3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!bool(GLOBAL_GET("rendering/occlusion_culling/use_occlusion_culling"))) { warnings.push_back(RTR("Occlusion culling is disabled in the Project Settings, which means occlusion culling won't be performed in the root viewport.\nTo resolve this, open the Project Settings and enable Rendering > Occlusion Culling > Use Occlusion Culling.")); diff --git a/scene/3d/occluder_instance_3d.h b/scene/3d/occluder_instance_3d.h index 69a80e63fc..f507fee024 100644 --- a/scene/3d/occluder_instance_3d.h +++ b/scene/3d/occluder_instance_3d.h @@ -181,7 +181,7 @@ protected: static void _bind_methods(); public: - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; enum BakeError { BAKE_ERROR_OK, diff --git a/scene/3d/path_3d.cpp b/scene/3d/path_3d.cpp index 2d1f4a579b..123a044b84 100644 --- a/scene/3d/path_3d.cpp +++ b/scene/3d/path_3d.cpp @@ -341,8 +341,8 @@ void PathFollow3D::_validate_property(PropertyInfo &p_property) const { } } -TypedArray<String> PathFollow3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray PathFollow3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible_in_tree() && is_inside_tree()) { if (!Object::cast_to<Path3D>(get_parent())) { diff --git a/scene/3d/path_3d.h b/scene/3d/path_3d.h index 45fa2c8917..b161b12185 100644 --- a/scene/3d/path_3d.h +++ b/scene/3d/path_3d.h @@ -112,7 +112,7 @@ public: void set_cubic_interpolation(bool p_enable); bool get_cubic_interpolation() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; PathFollow3D() {} }; diff --git a/scene/3d/physics_body_3d.cpp b/scene/3d/physics_body_3d.cpp index 8888aa183a..0eefb45c04 100644 --- a/scene/3d/physics_body_3d.cpp +++ b/scene/3d/physics_body_3d.cpp @@ -34,8 +34,8 @@ #include "scene/scene_string_names.h" void PhysicsBody3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("move_and_collide", "distance", "test_only", "safe_margin", "max_collisions"), &PhysicsBody3D::_move, DEFVAL(false), DEFVAL(0.001), DEFVAL(1)); - ClassDB::bind_method(D_METHOD("test_move", "from", "distance", "collision", "safe_margin", "max_collisions"), &PhysicsBody3D::test_move, DEFVAL(Variant()), DEFVAL(0.001), DEFVAL(1)); + ClassDB::bind_method(D_METHOD("move_and_collide", "distance", "test_only", "safe_margin", "recovery_as_collision", "max_collisions"), &PhysicsBody3D::_move, DEFVAL(false), DEFVAL(0.001), DEFVAL(false), DEFVAL(1)); + ClassDB::bind_method(D_METHOD("test_move", "from", "distance", "collision", "safe_margin", "recovery_as_collision", "max_collisions"), &PhysicsBody3D::test_move, DEFVAL(Variant()), DEFVAL(0.001), DEFVAL(false), DEFVAL(1)); ClassDB::bind_method(D_METHOD("set_axis_lock", "axis", "lock"), &PhysicsBody3D::set_axis_lock); ClassDB::bind_method(D_METHOD("get_axis_lock", "axis"), &PhysicsBody3D::get_axis_lock); @@ -91,10 +91,10 @@ void PhysicsBody3D::remove_collision_exception_with(Node *p_node) { PhysicsServer3D::get_singleton()->body_remove_collision_exception(get_rid(), collision_object->get_rid()); } -Ref<KinematicCollision3D> PhysicsBody3D::_move(const Vector3 &p_distance, bool p_test_only, real_t p_margin, int p_max_collisions) { +Ref<KinematicCollision3D> PhysicsBody3D::_move(const Vector3 &p_distance, bool p_test_only, real_t p_margin, bool p_recovery_as_collision, int p_max_collisions) { PhysicsServer3D::MotionParameters parameters(get_global_transform(), p_distance, p_margin); parameters.max_collisions = p_max_collisions; - parameters.recovery_as_collision = false; // Don't report collisions generated only from recovery. + parameters.recovery_as_collision = p_recovery_as_collision; PhysicsServer3D::MotionResult result; @@ -169,7 +169,7 @@ bool PhysicsBody3D::move_and_collide(const PhysicsServer3D::MotionParameters &p_ return colliding; } -bool PhysicsBody3D::test_move(const Transform3D &p_from, const Vector3 &p_distance, const Ref<KinematicCollision3D> &r_collision, real_t p_margin, int p_max_collisions) { +bool PhysicsBody3D::test_move(const Transform3D &p_from, const Vector3 &p_distance, const Ref<KinematicCollision3D> &r_collision, real_t p_margin, bool p_recovery_as_collision, int p_max_collisions) { ERR_FAIL_COND_V(!is_inside_tree(), false); PhysicsServer3D::MotionResult *r = nullptr; @@ -182,7 +182,7 @@ bool PhysicsBody3D::test_move(const Transform3D &p_from, const Vector3 &p_distan } PhysicsServer3D::MotionParameters parameters(p_from, p_distance, p_margin); - parameters.recovery_as_collision = false; // Don't report collisions generated only from recovery. + parameters.recovery_as_collision = p_recovery_as_collision; return PhysicsServer3D::get_singleton()->body_test_motion(get_rid(), parameters, r); } @@ -317,11 +317,6 @@ void AnimatableBody3D::_update_kinematic_motion() { } } -void AnimatableBody3D::_body_state_changed_callback(void *p_instance, PhysicsDirectBodyState3D *p_state) { - AnimatableBody3D *body = (AnimatableBody3D *)p_instance; - body->_body_state_changed(p_state); -} - void AnimatableBody3D::_body_state_changed(PhysicsDirectBodyState3D *p_state) { linear_velocity = p_state->get_linear_velocity(); angular_velocity = p_state->get_angular_velocity(); @@ -373,7 +368,7 @@ void AnimatableBody3D::_bind_methods() { AnimatableBody3D::AnimatableBody3D() : StaticBody3D(PhysicsServer3D::BODY_MODE_KINEMATIC) { - PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), this, _body_state_changed_callback); + PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), callable_mp(this, &AnimatableBody3D::_body_state_changed)); } void RigidBody3D::_body_enter_tree(ObjectID p_id) { @@ -488,11 +483,6 @@ struct _RigidBodyInOut { int local_shape = 0; }; -void RigidBody3D::_body_state_changed_callback(void *p_instance, PhysicsDirectBodyState3D *p_state) { - RigidBody3D *body = (RigidBody3D *)p_instance; - body->_body_state_changed(p_state); -} - void RigidBody3D::_body_state_changed(PhysicsDirectBodyState3D *p_state) { set_ignore_transform_notification(true); set_global_transform(p_state->get_transform()); @@ -982,10 +972,10 @@ TypedArray<Node3D> RigidBody3D::get_colliding_bodies() const { return ret; } -TypedArray<String> RigidBody3D::get_configuration_warnings() const { +PackedStringArray RigidBody3D::get_configuration_warnings() const { Transform3D t = get_transform(); - TypedArray<String> warnings = Node::get_configuration_warnings(); + PackedStringArray warnings = Node::get_configuration_warnings(); if (ABS(t.basis.get_column(0).length() - 1.0) > 0.05 || ABS(t.basis.get_column(1).length() - 1.0) > 0.05 || ABS(t.basis.get_column(2).length() - 1.0) > 0.05) { warnings.push_back(RTR("Size changes to RigidBody will be overridden by the physics engine when running.\nChange the size in children collision shapes instead.")); @@ -1139,7 +1129,7 @@ void RigidBody3D::_validate_property(PropertyInfo &p_property) const { RigidBody3D::RigidBody3D() : PhysicsBody3D(PhysicsServer3D::BODY_MODE_RIGID) { - PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), this, _body_state_changed_callback); + PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), callable_mp(this, &RigidBody3D::_body_state_changed)); } RigidBody3D::~RigidBody3D() { @@ -1210,7 +1200,6 @@ bool CharacterBody3D::move_and_slide() { if (!current_platform_velocity.is_zero_approx()) { PhysicsServer3D::MotionParameters parameters(get_global_transform(), current_platform_velocity * delta, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. parameters.exclude_bodies.insert(platform_rid); if (platform_object_id.is_valid()) { @@ -1274,8 +1263,7 @@ void CharacterBody3D::_move_and_slide_grounded(double p_delta, bool p_was_on_flo for (int iteration = 0; iteration < max_slides; ++iteration) { PhysicsServer3D::MotionParameters parameters(get_global_transform(), motion, margin); - parameters.max_collisions = 4; - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. + parameters.max_collisions = 6; // There can be 4 collisions between 2 walls + 2 more for the floor. PhysicsServer3D::MotionResult result; bool collided = move_and_collide(parameters, result, false, !sliding_enabled); @@ -1520,7 +1508,6 @@ void CharacterBody3D::_move_and_slide_floating(double p_delta) { bool first_slide = true; for (int iteration = 0; iteration < max_slides; ++iteration) { PhysicsServer3D::MotionParameters parameters(get_global_transform(), motion, margin); - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. PhysicsServer3D::MotionResult result; bool collided = move_and_collide(parameters, result, false, false); @@ -1575,7 +1562,7 @@ void CharacterBody3D::_snap_on_floor(bool p_was_on_floor, bool p_vel_dir_facing_ PhysicsServer3D::MotionParameters parameters(get_global_transform(), -up_direction * length, margin); parameters.max_collisions = 4; - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. + parameters.recovery_as_collision = true; // Report margin recovery as collision to improve floor detection. parameters.collide_separation_ray = true; PhysicsServer3D::MotionResult result; @@ -1611,7 +1598,7 @@ bool CharacterBody3D::_on_floor_if_snapped(bool p_was_on_floor, bool p_vel_dir_f PhysicsServer3D::MotionParameters parameters(get_global_transform(), -up_direction * length, margin); parameters.max_collisions = 4; - parameters.recovery_as_collision = true; // Also report collisions generated only from recovery. + parameters.recovery_as_collision = true; // Report margin recovery as collision to improve floor detection. parameters.collide_separation_ray = true; PhysicsServer3D::MotionResult result; @@ -2903,11 +2890,6 @@ void PhysicalBone3D::_notification(int p_what) { } } -void PhysicalBone3D::_body_state_changed_callback(void *p_instance, PhysicsDirectBodyState3D *p_state) { - PhysicalBone3D *bone = (PhysicalBone3D *)p_instance; - bone->_body_state_changed(p_state); -} - void PhysicalBone3D::_body_state_changed(PhysicsDirectBodyState3D *p_state) { if (!simulate_physics || !_internal_simulate_physics) { return; @@ -3425,7 +3407,7 @@ void PhysicalBone3D::_start_physics_simulation() { PhysicsServer3D::get_singleton()->body_set_collision_layer(get_rid(), get_collision_layer()); PhysicsServer3D::get_singleton()->body_set_collision_mask(get_rid(), get_collision_mask()); PhysicsServer3D::get_singleton()->body_set_collision_priority(get_rid(), get_collision_priority()); - PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), this, _body_state_changed_callback); + PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), callable_mp(this, &PhysicalBone3D::_body_state_changed)); set_as_top_level(true); _internal_simulate_physics = true; } @@ -3446,7 +3428,7 @@ void PhysicalBone3D::_stop_physics_simulation() { PhysicsServer3D::get_singleton()->body_set_collision_priority(get_rid(), 1.0); } if (_internal_simulate_physics) { - PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), nullptr, nullptr); + PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), Callable()); parent_skeleton->set_bone_global_pose_override(bone_id, Transform3D(), 0.0, false); set_as_top_level(false); _internal_simulate_physics = false; diff --git a/scene/3d/physics_body_3d.h b/scene/3d/physics_body_3d.h index 184d8b00d0..4b874b91d9 100644 --- a/scene/3d/physics_body_3d.h +++ b/scene/3d/physics_body_3d.h @@ -50,11 +50,11 @@ protected: uint16_t locked_axis = 0; - Ref<KinematicCollision3D> _move(const Vector3 &p_distance, bool p_test_only = false, real_t p_margin = 0.001, int p_max_collisions = 1); + Ref<KinematicCollision3D> _move(const Vector3 &p_distance, bool p_test_only = false, real_t p_margin = 0.001, bool p_recovery_as_collision = false, int p_max_collisions = 1); public: bool move_and_collide(const PhysicsServer3D::MotionParameters &p_parameters, PhysicsServer3D::MotionResult &r_result, bool p_test_only = false, bool p_cancel_sliding = true); - bool test_move(const Transform3D &p_from, const Vector3 &p_distance, const Ref<KinematicCollision3D> &r_collision = Ref<KinematicCollision3D>(), real_t p_margin = 0.001, int p_max_collisions = 1); + bool test_move(const Transform3D &p_from, const Vector3 &p_distance, const Ref<KinematicCollision3D> &r_collision = Ref<KinematicCollision3D>(), real_t p_margin = 0.001, bool p_recovery_as_collision = false, int p_max_collisions = 1); void set_axis_lock(PhysicsServer3D::BodyAxis p_axis, bool p_lock); bool get_axis_lock(PhysicsServer3D::BodyAxis p_axis) const; @@ -325,7 +325,7 @@ public: void set_constant_torque(const Vector3 &p_torque); Vector3 get_constant_torque() const; - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; RigidBody3D(); ~RigidBody3D(); diff --git a/scene/3d/remote_transform_3d.cpp b/scene/3d/remote_transform_3d.cpp index 9979052385..ff05e88241 100644 --- a/scene/3d/remote_transform_3d.cpp +++ b/scene/3d/remote_transform_3d.cpp @@ -178,8 +178,8 @@ void RemoteTransform3D::force_update_cache() { _update_cache(); } -TypedArray<String> RemoteTransform3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray RemoteTransform3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!has_node(remote_node) || !Object::cast_to<Node3D>(get_node(remote_node))) { warnings.push_back(RTR("The \"Remote Path\" property must point to a valid Node3D or Node3D-derived node to work.")); diff --git a/scene/3d/remote_transform_3d.h b/scene/3d/remote_transform_3d.h index ab134c1261..cc83661f26 100644 --- a/scene/3d/remote_transform_3d.h +++ b/scene/3d/remote_transform_3d.h @@ -70,7 +70,7 @@ public: void force_update_cache(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; RemoteTransform3D(); }; diff --git a/scene/3d/shape_cast_3d.cpp b/scene/3d/shape_cast_3d.cpp index a2fecf9c31..e7d1a8ec7d 100644 --- a/scene/3d/shape_cast_3d.cpp +++ b/scene/3d/shape_cast_3d.cpp @@ -167,8 +167,8 @@ void ShapeCast3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::COLOR, "debug_shape_custom_color"), "set_debug_shape_custom_color", "get_debug_shape_custom_color"); } -TypedArray<String> ShapeCast3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node3D::get_configuration_warnings(); +PackedStringArray ShapeCast3D::get_configuration_warnings() const { + PackedStringArray warnings = Node3D::get_configuration_warnings(); if (shape.is_null()) { warnings.push_back(RTR("This node cannot interact with other objects unless a Shape3D is assigned.")); diff --git a/scene/3d/shape_cast_3d.h b/scene/3d/shape_cast_3d.h index 5bda15e4b0..2526d8d32c 100644 --- a/scene/3d/shape_cast_3d.h +++ b/scene/3d/shape_cast_3d.h @@ -136,7 +136,7 @@ public: void remove_exception(const Object *p_object); void clear_exceptions(); - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; }; #endif // SHAPE_CAST_3D_H diff --git a/scene/3d/skeleton_3d.cpp b/scene/3d/skeleton_3d.cpp index e04e1866db..85b2c5154b 100644 --- a/scene/3d/skeleton_3d.cpp +++ b/scene/3d/skeleton_3d.cpp @@ -45,7 +45,6 @@ void SkinReference::_skin_changed() { } void SkinReference::_bind_methods() { - ClassDB::bind_method(D_METHOD("_skin_changed"), &SkinReference::_skin_changed); ClassDB::bind_method(D_METHOD("get_skeleton"), &SkinReference::get_skeleton); ClassDB::bind_method(D_METHOD("get_skin"), &SkinReference::get_skin); } @@ -1007,7 +1006,7 @@ Ref<SkinReference> Skeleton3D::register_skin(const Ref<Skin> &p_skin) { skin_bindings.insert(skin_ref.operator->()); - skin_ref->skin->connect("changed", Callable(skin_ref.operator->(), "_skin_changed")); + skin_ref->skin->connect("changed", callable_mp(skin_ref.operator->(), &SkinReference::_skin_changed)); _make_dirty(); // Skin needs to be updated, so update skeleton. diff --git a/scene/3d/skeleton_3d.h b/scene/3d/skeleton_3d.h index 5e49dfa1f4..c2e9cfcced 100644 --- a/scene/3d/skeleton_3d.h +++ b/scene/3d/skeleton_3d.h @@ -51,12 +51,14 @@ class SkinReference : public RefCounted { uint64_t skeleton_version = 0; Vector<uint32_t> skin_bone_indices; uint32_t *skin_bone_indices_ptrs = nullptr; - void _skin_changed(); protected: static void _bind_methods(); public: + // Public for use with callable_mp. + void _skin_changed(); + RID get_skeleton() const; Ref<Skin> get_skin() const; ~SkinReference(); diff --git a/scene/3d/soft_body_3d.cpp b/scene/3d/soft_body_3d.cpp index 47858b372c..2466b71aea 100644 --- a/scene/3d/soft_body_3d.cpp +++ b/scene/3d/soft_body_3d.cpp @@ -384,8 +384,8 @@ void SoftBody3D::_bind_methods() { BIND_ENUM_CONSTANT(DISABLE_MODE_KEEP_ACTIVE); } -TypedArray<String> SoftBody3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray SoftBody3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (mesh.is_null()) { warnings.push_back(RTR("This body will be ignored until you set a mesh.")); diff --git a/scene/3d/soft_body_3d.h b/scene/3d/soft_body_3d.h index 40f3d6f1f4..9ec1f18396 100644 --- a/scene/3d/soft_body_3d.h +++ b/scene/3d/soft_body_3d.h @@ -125,7 +125,7 @@ protected: void _notification(int p_what); static void _bind_methods(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; public: RID get_physics_rid() const { return physics_rid; } diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp index 4515277dc3..4b83bcdfc4 100644 --- a/scene/3d/sprite_3d.cpp +++ b/scene/3d/sprite_3d.cpp @@ -30,7 +30,6 @@ #include "sprite_3d.h" -#include "core/core_string_names.h" #include "scene/scene_string_names.h" Color SpriteBase3D::_get_color_accum() { @@ -58,7 +57,7 @@ void SpriteBase3D::_propagate_color_changed() { } color_dirty = true; - _queue_update(); + _queue_redraw(); for (SpriteBase3D *&E : children) { E->_propagate_color_changed(); @@ -88,9 +87,185 @@ void SpriteBase3D::_notification(int p_what) { } } +void SpriteBase3D::draw_texture_rect(Ref<Texture2D> p_texture, Rect2 p_dst_rect, Rect2 p_src_rect) { + ERR_FAIL_COND(p_texture.is_null()); + + Rect2 final_rect; + Rect2 final_src_rect; + if (!p_texture->get_rect_region(p_dst_rect, p_src_rect, final_rect, final_src_rect)) { + return; + } + + if (final_rect.size.x == 0 || final_rect.size.y == 0) { + return; + } + + // 2D: 3D plane (axes match exactly when `axis == Vector3::AXIS_Z`): + // -X+ -X+ + // - + + // Y +--------+ +--------+ +--------+ Y +--------+ + // + | +--+ | | | (2) | | - | 0--1 | + // | |ab| | (1) | +--+ | (3) | 3--2 | | |ab| | + // | |cd| | --> | |ab| | --> | |cd| | <==> | |cd| | + // | +--+ | | |cd| | | |ab| | | 3--2 | + // | | | +--+ | | 0--1 | | | + // +--------+ +--------+ +--------+ +--------+ + + // (1) Y-wise shift `final_rect` within `p_dst_rect` so after inverting Y + // axis distances between top/bottom borders will be preserved (so for + // example AtlasTextures with vertical margins will look the same in 2D/3D). + final_rect.position.y = (p_dst_rect.position.y + p_dst_rect.size.y) - ((final_rect.position.y + final_rect.size.y) - p_dst_rect.position.y); + + Color color = _get_color_accum(); + + real_t pixel_size = get_pixel_size(); + + // (2) Order vertices (0123) bottom-top in 2D / top-bottom in 3D. + Vector2 vertices[4] = { + (final_rect.position + Vector2(0, final_rect.size.y)) * pixel_size, + (final_rect.position + final_rect.size) * pixel_size, + (final_rect.position + Vector2(final_rect.size.x, 0)) * pixel_size, + final_rect.position * pixel_size, + }; + + Vector2 src_tsize = p_texture->get_size(); + + // Properly setup UVs for impostor textures (AtlasTexture). + Ref<AtlasTexture> atlas_tex = p_texture; + if (atlas_tex != nullptr) { + src_tsize[0] = atlas_tex->get_atlas()->get_width(); + src_tsize[1] = atlas_tex->get_atlas()->get_height(); + } + + // (3) Assign UVs (abcd) according to the vertices order (bottom-top in 2D / top-bottom in 3D). + Vector2 uvs[4] = { + final_src_rect.position / src_tsize, + (final_src_rect.position + Vector2(final_src_rect.size.x, 0)) / src_tsize, + (final_src_rect.position + final_src_rect.size) / src_tsize, + (final_src_rect.position + Vector2(0, final_src_rect.size.y)) / src_tsize, + }; + + if (is_flipped_h()) { + SWAP(uvs[0], uvs[1]); + SWAP(uvs[2], uvs[3]); + } + + if (is_flipped_v()) { + SWAP(uvs[0], uvs[3]); + SWAP(uvs[1], uvs[2]); + } + + Vector3 normal; + int axis = get_axis(); + normal[axis] = 1.0; + + Plane tangent; + if (axis == Vector3::AXIS_X) { + tangent = Plane(0, 0, -1, 1); + } else { + tangent = Plane(1, 0, 0, 1); + } + + int x_axis = ((axis + 1) % 3); + int y_axis = ((axis + 2) % 3); + + if (axis != Vector3::AXIS_Z) { + SWAP(x_axis, y_axis); + + for (int i = 0; i < 4; i++) { + //uvs[i] = Vector2(1.0,1.0)-uvs[i]; + //SWAP(vertices[i].x,vertices[i].y); + if (axis == Vector3::AXIS_Y) { + vertices[i].y = -vertices[i].y; + } else if (axis == Vector3::AXIS_X) { + vertices[i].x = -vertices[i].x; + } + } + } + + AABB aabb; + + // Everything except position and UV is compressed. + uint8_t *vertex_write_buffer = vertex_buffer.ptrw(); + uint8_t *attribute_write_buffer = attribute_buffer.ptrw(); + + uint32_t v_normal; + { + Vector3 n = normal * Vector3(0.5, 0.5, 0.5) + Vector3(0.5, 0.5, 0.5); + + Vector2 res = n.octahedron_encode(); + uint32_t value = 0; + value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); + value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; + + v_normal = value; + } + uint32_t v_tangent; + { + Plane t = tangent; + Vector2 res = t.normal.octahedron_tangent_encode(t.d); + uint32_t value = 0; + value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); + value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; + + v_tangent = value; + } + + uint8_t v_color[4] = { + uint8_t(CLAMP(color.r * 255.0, 0.0, 255.0)), + uint8_t(CLAMP(color.g * 255.0, 0.0, 255.0)), + uint8_t(CLAMP(color.b * 255.0, 0.0, 255.0)), + uint8_t(CLAMP(color.a * 255.0, 0.0, 255.0)) + }; + + for (int i = 0; i < 4; i++) { + Vector3 vtx; + vtx[x_axis] = vertices[i][0]; + vtx[y_axis] = vertices[i][1]; + if (i == 0) { + aabb.position = vtx; + aabb.size = Vector3(); + } else { + aabb.expand_to(vtx); + } + + float v_uv[2] = { (float)uvs[i].x, (float)uvs[i].y }; + memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_TEX_UV]], v_uv, 8); + + float v_vertex[3] = { (float)vtx.x, (float)vtx.y, (float)vtx.z }; + + memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_VERTEX]], &v_vertex, sizeof(float) * 3); + memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_NORMAL]], &v_normal, 4); + memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_TANGENT]], &v_tangent, 4); + memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_COLOR]], v_color, 4); + } + + RID mesh = get_mesh(); + RS::get_singleton()->mesh_surface_update_vertex_region(mesh, 0, 0, vertex_buffer); + RS::get_singleton()->mesh_surface_update_attribute_region(mesh, 0, 0, attribute_buffer); + + RS::get_singleton()->mesh_set_custom_aabb(mesh, aabb); + set_aabb(aabb); + + RID shader_rid; + StandardMaterial3D::get_material_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS, get_billboard_mode() == StandardMaterial3D::BILLBOARD_ENABLED, get_billboard_mode() == StandardMaterial3D::BILLBOARD_FIXED_Y, false, get_draw_flag(FLAG_DISABLE_DEPTH_TEST), get_draw_flag(FLAG_FIXED_SIZE), get_texture_filter(), &shader_rid); + if (last_shader != shader_rid) { + RS::get_singleton()->material_set_shader(get_material(), shader_rid); + last_shader = shader_rid; + } + if (last_texture != p_texture->get_rid()) { + RS::get_singleton()->material_set_param(get_material(), "texture_albedo", p_texture->get_rid()); + last_texture = p_texture->get_rid(); + } + if (get_alpha_cut_mode() == ALPHA_CUT_DISABLED) { + RS::get_singleton()->material_set_render_priority(get_material(), get_render_priority()); + RS::get_singleton()->mesh_surface_set_material(mesh, 0, get_material()); + } +} + void SpriteBase3D::set_centered(bool p_center) { centered = p_center; - _queue_update(); + _queue_redraw(); } bool SpriteBase3D::is_centered() const { @@ -99,7 +274,7 @@ bool SpriteBase3D::is_centered() const { void SpriteBase3D::set_offset(const Point2 &p_offset) { offset = p_offset; - _queue_update(); + _queue_redraw(); } Point2 SpriteBase3D::get_offset() const { @@ -108,7 +283,7 @@ Point2 SpriteBase3D::get_offset() const { void SpriteBase3D::set_flip_h(bool p_flip) { hflip = p_flip; - _queue_update(); + _queue_redraw(); } bool SpriteBase3D::is_flipped_h() const { @@ -117,7 +292,7 @@ bool SpriteBase3D::is_flipped_h() const { void SpriteBase3D::set_flip_v(bool p_flip) { vflip = p_flip; - _queue_update(); + _queue_redraw(); } bool SpriteBase3D::is_flipped_v() const { @@ -127,7 +302,7 @@ bool SpriteBase3D::is_flipped_v() const { void SpriteBase3D::set_modulate(const Color &p_color) { modulate = p_color; _propagate_color_changed(); - _queue_update(); + _queue_redraw(); } Color SpriteBase3D::get_modulate() const { @@ -137,7 +312,7 @@ Color SpriteBase3D::get_modulate() const { void SpriteBase3D::set_render_priority(int p_priority) { ERR_FAIL_COND(p_priority < RS::MATERIAL_RENDER_PRIORITY_MIN || p_priority > RS::MATERIAL_RENDER_PRIORITY_MAX); render_priority = p_priority; - _queue_update(); + _queue_redraw(); } int SpriteBase3D::get_render_priority() const { @@ -146,7 +321,7 @@ int SpriteBase3D::get_render_priority() const { void SpriteBase3D::set_pixel_size(real_t p_amount) { pixel_size = p_amount; - _queue_update(); + _queue_redraw(); } real_t SpriteBase3D::get_pixel_size() const { @@ -156,7 +331,7 @@ real_t SpriteBase3D::get_pixel_size() const { void SpriteBase3D::set_axis(Vector3::Axis p_axis) { ERR_FAIL_INDEX(p_axis, 3); axis = p_axis; - _queue_update(); + _queue_redraw(); } Vector3::Axis SpriteBase3D::get_axis() const { @@ -171,7 +346,8 @@ void SpriteBase3D::_im_update() { //texture->draw_rect_region(ci,dst_rect,src_rect,modulate); } -void SpriteBase3D::_queue_update() { +void SpriteBase3D::_queue_redraw() { + // The 3D equivalent of CanvasItem.queue_redraw(). if (pending_update) { return; } @@ -250,7 +426,7 @@ Ref<TriangleMesh> SpriteBase3D::generate_triangle_mesh() const { void SpriteBase3D::set_draw_flag(DrawFlags p_flag, bool p_enable) { ERR_FAIL_INDEX(p_flag, FLAG_MAX); flags[p_flag] = p_enable; - _queue_update(); + _queue_redraw(); } bool SpriteBase3D::get_draw_flag(DrawFlags p_flag) const { @@ -261,7 +437,7 @@ bool SpriteBase3D::get_draw_flag(DrawFlags p_flag) const { void SpriteBase3D::set_alpha_cut_mode(AlphaCutMode p_mode) { ERR_FAIL_INDEX(p_mode, 3); alpha_cut = p_mode; - _queue_update(); + _queue_redraw(); } SpriteBase3D::AlphaCutMode SpriteBase3D::get_alpha_cut_mode() const { @@ -269,9 +445,9 @@ SpriteBase3D::AlphaCutMode SpriteBase3D::get_alpha_cut_mode() const { } void SpriteBase3D::set_billboard_mode(StandardMaterial3D::BillboardMode p_mode) { - ERR_FAIL_INDEX(p_mode, 3); + ERR_FAIL_INDEX(p_mode, 3); // Cannot use BILLBOARD_PARTICLES. billboard_mode = p_mode; - _queue_update(); + _queue_redraw(); } StandardMaterial3D::BillboardMode SpriteBase3D::get_billboard_mode() const { @@ -281,7 +457,7 @@ StandardMaterial3D::BillboardMode SpriteBase3D::get_billboard_mode() const { void SpriteBase3D::set_texture_filter(StandardMaterial3D::TextureFilter p_filter) { if (texture_filter != p_filter) { texture_filter = p_filter; - _queue_update(); + _queue_redraw(); } } @@ -329,7 +505,6 @@ void SpriteBase3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_item_rect"), &SpriteBase3D::get_item_rect); ClassDB::bind_method(D_METHOD("generate_triangle_mesh"), &SpriteBase3D::generate_triangle_mesh); - ClassDB::bind_method(D_METHOD("_queue_update"), &SpriteBase3D::_queue_update); ClassDB::bind_method(D_METHOD("_im_update"), &SpriteBase3D::_im_update); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "centered"), "set_centered", "is_centered"); @@ -368,7 +543,7 @@ SpriteBase3D::SpriteBase3D() { } material = RenderingServer::get_singleton()->material_create(); - // Set defaults for material, names need to match up those in StandardMaterial3D + // Set defaults for material, names need to match up those in StandardMaterial3D. RS::get_singleton()->material_set_param(material, "albedo", Color(1, 1, 1, 1)); RS::get_singleton()->material_set_param(material, "specular", 0.5); RS::get_singleton()->material_set_param(material, "metallic", 0.0); @@ -394,7 +569,7 @@ SpriteBase3D::SpriteBase3D() { mesh_colors.resize(4); mesh_uvs.resize(4); - // create basic mesh and store format information + // Create basic mesh and store format information. for (int i = 0; i < 4; i++) { mesh_normals.write[i] = Vector3(0.0, 0.0, 0.0); mesh_tangents.write[i * 4 + 0] = 0.0; @@ -448,7 +623,7 @@ void Sprite3D::_draw() { if (get_base() != get_mesh()) { set_base(get_mesh()); } - if (!texture.is_valid()) { + if (texture.is_null()) { set_base(RID()); return; } @@ -465,171 +640,17 @@ void Sprite3D::_draw() { } Size2 frame_size = base_rect.size / Size2(hframes, vframes); - Point2 frame_offset = Point2(frame % hframes, frame / hframes); - frame_offset *= frame_size; + Point2 frame_offset = Point2(frame % hframes, frame / hframes) * frame_size; - Point2 dest_offset = get_offset(); + Point2 dst_offset = get_offset(); if (is_centered()) { - dest_offset -= frame_size / 2; + dst_offset -= frame_size / 2.0f; } Rect2 src_rect(base_rect.position + frame_offset, frame_size); - Rect2 final_dst_rect(dest_offset, frame_size); - Rect2 final_rect; - Rect2 final_src_rect; - if (!texture->get_rect_region(final_dst_rect, src_rect, final_rect, final_src_rect)) { - return; - } - - if (final_rect.size.x == 0 || final_rect.size.y == 0) { - return; - } - - Color color = _get_color_accum(); - - real_t pixel_size = get_pixel_size(); - - Vector2 vertices[4] = { - - (final_rect.position + Vector2(0, final_rect.size.y)) * pixel_size, - (final_rect.position + final_rect.size) * pixel_size, - (final_rect.position + Vector2(final_rect.size.x, 0)) * pixel_size, - final_rect.position * pixel_size, - - }; - - Vector2 src_tsize = tsize; - - // Properly setup UVs for impostor textures (AtlasTexture). - Ref<AtlasTexture> atlas_tex = texture; - if (atlas_tex != nullptr) { - src_tsize[0] = atlas_tex->get_atlas()->get_width(); - src_tsize[1] = atlas_tex->get_atlas()->get_height(); - } - - Vector2 uvs[4] = { - final_src_rect.position / src_tsize, - (final_src_rect.position + Vector2(final_src_rect.size.x, 0)) / src_tsize, - (final_src_rect.position + final_src_rect.size) / src_tsize, - (final_src_rect.position + Vector2(0, final_src_rect.size.y)) / src_tsize, - }; - - if (is_flipped_h()) { - SWAP(uvs[0], uvs[1]); - SWAP(uvs[2], uvs[3]); - } - - if (is_flipped_v()) { - SWAP(uvs[0], uvs[3]); - SWAP(uvs[1], uvs[2]); - } - - Vector3 normal; - int axis = get_axis(); - normal[axis] = 1.0; - - Plane tangent; - if (axis == Vector3::AXIS_X) { - tangent = Plane(0, 0, -1, 1); - } else { - tangent = Plane(1, 0, 0, 1); - } - - int x_axis = ((axis + 1) % 3); - int y_axis = ((axis + 2) % 3); - - if (axis != Vector3::AXIS_Z) { - SWAP(x_axis, y_axis); - - for (int i = 0; i < 4; i++) { - //uvs[i] = Vector2(1.0,1.0)-uvs[i]; - //SWAP(vertices[i].x,vertices[i].y); - if (axis == Vector3::AXIS_Y) { - vertices[i].y = -vertices[i].y; - } else if (axis == Vector3::AXIS_X) { - vertices[i].x = -vertices[i].x; - } - } - } - - AABB aabb; - - // Everything except position and UV is compressed - uint8_t *vertex_write_buffer = vertex_buffer.ptrw(); - uint8_t *attribute_write_buffer = attribute_buffer.ptrw(); - - uint32_t v_normal; - { - Vector3 n = normal * Vector3(0.5, 0.5, 0.5) + Vector3(0.5, 0.5, 0.5); - - Vector2 res = n.octahedron_encode(); - uint32_t value = 0; - value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); - value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; - - v_normal = value; - } - uint32_t v_tangent; - { - Plane t = tangent; - Vector2 res = t.normal.octahedron_tangent_encode(t.d); - uint32_t value = 0; - value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); - value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; - - v_tangent = value; - } - - uint8_t v_color[4] = { - uint8_t(CLAMP(color.r * 255.0, 0.0, 255.0)), - uint8_t(CLAMP(color.g * 255.0, 0.0, 255.0)), - uint8_t(CLAMP(color.b * 255.0, 0.0, 255.0)), - uint8_t(CLAMP(color.a * 255.0, 0.0, 255.0)) - }; - - for (int i = 0; i < 4; i++) { - Vector3 vtx; - vtx[x_axis] = vertices[i][0]; - vtx[y_axis] = vertices[i][1]; - if (i == 0) { - aabb.position = vtx; - aabb.size = Vector3(); - } else { - aabb.expand_to(vtx); - } - - float v_uv[2] = { (float)uvs[i].x, (float)uvs[i].y }; - memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_TEX_UV]], v_uv, 8); - - float v_vertex[3] = { (float)vtx.x, (float)vtx.y, (float)vtx.z }; + Rect2 dst_rect(dst_offset, frame_size); - memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_VERTEX]], &v_vertex, sizeof(float) * 3); - memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_NORMAL]], &v_normal, 4); - memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_TANGENT]], &v_tangent, 4); - memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_COLOR]], v_color, 4); - } - - RID mesh = get_mesh(); - RS::get_singleton()->mesh_surface_update_vertex_region(mesh, 0, 0, vertex_buffer); - RS::get_singleton()->mesh_surface_update_attribute_region(mesh, 0, 0, attribute_buffer); - - RS::get_singleton()->mesh_set_custom_aabb(mesh, aabb); - set_aabb(aabb); - - RID shader_rid; - StandardMaterial3D::get_material_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS, get_billboard_mode() == StandardMaterial3D::BILLBOARD_ENABLED, get_billboard_mode() == StandardMaterial3D::BILLBOARD_FIXED_Y, false, get_draw_flag(FLAG_DISABLE_DEPTH_TEST), get_draw_flag(FLAG_FIXED_SIZE), get_texture_filter(), &shader_rid); - if (last_shader != shader_rid) { - RS::get_singleton()->material_set_shader(get_material(), shader_rid); - last_shader = shader_rid; - } - if (last_texture != texture->get_rid()) { - RS::get_singleton()->material_set_param(get_material(), "texture_albedo", texture->get_rid()); - last_texture = texture->get_rid(); - } - if (get_alpha_cut_mode() == ALPHA_CUT_DISABLED) { - RS::get_singleton()->material_set_render_priority(get_material(), get_render_priority()); - RS::get_singleton()->mesh_surface_set_material(mesh, 0, get_material()); - } + draw_texture_rect(texture, dst_rect, src_rect); } void Sprite3D::set_texture(const Ref<Texture2D> &p_texture) { @@ -637,13 +658,14 @@ void Sprite3D::set_texture(const Ref<Texture2D> &p_texture) { return; } if (texture.is_valid()) { - texture->disconnect(CoreStringNames::get_singleton()->changed, Callable(this, "_queue_update")); + texture->disconnect(SceneStringNames::get_singleton()->changed, callable_mp((SpriteBase3D *)this, &Sprite3D::_queue_redraw)); } texture = p_texture; if (texture.is_valid()) { - texture->connect(CoreStringNames::get_singleton()->changed, Callable(this, "_queue_update")); + texture->connect(SceneStringNames::get_singleton()->changed, callable_mp((SpriteBase3D *)this, &Sprite3D::_queue_redraw)); } - _queue_update(); + + _queue_redraw(); emit_signal(SceneStringNames::get_singleton()->texture_changed); } @@ -657,7 +679,7 @@ void Sprite3D::set_region_enabled(bool p_region) { } region = p_region; - _queue_update(); + _queue_redraw(); } bool Sprite3D::is_region_enabled() const { @@ -668,7 +690,7 @@ void Sprite3D::set_region_rect(const Rect2 &p_region_rect) { bool changed = region_rect != p_region_rect; region_rect = p_region_rect; if (region && changed) { - _queue_update(); + _queue_redraw(); } } @@ -681,7 +703,7 @@ void Sprite3D::set_frame(int p_frame) { frame = p_frame; - _queue_update(); + _queue_redraw(); emit_signal(SceneStringNames::get_singleton()->frame_changed); } @@ -704,7 +726,7 @@ Vector2i Sprite3D::get_frame_coords() const { void Sprite3D::set_vframes(int p_amount) { ERR_FAIL_COND(p_amount < 1); vframes = p_amount; - _queue_update(); + _queue_redraw(); notify_property_list_changed(); } @@ -715,7 +737,7 @@ int Sprite3D::get_vframes() const { void Sprite3D::set_hframes(int p_amount) { ERR_FAIL_COND(p_amount < 1); hframes = p_amount; - _queue_update(); + _queue_redraw(); notify_property_list_changed(); } @@ -807,22 +829,14 @@ void AnimatedSprite3D::_draw() { set_base(get_mesh()); } - if (frames.is_null()) { - return; - } - - if (frame < 0) { - return; - } - - if (!frames->has_animation(animation)) { + if (frames.is_null() || !frames->has_animation(animation)) { return; } Ref<Texture2D> texture = frames->get_frame(animation, frame); - if (!texture.is_valid()) { + if (texture.is_null()) { set_base(RID()); - return; //no texuture no life + return; } Size2 tsize = texture->get_size(); if (tsize.x == 0 || tsize.y == 0) { @@ -839,164 +853,14 @@ void AnimatedSprite3D::_draw() { Rect2 dst_rect(ofs, tsize); - Rect2 final_rect; - Rect2 final_src_rect; - if (!texture->get_rect_region(dst_rect, src_rect, final_rect, final_src_rect)) { - return; - } - - if (final_rect.size.x == 0 || final_rect.size.y == 0) { - return; - } - - Color color = _get_color_accum(); - - real_t pixel_size = get_pixel_size(); - - Vector2 vertices[4] = { - - (final_rect.position + Vector2(0, final_rect.size.y)) * pixel_size, - (final_rect.position + final_rect.size) * pixel_size, - (final_rect.position + Vector2(final_rect.size.x, 0)) * pixel_size, - final_rect.position * pixel_size, - - }; - - Vector2 src_tsize = tsize; - - // Properly setup UVs for impostor textures (AtlasTexture). - Ref<AtlasTexture> atlas_tex = texture; - if (atlas_tex != nullptr) { - src_tsize[0] = atlas_tex->get_atlas()->get_width(); - src_tsize[1] = atlas_tex->get_atlas()->get_height(); - } - - Vector2 uvs[4] = { - final_src_rect.position / src_tsize, - (final_src_rect.position + Vector2(final_src_rect.size.x, 0)) / src_tsize, - (final_src_rect.position + final_src_rect.size) / src_tsize, - (final_src_rect.position + Vector2(0, final_src_rect.size.y)) / src_tsize, - }; - - if (is_flipped_h()) { - SWAP(uvs[0], uvs[1]); - SWAP(uvs[2], uvs[3]); - } - if (is_flipped_v()) { - SWAP(uvs[0], uvs[3]); - SWAP(uvs[1], uvs[2]); - } - - Vector3 normal; - int axis = get_axis(); - normal[axis] = 1.0; - - Plane tangent; - if (axis == Vector3::AXIS_X) { - tangent = Plane(0, 0, -1, -1); - } else { - tangent = Plane(1, 0, 0, -1); - } - - int x_axis = ((axis + 1) % 3); - int y_axis = ((axis + 2) % 3); - - if (axis != Vector3::AXIS_Z) { - SWAP(x_axis, y_axis); - - for (int i = 0; i < 4; i++) { - //uvs[i] = Vector2(1.0,1.0)-uvs[i]; - //SWAP(vertices[i].x,vertices[i].y); - if (axis == Vector3::AXIS_Y) { - vertices[i].y = -vertices[i].y; - } else if (axis == Vector3::AXIS_X) { - vertices[i].x = -vertices[i].x; - } - } - } - - AABB aabb; - - // Everything except position and UV is compressed - uint8_t *vertex_write_buffer = vertex_buffer.ptrw(); - uint8_t *attribute_write_buffer = attribute_buffer.ptrw(); - - uint32_t v_normal; - { - Vector3 n = normal * Vector3(0.5, 0.5, 0.5) + Vector3(0.5, 0.5, 0.5); - - Vector2 res = n.octahedron_encode(); - uint32_t value = 0; - value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); - value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; - - v_normal = value; - } - uint32_t v_tangent; - { - Plane t = tangent; - Vector2 res = t.normal.octahedron_tangent_encode(t.d); - uint32_t value = 0; - value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); - value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; - v_tangent = value; - } - - uint8_t v_color[4] = { - uint8_t(CLAMP(color.r * 255.0, 0.0, 255.0)), - uint8_t(CLAMP(color.g * 255.0, 0.0, 255.0)), - uint8_t(CLAMP(color.b * 255.0, 0.0, 255.0)), - uint8_t(CLAMP(color.a * 255.0, 0.0, 255.0)) - }; - - for (int i = 0; i < 4; i++) { - Vector3 vtx; - vtx[x_axis] = vertices[i][0]; - vtx[y_axis] = vertices[i][1]; - if (i == 0) { - aabb.position = vtx; - aabb.size = Vector3(); - } else { - aabb.expand_to(vtx); - } - - float v_uv[2] = { (float)uvs[i].x, (float)uvs[i].y }; - memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_TEX_UV]], v_uv, 8); - - float v_vertex[3] = { (float)vtx.x, (float)vtx.y, (float)vtx.z }; - memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_VERTEX]], &v_vertex, sizeof(float) * 3); - memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_NORMAL]], &v_normal, 4); - memcpy(&vertex_write_buffer[i * vertex_stride + mesh_surface_offsets[RS::ARRAY_TANGENT]], &v_tangent, 4); - memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_COLOR]], v_color, 4); - } - - RID mesh = get_mesh(); - RS::get_singleton()->mesh_surface_update_vertex_region(mesh, 0, 0, vertex_buffer); - RS::get_singleton()->mesh_surface_update_attribute_region(mesh, 0, 0, attribute_buffer); - - RS::get_singleton()->mesh_set_custom_aabb(mesh, aabb); - set_aabb(aabb); - - RID shader_rid; - StandardMaterial3D::get_material_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS, get_billboard_mode() == StandardMaterial3D::BILLBOARD_ENABLED, get_billboard_mode() == StandardMaterial3D::BILLBOARD_FIXED_Y, false, get_draw_flag(FLAG_DISABLE_DEPTH_TEST), get_draw_flag(FLAG_FIXED_SIZE), get_texture_filter(), &shader_rid); - if (last_shader != shader_rid) { - RS::get_singleton()->material_set_shader(get_material(), shader_rid); - last_shader = shader_rid; - } - if (last_texture != texture->get_rid()) { - RS::get_singleton()->material_set_param(get_material(), "texture_albedo", texture->get_rid()); - last_texture = texture->get_rid(); - } - if (get_alpha_cut_mode() == ALPHA_CUT_DISABLED) { - RS::get_singleton()->material_set_render_priority(get_material(), get_render_priority()); - RS::get_singleton()->mesh_surface_set_material(mesh, 0, get_material()); - } + draw_texture_rect(texture, dst_rect, src_rect); } void AnimatedSprite3D::_validate_property(PropertyInfo &p_property) const { if (!frames.is_valid()) { return; } + if (p_property.name == "animation") { p_property.hint = PROPERTY_HINT_ENUM; List<StringName> names; @@ -1026,9 +890,15 @@ void AnimatedSprite3D::_validate_property(PropertyInfo &p_property) const { p_property.hint_string = String(animation) + "," + p_property.hint_string; } } + return; } if (p_property.name == "frame") { + if (playing) { + p_property.usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY; + return; + } + p_property.hint = PROPERTY_HINT_RANGE; if (frames->has_animation(animation) && frames->get_frame_count(animation) > 0) { p_property.hint_string = "0," + itos(frames->get_frame_count(animation) - 1) + ",1"; @@ -1043,40 +913,57 @@ void AnimatedSprite3D::_validate_property(PropertyInfo &p_property) const { void AnimatedSprite3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_INTERNAL_PROCESS: { - if (frames.is_null()) { + if (frames.is_null() || !frames->has_animation(animation)) { return; } - if (!frames->has_animation(animation)) { - return; - } - if (frame < 0) { - return; + + double speed = frames->get_animation_speed(animation) * Math::abs(speed_scale); + if (speed == 0) { + return; // Do nothing. } + int last_frame = frames->get_frame_count(animation) - 1; double remaining = get_process_delta_time(); - while (remaining) { - double speed = frames->get_animation_speed(animation); - if (speed == 0) { - return; // Do nothing. - } - if (timeout <= 0) { - timeout = 1.0 / speed; - - int fc = frames->get_frame_count(animation); - if (frame >= fc - 1) { - if (frames->get_animation_loop(animation)) { - frame = 0; + timeout = _get_frame_duration(); + + if (!playing_backwards) { + // Forward. + if (frame >= last_frame) { + if (frames->get_animation_loop(animation)) { + frame = 0; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } else { + frame = last_frame; + if (!is_over) { + is_over = true; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } + } } else { - frame = fc - 1; + frame++; } - emit_signal(SceneStringNames::get_singleton()->animation_finished); } else { - frame++; + // Reversed. + if (frame <= 0) { + if (frames->get_animation_loop(animation)) { + frame = last_frame; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } else { + frame = 0; + if (!is_over) { + is_over = true; + emit_signal(SceneStringNames::get_singleton()->animation_finished); + } + } + } else { + frame--; + } } - _queue_update(); + _queue_redraw(); + emit_signal(SceneStringNames::get_singleton()->frame_changed); } @@ -1090,14 +977,15 @@ void AnimatedSprite3D::_notification(int p_what) { void AnimatedSprite3D::set_sprite_frames(const Ref<SpriteFrames> &p_frames) { if (frames.is_valid()) { - frames->disconnect("changed", Callable(this, "_res_changed")); + frames->disconnect(SceneStringNames::get_singleton()->changed, callable_mp(this, &AnimatedSprite3D::_res_changed)); } + frames = p_frames; if (frames.is_valid()) { - frames->connect("changed", Callable(this, "_res_changed")); + frames->connect(SceneStringNames::get_singleton()->changed, callable_mp(this, &AnimatedSprite3D::_res_changed)); } - if (!frames.is_valid()) { + if (frames.is_null()) { frame = 0; } else { set_frame(frame); @@ -1105,7 +993,7 @@ void AnimatedSprite3D::set_sprite_frames(const Ref<SpriteFrames> &p_frames) { notify_property_list_changed(); _reset_timeout(); - _queue_update(); + _queue_redraw(); update_configuration_warnings(); } @@ -1114,7 +1002,7 @@ Ref<SpriteFrames> AnimatedSprite3D::get_sprite_frames() const { } void AnimatedSprite3D::set_frame(int p_frame) { - if (!frames.is_valid()) { + if (frames.is_null()) { return; } @@ -1135,7 +1023,8 @@ void AnimatedSprite3D::set_frame(int p_frame) { frame = p_frame; _reset_timeout(); - _queue_update(); + _queue_redraw(); + emit_signal(SceneStringNames::get_singleton()->frame_changed); } @@ -1143,8 +1032,30 @@ int AnimatedSprite3D::get_frame() const { return frame; } +void AnimatedSprite3D::set_speed_scale(double p_speed_scale) { + if (speed_scale == p_speed_scale) { + return; + } + + double elapsed = _get_frame_duration() - timeout; + + speed_scale = p_speed_scale; + playing_backwards = signbit(speed_scale) != backwards; + + // We adapt the timeout so that the animation speed adapts as soon as the speed scale is changed. + _reset_timeout(); + timeout -= elapsed; +} + +double AnimatedSprite3D::get_speed_scale() const { + return speed_scale; +} + Rect2 AnimatedSprite3D::get_item_rect() const { - if (!frames.is_valid() || !frames->has_animation(animation) || frame < 0 || frame >= frames->get_frame_count(animation)) { + if (frames.is_null() || !frames->has_animation(animation)) { + return Rect2(0, 0, 1, 1); + } + if (frame < 0 || frame >= frames->get_frame_count(animation)) { return Rect2(0, 0, 1, 1); } @@ -1171,7 +1082,8 @@ Rect2 AnimatedSprite3D::get_item_rect() const { void AnimatedSprite3D::_res_changed() { set_frame(frame); - _queue_update(); + + _queue_redraw(); } void AnimatedSprite3D::set_playing(bool p_playing) { @@ -1181,16 +1093,25 @@ void AnimatedSprite3D::set_playing(bool p_playing) { playing = p_playing; _reset_timeout(); set_process_internal(playing); + notify_property_list_changed(); } bool AnimatedSprite3D::is_playing() const { return playing; } -void AnimatedSprite3D::play(const StringName &p_animation) { +void AnimatedSprite3D::play(const StringName &p_animation, bool p_backwards) { + backwards = p_backwards; + playing_backwards = signbit(speed_scale) != backwards; + if (p_animation) { set_animation(p_animation); + if (frames.is_valid() && playing_backwards && get_frame() == 0) { + set_frame(frames->get_frame_count(p_animation) - 1); + } } + + is_over = false; set_playing(true); } @@ -1198,24 +1119,28 @@ void AnimatedSprite3D::stop() { set_playing(false); } +double AnimatedSprite3D::_get_frame_duration() { + if (frames.is_valid() && frames->has_animation(animation)) { + double speed = frames->get_animation_speed(animation) * Math::abs(speed_scale); + if (speed > 0) { + return 1.0 / speed; + } + } + return 0.0; +} + void AnimatedSprite3D::_reset_timeout() { if (!playing) { return; } - if (frames.is_valid() && frames->has_animation(animation)) { - float speed = frames->get_animation_speed(animation); - if (speed > 0) { - timeout = 1.0 / speed; - } else { - timeout = 0; - } - } else { - timeout = 0; - } + timeout = _get_frame_duration(); + is_over = false; } void AnimatedSprite3D::set_animation(const StringName &p_animation) { + ERR_FAIL_COND_MSG(frames == nullptr, vformat("There is no animation with name '%s'.", p_animation)); + ERR_FAIL_COND_MSG(!frames->get_animation_names().has(p_animation), vformat("There is no animation with name '%s'.", p_animation)); if (animation == p_animation) { return; } @@ -1224,15 +1149,15 @@ void AnimatedSprite3D::set_animation(const StringName &p_animation) { _reset_timeout(); set_frame(0); notify_property_list_changed(); - _queue_update(); + _queue_redraw(); } StringName AnimatedSprite3D::get_animation() const { return animation; } -TypedArray<String> AnimatedSprite3D::get_configuration_warnings() const { - TypedArray<String> warnings = SpriteBase3D::get_configuration_warnings(); +PackedStringArray AnimatedSprite3D::get_configuration_warnings() const { + PackedStringArray warnings = SpriteBase3D::get_configuration_warnings(); if (frames.is_null()) { warnings.push_back(RTR("A SpriteFrames resource must be created or set in the \"Frames\" property in order for AnimatedSprite3D to display frames.")); } @@ -1261,12 +1186,15 @@ void AnimatedSprite3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_playing", "playing"), &AnimatedSprite3D::set_playing); ClassDB::bind_method(D_METHOD("is_playing"), &AnimatedSprite3D::is_playing); - ClassDB::bind_method(D_METHOD("play", "anim"), &AnimatedSprite3D::play, DEFVAL(StringName())); + ClassDB::bind_method(D_METHOD("play", "anim", "backwards"), &AnimatedSprite3D::play, DEFVAL(StringName()), DEFVAL(false)); ClassDB::bind_method(D_METHOD("stop"), &AnimatedSprite3D::stop); ClassDB::bind_method(D_METHOD("set_frame", "frame"), &AnimatedSprite3D::set_frame); ClassDB::bind_method(D_METHOD("get_frame"), &AnimatedSprite3D::get_frame); + ClassDB::bind_method(D_METHOD("set_speed_scale", "speed_scale"), &AnimatedSprite3D::set_speed_scale); + ClassDB::bind_method(D_METHOD("get_speed_scale"), &AnimatedSprite3D::get_speed_scale); + ClassDB::bind_method(D_METHOD("_res_changed"), &AnimatedSprite3D::_res_changed); ADD_SIGNAL(MethodInfo("frame_changed")); @@ -1275,6 +1203,7 @@ void AnimatedSprite3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "frames", PROPERTY_HINT_RESOURCE_TYPE, "SpriteFrames"), "set_sprite_frames", "get_sprite_frames"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "animation"), "set_animation", "get_animation"); ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "speed_scale"), "set_speed_scale", "get_speed_scale"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing"), "set_playing", "is_playing"); } diff --git a/scene/3d/sprite_3d.h b/scene/3d/sprite_3d.h index 84244a2476..edc48c7b71 100644 --- a/scene/3d/sprite_3d.h +++ b/scene/3d/sprite_3d.h @@ -80,6 +80,9 @@ private: RID mesh; RID material; + RID last_shader; + RID last_texture; + bool flags[FLAG_MAX] = {}; AlphaCutMode alpha_cut = ALPHA_CUT_DISABLED; StandardMaterial3D::BillboardMode billboard_mode = StandardMaterial3D::BILLBOARD_DISABLED; @@ -94,6 +97,7 @@ protected: void _notification(int p_what); static void _bind_methods(); virtual void _draw() = 0; + void draw_texture_rect(Ref<Texture2D> p_texture, Rect2 p_dst_rect, Rect2 p_src_rect); _FORCE_INLINE_ void set_aabb(const AABB &p_aabb) { aabb = p_aabb; } _FORCE_INLINE_ RID &get_mesh() { return mesh; } _FORCE_INLINE_ RID &get_material() { return material; } @@ -106,7 +110,7 @@ protected: uint32_t skin_stride = 0; uint32_t mesh_surface_format = 0; - void _queue_update(); + void _queue_redraw(); public: void set_centered(bool p_center); @@ -167,9 +171,6 @@ class Sprite3D : public SpriteBase3D { int vframes = 1; int hframes = 1; - RID last_shader; - RID last_texture; - protected: virtual void _draw() override; static void _bind_methods(); @@ -209,20 +210,22 @@ class AnimatedSprite3D : public SpriteBase3D { Ref<SpriteFrames> frames; bool playing = false; + bool playing_backwards = false; + bool backwards = false; StringName animation = "default"; int frame = 0; + float speed_scale = 1.0f; bool centered = false; + bool is_over = false; double timeout = 0.0; void _res_changed(); + double _get_frame_duration(); void _reset_timeout(); - RID last_shader; - RID last_texture; - protected: virtual void _draw() override; static void _bind_methods(); @@ -233,7 +236,7 @@ public: void set_sprite_frames(const Ref<SpriteFrames> &p_frames); Ref<SpriteFrames> get_sprite_frames() const; - void play(const StringName &p_animation = StringName()); + void play(const StringName &p_animation = StringName(), bool p_backwards = false); void stop(); void set_playing(bool p_playing); @@ -245,9 +248,12 @@ public: void set_frame(int p_frame); int get_frame() const; + void set_speed_scale(double p_speed_scale); + double get_speed_scale() const; + virtual Rect2 get_item_rect() const override; - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; virtual void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const override; AnimatedSprite3D(); diff --git a/scene/3d/vehicle_body_3d.cpp b/scene/3d/vehicle_body_3d.cpp index d61b49eaa7..36b5e61f45 100644 --- a/scene/3d/vehicle_body_3d.cpp +++ b/scene/3d/vehicle_body_3d.cpp @@ -105,8 +105,8 @@ void VehicleWheel3D::_notification(int p_what) { } } -TypedArray<String> VehicleWheel3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray VehicleWheel3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Object::cast_to<VehicleBody3D>(get_parent())) { warnings.push_back(RTR("VehicleWheel3D serves to provide a wheel system to a VehicleBody3D. Please use it as a child of a VehicleBody3D.")); diff --git a/scene/3d/vehicle_body_3d.h b/scene/3d/vehicle_body_3d.h index 5c4f4beaea..a6a49ee88a 100644 --- a/scene/3d/vehicle_body_3d.h +++ b/scene/3d/vehicle_body_3d.h @@ -147,7 +147,7 @@ public: void set_steering(real_t p_steering); real_t get_steering() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; VehicleWheel3D(); }; diff --git a/scene/3d/visual_instance_3d.cpp b/scene/3d/visual_instance_3d.cpp index db9f68544b..e93ad5ecbf 100644 --- a/scene/3d/visual_instance_3d.cpp +++ b/scene/3d/visual_instance_3d.cpp @@ -385,8 +385,8 @@ bool GeometryInstance3D::is_ignoring_occlusion_culling() { return ignore_occlusion_culling; } -TypedArray<String> GeometryInstance3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray GeometryInstance3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!Math::is_zero_approx(visibility_range_end) && visibility_range_end <= visibility_range_begin) { warnings.push_back(RTR("The GeometryInstance3D visibility range's End distance is set to a non-zero value, but is lower than the Begin distance.\nThis means the GeometryInstance3D will never be visible.\nTo resolve this, set the End distance to 0 or to a value greater than the Begin distance.")); diff --git a/scene/3d/visual_instance_3d.h b/scene/3d/visual_instance_3d.h index 100d8d8836..4755545516 100644 --- a/scene/3d/visual_instance_3d.h +++ b/scene/3d/visual_instance_3d.h @@ -186,7 +186,7 @@ public: void set_ignore_occlusion_culling(bool p_enabled); bool is_ignoring_occlusion_culling(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; GeometryInstance3D(); virtual ~GeometryInstance3D(); }; diff --git a/scene/3d/voxel_gi.cpp b/scene/3d/voxel_gi.cpp index c97af087bf..1b1ac32207 100644 --- a/scene/3d/voxel_gi.cpp +++ b/scene/3d/voxel_gi.cpp @@ -468,8 +468,8 @@ AABB VoxelGI::get_aabb() const { return AABB(-extents, extents * 2); } -TypedArray<String> VoxelGI::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray VoxelGI::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (RenderingServer::get_singleton()->is_low_end()) { warnings.push_back(RTR("VoxelGIs are not supported by the OpenGL video driver.\nUse a LightmapGI instead.")); diff --git a/scene/3d/voxel_gi.h b/scene/3d/voxel_gi.h index b31ae4cd95..fc10091d4f 100644 --- a/scene/3d/voxel_gi.h +++ b/scene/3d/voxel_gi.h @@ -157,7 +157,7 @@ public: virtual AABB get_aabb() const override; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; VoxelGI(); ~VoxelGI(); diff --git a/scene/3d/world_environment.cpp b/scene/3d/world_environment.cpp index ae7d79e8b0..6cc5e9ef20 100644 --- a/scene/3d/world_environment.cpp +++ b/scene/3d/world_environment.cpp @@ -135,8 +135,8 @@ Ref<CameraAttributes> WorldEnvironment::get_camera_attributes() const { return camera_attributes; } -TypedArray<String> WorldEnvironment::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray WorldEnvironment::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!environment.is_valid() && !camera_attributes.is_valid()) { warnings.push_back(RTR("To have any visible effect, WorldEnvironment requires its \"Environment\" property to contain an Environment, its \"Camera Attributes\" property to contain a CameraAttributes resource, or both.")); diff --git a/scene/3d/world_environment.h b/scene/3d/world_environment.h index 07f243c750..cc46a06b4c 100644 --- a/scene/3d/world_environment.h +++ b/scene/3d/world_environment.h @@ -55,7 +55,7 @@ public: void set_camera_attributes(const Ref<CameraAttributes> &p_camera_attributes); Ref<CameraAttributes> get_camera_attributes() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; WorldEnvironment(); }; diff --git a/scene/3d/xr_nodes.cpp b/scene/3d/xr_nodes.cpp index de765d7ccb..4401d22f30 100644 --- a/scene/3d/xr_nodes.cpp +++ b/scene/3d/xr_nodes.cpp @@ -88,8 +88,8 @@ void XRCamera3D::_pose_changed(const Ref<XRPose> &p_pose) { } } -TypedArray<String> XRCamera3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray XRCamera3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible() && is_inside_tree()) { // must be child node of XROrigin3D! @@ -414,8 +414,8 @@ XRNode3D::~XRNode3D() { xr_server->disconnect("tracker_removed", callable_mp(this, &XRNode3D::_removed_tracker)); } -TypedArray<String> XRNode3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray XRNode3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible() && is_inside_tree()) { // must be child node of XROrigin! @@ -582,8 +582,8 @@ Plane XRAnchor3D::get_plane() const { //////////////////////////////////////////////////////////////////////////////////////////////////// -TypedArray<String> XROrigin3D::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray XROrigin3D::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible() && is_inside_tree()) { if (tracked_camera == nullptr) { diff --git a/scene/3d/xr_nodes.h b/scene/3d/xr_nodes.h index 312bef7856..ef846cc3a3 100644 --- a/scene/3d/xr_nodes.h +++ b/scene/3d/xr_nodes.h @@ -55,7 +55,7 @@ protected: void _pose_changed(const Ref<XRPose> &p_pose); public: - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; virtual Vector3 project_local_ray_normal(const Point2 &p_pos) const override; virtual Point2 unproject_position(const Vector3 &p_pos) const override; @@ -107,7 +107,7 @@ public: Ref<XRPose> get_pose(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; XRNode3D(); ~XRNode3D(); @@ -187,7 +187,7 @@ protected: static void _bind_methods(); public: - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_tracked_camera(XRCamera3D *p_tracked_camera); XRCamera3D *get_tracked_camera() const; diff --git a/scene/animation/animation_blend_tree.cpp b/scene/animation/animation_blend_tree.cpp index 99f17a1eef..1efbaacb3b 100644 --- a/scene/animation/animation_blend_tree.cpp +++ b/scene/animation/animation_blend_tree.cpp @@ -1175,6 +1175,7 @@ void AnimationNodeBlendTree::_tree_changed() { void AnimationNodeBlendTree::_node_changed(const StringName &p_node) { ERR_FAIL_COND(!nodes.has(p_node)); nodes[p_node].connections.resize(nodes[p_node].node->get_input_count()); + emit_signal(SNAME("node_changed"), p_node); } void AnimationNodeBlendTree::_bind_methods() { @@ -1200,6 +1201,8 @@ void AnimationNodeBlendTree::_bind_methods() { BIND_CONSTANT(CONNECTION_ERROR_NO_OUTPUT); BIND_CONSTANT(CONNECTION_ERROR_SAME_NODE); BIND_CONSTANT(CONNECTION_ERROR_CONNECTION_EXISTS); + + ADD_SIGNAL(MethodInfo("node_changed", PropertyInfo(Variant::STRING_NAME, "node_name"))); } void AnimationNodeBlendTree::_initialize_node_tree() { diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index 096f4edee2..ce9406883d 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -650,15 +650,14 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, double double c = Math::ease(p_time / first_key_time, transition); Variant first_value = a->track_get_key_value(i, first_key); first_value = _post_process_key_value(a, i, first_value, nc->node); - Variant interp_value; - Variant::interpolate(pa->capture, first_value, c, interp_value); + Variant interp_value = Animation::interpolate_variant(pa->capture, first_value, c); if (pa->accum_pass != accum_pass) { ERR_CONTINUE(cache_update_prop_size >= NODE_CACHE_UPDATE_MAX); cache_update_prop[cache_update_prop_size++] = pa; pa->value_accum = interp_value; pa->accum_pass = accum_pass; } else { - Variant::interpolate(pa->value_accum, interp_value, p_interp, pa->value_accum); + pa->value_accum = Animation::interpolate_variant(pa->value_accum, interp_value, p_interp); } continue; //handled @@ -679,7 +678,7 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, double pa->value_accum = value; pa->accum_pass = accum_pass; } else { - Variant::interpolate(pa->value_accum, value, p_interp, pa->value_accum); + pa->value_accum = Animation::interpolate_variant(pa->value_accum, value, p_interp); } } else if (p_is_current && p_delta != 0) { @@ -1270,6 +1269,8 @@ void AnimationPlayer::_animation_set_cache_update() { // If something was modified or removed, caches need to be cleared clear_caches(); } + + emit_signal(SNAME("animation_list_changed")); } void AnimationPlayer::_animation_added(const StringName &p_name, const StringName &p_library) { @@ -2150,6 +2151,7 @@ void AnimationPlayer::_bind_methods() { ADD_SIGNAL(MethodInfo("animation_finished", PropertyInfo(Variant::STRING_NAME, "anim_name"))); ADD_SIGNAL(MethodInfo("animation_changed", PropertyInfo(Variant::STRING_NAME, "old_name"), PropertyInfo(Variant::STRING_NAME, "new_name"))); ADD_SIGNAL(MethodInfo("animation_started", PropertyInfo(Variant::STRING_NAME, "anim_name"))); + ADD_SIGNAL(MethodInfo("animation_list_changed")); ADD_SIGNAL(MethodInfo("caches_cleared")); BIND_ENUM_CONSTANT(ANIMATION_PROCESS_PHYSICS); diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp index d06324f0aa..bcd52082af 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -847,6 +847,11 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) { return true; } +void AnimationTree::_animation_player_changed() { + emit_signal(SNAME("animation_player_changed")); + _clear_caches(); +} + void AnimationTree::_clear_caches() { for (KeyValue<NodePath, TrackCache *> &K : track_cache) { memdelete(K.value); @@ -1378,8 +1383,13 @@ void AnimationTree::_process_graph(double p_delta) { } t->value = Math::fposmod(rot_a + (rot_b - rot_init) * (float)blend, (float)Math_TAU); } else { - Variant::sub(value, t->init_value, value); - Variant::blend(t->value, value, blend, t->value); + if (t->init_value.get_type() == Variant::BOOL) { + value = Animation::subtract_variant(value.operator real_t(), t->init_value.operator real_t()); + t->value = Animation::blend_variant(t->value.operator real_t(), value.operator real_t(), blend); + } else { + value = Animation::subtract_variant(value, t->init_value); + t->value = Animation::blend_variant(t->value, value, blend); + } } } else { if (blend < CMP_EPSILON) { @@ -1698,7 +1708,11 @@ void AnimationTree::_process_graph(double p_delta) { case Animation::TYPE_VALUE: { TrackCacheValue *t = static_cast<TrackCacheValue *>(track); - t->object->set_indexed(t->subpath, t->value); + if (t->init_value.get_type() == Variant::BOOL) { + t->object->set_indexed(t->subpath, t->value.operator real_t() >= 0.5); + } else { + t->object->set_indexed(t->subpath, t->value); + } } break; case Animation::TYPE_BEZIER: { @@ -1738,6 +1752,7 @@ void AnimationTree::advance(real_t p_time) { void AnimationTree::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { + _setup_animation_player(); if (last_animation_player.is_valid()) { Object *player = ObjectDB::get_instance(last_animation_player); if (player) { @@ -1770,8 +1785,43 @@ void AnimationTree::_notification(int p_what) { } } +void AnimationTree::_setup_animation_player() { + if (!is_inside_tree()) { + return; + } + + AnimationPlayer *new_player = nullptr; + if (!animation_player.is_empty()) { + new_player = Object::cast_to<AnimationPlayer>(get_node(animation_player)); + if (new_player && !new_player->is_connected("animation_list_changed", callable_mp(this, &AnimationTree::_animation_player_changed))) { + new_player->connect("animation_list_changed", callable_mp(this, &AnimationTree::_animation_player_changed)); + } + } + + if (new_player) { + if (!last_animation_player.is_valid()) { + // Animation player set newly. + emit_signal(SNAME("animation_player_changed")); + return; + } else if (last_animation_player == new_player->get_instance_id()) { + // Animation player isn't changed. + return; + } + } else if (!last_animation_player.is_valid()) { + // Animation player is being empty. + return; + } + + AnimationPlayer *old_player = Object::cast_to<AnimationPlayer>(ObjectDB::get_instance(last_animation_player)); + if (old_player && old_player->is_connected("animation_list_changed", callable_mp(this, &AnimationTree::_animation_player_changed))) { + old_player->disconnect("animation_list_changed", callable_mp(this, &AnimationTree::_animation_player_changed)); + } + emit_signal(SNAME("animation_player_changed")); +} + void AnimationTree::set_animation_player(const NodePath &p_player) { animation_player = p_player; + _setup_animation_player(); update_configuration_warnings(); } @@ -1799,8 +1849,8 @@ uint64_t AnimationTree::get_last_process_pass() const { return process_pass; } -TypedArray<String> AnimationTree::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray AnimationTree::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!root.is_valid()) { warnings.push_back(RTR("No root AnimationNode for the graph is set.")); @@ -2008,6 +2058,8 @@ void AnimationTree::_bind_methods() { BIND_ENUM_CONSTANT(ANIMATION_PROCESS_PHYSICS); BIND_ENUM_CONSTANT(ANIMATION_PROCESS_IDLE); BIND_ENUM_CONSTANT(ANIMATION_PROCESS_MANUAL); + + ADD_SIGNAL(MethodInfo("animation_player_changed")); } AnimationTree::AnimationTree() { diff --git a/scene/animation/animation_tree.h b/scene/animation/animation_tree.h index ee0c0303dc..fc31c52bc6 100644 --- a/scene/animation/animation_tree.h +++ b/scene/animation/animation_tree.h @@ -282,6 +282,8 @@ private: bool cache_valid = false; void _node_removed(Node *p_node); + void _setup_animation_player(); + void _animation_player_changed(); void _clear_caches(); bool _update_caches(AnimationPlayer *player); void _process_graph(double p_delta); @@ -340,7 +342,7 @@ public: void set_advance_expression_base_node(const NodePath &p_advance_expression_base_node); NodePath get_advance_expression_base_node() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; bool is_state_invalid() const; String get_invalid_state_reason() const; diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp index 5b18d4e457..b02f1959b7 100644 --- a/scene/animation/tween.cpp +++ b/scene/animation/tween.cpp @@ -32,6 +32,7 @@ #include "scene/animation/easing_equations.h" #include "scene/main/node.h" +#include "scene/resources/animation.h" Tween::interpolater Tween::interpolaters[Tween::TRANS_MAX][Tween::EASE_MAX] = { { &linear::in, &linear::in, &linear::in, &linear::in }, // Linear is the same for each easing. @@ -314,6 +315,7 @@ bool Tween::step(float p_delta) { running = false; dead = true; emit_signal(SNAME("finished")); + break; } else { emit_signal(SNAME("loop_finished"), loops_done); current_step = 0; @@ -375,264 +377,14 @@ Variant Tween::interpolate_variant(Variant p_initial_val, Variant p_delta_val, f ERR_FAIL_INDEX_V(p_trans, TransitionType::TRANS_MAX, Variant()); ERR_FAIL_INDEX_V(p_ease, EaseType::EASE_MAX, Variant()); -// Helper macro to run equation on sub-elements of the value (e.g. x and y of Vector2). -#define APPLY_EQUATION(element) \ - r.element = run_equation(p_trans, p_ease, p_time, i.element, d.element, p_duration); - - switch (p_initial_val.get_type()) { - case Variant::BOOL: { - return (run_equation(p_trans, p_ease, p_time, p_initial_val, p_delta_val, p_duration)) >= 0.5; - } - - case Variant::INT: { - return (int)run_equation(p_trans, p_ease, p_time, (int)p_initial_val, (int)p_delta_val, p_duration); - } - - case Variant::FLOAT: { - return run_equation(p_trans, p_ease, p_time, (real_t)p_initial_val, (real_t)p_delta_val, p_duration); - } - - case Variant::VECTOR2: { - Vector2 i = p_initial_val; - Vector2 d = p_delta_val; - Vector2 r; - - APPLY_EQUATION(x); - APPLY_EQUATION(y); - return r; - } - - case Variant::VECTOR2I: { - Vector2i i = p_initial_val; - Vector2i d = p_delta_val; - Vector2i r; - - APPLY_EQUATION(x); - APPLY_EQUATION(y); - return r; - } - - case Variant::RECT2: { - Rect2 i = p_initial_val; - Rect2 d = p_delta_val; - Rect2 r; - - APPLY_EQUATION(position.x); - APPLY_EQUATION(position.y); - APPLY_EQUATION(size.x); - APPLY_EQUATION(size.y); - return r; - } - - case Variant::RECT2I: { - Rect2i i = p_initial_val; - Rect2i d = p_delta_val; - Rect2i r; - - APPLY_EQUATION(position.x); - APPLY_EQUATION(position.y); - APPLY_EQUATION(size.x); - APPLY_EQUATION(size.y); - return r; - } - - case Variant::VECTOR3: { - Vector3 i = p_initial_val; - Vector3 d = p_delta_val; - Vector3 r; - - APPLY_EQUATION(x); - APPLY_EQUATION(y); - APPLY_EQUATION(z); - return r; - } - - case Variant::VECTOR3I: { - Vector3i i = p_initial_val; - Vector3i d = p_delta_val; - Vector3i r; - - APPLY_EQUATION(x); - APPLY_EQUATION(y); - APPLY_EQUATION(z); - return r; - } - - case Variant::TRANSFORM2D: { - Transform2D i = p_initial_val; - Transform2D d = p_delta_val; - Transform2D r; - - APPLY_EQUATION(columns[0][0]); - APPLY_EQUATION(columns[0][1]); - APPLY_EQUATION(columns[1][0]); - APPLY_EQUATION(columns[1][1]); - APPLY_EQUATION(columns[2][0]); - APPLY_EQUATION(columns[2][1]); - return r; - } - case Variant::VECTOR4: { - Vector4 i = p_initial_val; - Vector4 d = p_delta_val; - Vector4 r; - - APPLY_EQUATION(x); - APPLY_EQUATION(y); - APPLY_EQUATION(z); - APPLY_EQUATION(w); - return r; - } - - case Variant::QUATERNION: { - Quaternion i = p_initial_val; - Quaternion d = p_delta_val; - Quaternion r = i * d; - r = i.slerp(r, run_equation(p_trans, p_ease, p_time, 0.0, 1.0, p_duration)); - return r; - } - - case Variant::AABB: { - AABB i = p_initial_val; - AABB d = p_delta_val; - AABB r; - - APPLY_EQUATION(position.x); - APPLY_EQUATION(position.y); - APPLY_EQUATION(position.z); - APPLY_EQUATION(size.x); - APPLY_EQUATION(size.y); - APPLY_EQUATION(size.z); - return r; - } - - case Variant::BASIS: { - Basis i = p_initial_val; - Basis d = p_delta_val; - Basis r; - - APPLY_EQUATION(rows[0][0]); - APPLY_EQUATION(rows[0][1]); - APPLY_EQUATION(rows[0][2]); - APPLY_EQUATION(rows[1][0]); - APPLY_EQUATION(rows[1][1]); - APPLY_EQUATION(rows[1][2]); - APPLY_EQUATION(rows[2][0]); - APPLY_EQUATION(rows[2][1]); - APPLY_EQUATION(rows[2][2]); - return r; - } - - case Variant::TRANSFORM3D: { - Transform3D i = p_initial_val; - Transform3D d = p_delta_val; - Transform3D r; - - APPLY_EQUATION(basis.rows[0][0]); - APPLY_EQUATION(basis.rows[0][1]); - APPLY_EQUATION(basis.rows[0][2]); - APPLY_EQUATION(basis.rows[1][0]); - APPLY_EQUATION(basis.rows[1][1]); - APPLY_EQUATION(basis.rows[1][2]); - APPLY_EQUATION(basis.rows[2][0]); - APPLY_EQUATION(basis.rows[2][1]); - APPLY_EQUATION(basis.rows[2][2]); - APPLY_EQUATION(origin.x); - APPLY_EQUATION(origin.y); - APPLY_EQUATION(origin.z); - return r; - } - - case Variant::COLOR: { - Color i = p_initial_val; - Color d = p_delta_val; - Color r; - - APPLY_EQUATION(r); - APPLY_EQUATION(g); - APPLY_EQUATION(b); - APPLY_EQUATION(a); - return r; - } - - default: { - return p_initial_val; - } - }; -#undef APPLY_EQUATION -} - -Variant Tween::calculate_delta_value(Variant p_intial_val, Variant p_final_val) { - ERR_FAIL_COND_V_MSG(p_intial_val.get_type() != p_final_val.get_type(), p_intial_val, "Type mismatch between initial and final value: " + Variant::get_type_name(p_intial_val.get_type()) + " and " + Variant::get_type_name(p_final_val.get_type())); - - switch (p_intial_val.get_type()) { - case Variant::BOOL: { - return (int)p_final_val - (int)p_intial_val; - } - - case Variant::RECT2: { - Rect2 i = p_intial_val; - Rect2 f = p_final_val; - return Rect2(f.position - i.position, f.size - i.size); - } - - case Variant::RECT2I: { - Rect2i i = p_intial_val; - Rect2i f = p_final_val; - return Rect2i(f.position - i.position, f.size - i.size); - } - - case Variant::TRANSFORM2D: { - Transform2D i = p_intial_val; - Transform2D f = p_final_val; - return Transform2D(f.columns[0][0] - i.columns[0][0], - f.columns[0][1] - i.columns[0][1], - f.columns[1][0] - i.columns[1][0], - f.columns[1][1] - i.columns[1][1], - f.columns[2][0] - i.columns[2][0], - f.columns[2][1] - i.columns[2][1]); - } - - case Variant::AABB: { - AABB i = p_intial_val; - AABB f = p_final_val; - return AABB(f.position - i.position, f.size - i.size); - } - - case Variant::BASIS: { - Basis i = p_intial_val; - Basis f = p_final_val; - return Basis(f.rows[0][0] - i.rows[0][0], - f.rows[0][1] - i.rows[0][1], - f.rows[0][2] - i.rows[0][2], - f.rows[1][0] - i.rows[1][0], - f.rows[1][1] - i.rows[1][1], - f.rows[1][2] - i.rows[1][2], - f.rows[2][0] - i.rows[2][0], - f.rows[2][1] - i.rows[2][1], - f.rows[2][2] - i.rows[2][2]); - } - - case Variant::TRANSFORM3D: { - Transform3D i = p_intial_val; - Transform3D f = p_final_val; - return Transform3D(f.basis.rows[0][0] - i.basis.rows[0][0], - f.basis.rows[0][1] - i.basis.rows[0][1], - f.basis.rows[0][2] - i.basis.rows[0][2], - f.basis.rows[1][0] - i.basis.rows[1][0], - f.basis.rows[1][1] - i.basis.rows[1][1], - f.basis.rows[1][2] - i.basis.rows[1][2], - f.basis.rows[2][0] - i.basis.rows[2][0], - f.basis.rows[2][1] - i.basis.rows[2][1], - f.basis.rows[2][2] - i.basis.rows[2][2], - f.origin.x - i.origin.x, - f.origin.y - i.origin.y, - f.origin.z - i.origin.z); - } + // Special case for bool. + if (p_initial_val.get_type() == Variant::BOOL) { + return run_equation(p_trans, p_ease, p_time, p_initial_val, p_delta_val, p_duration) >= 0.5; + } - default: { - return Variant::evaluate(Variant::OP_SUBTRACT, p_final_val, p_intial_val); - } - }; + Variant ret = Animation::add_variant(p_initial_val, p_delta_val); + ret = Animation::interpolate_variant(p_initial_val, ret, run_equation(p_trans, p_ease, p_time, 0.0, 1.0, p_duration)); + return ret; } void Tween::_bind_methods() { @@ -748,10 +500,10 @@ void PropertyTweener::start() { } if (relative) { - final_val = Variant::evaluate(Variant::Operator::OP_ADD, initial_val, base_final_val); + final_val = Animation::add_variant(initial_val, base_final_val); } - delta_val = tween->calculate_delta_value(initial_val, final_val); + delta_val = Animation::subtract_variant(final_val, initial_val); } bool PropertyTweener::step(float &r_delta) { @@ -973,7 +725,7 @@ void MethodTweener::_bind_methods() { MethodTweener::MethodTweener(Callable p_callback, Variant p_from, Variant p_to, float p_duration) { callback = p_callback; initial_val = p_from; - delta_val = tween->calculate_delta_value(p_from, p_to); + delta_val = Animation::subtract_variant(p_to, p_from); final_val = p_to; duration = p_duration; } diff --git a/scene/animation/tween.h b/scene/animation/tween.h index b57ec2e5e7..da7a8b5d71 100644 --- a/scene/animation/tween.h +++ b/scene/animation/tween.h @@ -164,7 +164,6 @@ public: static real_t run_equation(TransitionType p_trans_type, EaseType p_ease_type, real_t t, real_t b, real_t c, real_t d); static Variant interpolate_variant(Variant p_initial_val, Variant p_delta_val, float p_time, float p_duration, Tween::TransitionType p_trans, Tween::EaseType p_ease); - Variant calculate_delta_value(Variant p_intial_val, Variant p_final_val); bool step(float p_delta); bool can_process(bool p_tree_paused) const; diff --git a/scene/gui/base_button.cpp b/scene/gui/base_button.cpp index cf467ceafb..3d95677dcf 100644 --- a/scene/gui/base_button.cpp +++ b/scene/gui/base_button.cpp @@ -469,7 +469,7 @@ void BaseButton::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "keep_pressed_outside"), "set_keep_pressed_outside", "is_keep_pressed_outside"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut", PROPERTY_HINT_RESOURCE_TYPE, "Shortcut"), "set_shortcut", "get_shortcut"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "button_group", PROPERTY_HINT_RESOURCE_TYPE, "ButtonGroup"), "set_button_group", "get_button_group"); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut_context", PROPERTY_HINT_RESOURCE_TYPE, "Node"), "set_shortcut_context", "get_shortcut_context"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut_context", PROPERTY_HINT_NODE_TYPE, "Node"), "set_shortcut_context", "get_shortcut_context"); BIND_ENUM_CONSTANT(DRAW_NORMAL); BIND_ENUM_CONSTANT(DRAW_PRESSED); diff --git a/scene/gui/code_edit.cpp b/scene/gui/code_edit.cpp index 1ef1801457..f6e0e4216d 100644 --- a/scene/gui/code_edit.cpp +++ b/scene/gui/code_edit.cpp @@ -344,7 +344,7 @@ void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) { } } else { if (mb->get_button_index() == MouseButton::LEFT) { - if (mb->is_command_pressed() && !symbol_lookup_word.is_empty()) { + if (mb->is_command_or_control_pressed() && !symbol_lookup_word.is_empty()) { Vector2i mpos = mb->get_position(); if (is_layout_rtl()) { mpos.x = get_size().x - mpos.x; @@ -371,7 +371,7 @@ void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) { } if (symbol_lookup_on_click_enabled) { - if (mm->is_command_pressed() && mm->get_button_mask() == MouseButton::NONE && !is_dragging_cursor()) { + if (mm->is_command_or_control_pressed() && mm->get_button_mask() == MouseButton::NONE && !is_dragging_cursor()) { symbol_lookup_new_word = get_word_at_pos(mpos); if (symbol_lookup_new_word != symbol_lookup_word) { emit_signal(SNAME("symbol_validate"), symbol_lookup_new_word); @@ -432,7 +432,7 @@ void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) { /* Allow unicode handling if: */ /* No Modifiers are pressed (except shift) */ - bool allow_unicode_handling = !(k->is_command_pressed() || k->is_ctrl_pressed() || k->is_alt_pressed() || k->is_meta_pressed()); + bool allow_unicode_handling = !(k->is_command_or_control_pressed() || k->is_ctrl_pressed() || k->is_alt_pressed() || k->is_meta_pressed()); /* AUTO-COMPLETE */ if (code_completion_enabled && k->is_action("ui_text_completion_query", true)) { diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index 41ed1d16c4..4a1f2ab7c6 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -1086,7 +1086,7 @@ void ColorPicker::_screen_pick_pressed() { } else { screen->show(); } - screen->raise(); + screen->move_to_front(); #ifndef _MSC_VER #warning show modal no longer works, needs to be converted to a popup #endif diff --git a/scene/gui/container.cpp b/scene/gui/container.cpp index 5512c0f1fd..3c29c37479 100644 --- a/scene/gui/container.cpp +++ b/scene/gui/container.cpp @@ -192,8 +192,8 @@ void Container::_notification(int p_what) { } } -TypedArray<String> Container::get_configuration_warnings() const { - TypedArray<String> warnings = Control::get_configuration_warnings(); +PackedStringArray Container::get_configuration_warnings() const { + PackedStringArray warnings = Control::get_configuration_warnings(); if (get_class() == "Container" && get_script().is_null()) { warnings.push_back(RTR("Container by itself serves no purpose unless a script configures its children placement behavior.\nIf you don't intend to add a script, use a plain Control node instead.")); diff --git a/scene/gui/container.h b/scene/gui/container.h index 9ec4ad3200..21bdb95186 100644 --- a/scene/gui/container.h +++ b/scene/gui/container.h @@ -63,7 +63,7 @@ public: virtual Vector<int> get_allowed_size_flags_horizontal() const; virtual Vector<int> get_allowed_size_flags_vertical() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; Container(); }; diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index b4e603d5ed..ae94be8437 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -213,8 +213,8 @@ void Control::get_argument_options(const StringName &p_function, int p_idx, List } } -TypedArray<String> Control::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray Control::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (data.mouse_filter == MOUSE_FILTER_IGNORE && !data.tooltip.is_empty()) { warnings.push_back(RTR("The Hint Tooltip won't be displayed as the control's Mouse Filter is set to \"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\".")); @@ -1564,7 +1564,7 @@ Size2 Control::get_minimum_size() const { return Vector2(); } -void Control::set_custom_minimum_size(const Size2 &p_custom) { +void Control::set_custom_minimum_size(const Size2i &p_custom) { if (p_custom == data.custom_minimum_size) { return; } @@ -1572,7 +1572,7 @@ void Control::set_custom_minimum_size(const Size2 &p_custom) { update_minimum_size(); } -Size2 Control::get_custom_minimum_size() const { +Size2i Control::get_custom_minimum_size() const { return data.custom_minimum_size; } @@ -3132,7 +3132,7 @@ void Control::_bind_methods() { ADD_GROUP("Layout", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_contents"), "set_clip_contents", "is_clipping_contents"); - ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "custom_minimum_size", PROPERTY_HINT_NONE, "suffix:px"), "set_custom_minimum_size", "get_custom_minimum_size"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "custom_minimum_size", PROPERTY_HINT_NONE, "suffix:px"), "set_custom_minimum_size", "get_custom_minimum_size"); ADD_PROPERTY(PropertyInfo(Variant::INT, "layout_direction", PROPERTY_HINT_ENUM, "Inherited,Locale,Left-to-Right,Right-to-Left"), "set_layout_direction", "get_layout_direction"); ADD_PROPERTY(PropertyInfo(Variant::INT, "layout_mode", PROPERTY_HINT_ENUM, "Position,Anchors,Container,Uncontrolled", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "_set_layout_mode", "_get_layout_mode"); ADD_PROPERTY_DEFAULT("layout_mode", LayoutMode::LAYOUT_MODE_POSITION); diff --git a/scene/gui/control.h b/scene/gui/control.h index 3fb1494d66..ee6443c81c 100644 --- a/scene/gui/control.h +++ b/scene/gui/control.h @@ -200,7 +200,7 @@ private: int h_size_flags = SIZE_FILL; int v_size_flags = SIZE_FILL; real_t expand = 1.0; - Point2 custom_minimum_size; + Point2i custom_minimum_size; // Input events and rendering. @@ -387,7 +387,7 @@ public: // Editor integration. virtual void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const override; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; virtual bool is_text_field() const; @@ -460,8 +460,8 @@ public: virtual Size2 get_minimum_size() const; virtual Size2 get_combined_minimum_size() const; - void set_custom_minimum_size(const Size2 &p_custom); - Size2 get_custom_minimum_size() const; + void set_custom_minimum_size(const Size2i &p_custom); + Size2i get_custom_minimum_size() const; // Container sizing. diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index 9fdb9537a0..57f27e299f 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -145,7 +145,7 @@ void FileDialog::shortcut_input(const Ref<InputEvent> &p_event) { switch (k->get_keycode()) { case Key::H: { - if (k->is_command_pressed()) { + if (k->is_command_or_control_pressed()) { set_show_hidden_files(!show_hidden_files); } else { handled = false; diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index 3efd465939..7295ab9e9d 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -190,6 +190,14 @@ void GraphEditMinimap::_adjust_graph_scroll(const Vector2 &p_offset) { ge->set_scroll_ofs(p_offset + graph_offset - camera_size / 2); } +PackedStringArray GraphEdit::get_configuration_warnings() const { + PackedStringArray warnings = Control::get_configuration_warnings(); + + warnings.push_back(RTR("Please be aware that GraphEdit and GraphNode will undergo extensive refactoring in a future beta version involving compatibility-breaking API changes.")); + + return warnings; +} + Error GraphEdit::connect_node(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port) { if (is_node_connected(p_from, p_from_port, p_to, p_to_port)) { return OK; @@ -351,7 +359,7 @@ void GraphEdit::_graph_node_raised(Node *p_gn) { if (gn->is_comment()) { move_child(gn, 0); } else { - gn->raise(); + gn->move_to_front(); } } @@ -773,25 +781,25 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) { if (connecting_valid) { if (connecting && connecting_target) { String from = connecting_from; - int from_slot = connecting_index; + int from_port = connecting_index; String to = connecting_target_to; - int to_slot = connecting_target_index; + int to_port = connecting_target_index; if (!connecting_out) { SWAP(from, to); - SWAP(from_slot, to_slot); + SWAP(from_port, to_port); } - emit_signal(SNAME("connection_request"), from, from_slot, to, to_slot); + emit_signal(SNAME("connection_request"), from, from_port, to, to_port); } else if (!just_disconnected) { String from = connecting_from; - int from_slot = connecting_index; + int from_port = connecting_index; Vector2 ofs = mb->get_position(); if (!connecting_out) { - emit_signal(SNAME("connection_from_empty"), from, from_slot, ofs); + emit_signal(SNAME("connection_from_empty"), from, from_port, ofs); } else { - emit_signal(SNAME("connection_to_empty"), from, from_slot, ofs); + emit_signal(SNAME("connection_to_empty"), from, from_port, ofs); } } } @@ -830,22 +838,22 @@ bool GraphEdit::_check_clickable_control(Control *p_control, const Vector2 &mpos } } -bool GraphEdit::is_in_input_hotzone(GraphNode *p_graph_node, int p_slot_index, const Vector2 &p_mouse_pos, const Vector2i &p_port_size) { +bool GraphEdit::is_in_input_hotzone(GraphNode *p_node, int p_port, const Vector2 &p_mouse_pos, const Vector2i &p_port_size) { bool success; - if (GDVIRTUAL_CALL(_is_in_input_hotzone, p_graph_node, p_slot_index, p_mouse_pos, success)) { + if (GDVIRTUAL_CALL(_is_in_input_hotzone, p_node, p_port, p_mouse_pos, success)) { return success; } else { - Vector2 pos = p_graph_node->get_connection_input_position(p_slot_index) + p_graph_node->get_position(); + Vector2 pos = p_node->get_connection_input_position(p_port) + p_node->get_position(); return is_in_port_hotzone(pos / zoom, p_mouse_pos, p_port_size, true); } } -bool GraphEdit::is_in_output_hotzone(GraphNode *p_graph_node, int p_slot_index, const Vector2 &p_mouse_pos, const Vector2i &p_port_size) { +bool GraphEdit::is_in_output_hotzone(GraphNode *p_node, int p_port, const Vector2 &p_mouse_pos, const Vector2i &p_port_size) { bool success; - if (GDVIRTUAL_CALL(_is_in_output_hotzone, p_graph_node, p_slot_index, p_mouse_pos, success)) { + if (GDVIRTUAL_CALL(_is_in_output_hotzone, p_node, p_port, p_mouse_pos, success)) { return success; } else { - Vector2 pos = p_graph_node->get_connection_output_position(p_slot_index) + p_graph_node->get_position(); + Vector2 pos = p_node->get_connection_output_position(p_port) + p_node->get_position(); return is_in_port_hotzone(pos / zoom, p_mouse_pos, p_port_size, false); } } @@ -1100,11 +1108,11 @@ void GraphEdit::_minimap_draw() { continue; } - Vector2 from_slot_position = gfrom->get_position_offset() * zoom + gfrom->get_connection_output_position(E.from_port); - Vector2 from_position = minimap->_convert_from_graph_position(from_slot_position - graph_offset) + minimap_offset; + Vector2 from_port_position = gfrom->get_position_offset() * zoom + gfrom->get_connection_output_position(E.from_port); + Vector2 from_position = minimap->_convert_from_graph_position(from_port_position - graph_offset) + minimap_offset; Color from_color = gfrom->get_connection_output_color(E.from_port); - Vector2 to_slot_position = gto->get_position_offset() * zoom + gto->get_connection_input_position(E.to_port); - Vector2 to_position = minimap->_convert_from_graph_position(to_slot_position - graph_offset) + minimap_offset; + Vector2 to_port_position = gto->get_position_offset() * zoom + gto->get_connection_input_position(E.to_port); + Vector2 to_position = minimap->_convert_from_graph_position(to_port_position - graph_offset) + minimap_offset; Color to_color = gto->get_connection_input_color(E.to_port); if (E.activity > 0) { @@ -2303,10 +2311,10 @@ void GraphEdit::arrange_nodes() { } void GraphEdit::_bind_methods() { - ClassDB::bind_method(D_METHOD("connect_node", "from", "from_port", "to", "to_port"), &GraphEdit::connect_node); - ClassDB::bind_method(D_METHOD("is_node_connected", "from", "from_port", "to", "to_port"), &GraphEdit::is_node_connected); - ClassDB::bind_method(D_METHOD("disconnect_node", "from", "from_port", "to", "to_port"), &GraphEdit::disconnect_node); - ClassDB::bind_method(D_METHOD("set_connection_activity", "from", "from_port", "to", "to_port", "amount"), &GraphEdit::set_connection_activity); + ClassDB::bind_method(D_METHOD("connect_node", "from_node", "from_port", "to_node", "to_port"), &GraphEdit::connect_node); + ClassDB::bind_method(D_METHOD("is_node_connected", "from_node", "from_port", "to_node", "to_port"), &GraphEdit::is_node_connected); + ClassDB::bind_method(D_METHOD("disconnect_node", "from_node", "from_port", "to_node", "to_port"), &GraphEdit::disconnect_node); + ClassDB::bind_method(D_METHOD("set_connection_activity", "from_node", "from_port", "to_node", "to_port", "amount"), &GraphEdit::set_connection_activity); ClassDB::bind_method(D_METHOD("get_connection_list"), &GraphEdit::_get_connection_list); ClassDB::bind_method(D_METHOD("clear_connections"), &GraphEdit::clear_connections); ClassDB::bind_method(D_METHOD("force_connection_drag_end"), &GraphEdit::force_connection_drag_end); @@ -2320,7 +2328,7 @@ void GraphEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("add_valid_connection_type", "from_type", "to_type"), &GraphEdit::add_valid_connection_type); ClassDB::bind_method(D_METHOD("remove_valid_connection_type", "from_type", "to_type"), &GraphEdit::remove_valid_connection_type); ClassDB::bind_method(D_METHOD("is_valid_connection_type", "from_type", "to_type"), &GraphEdit::is_valid_connection_type); - ClassDB::bind_method(D_METHOD("get_connection_line", "from", "to"), &GraphEdit::get_connection_line); + ClassDB::bind_method(D_METHOD("get_connection_line", "from_node", "to_node"), &GraphEdit::get_connection_line); ClassDB::bind_method(D_METHOD("set_panning_scheme", "scheme"), &GraphEdit::set_panning_scheme); ClassDB::bind_method(D_METHOD("get_panning_scheme"), &GraphEdit::get_panning_scheme); @@ -2370,8 +2378,8 @@ void GraphEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("is_right_disconnects_enabled"), &GraphEdit::is_right_disconnects_enabled); ClassDB::bind_method(D_METHOD("_update_scroll_offset"), &GraphEdit::_update_scroll_offset); - GDVIRTUAL_BIND(_is_in_input_hotzone, "graph_node", "slot_index", "mouse_position"); - GDVIRTUAL_BIND(_is_in_output_hotzone, "graph_node", "slot_index", "mouse_position"); + GDVIRTUAL_BIND(_is_in_input_hotzone, "in_node", "in_port", "mouse_position"); + GDVIRTUAL_BIND(_is_in_output_hotzone, "in_node", "in_port", "mouse_position"); ClassDB::bind_method(D_METHOD("get_zoom_hbox"), &GraphEdit::get_zoom_hbox); @@ -2379,8 +2387,8 @@ void GraphEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("set_selected", "node"), &GraphEdit::set_selected); - GDVIRTUAL_BIND(_get_connection_line, "from", "to") - GDVIRTUAL_BIND(_is_node_hover_valid, "from", "from_slot", "to", "to_slot"); + GDVIRTUAL_BIND(_get_connection_line, "from_position", "to_position") + GDVIRTUAL_BIND(_is_node_hover_valid, "from_node", "from_port", "to_node", "to_port"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "right_disconnects"), "set_right_disconnects", "is_right_disconnects_enabled"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "scroll_offset", PROPERTY_HINT_NONE, "suffix:px"), "set_scroll_ofs", "get_scroll_ofs"); @@ -2408,21 +2416,21 @@ void GraphEdit::_bind_methods() { ADD_GROUP("UI", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "arrange_nodes_button_hidden"), "set_arrange_nodes_button_hidden", "is_arrange_nodes_button_hidden"); - ADD_SIGNAL(MethodInfo("connection_request", PropertyInfo(Variant::STRING_NAME, "from"), PropertyInfo(Variant::INT, "from_slot"), PropertyInfo(Variant::STRING_NAME, "to"), PropertyInfo(Variant::INT, "to_slot"))); - ADD_SIGNAL(MethodInfo("disconnection_request", PropertyInfo(Variant::STRING_NAME, "from"), PropertyInfo(Variant::INT, "from_slot"), PropertyInfo(Variant::STRING_NAME, "to"), PropertyInfo(Variant::INT, "to_slot"))); + ADD_SIGNAL(MethodInfo("connection_request", PropertyInfo(Variant::STRING_NAME, "from_node"), PropertyInfo(Variant::INT, "from_port"), PropertyInfo(Variant::STRING_NAME, "to_node"), PropertyInfo(Variant::INT, "to_port"))); + ADD_SIGNAL(MethodInfo("disconnection_request", PropertyInfo(Variant::STRING_NAME, "from_node"), PropertyInfo(Variant::INT, "from_port"), PropertyInfo(Variant::STRING_NAME, "to_node"), PropertyInfo(Variant::INT, "to_port"))); ADD_SIGNAL(MethodInfo("popup_request", PropertyInfo(Variant::VECTOR2, "position"))); ADD_SIGNAL(MethodInfo("duplicate_nodes_request")); ADD_SIGNAL(MethodInfo("copy_nodes_request")); ADD_SIGNAL(MethodInfo("paste_nodes_request")); ADD_SIGNAL(MethodInfo("node_selected", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node"))); ADD_SIGNAL(MethodInfo("node_deselected", 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("connection_to_empty", PropertyInfo(Variant::STRING_NAME, "from_node"), PropertyInfo(Variant::INT, "from_port"), PropertyInfo(Variant::VECTOR2, "release_position"))); + ADD_SIGNAL(MethodInfo("connection_from_empty", PropertyInfo(Variant::STRING_NAME, "to_node"), PropertyInfo(Variant::INT, "to_port"), PropertyInfo(Variant::VECTOR2, "release_position"))); ADD_SIGNAL(MethodInfo("delete_nodes_request", PropertyInfo(Variant::ARRAY, "nodes", PROPERTY_HINT_ARRAY_TYPE, "StringName"))); ADD_SIGNAL(MethodInfo("begin_node_move")); ADD_SIGNAL(MethodInfo("end_node_move")); ADD_SIGNAL(MethodInfo("scroll_offset_changed", PropertyInfo(Variant::VECTOR2, "offset"))); - ADD_SIGNAL(MethodInfo("connection_drag_started", PropertyInfo(Variant::STRING, "from"), PropertyInfo(Variant::INT, "slot"), PropertyInfo(Variant::BOOL, "is_output"))); + ADD_SIGNAL(MethodInfo("connection_drag_started", PropertyInfo(Variant::STRING, "from_node"), PropertyInfo(Variant::INT, "from_port"), PropertyInfo(Variant::BOOL, "is_output"))); ADD_SIGNAL(MethodInfo("connection_drag_ended")); BIND_ENUM_CONSTANT(SCROLL_ZOOMS); diff --git a/scene/gui/graph_edit.h b/scene/gui/graph_edit.h index b6ce575009..101087bdbd 100644 --- a/scene/gui/graph_edit.h +++ b/scene/gui/graph_edit.h @@ -201,8 +201,8 @@ private: GraphEditMinimap *minimap = nullptr; void _top_layer_input(const Ref<InputEvent> &p_ev); - bool is_in_input_hotzone(GraphNode *p_graph_node, int p_slot_index, const Vector2 &p_mouse_pos, const Vector2i &p_port_size); - bool is_in_output_hotzone(GraphNode *p_graph_node, int p_slot_index, const Vector2 &p_mouse_pos, const Vector2i &p_port_size); + bool is_in_input_hotzone(GraphNode *p_node, int p_port, const Vector2 &p_mouse_pos, const Vector2i &p_port_size); + bool is_in_output_hotzone(GraphNode *p_node, int p_port, const Vector2 &p_mouse_pos, const Vector2i &p_port_size); bool is_in_port_hotzone(const Vector2 &pos, const Vector2 &p_mouse_pos, const Vector2i &p_port_size, bool p_left); void _top_layer_draw(); @@ -287,6 +287,8 @@ protected: GDVIRTUAL4R(bool, _is_node_hover_valid, StringName, int, StringName, int); public: + PackedStringArray get_configuration_warnings() const override; + Error connect_node(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port); bool is_node_connected(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port); void disconnect_node(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port); diff --git a/scene/gui/graph_node.cpp b/scene/gui/graph_node.cpp index f441144a8e..21c0b5a842 100644 --- a/scene/gui/graph_node.cpp +++ b/scene/gui/graph_node.cpp @@ -779,8 +779,8 @@ void GraphNode::_connpos_update() { int sep = get_theme_constant(SNAME("separation")); Ref<StyleBox> sb = get_theme_stylebox(SNAME("frame")); - conn_input_cache.clear(); - conn_output_cache.clear(); + left_port_cache.clear(); + right_port_cache.clear(); int vofs = 0; int idx = 0; @@ -801,20 +801,26 @@ void GraphNode::_connpos_update() { if (slot_info.has(idx)) { if (slot_info[idx].enable_left) { - ConnCache cc; - cc.pos = Point2i(edgeofs, y + h / 2); + PortCache cc; + cc.position = Point2i(edgeofs, y + h / 2); + cc.height = size.height; + + cc.slot_idx = idx; cc.type = slot_info[idx].type_left; cc.color = slot_info[idx].color_left; - cc.height = size.height; - conn_input_cache.push_back(cc); + + left_port_cache.push_back(cc); } if (slot_info[idx].enable_right) { - ConnCache cc; - cc.pos = Point2i(get_size().width - edgeofs, y + h / 2); + PortCache cc; + cc.position = Point2i(get_size().width - edgeofs, y + h / 2); + cc.height = size.height; + + cc.slot_idx = idx; cc.type = slot_info[idx].type_right; cc.color = slot_info[idx].color_right; - cc.height = size.height; - conn_output_cache.push_back(cc); + + right_port_cache.push_back(cc); } } @@ -831,46 +837,55 @@ int GraphNode::get_connection_input_count() { _connpos_update(); } - return conn_input_cache.size(); + return left_port_cache.size(); } -int GraphNode::get_connection_input_height(int p_idx) { +int GraphNode::get_connection_input_height(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_input_cache.size(), 0); - return conn_input_cache[p_idx].height; + ERR_FAIL_INDEX_V(p_port, left_port_cache.size(), 0); + return left_port_cache[p_port].height; } -Vector2 GraphNode::get_connection_input_position(int p_idx) { +Vector2 GraphNode::get_connection_input_position(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_input_cache.size(), Vector2()); - Vector2 pos = conn_input_cache[p_idx].pos; + ERR_FAIL_INDEX_V(p_port, left_port_cache.size(), Vector2()); + Vector2 pos = left_port_cache[p_port].position; pos.x *= get_scale().x; pos.y *= get_scale().y; return pos; } -int GraphNode::get_connection_input_type(int p_idx) { +int GraphNode::get_connection_input_type(int p_port) { + if (connpos_dirty) { + _connpos_update(); + } + + ERR_FAIL_INDEX_V(p_port, left_port_cache.size(), 0); + return left_port_cache[p_port].type; +} + +Color GraphNode::get_connection_input_color(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_input_cache.size(), 0); - return conn_input_cache[p_idx].type; + ERR_FAIL_INDEX_V(p_port, left_port_cache.size(), Color()); + return left_port_cache[p_port].color; } -Color GraphNode::get_connection_input_color(int p_idx) { +int GraphNode::get_connection_input_slot(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_input_cache.size(), Color()); - return conn_input_cache[p_idx].color; + ERR_FAIL_INDEX_V(p_port, left_port_cache.size(), -1); + return left_port_cache[p_port].slot_idx; } int GraphNode::get_connection_output_count() { @@ -878,46 +893,55 @@ int GraphNode::get_connection_output_count() { _connpos_update(); } - return conn_output_cache.size(); + return right_port_cache.size(); } -int GraphNode::get_connection_output_height(int p_idx) { +int GraphNode::get_connection_output_height(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_output_cache.size(), 0); - return conn_output_cache[p_idx].height; + ERR_FAIL_INDEX_V(p_port, right_port_cache.size(), 0); + return right_port_cache[p_port].height; } -Vector2 GraphNode::get_connection_output_position(int p_idx) { +Vector2 GraphNode::get_connection_output_position(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_output_cache.size(), Vector2()); - Vector2 pos = conn_output_cache[p_idx].pos; + ERR_FAIL_INDEX_V(p_port, right_port_cache.size(), Vector2()); + Vector2 pos = right_port_cache[p_port].position; pos.x *= get_scale().x; pos.y *= get_scale().y; return pos; } -int GraphNode::get_connection_output_type(int p_idx) { +int GraphNode::get_connection_output_type(int p_port) { + if (connpos_dirty) { + _connpos_update(); + } + + ERR_FAIL_INDEX_V(p_port, right_port_cache.size(), 0); + return right_port_cache[p_port].type; +} + +Color GraphNode::get_connection_output_color(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_output_cache.size(), 0); - return conn_output_cache[p_idx].type; + ERR_FAIL_INDEX_V(p_port, right_port_cache.size(), Color()); + return right_port_cache[p_port].color; } -Color GraphNode::get_connection_output_color(int p_idx) { +int GraphNode::get_connection_output_slot(int p_port) { if (connpos_dirty) { _connpos_update(); } - ERR_FAIL_INDEX_V(p_idx, conn_output_cache.size(), Color()); - return conn_output_cache[p_idx].color; + ERR_FAIL_INDEX_V(p_port, right_port_cache.size(), -1); + return right_port_cache[p_port].slot_idx; } void GraphNode::gui_input(const Ref<InputEvent> &p_ev) { @@ -1050,30 +1074,30 @@ void GraphNode::_bind_methods() { ClassDB::bind_method(D_METHOD("set_language", "language"), &GraphNode::set_language); ClassDB::bind_method(D_METHOD("get_language"), &GraphNode::get_language); - ClassDB::bind_method(D_METHOD("set_slot", "idx", "enable_left", "type_left", "color_left", "enable_right", "type_right", "color_right", "custom_left", "custom_right", "enable"), &GraphNode::set_slot, DEFVAL(Ref<Texture2D>()), DEFVAL(Ref<Texture2D>()), DEFVAL(true)); - ClassDB::bind_method(D_METHOD("clear_slot", "idx"), &GraphNode::clear_slot); + ClassDB::bind_method(D_METHOD("set_slot", "slot_index", "enable_left_port", "type_left", "color_left", "enable_right_port", "type_right", "color_right", "custom_icon_left", "custom_icon_right", "draw_stylebox"), &GraphNode::set_slot, DEFVAL(Ref<Texture2D>()), DEFVAL(Ref<Texture2D>()), DEFVAL(true)); + ClassDB::bind_method(D_METHOD("clear_slot", "slot_index"), &GraphNode::clear_slot); ClassDB::bind_method(D_METHOD("clear_all_slots"), &GraphNode::clear_all_slots); - ClassDB::bind_method(D_METHOD("is_slot_enabled_left", "idx"), &GraphNode::is_slot_enabled_left); - ClassDB::bind_method(D_METHOD("set_slot_enabled_left", "idx", "enable_left"), &GraphNode::set_slot_enabled_left); + ClassDB::bind_method(D_METHOD("set_slot_enabled_left", "slot_index", "enable"), &GraphNode::set_slot_enabled_left); + ClassDB::bind_method(D_METHOD("is_slot_enabled_left", "slot_index"), &GraphNode::is_slot_enabled_left); - ClassDB::bind_method(D_METHOD("set_slot_type_left", "idx", "type_left"), &GraphNode::set_slot_type_left); - ClassDB::bind_method(D_METHOD("get_slot_type_left", "idx"), &GraphNode::get_slot_type_left); + ClassDB::bind_method(D_METHOD("set_slot_type_left", "slot_index", "type"), &GraphNode::set_slot_type_left); + ClassDB::bind_method(D_METHOD("get_slot_type_left", "slot_index"), &GraphNode::get_slot_type_left); - ClassDB::bind_method(D_METHOD("set_slot_color_left", "idx", "color_left"), &GraphNode::set_slot_color_left); - ClassDB::bind_method(D_METHOD("get_slot_color_left", "idx"), &GraphNode::get_slot_color_left); + ClassDB::bind_method(D_METHOD("set_slot_color_left", "slot_index", "color"), &GraphNode::set_slot_color_left); + ClassDB::bind_method(D_METHOD("get_slot_color_left", "slot_index"), &GraphNode::get_slot_color_left); - ClassDB::bind_method(D_METHOD("is_slot_enabled_right", "idx"), &GraphNode::is_slot_enabled_right); - ClassDB::bind_method(D_METHOD("set_slot_enabled_right", "idx", "enable_right"), &GraphNode::set_slot_enabled_right); + ClassDB::bind_method(D_METHOD("set_slot_enabled_right", "slot_index", "enable"), &GraphNode::set_slot_enabled_right); + ClassDB::bind_method(D_METHOD("is_slot_enabled_right", "slot_index"), &GraphNode::is_slot_enabled_right); - ClassDB::bind_method(D_METHOD("set_slot_type_right", "idx", "type_right"), &GraphNode::set_slot_type_right); - ClassDB::bind_method(D_METHOD("get_slot_type_right", "idx"), &GraphNode::get_slot_type_right); + ClassDB::bind_method(D_METHOD("set_slot_type_right", "slot_index", "type"), &GraphNode::set_slot_type_right); + ClassDB::bind_method(D_METHOD("get_slot_type_right", "slot_index"), &GraphNode::get_slot_type_right); - ClassDB::bind_method(D_METHOD("set_slot_color_right", "idx", "color_right"), &GraphNode::set_slot_color_right); - ClassDB::bind_method(D_METHOD("get_slot_color_right", "idx"), &GraphNode::get_slot_color_right); + ClassDB::bind_method(D_METHOD("set_slot_color_right", "slot_index", "color"), &GraphNode::set_slot_color_right); + ClassDB::bind_method(D_METHOD("get_slot_color_right", "slot_index"), &GraphNode::get_slot_color_right); - ClassDB::bind_method(D_METHOD("is_slot_draw_stylebox", "idx"), &GraphNode::is_slot_draw_stylebox); - ClassDB::bind_method(D_METHOD("set_slot_draw_stylebox", "idx", "draw_stylebox"), &GraphNode::set_slot_draw_stylebox); + ClassDB::bind_method(D_METHOD("is_slot_draw_stylebox", "slot_index"), &GraphNode::is_slot_draw_stylebox); + ClassDB::bind_method(D_METHOD("set_slot_draw_stylebox", "slot_index", "enable"), &GraphNode::set_slot_draw_stylebox); ClassDB::bind_method(D_METHOD("set_position_offset", "offset"), &GraphNode::set_position_offset); ClassDB::bind_method(D_METHOD("get_position_offset"), &GraphNode::get_position_offset); @@ -1094,16 +1118,18 @@ void GraphNode::_bind_methods() { ClassDB::bind_method(D_METHOD("is_selected"), &GraphNode::is_selected); ClassDB::bind_method(D_METHOD("get_connection_input_count"), &GraphNode::get_connection_input_count); - ClassDB::bind_method(D_METHOD("get_connection_input_height", "idx"), &GraphNode::get_connection_input_height); - ClassDB::bind_method(D_METHOD("get_connection_input_position", "idx"), &GraphNode::get_connection_input_position); - ClassDB::bind_method(D_METHOD("get_connection_input_type", "idx"), &GraphNode::get_connection_input_type); - ClassDB::bind_method(D_METHOD("get_connection_input_color", "idx"), &GraphNode::get_connection_input_color); + ClassDB::bind_method(D_METHOD("get_connection_input_height", "port"), &GraphNode::get_connection_input_height); + ClassDB::bind_method(D_METHOD("get_connection_input_position", "port"), &GraphNode::get_connection_input_position); + ClassDB::bind_method(D_METHOD("get_connection_input_type", "port"), &GraphNode::get_connection_input_type); + ClassDB::bind_method(D_METHOD("get_connection_input_color", "port"), &GraphNode::get_connection_input_color); + ClassDB::bind_method(D_METHOD("get_connection_input_slot", "port"), &GraphNode::get_connection_input_slot); ClassDB::bind_method(D_METHOD("get_connection_output_count"), &GraphNode::get_connection_output_count); - ClassDB::bind_method(D_METHOD("get_connection_output_height", "idx"), &GraphNode::get_connection_output_height); - ClassDB::bind_method(D_METHOD("get_connection_output_position", "idx"), &GraphNode::get_connection_output_position); - ClassDB::bind_method(D_METHOD("get_connection_output_type", "idx"), &GraphNode::get_connection_output_type); - ClassDB::bind_method(D_METHOD("get_connection_output_color", "idx"), &GraphNode::get_connection_output_color); + ClassDB::bind_method(D_METHOD("get_connection_output_height", "port"), &GraphNode::get_connection_output_height); + ClassDB::bind_method(D_METHOD("get_connection_output_position", "port"), &GraphNode::get_connection_output_position); + ClassDB::bind_method(D_METHOD("get_connection_output_type", "port"), &GraphNode::get_connection_output_type); + ClassDB::bind_method(D_METHOD("get_connection_output_color", "port"), &GraphNode::get_connection_output_color); + ClassDB::bind_method(D_METHOD("get_connection_output_slot", "port"), &GraphNode::get_connection_output_slot); ClassDB::bind_method(D_METHOD("set_show_close_button", "show"), &GraphNode::set_show_close_button); ClassDB::bind_method(D_METHOD("is_close_button_visible"), &GraphNode::is_close_button_visible); diff --git a/scene/gui/graph_node.h b/scene/gui/graph_node.h index 9c8f926403..e66b0cfc20 100644 --- a/scene/gui/graph_node.h +++ b/scene/gui/graph_node.h @@ -78,15 +78,17 @@ private: Vector<int> cache_y; - struct ConnCache { - Vector2 pos; + struct PortCache { + Vector2 position; + int height; + + int slot_idx; int type = 0; Color color; - int height; }; - Vector<ConnCache> conn_input_cache; - Vector<ConnCache> conn_output_cache; + Vector<PortCache> left_port_cache; + Vector<PortCache> right_port_cache; HashMap<int, Slot> slot_info; @@ -165,16 +167,18 @@ public: bool is_close_button_visible() const; int get_connection_input_count(); - int get_connection_input_height(int p_idx); - Vector2 get_connection_input_position(int p_idx); - int get_connection_input_type(int p_idx); - Color get_connection_input_color(int p_idx); + int get_connection_input_height(int p_port); + Vector2 get_connection_input_position(int p_port); + int get_connection_input_type(int p_port); + Color get_connection_input_color(int p_port); + int get_connection_input_slot(int p_port); int get_connection_output_count(); - int get_connection_output_height(int p_idx); - Vector2 get_connection_output_position(int p_idx); - int get_connection_output_type(int p_idx); - Color get_connection_output_color(int p_idx); + int get_connection_output_height(int p_port); + Vector2 get_connection_output_position(int p_port); + int get_connection_output_type(int p_port); + Color get_connection_output_color(int p_port); + int get_connection_output_slot(int p_port); void set_overlay(Overlay p_overlay); Overlay get_overlay() const; diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp index 7ff6e78c99..008109da65 100644 --- a/scene/gui/item_list.cpp +++ b/scene/gui/item_list.cpp @@ -596,7 +596,7 @@ ItemList::IconMode ItemList::get_icon_mode() const { return icon_mode; } -void ItemList::set_fixed_icon_size(const Size2 &p_size) { +void ItemList::set_fixed_icon_size(const Size2i &p_size) { if (fixed_icon_size == p_size) { return; } @@ -605,7 +605,7 @@ void ItemList::set_fixed_icon_size(const Size2 &p_size) { queue_redraw(); } -Size2 ItemList::get_fixed_icon_size() const { +Size2i ItemList::get_fixed_icon_size() const { return fixed_icon_size; } @@ -679,7 +679,7 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) { if (closest != -1 && (mb->get_button_index() == MouseButton::LEFT || (allow_rmb_select && mb->get_button_index() == MouseButton::RIGHT))) { int i = closest; - if (select_mode == SELECT_MULTI && items[i].selected && mb->is_command_pressed()) { + if (select_mode == SELECT_MULTI && items[i].selected && mb->is_command_or_control_pressed()) { deselect(i); emit_signal(SNAME("multi_selected"), i, false); @@ -702,13 +702,13 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) { emit_signal(SNAME("item_clicked"), i, get_local_mouse_position(), mb->get_button_index()); } else { - if (!mb->is_double_click() && !mb->is_command_pressed() && select_mode == SELECT_MULTI && items[i].selectable && !items[i].disabled && items[i].selected && mb->get_button_index() == MouseButton::LEFT) { + if (!mb->is_double_click() && !mb->is_command_or_control_pressed() && select_mode == SELECT_MULTI && items[i].selectable && !items[i].disabled && items[i].selected && mb->get_button_index() == MouseButton::LEFT) { defer_select_single = i; return; } if (!items[i].selected || allow_reselect) { - select(i, select_mode == SELECT_SINGLE || !mb->is_command_pressed()); + select(i, select_mode == SELECT_SINGLE || !mb->is_command_or_control_pressed()); if (select_mode == SELECT_SINGLE) { emit_signal(SNAME("item_selected"), i); @@ -1830,7 +1830,7 @@ void ItemList::_bind_methods() { ADD_GROUP("Icon", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "icon_mode", PROPERTY_HINT_ENUM, "Top,Left"), "set_icon_mode", "get_icon_mode"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "icon_scale"), "set_icon_scale", "get_icon_scale"); - ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "fixed_icon_size", PROPERTY_HINT_NONE, "suffix:px"), "set_fixed_icon_size", "get_fixed_icon_size"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "fixed_icon_size", PROPERTY_HINT_NONE, "suffix:px"), "set_fixed_icon_size", "get_fixed_icon_size"); BIND_ENUM_CONSTANT(ICON_MODE_TOP); BIND_ENUM_CONSTANT(ICON_MODE_LEFT); diff --git a/scene/gui/item_list.h b/scene/gui/item_list.h index 486c609034..4b1b9d9282 100644 --- a/scene/gui/item_list.h +++ b/scene/gui/item_list.h @@ -244,8 +244,8 @@ public: void set_icon_mode(IconMode p_mode); IconMode get_icon_mode() const; - void set_fixed_icon_size(const Size2 &p_size); - Size2 get_fixed_icon_size() const; + void set_fixed_icon_size(const Size2i &p_size); + Size2i get_fixed_icon_size() const; void set_allow_rmb_select(bool p_allow); bool get_allow_rmb_select() const; diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 339fc88b65..be94337c89 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -589,7 +589,7 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { // Allow unicode handling if: // * No Modifiers are pressed (except shift) - bool allow_unicode_handling = !(k->is_command_pressed() || k->is_ctrl_pressed() || k->is_alt_pressed() || k->is_meta_pressed()); + bool allow_unicode_handling = !(k->is_command_or_control_pressed() || k->is_ctrl_pressed() || k->is_alt_pressed() || k->is_meta_pressed()); if (allow_unicode_handling && editable && k->get_unicode() >= 32) { // Handle Unicode (if no modifiers active) diff --git a/scene/gui/menu_bar.cpp b/scene/gui/menu_bar.cpp index d6bf84ea5a..75592a1b99 100644 --- a/scene/gui/menu_bar.cpp +++ b/scene/gui/menu_bar.cpp @@ -703,7 +703,7 @@ void MenuBar::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "start_index"), "set_start_index", "get_start_index"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "switch_on_hover"), "set_switch_on_hover", "is_switch_on_hover"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "prefer_global_menu"), "set_prefer_global_menu", "is_prefer_global_menu"); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut_context", PROPERTY_HINT_RESOURCE_TYPE, "Node"), "set_shortcut_context", "get_shortcut_context"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut_context", PROPERTY_HINT_NODE_TYPE, "Node"), "set_shortcut_context", "get_shortcut_context"); ADD_GROUP("BiDi", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "text_direction", PROPERTY_HINT_ENUM, "Auto,Left-to-Right,Right-to-Left,Inherited"), "set_text_direction", "get_text_direction"); diff --git a/scene/gui/range.cpp b/scene/gui/range.cpp index 1eb412abaf..2d2b3e413d 100644 --- a/scene/gui/range.cpp +++ b/scene/gui/range.cpp @@ -30,8 +30,8 @@ #include "range.h" -TypedArray<String> Range::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray Range::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (shared->exp_ratio && shared->min <= 0) { warnings.push_back(RTR("If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0.")); diff --git a/scene/gui/range.h b/scene/gui/range.h index 87bd0d88af..19452243cf 100644 --- a/scene/gui/range.h +++ b/scene/gui/range.h @@ -100,7 +100,7 @@ public: void share(Range *p_range); void unshare(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; Range(); ~Range(); diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 72f5de170c..ef0172c612 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -965,17 +965,18 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o uint32_t gl = glyphs[i].index; uint16_t gl_fl = glyphs[i].flags; uint8_t gl_cn = glyphs[i].count; - bool cprev = false; + bool cprev_cluster = false; + bool cprev_conn = false; if (gl_cn == 0) { // Parts of the same cluster, always connected. - cprev = true; + cprev_cluster = true; } if (gl_fl & TextServer::GRAPHEME_IS_RTL) { // Check if previous grapheme cluster is connected. if (i > 0 && (glyphs[i - 1].flags & TextServer::GRAPHEME_IS_CONNECTED)) { - cprev = true; + cprev_conn = true; } } else { if (glyphs[i].flags & TextServer::GRAPHEME_IS_CONNECTED) { - cprev = true; + cprev_conn = true; } } @@ -994,6 +995,8 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o for (int j = 0; j < fx_stack.size(); j++) { ItemFX *item_fx = fx_stack[j]; + bool cn = cprev_cluster || (cprev_conn && item_fx->connected); + if (item_fx->type == ITEM_CUSTOMFX && custom_fx_ok) { ItemCustomFX *item_custom = static_cast<ItemCustomFX *>(item_fx); @@ -1024,7 +1027,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } else if (item_fx->type == ITEM_SHAKE) { ItemShake *item_shake = static_cast<ItemShake *>(item_fx); - if (!cprev) { + if (!cn) { uint64_t char_current_rand = item_shake->offset_random(glyphs[i].start); uint64_t char_previous_rand = item_shake->offset_previous_random(glyphs[i].start); uint64_t max_rand = 2147483647; @@ -1038,7 +1041,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } else if (item_fx->type == ITEM_WAVE) { ItemWave *item_wave = static_cast<ItemWave *>(item_fx); - if (!cprev) { + if (!cn) { double value = Math::sin(item_wave->frequency * item_wave->elapsed_time + ((p_ofs.x + gloff.x) / 50)) * (item_wave->amplitude / 10.0f); item_wave->prev_off = Point2(0, 1) * value; } @@ -1046,7 +1049,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } else if (item_fx->type == ITEM_TORNADO) { ItemTornado *item_tornado = static_cast<ItemTornado *>(item_fx); - if (!cprev) { + if (!cn) { double torn_x = Math::sin(item_tornado->frequency * item_tornado->elapsed_time + ((p_ofs.x + gloff.x) / 50)) * (item_tornado->radius); double torn_y = Math::cos(item_tornado->frequency * item_tornado->elapsed_time + ((p_ofs.x + gloff.x) / 50)) * (item_tornado->radius); item_tornado->prev_off = Point2(torn_x, torn_y); @@ -1181,17 +1184,18 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o uint32_t gl = glyphs[i].index; uint16_t gl_fl = glyphs[i].flags; uint8_t gl_cn = glyphs[i].count; - bool cprev = false; + bool cprev_cluster = false; + bool cprev_conn = false; if (gl_cn == 0) { // Parts of the same grapheme cluster, always connected. - cprev = true; + cprev_cluster = true; } if (gl_fl & TextServer::GRAPHEME_IS_RTL) { // Check if previous grapheme cluster is connected. if (i > 0 && (glyphs[i - 1].flags & TextServer::GRAPHEME_IS_CONNECTED)) { - cprev = true; + cprev_conn = true; } } else { if (glyphs[i].flags & TextServer::GRAPHEME_IS_CONNECTED) { - cprev = true; + cprev_conn = true; } } @@ -1209,6 +1213,8 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o for (int j = 0; j < fx_stack.size(); j++) { ItemFX *item_fx = fx_stack[j]; + bool cn = cprev_cluster || (cprev_conn && item_fx->connected); + if (item_fx->type == ITEM_CUSTOMFX && custom_fx_ok) { ItemCustomFX *item_custom = static_cast<ItemCustomFX *>(item_fx); @@ -1239,7 +1245,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } else if (item_fx->type == ITEM_SHAKE) { ItemShake *item_shake = static_cast<ItemShake *>(item_fx); - if (!cprev) { + if (!cn) { uint64_t char_current_rand = item_shake->offset_random(glyphs[i].start); uint64_t char_previous_rand = item_shake->offset_previous_random(glyphs[i].start); uint64_t max_rand = 2147483647; @@ -1253,7 +1259,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } else if (item_fx->type == ITEM_WAVE) { ItemWave *item_wave = static_cast<ItemWave *>(item_fx); - if (!cprev) { + if (!cn) { double value = Math::sin(item_wave->frequency * item_wave->elapsed_time + ((p_ofs.x + off.x) / 50)) * (item_wave->amplitude / 10.0f); item_wave->prev_off = Point2(0, 1) * value; } @@ -1261,7 +1267,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } else if (item_fx->type == ITEM_TORNADO) { ItemTornado *item_tornado = static_cast<ItemTornado *>(item_fx); - if (!cprev) { + if (!cn) { double torn_x = Math::sin(item_tornado->frequency * item_tornado->elapsed_time + ((p_ofs.x + off.x) / 50)) * (item_tornado->radius); double torn_y = Math::cos(item_tornado->frequency * item_tornado->elapsed_time + ((p_ofs.x + off.x) / 50)) * (item_tornado->radius); item_tornado->prev_off = Point2(torn_x, torn_y); @@ -1664,7 +1670,7 @@ int RichTextLabel::_find_first_line(int p_from, int p_to, int p_vofs) const { r = m; } } - return l; + return MIN(l, (int)main->lines.size() - 1); } _FORCE_INLINE_ float RichTextLabel::_calculate_line_vertical_offset(const RichTextLabel::Line &line) const { @@ -2188,6 +2194,30 @@ RichTextLabel::ItemFont *RichTextLabel::_find_font(Item *p_item) { while (fontitem) { if (fontitem->type == ITEM_FONT) { ItemFont *fi = static_cast<ItemFont *>(fontitem); + switch (fi->def_font) { + case NORMAL_FONT: { + fi->font = theme_cache.normal_font; + fi->font_size = theme_cache.normal_font_size; + } break; + case BOLD_FONT: { + fi->font = theme_cache.bold_font; + fi->font_size = theme_cache.bold_font_size; + } break; + case ITALICS_FONT: { + fi->font = theme_cache.italics_font; + fi->font_size = theme_cache.italics_font_size; + } break; + case BOLD_ITALICS_FONT: { + fi->font = theme_cache.bold_italics_font; + fi->font_size = theme_cache.bold_italics_font_size; + } break; + case MONO_FONT: { + fi->font = theme_cache.mono_font; + fi->font_size = theme_cache.mono_font_size; + } break; + default: { + } break; + } return fi; } @@ -2563,7 +2593,9 @@ bool RichTextLabel::_find_layout_subitem(Item *from, Item *to) { void RichTextLabel::_thread_function(void *self) { RichTextLabel *rtl = reinterpret_cast<RichTextLabel *>(self); + rtl->set_physics_process_internal(true); rtl->_process_line_caches(); + rtl->set_physics_process_internal(false); rtl->updating.store(false); rtl->call_deferred(SNAME("queue_redraw")); } @@ -2679,7 +2711,6 @@ bool RichTextLabel::_validate_line_caches() { loaded.store(true); thread.start(RichTextLabel::_thread_function, reinterpret_cast<void *>(this)); loading_started = OS::get_singleton()->get_ticks_msec(); - set_physics_process_internal(true); return false; } else { _process_line_caches(); @@ -3003,6 +3034,17 @@ void RichTextLabel::push_dropcap(const String &p_string, const Ref<Font> &p_font _add_item(item, false); } +void RichTextLabel::_push_def_font(DefaultFont p_font) { + _stop_thread(); + MutexLock data_lock(data_mutex); + + ERR_FAIL_COND(current->type == ITEM_TABLE); + ItemFont *item = memnew(ItemFont); + + item->def_font = p_font; + _add_item(item, true); +} + void RichTextLabel::push_font(const Ref<Font> &p_font, int p_size) { _stop_thread(); MutexLock data_lock(data_mutex); @@ -3019,31 +3061,31 @@ void RichTextLabel::push_font(const Ref<Font> &p_font, int p_size) { void RichTextLabel::push_normal() { ERR_FAIL_COND(theme_cache.normal_font.is_null()); - push_font(theme_cache.normal_font, theme_cache.normal_font_size); + _push_def_font(NORMAL_FONT); } void RichTextLabel::push_bold() { ERR_FAIL_COND(theme_cache.bold_font.is_null()); - push_font(theme_cache.bold_font, theme_cache.bold_font_size); + _push_def_font(BOLD_FONT); } void RichTextLabel::push_bold_italics() { ERR_FAIL_COND(theme_cache.bold_italics_font.is_null()); - push_font(theme_cache.bold_italics_font, theme_cache.bold_italics_font_size); + _push_def_font(BOLD_ITALICS_FONT); } void RichTextLabel::push_italics() { ERR_FAIL_COND(theme_cache.italics_font.is_null()); - push_font(theme_cache.italics_font, theme_cache.italics_font_size); + _push_def_font(ITALICS_FONT); } void RichTextLabel::push_mono() { ERR_FAIL_COND(theme_cache.mono_font.is_null()); - push_font(theme_cache.mono_font, theme_cache.mono_font_size); + _push_def_font(MONO_FONT); } void RichTextLabel::push_font_size(int p_font_size) { @@ -3200,33 +3242,36 @@ void RichTextLabel::push_fade(int p_start_index, int p_length) { _add_item(item, true); } -void RichTextLabel::push_shake(int p_strength = 10, float p_rate = 24.0f) { +void RichTextLabel::push_shake(int p_strength = 10, float p_rate = 24.0f, bool p_connected = true) { _stop_thread(); MutexLock data_lock(data_mutex); ItemShake *item = memnew(ItemShake); item->strength = p_strength; item->rate = p_rate; + item->connected = p_connected; _add_item(item, true); } -void RichTextLabel::push_wave(float p_frequency = 1.0f, float p_amplitude = 10.0f) { +void RichTextLabel::push_wave(float p_frequency = 1.0f, float p_amplitude = 10.0f, bool p_connected = true) { _stop_thread(); MutexLock data_lock(data_mutex); ItemWave *item = memnew(ItemWave); item->frequency = p_frequency; item->amplitude = p_amplitude; + item->connected = p_connected; _add_item(item, true); } -void RichTextLabel::push_tornado(float p_frequency = 1.0f, float p_radius = 10.0f) { +void RichTextLabel::push_tornado(float p_frequency = 1.0f, float p_radius = 10.0f, bool p_connected = true) { _stop_thread(); MutexLock data_lock(data_mutex); ItemTornado *item = memnew(ItemTornado); item->frequency = p_frequency; item->radius = p_radius; + item->connected = p_connected; _add_item(item, true); } @@ -3634,9 +3679,9 @@ void RichTextLabel::append_text(const String &p_bbcode) { //use bold font in_bold = true; if (in_italics) { - push_font(theme_cache.bold_italics_font, theme_cache.bold_italics_font_size); + _push_def_font(BOLD_ITALICS_FONT); } else { - push_font(theme_cache.bold_font, theme_cache.bold_font_size); + _push_def_font(BOLD_FONT); } pos = brk_end + 1; tag_stack.push_front(tag); @@ -3644,15 +3689,15 @@ void RichTextLabel::append_text(const String &p_bbcode) { //use italics font in_italics = true; if (in_bold) { - push_font(theme_cache.bold_italics_font, theme_cache.bold_italics_font_size); + _push_def_font(BOLD_ITALICS_FONT); } else { - push_font(theme_cache.italics_font, theme_cache.italics_font_size); + _push_def_font(ITALICS_FONT); } pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "code") { //use monospace font - push_font(theme_cache.mono_font, theme_cache.mono_font_size); + _push_def_font(MONO_FONT); pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag.begins_with("table=")) { @@ -4229,7 +4274,13 @@ void RichTextLabel::append_text(const String &p_bbcode) { rate = rate_option->value.to_float(); } - push_shake(strength, rate); + bool connected = true; + OptionMap::Iterator connected_option = bbcode_options.find("connected"); + if (connected_option) { + connected = connected_option->value.to_int(); + } + + push_shake(strength, rate, connected); pos = brk_end + 1; tag_stack.push_front("shake"); set_process_internal(true); @@ -4246,7 +4297,13 @@ void RichTextLabel::append_text(const String &p_bbcode) { period = period_option->value.to_float(); } - push_wave(period, amplitude); + bool connected = true; + OptionMap::Iterator connected_option = bbcode_options.find("connected"); + if (connected_option) { + connected = connected_option->value.to_int(); + } + + push_wave(period, amplitude, connected); pos = brk_end + 1; tag_stack.push_front("wave"); set_process_internal(true); @@ -4263,7 +4320,13 @@ void RichTextLabel::append_text(const String &p_bbcode) { frequency = frequency_option->value.to_float(); } - push_tornado(frequency, radius); + bool connected = true; + OptionMap::Iterator connected_option = bbcode_options.find("connected"); + if (connected_option) { + connected = connected_option->value.to_int(); + } + + push_tornado(frequency, radius, connected); pos = brk_end + 1; tag_stack.push_front("tornado"); set_process_internal(true); @@ -4363,16 +4426,18 @@ int RichTextLabel::get_visible_paragraph_count() const { if (!is_visible()) { return 0; } + + const_cast<RichTextLabel *>(this)->_validate_line_caches(); return visible_paragraph_count; } void RichTextLabel::scroll_to_line(int p_line) { - _validate_line_caches(); - if (p_line <= 0) { vscroll->set_value(0); return; } + _validate_line_caches(); + int line_count = 0; int to_line = main->first_invalid_line.load(); for (int i = 0; i < to_line; i++) { @@ -4391,6 +4456,8 @@ void RichTextLabel::scroll_to_line(int p_line) { } float RichTextLabel::get_line_offset(int p_line) { + _validate_line_caches(); + int line_count = 0; int to_line = main->first_invalid_line.load(); for (int i = 0; i < to_line; i++) { @@ -4408,6 +4475,8 @@ float RichTextLabel::get_line_offset(int p_line) { } float RichTextLabel::get_paragraph_offset(int p_paragraph) { + _validate_line_caches(); + int to_line = main->first_invalid_line.load(); if (0 <= p_paragraph && p_paragraph < to_line) { return main->lines[p_paragraph].offset.y; @@ -4416,6 +4485,8 @@ float RichTextLabel::get_paragraph_offset(int p_paragraph) { } int RichTextLabel::get_line_count() const { + const_cast<RichTextLabel *>(this)->_validate_line_caches(); + int line_count = 0; int to_line = main->first_invalid_line.load(); for (int i = 0; i < to_line; i++) { @@ -4429,6 +4500,8 @@ int RichTextLabel::get_visible_line_count() const { if (!is_visible()) { return 0; } + const_cast<RichTextLabel *>(this)->_validate_line_caches(); + return visible_line_count; } @@ -4843,7 +4916,14 @@ void RichTextLabel::set_use_bbcode(bool p_enable) { } use_bbcode = p_enable; notify_property_list_changed(); - set_text(text); + + const String current_text = text; + if (use_bbcode) { + parse_bbcode(current_text); + } else { // raw text + clear(); + add_text(current_text); + } } bool RichTextLabel::is_using_bbcode() const { @@ -5004,7 +5084,12 @@ int RichTextLabel::get_content_height() const { int to_line = main->first_invalid_line.load(); if (to_line) { MutexLock lock(main->lines[to_line - 1].text_buf->get_mutex()); - total_height = main->lines[to_line - 1].offset.y + main->lines[to_line - 1].text_buf->get_size().y + main->lines[to_line - 1].text_buf->get_line_count() * theme_cache.line_separation; + if (theme_cache.line_separation < 0) { + // Do not apply to the last line to avoid cutting text. + total_height = main->lines[to_line - 1].offset.y + main->lines[to_line - 1].text_buf->get_size().y + (main->lines[to_line - 1].text_buf->get_line_count() - 1) * theme_cache.line_separation; + } else { + total_height = main->lines[to_line - 1].offset.y + main->lines[to_line - 1].text_buf->get_size().y + main->lines[to_line - 1].text_buf->get_line_count() * theme_cache.line_separation; + } } return total_height; } @@ -5297,6 +5382,8 @@ int RichTextLabel::get_visible_characters() const { } int RichTextLabel::get_character_line(int p_char) { + _validate_line_caches(); + int line_count = 0; int to_line = main->first_invalid_line.load(); for (int i = 0; i < to_line; i++) { @@ -5317,6 +5404,8 @@ int RichTextLabel::get_character_line(int p_char) { } int RichTextLabel::get_character_paragraph(int p_char) { + _validate_line_caches(); + int para_count = 0; int to_line = main->first_invalid_line.load(); for (int i = 0; i < to_line; i++) { @@ -5348,6 +5437,8 @@ int RichTextLabel::get_total_character_count() const { } int RichTextLabel::get_total_glyph_count() const { + const_cast<RichTextLabel *>(this)->_validate_line_caches(); + int tg = 0; Item *it = main; while (it) { diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h index 8bc28a9ecf..e714cb4ced 100644 --- a/scene/gui/rich_text_label.h +++ b/scene/gui/rich_text_label.h @@ -82,6 +82,15 @@ public: MENU_SELECT_ALL, }; + enum DefaultFont { + NORMAL_FONT, + BOLD_FONT, + ITALICS_FONT, + BOLD_ITALICS_FONT, + MONO_FONT, + CUSTOM_FONT, + }; + protected: virtual void _update_theme_item_cache() override; void _notification(int p_what); @@ -178,6 +187,7 @@ private: }; struct ItemFont : public Item { + DefaultFont def_font = CUSTOM_FONT; Ref<Font> font; int font_size = 0; ItemFont() { type = ITEM_FONT; } @@ -272,6 +282,7 @@ private: struct ItemFX : public Item { double elapsed_time = 0.f; + bool connected = true; }; struct ItemShake : public ItemFX { @@ -560,6 +571,7 @@ public: void add_newline(); bool remove_line(const int p_line); void push_dropcap(const String &p_string, const Ref<Font> &p_font, int p_size, const Rect2 &p_dropcap_margins = Rect2(), const Color &p_color = Color(1, 1, 1), int p_ol_size = 0, const Color &p_ol_color = Color(0, 0, 0, 0)); + void _push_def_font(DefaultFont p_font); void push_font(const Ref<Font> &p_font, int p_size = 0); void push_font_size(int p_font_size); void push_outline_size(int p_font_size); @@ -579,9 +591,9 @@ public: void push_hint(const String &p_string); void push_table(int p_columns, InlineAlignment p_alignment = INLINE_ALIGNMENT_TOP); void push_fade(int p_start_index, int p_length); - void push_shake(int p_strength, float p_rate); - void push_wave(float p_frequency, float p_amplitude); - void push_tornado(float p_frequency, float p_radius); + void push_shake(int p_strength, float p_rate, bool p_connected); + void push_wave(float p_frequency, float p_amplitude, bool p_connected); + void push_tornado(float p_frequency, float p_radius, bool p_connected); void push_rainbow(float p_saturation, float p_value, float p_frequency); void push_bgcolor(const Color &p_color); void push_fgcolor(const Color &p_color); diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp index c12ac115b7..761072c5bc 100644 --- a/scene/gui/scroll_container.cpp +++ b/scene/gui/scroll_container.cpp @@ -501,8 +501,8 @@ void ScrollContainer::set_follow_focus(bool p_follow) { follow_focus = p_follow; } -TypedArray<String> ScrollContainer::get_configuration_warnings() const { - TypedArray<String> warnings = Container::get_configuration_warnings(); +PackedStringArray ScrollContainer::get_configuration_warnings() const { + PackedStringArray warnings = Container::get_configuration_warnings(); int found = 0; diff --git a/scene/gui/scroll_container.h b/scene/gui/scroll_container.h index f4899846f4..0079358ef7 100644 --- a/scene/gui/scroll_container.h +++ b/scene/gui/scroll_container.h @@ -114,7 +114,7 @@ public: VScrollBar *get_v_scroll_bar(); void ensure_control_visible(Control *p_control); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; ScrollContainer(); }; diff --git a/scene/gui/subviewport_container.cpp b/scene/gui/subviewport_container.cpp index 88e68ec763..3ad84cbc6d 100644 --- a/scene/gui/subviewport_container.cpp +++ b/scene/gui/subviewport_container.cpp @@ -227,8 +227,8 @@ void SubViewportContainer::unhandled_input(const Ref<InputEvent> &p_event) { } } -TypedArray<String> SubViewportContainer::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray SubViewportContainer::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); bool has_viewport = false; for (int i = 0; i < get_child_count(); i++) { diff --git a/scene/gui/subviewport_container.h b/scene/gui/subviewport_container.h index 5b488fb79e..63a58b5f07 100644 --- a/scene/gui/subviewport_container.h +++ b/scene/gui/subviewport_container.h @@ -58,7 +58,7 @@ public: virtual Vector<int> get_allowed_size_flags_horizontal() const override; virtual Vector<int> get_allowed_size_flags_vertical() const override; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; SubViewportContainer(); }; diff --git a/scene/gui/tab_bar.cpp b/scene/gui/tab_bar.cpp index 4d18af7743..cf6681f809 100644 --- a/scene/gui/tab_bar.cpp +++ b/scene/gui/tab_bar.cpp @@ -162,7 +162,7 @@ void TabBar::gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP && !mb->is_command_pressed()) { + if (mb->is_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP && !mb->is_command_or_control_pressed()) { if (scrolling_enabled && buttons_visible) { if (offset > 0) { offset--; @@ -172,7 +172,7 @@ void TabBar::gui_input(const Ref<InputEvent> &p_event) { } } - if (mb->is_pressed() && mb->get_button_index() == MouseButton::WHEEL_DOWN && !mb->is_command_pressed()) { + if (mb->is_pressed() && mb->get_button_index() == MouseButton::WHEEL_DOWN && !mb->is_command_or_control_pressed()) { if (scrolling_enabled && buttons_visible) { if (missing_right && offset < tabs.size()) { offset++; diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index f45d132a66..ab4808d312 100644 --- a/scene/gui/tab_container.cpp +++ b/scene/gui/tab_container.cpp @@ -519,12 +519,12 @@ void TabContainer::_refresh_tab_names() { } void TabContainer::add_child_notify(Node *p_child) { + Container::add_child_notify(p_child); + if (p_child == tab_bar) { return; } - Container::add_child_notify(p_child); - Control *c = Object::cast_to<Control>(p_child); if (!c || c->is_set_as_top_level()) { return; @@ -838,7 +838,7 @@ Size2 TabContainer::get_minimum_size() const { } Vector<Control *> controls = _get_tab_controls(); - int max_control_height = 0; + Size2 largest_child_min_size; for (int i = 0; i < controls.size(); i++) { Control *c = controls[i]; @@ -847,13 +847,14 @@ Size2 TabContainer::get_minimum_size() const { } Size2 cms = c->get_combined_minimum_size(); - ms.x = MAX(ms.x, cms.x); - max_control_height = MAX(max_control_height, cms.y); + largest_child_min_size.x = MAX(largest_child_min_size.x, cms.x); + largest_child_min_size.y = MAX(largest_child_min_size.y, cms.y); } - ms.y += max_control_height; + ms.y += largest_child_min_size.y; Size2 panel_ms = theme_cache.panel_style->get_minimum_size(); - ms.x = MAX(ms.x, panel_ms.x); + + ms.x = MAX(ms.x, largest_child_min_size.x + panel_ms.x); ms.y += panel_ms.y; return ms; diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index fa1c1eea8d..318447ecd8 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -1614,7 +1614,7 @@ void TextEdit::gui_input(const Ref<InputEvent> &p_gui_input) { } if (mb->is_pressed()) { - if (mb->get_button_index() == MouseButton::WHEEL_UP && !mb->is_command_pressed()) { + if (mb->get_button_index() == MouseButton::WHEEL_UP && !mb->is_command_or_control_pressed()) { if (mb->is_shift_pressed()) { h_scroll->set_value(h_scroll->get_value() - (100 * mb->get_factor())); } else if (mb->is_alt_pressed()) { @@ -1625,7 +1625,7 @@ void TextEdit::gui_input(const Ref<InputEvent> &p_gui_input) { _scroll_up(3 * mb->get_factor()); } } - if (mb->get_button_index() == MouseButton::WHEEL_DOWN && !mb->is_command_pressed()) { + if (mb->get_button_index() == MouseButton::WHEEL_DOWN && !mb->is_command_or_control_pressed()) { if (mb->is_shift_pressed()) { h_scroll->set_value(h_scroll->get_value() + (100 * mb->get_factor())); } else if (mb->is_alt_pressed()) { @@ -1920,7 +1920,7 @@ void TextEdit::gui_input(const Ref<InputEvent> &p_gui_input) { // Allow unicode handling if: // * No Modifiers are pressed (except shift) - bool allow_unicode_handling = !(k->is_command_pressed() || k->is_ctrl_pressed() || k->is_alt_pressed() || k->is_meta_pressed()); + bool allow_unicode_handling = !(k->is_command_or_control_pressed() || k->is_ctrl_pressed() || k->is_alt_pressed() || k->is_meta_pressed()); selection.selecting_text = false; diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index e00d5dc025..237c78407b 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -2686,7 +2686,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int return -1; } - if (select_mode == SELECT_MULTI && p_mod->is_command_pressed() && c.selectable) { + if (select_mode == SELECT_MULTI && p_mod->is_command_or_control_pressed() && c.selectable) { if (!c.selected || p_button == MouseButton::RIGHT) { p_item->select(col); emit_signal(SNAME("multi_selected"), p_item, col, true); @@ -3127,7 +3127,7 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventKey> k = p_event; - bool is_command = k.is_valid() && k->is_command_pressed(); + bool is_command = k.is_valid() && k->is_command_or_control_pressed(); if (p_event->is_action("ui_right") && p_event->is_pressed()) { if (!cursor_can_exit_tree) { accept_event(); @@ -3285,7 +3285,7 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) { if (!k->is_pressed()) { return; } - if (k->is_command_pressed() || (k->is_shift_pressed() && k->get_unicode() == 0) || k->is_meta_pressed()) { + if (k->is_command_or_control_pressed() || (k->is_shift_pressed() && k->get_unicode() == 0) || k->is_meta_pressed()) { return; } if (!root) { @@ -3615,7 +3615,7 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) { } if (mb->get_button_index() == MouseButton::LEFT) { - if (get_item_at_position(mb->get_position()) == nullptr && !mb->is_shift_pressed() && !mb->is_ctrl_pressed() && !mb->is_command_pressed()) { + if (get_item_at_position(mb->get_position()) == nullptr && !mb->is_shift_pressed() && !mb->is_ctrl_pressed() && !mb->is_command_or_control_pressed()) { emit_signal(SNAME("nothing_selected")); } } diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index 65e7ba3e67..05d86f77f2 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -369,6 +369,13 @@ void CanvasItem::queue_redraw() { MessageQueue::get_singleton()->push_callable(callable_mp(this, &CanvasItem::_redraw_callback)); } +void CanvasItem::move_to_front() { + if (!get_parent()) { + return; + } + get_parent()->move_child(this, -1); +} + void CanvasItem::set_modulate(const Color &p_modulate) { if (modulate == p_modulate) { return; @@ -897,6 +904,7 @@ void CanvasItem::_bind_methods() { ClassDB::bind_method(D_METHOD("hide"), &CanvasItem::hide); ClassDB::bind_method(D_METHOD("queue_redraw"), &CanvasItem::queue_redraw); + ClassDB::bind_method(D_METHOD("move_to_front"), &CanvasItem::move_to_front); ClassDB::bind_method(D_METHOD("set_as_top_level", "enable"), &CanvasItem::set_as_top_level); ClassDB::bind_method(D_METHOD("is_set_as_top_level"), &CanvasItem::is_set_as_top_level); diff --git a/scene/main/canvas_item.h b/scene/main/canvas_item.h index 1abb4edec9..b80289fdb4 100644 --- a/scene/main/canvas_item.h +++ b/scene/main/canvas_item.h @@ -198,6 +198,7 @@ public: void hide(); void queue_redraw(); + void move_to_front(); void set_clip_children(bool p_enabled); bool is_clipping_children() const; diff --git a/scene/main/http_request.cpp b/scene/main/http_request.cpp index 9a23bc65bf..2c395ec07d 100644 --- a/scene/main/http_request.cpp +++ b/scene/main/http_request.cpp @@ -32,15 +32,12 @@ #include "core/io/compression.h" #include "scene/main/timer.h" -void HTTPRequest::_redirect_request(const String &p_new_url) { -} - Error HTTPRequest::_request() { - return client->connect_to_host(url, port, use_ssl, validate_ssl); + return client->connect_to_host(url, port, use_tls, validate_tls); } Error HTTPRequest::_parse_url(const String &p_url) { - use_ssl = false; + use_tls = false; request_string = ""; port = 80; request_sent = false; @@ -48,18 +45,19 @@ Error HTTPRequest::_parse_url(const String &p_url) { body_len = -1; body.clear(); downloaded.set(0); + final_body_size.set(0); redirections = 0; String scheme; Error err = p_url.parse_url(scheme, url, port, request_string); ERR_FAIL_COND_V_MSG(err != OK, err, "Error parsing URL: " + p_url + "."); if (scheme == "https://") { - use_ssl = true; + use_tls = true; } else if (scheme != "http://") { ERR_FAIL_V_MSG(ERR_INVALID_PARAMETER, "Invalid URL scheme: " + scheme + "."); } if (port == 0) { - port = use_ssl ? 443 : 80; + port = use_tls ? 443 : 80; } if (request_string.is_empty()) { request_string = "/"; @@ -98,7 +96,7 @@ String HTTPRequest::get_header_value(const PackedStringArray &p_headers, const S return value; } -Error HTTPRequest::request(const String &p_url, const Vector<String> &p_custom_headers, bool p_ssl_validate_domain, HTTPClient::Method p_method, const String &p_request_data) { +Error HTTPRequest::request(const String &p_url, const Vector<String> &p_custom_headers, bool p_tls_validate_domain, HTTPClient::Method p_method, const String &p_request_data) { // Copy the string into a raw buffer. Vector<uint8_t> raw_data; @@ -110,10 +108,10 @@ Error HTTPRequest::request(const String &p_url, const Vector<String> &p_custom_h memcpy(w, charstr.ptr(), len); } - return request_raw(p_url, p_custom_headers, p_ssl_validate_domain, p_method, raw_data); + return request_raw(p_url, p_custom_headers, p_tls_validate_domain, p_method, raw_data); } -Error HTTPRequest::request_raw(const String &p_url, const Vector<String> &p_custom_headers, bool p_ssl_validate_domain, HTTPClient::Method p_method, const Vector<uint8_t> &p_request_data_raw) { +Error HTTPRequest::request_raw(const String &p_url, const Vector<String> &p_custom_headers, bool p_tls_validate_domain, HTTPClient::Method p_method, const Vector<uint8_t> &p_request_data_raw) { ERR_FAIL_COND_V(!is_inside_tree(), ERR_UNCONFIGURED); ERR_FAIL_COND_V_MSG(requesting, ERR_BUSY, "HTTPRequest is processing a request. Wait for completion or cancel it before attempting a new one."); @@ -129,7 +127,7 @@ Error HTTPRequest::request_raw(const String &p_url, const Vector<String> &p_cust return err; } - validate_ssl = p_ssl_validate_domain; + validate_tls = p_tls_validate_domain; headers = p_custom_headers; @@ -153,7 +151,7 @@ Error HTTPRequest::request_raw(const String &p_url, const Vector<String> &p_cust client->set_blocking_mode(false); err = _request(); if (err != OK) { - call_deferred(SNAME("_request_done"), RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); return ERR_CANT_CONNECT; } @@ -169,7 +167,7 @@ void HTTPRequest::_thread_func(void *p_userdata) { Error err = hr->_request(); if (err != OK) { - hr->call_deferred(SNAME("_request_done"), RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); + hr->_defer_done(RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); } else { while (!hr->thread_request_quit.is_set()) { bool exit = hr->_update_connection(); @@ -198,6 +196,7 @@ void HTTPRequest::cancel_request() { } file.unref(); + decompressor.unref(); client->close(); body.clear(); got_response = false; @@ -208,7 +207,7 @@ void HTTPRequest::cancel_request() { bool HTTPRequest::_handle_response(bool *ret_value) { if (!client->has_response()) { - call_deferred(SNAME("_request_done"), RESULT_NO_RESPONSE, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_NO_RESPONSE, 0, PackedStringArray(), PackedByteArray()); *ret_value = true; return true; } @@ -219,6 +218,9 @@ bool HTTPRequest::_handle_response(bool *ret_value) { client->get_response_headers(&rheaders); response_headers.clear(); downloaded.set(0); + final_body_size.set(0); + decompressor.unref(); + for (const String &E : rheaders) { response_headers.push_back(E); } @@ -227,7 +229,7 @@ bool HTTPRequest::_handle_response(bool *ret_value) { // Handle redirect. if (max_redirects >= 0 && redirections >= max_redirects) { - call_deferred(SNAME("_request_done"), RESULT_REDIRECT_LIMIT_REACHED, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_REDIRECT_LIMIT_REACHED, response_code, response_headers, PackedByteArray()); *ret_value = true; return true; } @@ -259,6 +261,7 @@ bool HTTPRequest::_handle_response(bool *ret_value) { body_len = -1; body.clear(); downloaded.set(0); + final_body_size.set(0); redirections = new_redirs; *ret_value = false; return true; @@ -266,13 +269,26 @@ bool HTTPRequest::_handle_response(bool *ret_value) { } } + // Check if we need to start streaming decompression. + String content_encoding; + if (accept_gzip) { + content_encoding = get_header_value(response_headers, "Content-Encoding").to_lower(); + } + if (content_encoding == "gzip") { + decompressor.instantiate(); + decompressor->start_decompression(false, get_download_chunk_size() * 2); + } else if (content_encoding == "deflate") { + decompressor.instantiate(); + decompressor->start_decompression(true, get_download_chunk_size() * 2); + } + return false; } bool HTTPRequest::_update_connection() { switch (client->get_status()) { case HTTPClient::STATUS_DISCONNECTED: { - call_deferred(SNAME("_request_done"), RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); return true; // End it, since it's disconnected. } break; case HTTPClient::STATUS_RESOLVING: { @@ -281,7 +297,7 @@ bool HTTPRequest::_update_connection() { return false; } break; case HTTPClient::STATUS_CANT_RESOLVE: { - call_deferred(SNAME("_request_done"), RESULT_CANT_RESOLVE, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_CANT_RESOLVE, 0, PackedStringArray(), PackedByteArray()); return true; } break; @@ -291,7 +307,7 @@ bool HTTPRequest::_update_connection() { return false; } break; // Connecting to IP. case HTTPClient::STATUS_CANT_CONNECT: { - call_deferred(SNAME("_request_done"), RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); return true; } break; @@ -306,16 +322,16 @@ bool HTTPRequest::_update_connection() { return ret_value; } - call_deferred(SNAME("_request_done"), RESULT_SUCCESS, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_SUCCESS, response_code, response_headers, PackedByteArray()); return true; } if (body_len < 0) { // Chunked transfer is done. - call_deferred(SNAME("_request_done"), RESULT_SUCCESS, response_code, response_headers, body); + _defer_done(RESULT_SUCCESS, response_code, response_headers, body); return true; } - call_deferred(SNAME("_request_done"), RESULT_CHUNKED_BODY_SIZE_MISMATCH, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_CHUNKED_BODY_SIZE_MISMATCH, response_code, response_headers, PackedByteArray()); return true; // Request might have been done. } else { @@ -324,7 +340,7 @@ bool HTTPRequest::_update_connection() { int size = request_data.size(); Error err = client->request(method, request_string, headers, size > 0 ? request_data.ptr() : nullptr, size); if (err != OK) { - call_deferred(SNAME("_request_done"), RESULT_CONNECTION_ERROR, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_CONNECTION_ERROR, 0, PackedStringArray(), PackedByteArray()); return true; } @@ -347,7 +363,7 @@ bool HTTPRequest::_update_connection() { } if (!client->is_response_chunked() && client->get_response_body_length() == 0) { - call_deferred(SNAME("_request_done"), RESULT_SUCCESS, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_SUCCESS, response_code, response_headers, PackedByteArray()); return true; } @@ -356,14 +372,14 @@ bool HTTPRequest::_update_connection() { body_len = client->get_response_body_length(); if (body_size_limit >= 0 && body_len > body_size_limit) { - call_deferred(SNAME("_request_done"), RESULT_BODY_SIZE_LIMIT_EXCEEDED, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_BODY_SIZE_LIMIT_EXCEEDED, response_code, response_headers, PackedByteArray()); return true; } if (!download_to_file.is_empty()) { file = FileAccess::open(download_to_file, FileAccess::WRITE); if (file.is_null()) { - call_deferred(SNAME("_request_done"), RESULT_DOWNLOAD_FILE_CANT_OPEN, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_DOWNLOAD_FILE_CANT_OPEN, response_code, response_headers, PackedByteArray()); return true; } } @@ -375,14 +391,33 @@ bool HTTPRequest::_update_connection() { } PackedByteArray chunk = client->read_response_body_chunk(); + downloaded.add(chunk.size()); + + // Decompress chunk if needed. + if (decompressor.is_valid()) { + Error err = decompressor->put_data(chunk.ptr(), chunk.size()); + if (err == OK) { + chunk.resize(decompressor->get_available_bytes()); + err = decompressor->get_data(chunk.ptrw(), chunk.size()); + } + if (err != OK) { + _defer_done(RESULT_BODY_DECOMPRESS_FAILED, response_code, response_headers, PackedByteArray()); + return true; + } + } + final_body_size.add(chunk.size()); + + if (body_size_limit >= 0 && final_body_size.get() > body_size_limit) { + _defer_done(RESULT_BODY_SIZE_LIMIT_EXCEEDED, response_code, response_headers, PackedByteArray()); + return true; + } if (chunk.size()) { - downloaded.add(chunk.size()); if (file.is_valid()) { const uint8_t *r = chunk.ptr(); file->store_buffer(r, chunk.size()); if (file->get_error() != OK) { - call_deferred(SNAME("_request_done"), RESULT_DOWNLOAD_FILE_WRITE_ERROR, response_code, response_headers, PackedByteArray()); + _defer_done(RESULT_DOWNLOAD_FILE_WRITE_ERROR, response_code, response_headers, PackedByteArray()); return true; } } else { @@ -390,19 +425,14 @@ bool HTTPRequest::_update_connection() { } } - if (body_size_limit >= 0 && downloaded.get() > body_size_limit) { - call_deferred(SNAME("_request_done"), RESULT_BODY_SIZE_LIMIT_EXCEEDED, response_code, response_headers, PackedByteArray()); - return true; - } - if (body_len >= 0) { if (downloaded.get() == body_len) { - call_deferred(SNAME("_request_done"), RESULT_SUCCESS, response_code, response_headers, body); + _defer_done(RESULT_SUCCESS, response_code, response_headers, body); return true; } } else if (client->get_status() == HTTPClient::STATUS_DISCONNECTED) { // We read till EOF, with no errors. Request is done. - call_deferred(SNAME("_request_done"), RESULT_SUCCESS, response_code, response_headers, body); + _defer_done(RESULT_SUCCESS, response_code, response_headers, body); return true; } @@ -410,11 +440,11 @@ bool HTTPRequest::_update_connection() { } break; // Request resulted in body: break which must be read. case HTTPClient::STATUS_CONNECTION_ERROR: { - call_deferred(SNAME("_request_done"), RESULT_CONNECTION_ERROR, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_CONNECTION_ERROR, 0, PackedStringArray(), PackedByteArray()); return true; } break; - case HTTPClient::STATUS_SSL_HANDSHAKE_ERROR: { - call_deferred(SNAME("_request_done"), RESULT_SSL_HANDSHAKE_ERROR, 0, PackedStringArray(), PackedByteArray()); + case HTTPClient::STATUS_TLS_HANDSHAKE_ERROR: { + _defer_done(RESULT_TLS_HANDSHAKE_ERROR, 0, PackedStringArray(), PackedByteArray()); return true; } break; } @@ -422,41 +452,13 @@ bool HTTPRequest::_update_connection() { ERR_FAIL_V(false); } +void HTTPRequest::_defer_done(int p_status, int p_code, const PackedStringArray &p_headers, const PackedByteArray &p_data) { + call_deferred(SNAME("_request_done"), p_status, p_code, p_headers, p_data); +} + void HTTPRequest::_request_done(int p_status, int p_code, const PackedStringArray &p_headers, const PackedByteArray &p_data) { cancel_request(); - // Determine if the request body is compressed. - bool is_compressed; - String content_encoding = get_header_value(p_headers, "Content-Encoding").to_lower(); - Compression::Mode mode; - if (content_encoding == "gzip") { - mode = Compression::Mode::MODE_GZIP; - is_compressed = true; - } else if (content_encoding == "deflate") { - mode = Compression::Mode::MODE_DEFLATE; - is_compressed = true; - } else { - is_compressed = false; - } - - if (accept_gzip && is_compressed && p_data.size() > 0) { - // Decompress request body - PackedByteArray decompressed; - int result = Compression::decompress_dynamic(&decompressed, body_size_limit, p_data.ptr(), p_data.size(), mode); - if (result == OK) { - emit_signal(SNAME("request_completed"), p_status, p_code, p_headers, decompressed); - return; - } else if (result == -5) { - WARN_PRINT("Decompressed size of HTTP response body exceeded body_size_limit"); - p_status = RESULT_BODY_SIZE_LIMIT_EXCEEDED; - // Just return the raw data if we failed to decompress it. - } else { - WARN_PRINT("Failed to decompress HTTP response body"); - p_status = RESULT_BODY_DECOMPRESS_FAILED; - // Just return the raw data if we failed to decompress it. - } - } - emit_signal(SNAME("request_completed"), p_status, p_code, p_headers, p_data); } @@ -566,12 +568,12 @@ double HTTPRequest::get_timeout() { void HTTPRequest::_timeout() { cancel_request(); - call_deferred(SNAME("_request_done"), RESULT_TIMEOUT, 0, PackedStringArray(), PackedByteArray()); + _defer_done(RESULT_TIMEOUT, 0, PackedStringArray(), PackedByteArray()); } void HTTPRequest::_bind_methods() { - ClassDB::bind_method(D_METHOD("request", "url", "custom_headers", "ssl_validate_domain", "method", "request_data"), &HTTPRequest::request, DEFVAL(PackedStringArray()), DEFVAL(true), DEFVAL(HTTPClient::METHOD_GET), DEFVAL(String())); - ClassDB::bind_method(D_METHOD("request_raw", "url", "custom_headers", "ssl_validate_domain", "method", "request_data_raw"), &HTTPRequest::request_raw, DEFVAL(PackedStringArray()), DEFVAL(true), DEFVAL(HTTPClient::METHOD_GET), DEFVAL(PackedByteArray())); + ClassDB::bind_method(D_METHOD("request", "url", "custom_headers", "tls_validate_domain", "method", "request_data"), &HTTPRequest::request, DEFVAL(PackedStringArray()), DEFVAL(true), DEFVAL(HTTPClient::METHOD_GET), DEFVAL(String())); + ClassDB::bind_method(D_METHOD("request_raw", "url", "custom_headers", "tls_validate_domain", "method", "request_data_raw"), &HTTPRequest::request_raw, DEFVAL(PackedStringArray()), DEFVAL(true), DEFVAL(HTTPClient::METHOD_GET), DEFVAL(PackedByteArray())); ClassDB::bind_method(D_METHOD("cancel_request"), &HTTPRequest::cancel_request); ClassDB::bind_method(D_METHOD("get_http_client_status"), &HTTPRequest::get_http_client_status); @@ -594,7 +596,6 @@ void HTTPRequest::_bind_methods() { ClassDB::bind_method(D_METHOD("get_downloaded_bytes"), &HTTPRequest::get_downloaded_bytes); ClassDB::bind_method(D_METHOD("get_body_size"), &HTTPRequest::get_body_size); - ClassDB::bind_method(D_METHOD("_redirect_request"), &HTTPRequest::_redirect_request); ClassDB::bind_method(D_METHOD("_request_done"), &HTTPRequest::_request_done); ClassDB::bind_method(D_METHOD("set_timeout", "timeout"), &HTTPRequest::set_timeout); @@ -621,7 +622,7 @@ void HTTPRequest::_bind_methods() { BIND_ENUM_CONSTANT(RESULT_CANT_CONNECT); BIND_ENUM_CONSTANT(RESULT_CANT_RESOLVE); BIND_ENUM_CONSTANT(RESULT_CONNECTION_ERROR); - BIND_ENUM_CONSTANT(RESULT_SSL_HANDSHAKE_ERROR); + BIND_ENUM_CONSTANT(RESULT_TLS_HANDSHAKE_ERROR); BIND_ENUM_CONSTANT(RESULT_NO_RESPONSE); BIND_ENUM_CONSTANT(RESULT_BODY_SIZE_LIMIT_EXCEEDED); BIND_ENUM_CONSTANT(RESULT_BODY_DECOMPRESS_FAILED); diff --git a/scene/main/http_request.h b/scene/main/http_request.h index 4b32188377..80445684b0 100644 --- a/scene/main/http_request.h +++ b/scene/main/http_request.h @@ -32,6 +32,7 @@ #define HTTP_REQUEST_H #include "core/io/http_client.h" +#include "core/io/stream_peer_gzip.h" #include "core/os/thread.h" #include "core/templates/safe_refcount.h" #include "scene/main/node.h" @@ -48,7 +49,7 @@ public: RESULT_CANT_CONNECT, RESULT_CANT_RESOLVE, RESULT_CONNECTION_ERROR, - RESULT_SSL_HANDSHAKE_ERROR, + RESULT_TLS_HANDSHAKE_ERROR, RESULT_NO_RESPONSE, RESULT_BODY_SIZE_LIMIT_EXCEEDED, RESULT_BODY_DECOMPRESS_FAILED, @@ -67,8 +68,8 @@ private: String url; int port = 80; Vector<String> headers; - bool validate_ssl = false; - bool use_ssl = false; + bool validate_tls = false; + bool use_tls = false; HTTPClient::Method method; Vector<uint8_t> request_data; @@ -84,10 +85,12 @@ private: String download_to_file; + Ref<StreamPeerGZIP> decompressor; Ref<FileAccess> file; int body_len = -1; SafeNumeric<int> downloaded; + SafeNumeric<int> final_body_size; int body_size_limit = -1; int redirections = 0; @@ -113,6 +116,7 @@ private: Thread thread; + void _defer_done(int p_status, int p_code, const PackedStringArray &p_headers, const PackedByteArray &p_data); void _request_done(int p_status, int p_code, const PackedStringArray &p_headers, const PackedByteArray &p_data); static void _thread_func(void *p_userdata); @@ -121,8 +125,8 @@ protected: static void _bind_methods(); public: - Error request(const String &p_url, const Vector<String> &p_custom_headers = Vector<String>(), bool p_ssl_validate_domain = true, HTTPClient::Method p_method = HTTPClient::METHOD_GET, const String &p_request_data = ""); //connects to a full url and perform request - Error request_raw(const String &p_url, const Vector<String> &p_custom_headers = Vector<String>(), bool p_ssl_validate_domain = true, HTTPClient::Method p_method = HTTPClient::METHOD_GET, const Vector<uint8_t> &p_request_data_raw = Vector<uint8_t>()); //connects to a full url and perform request + Error request(const String &p_url, const Vector<String> &p_custom_headers = Vector<String>(), bool p_tls_validate_domain = true, HTTPClient::Method p_method = HTTPClient::METHOD_GET, const String &p_request_data = ""); //connects to a full url and perform request + Error request_raw(const String &p_url, const Vector<String> &p_custom_headers = Vector<String>(), bool p_tls_validate_domain = true, HTTPClient::Method p_method = HTTPClient::METHOD_GET, const Vector<uint8_t> &p_request_data_raw = Vector<uint8_t>()); //connects to a full url and perform request void cancel_request(); HTTPClient::Status get_http_client_status() const; diff --git a/scene/main/missing_node.cpp b/scene/main/missing_node.cpp index 395fdad9e4..7ce527fd9c 100644 --- a/scene/main/missing_node.cpp +++ b/scene/main/missing_node.cpp @@ -74,9 +74,9 @@ bool MissingNode::is_recording_properties() const { return recording_properties; } -TypedArray<String> MissingNode::get_configuration_warnings() const { +PackedStringArray MissingNode::get_configuration_warnings() const { // The mere existence of this node is warning. - TypedArray<String> ret; + PackedStringArray ret; ret.push_back(vformat(RTR("This node was saved as class type '%s', which was no longer available when this scene was loaded."), original_class)); ret.push_back(RTR("Data from the original node is kept as a placeholder until this type of node is available again. It can hence be safely re-saved without risk of data loss.")); return ret; diff --git a/scene/main/missing_node.h b/scene/main/missing_node.h index d200fbb47f..0003f71f29 100644 --- a/scene/main/missing_node.h +++ b/scene/main/missing_node.h @@ -55,7 +55,7 @@ public: void set_recording_properties(bool p_enable); bool is_recording_properties() const; - virtual TypedArray<String> get_configuration_warnings() const override; + virtual PackedStringArray get_configuration_warnings() const override; MissingNode(); }; diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 99ab7c03ac..a2b0f1a825 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -328,12 +328,21 @@ void Node::move_child(Node *p_child, int p_pos) { // We need to check whether node is internal and move it only in the relevant node range. if (p_child->_is_internal_front()) { + if (p_pos < 0) { + p_pos += data.internal_children_front; + } ERR_FAIL_INDEX_MSG(p_pos, data.internal_children_front, vformat("Invalid new child position: %d. Child is internal.", p_pos)); _move_child(p_child, p_pos); } else if (p_child->_is_internal_back()) { + if (p_pos < 0) { + p_pos += data.internal_children_back; + } ERR_FAIL_INDEX_MSG(p_pos, data.internal_children_back, vformat("Invalid new child position: %d. Child is internal.", p_pos)); _move_child(p_child, data.children.size() - data.internal_children_back + p_pos); } else { + if (p_pos < 0) { + p_pos += get_child_count(false); + } ERR_FAIL_INDEX_MSG(p_pos, data.children.size() + 1 - data.internal_children_front - data.internal_children_back, vformat("Invalid new child position: %d.", p_pos)); _move_child(p_child, p_pos + data.internal_children_front); } @@ -389,21 +398,6 @@ void Node::_move_child(Node *p_child, int p_pos, bool p_ignore_end) { data.blocked--; } -void Node::raise() { - if (!data.parent) { - return; - } - - // Internal children move within a different index range. - if (_is_internal_front()) { - data.parent->move_child(this, data.parent->data.internal_children_front - 1); - } else if (_is_internal_back()) { - data.parent->move_child(this, data.parent->data.internal_children_back - 1); - } else { - data.parent->move_child(this, data.parent->get_child_count(false) - 1); - } -} - void Node::_propagate_groups_dirty() { for (const KeyValue<StringName, GroupData> &E : data.grouped) { if (E.value.group) { @@ -1922,43 +1916,6 @@ Ref<Tween> Node::create_tween() { return tween; } -void Node::remove_and_skip() { - ERR_FAIL_COND(!data.parent); - - Node *new_owner = get_owner(); - - List<Node *> children; - - while (true) { - bool clear = true; - for (int i = 0; i < data.children.size(); i++) { - Node *c_node = data.children[i]; - if (!c_node->get_owner()) { - continue; - } - - remove_child(c_node); - c_node->_propagate_replace_owner(this, nullptr); - children.push_back(c_node); - clear = false; - break; - } - - if (clear) { - break; - } - } - - while (!children.is_empty()) { - Node *c_node = children.front()->get(); - data.parent->add_child(c_node); - c_node->_propagate_replace_owner(nullptr, new_owner); - children.pop_front(); - } - - data.parent->remove_child(this); -} - void Node::set_scene_file_path(const String &p_scene_file_path) { data.scene_file_path = p_scene_file_path; } @@ -2683,21 +2640,19 @@ void Node::clear_internal_tree_resource_paths() { } } -TypedArray<String> Node::get_configuration_warnings() const { - TypedArray<String> ret; +PackedStringArray Node::get_configuration_warnings() const { + PackedStringArray ret; Vector<String> warnings; if (GDVIRTUAL_CALL(_get_configuration_warnings, warnings)) { - for (int i = 0; i < warnings.size(); i++) { - ret.push_back(warnings[i]); - } + ret.append_array(warnings); } return ret; } String Node::get_configuration_warnings_as_string() const { - TypedArray<String> warnings = get_configuration_warnings(); + PackedStringArray warnings = get_configuration_warnings(); String all_warnings = String(); for (int i = 0; i < warnings.size(); i++) { if (i > 0) { @@ -2705,7 +2660,7 @@ String Node::get_configuration_warnings_as_string() const { } // Format as a bullet point list to make multiple warnings easier to distinguish // from each other. - all_warnings += String::utf8("• ") + String(warnings[i]); + all_warnings += String::utf8("• ") + warnings[i]; } return all_warnings; } @@ -2816,10 +2771,8 @@ void Node::_bind_methods() { ClassDB::bind_method(D_METHOD("is_in_group", "group"), &Node::is_in_group); ClassDB::bind_method(D_METHOD("move_child", "child_node", "to_position"), &Node::move_child); ClassDB::bind_method(D_METHOD("get_groups"), &Node::_get_groups); - ClassDB::bind_method(D_METHOD("raise"), &Node::raise); ClassDB::bind_method(D_METHOD("set_owner", "owner"), &Node::set_owner); ClassDB::bind_method(D_METHOD("get_owner"), &Node::get_owner); - ClassDB::bind_method(D_METHOD("remove_and_skip"), &Node::remove_and_skip); ClassDB::bind_method(D_METHOD("get_index", "include_internal"), &Node::get_index, DEFVAL(false)); ClassDB::bind_method(D_METHOD("print_tree"), &Node::print_tree); ClassDB::bind_method(D_METHOD("print_tree_pretty"), &Node::print_tree_pretty); diff --git a/scene/main/node.h b/scene/main/node.h index 6f402644b9..4e6530cccd 100644 --- a/scene/main/node.h +++ b/scene/main/node.h @@ -348,7 +348,6 @@ public: void move_child(Node *p_child, int p_pos); void _move_child(Node *p_child, int p_pos, bool p_ignore_end = false); - void raise(); void set_owner(Node *p_owner); Node *get_owner() const; @@ -357,7 +356,6 @@ public: void set_unique_name_in_owner(bool p_enabled); bool is_unique_name_in_owner() const; - void remove_and_skip(); int get_index(bool p_include_internal = true) const; Ref<Tween> create_tween(); @@ -479,7 +477,7 @@ public: _FORCE_INLINE_ Viewport *get_viewport() const { return data.viewport; } - virtual TypedArray<String> get_configuration_warnings() const; + virtual PackedStringArray get_configuration_warnings() const; String get_configuration_warnings_as_string() const; void update_configuration_warnings(); @@ -531,4 +529,8 @@ Error Node::rpc_id(int p_peer_id, const StringName &p_method, VarArgs... p_args) return rpcp(p_peer_id, p_method, sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args)); } +// Add these macro to your class's 'get_configuration_warnings' function to have warnings show up in the scene tree inspector. +#define DEPRECATED_NODE_WARNING warnings.push_back(RTR("This node is marked as deprecated and will be removed in future versions.\nPlease check the Godot documentation for information about migration.")); +#define EXPERIMENTAL_NODE_WARNING warnings.push_back(RTR("This node is marked as experimental and may be subject to removal or major changes in future versions.")); + #endif // NODE_H diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 25c9b33ff9..c18aa5aaa2 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -722,22 +722,6 @@ float SceneTree::get_debug_paths_width() const { return debug_paths_width; } -void SceneTree::set_debug_navigation_color(const Color &p_color) { - debug_navigation_color = p_color; -} - -Color SceneTree::get_debug_navigation_color() const { - return debug_navigation_color; -} - -void SceneTree::set_debug_navigation_disabled_color(const Color &p_color) { - debug_navigation_disabled_color = p_color; -} - -Color SceneTree::get_debug_navigation_disabled_color() const { - return debug_navigation_disabled_color; -} - Ref<Material> SceneTree::get_debug_paths_material() { if (debug_paths_material.is_valid()) { return debug_paths_material; @@ -755,40 +739,6 @@ Ref<Material> SceneTree::get_debug_paths_material() { return debug_paths_material; } -Ref<Material> SceneTree::get_debug_navigation_material() { - if (navigation_material.is_valid()) { - return navigation_material; - } - - Ref<StandardMaterial3D> line_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D)); - line_material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); - line_material->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA); - line_material->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true); - line_material->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true); - line_material->set_albedo(get_debug_navigation_color()); - - navigation_material = line_material; - - return navigation_material; -} - -Ref<Material> SceneTree::get_debug_navigation_disabled_material() { - if (navigation_disabled_material.is_valid()) { - return navigation_disabled_material; - } - - Ref<StandardMaterial3D> line_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D)); - line_material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); - line_material->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA); - line_material->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true); - line_material->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true); - line_material->set_albedo(get_debug_navigation_disabled_color()); - - navigation_disabled_material = line_material; - - return navigation_disabled_material; -} - Ref<Material> SceneTree::get_debug_collision_material() { if (collision_material.is_valid()) { return collision_material; @@ -1138,16 +1088,16 @@ void SceneTree::_change_scene(Node *p_to) { } } -Error SceneTree::change_scene(const String &p_path) { +Error SceneTree::change_scene_to_file(const String &p_path) { Ref<PackedScene> new_scene = ResourceLoader::load(p_path); if (new_scene.is_null()) { return ERR_CANT_OPEN; } - return change_scene_to(new_scene); + return change_scene_to_packed(new_scene); } -Error SceneTree::change_scene_to(const Ref<PackedScene> &p_scene) { +Error SceneTree::change_scene_to_packed(const Ref<PackedScene> &p_scene) { Node *new_scene = nullptr; if (p_scene.is_valid()) { new_scene = p_scene->instantiate(); @@ -1161,7 +1111,7 @@ Error SceneTree::change_scene_to(const Ref<PackedScene> &p_scene) { Error SceneTree::reload_current_scene() { ERR_FAIL_COND_V(!current_scene, ERR_UNCONFIGURED); String fname = current_scene->get_scene_file_path(); - return change_scene(fname); + return change_scene_to_file(fname); } void SceneTree::add_current_scene(Node *p_current) { @@ -1310,8 +1260,8 @@ void SceneTree::_bind_methods() { ClassDB::bind_method(D_METHOD("set_current_scene", "child_node"), &SceneTree::set_current_scene); ClassDB::bind_method(D_METHOD("get_current_scene"), &SceneTree::get_current_scene); - ClassDB::bind_method(D_METHOD("change_scene", "path"), &SceneTree::change_scene); - ClassDB::bind_method(D_METHOD("change_scene_to", "packed_scene"), &SceneTree::change_scene_to); + ClassDB::bind_method(D_METHOD("change_scene_to_file", "path"), &SceneTree::change_scene_to_file); + ClassDB::bind_method(D_METHOD("change_scene_to_packed", "packed_scene"), &SceneTree::change_scene_to_packed); ClassDB::bind_method(D_METHOD("reload_current_scene"), &SceneTree::reload_current_scene); @@ -1366,7 +1316,7 @@ void SceneTree::add_idle_callback(IdleCallback p_callback) { } void SceneTree::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const { - if (p_function == "change_scene") { + if (p_function == "change_scene_to_file") { Ref<DirAccess> dir_access = DirAccess::create(DirAccess::ACCESS_RESOURCES); List<String> directories; directories.push_back(dir_access->get_current_dir()); @@ -1404,8 +1354,6 @@ SceneTree::SceneTree() { debug_collision_contact_color = GLOBAL_DEF("debug/shapes/collision/contact_color", Color(1.0, 0.2, 0.1, 0.8)); debug_paths_color = GLOBAL_DEF("debug/shapes/paths/geometry_color", Color(0.1, 1.0, 0.7, 0.4)); debug_paths_width = GLOBAL_DEF("debug/shapes/paths/geometry_width", 2.0); - debug_navigation_color = GLOBAL_DEF("debug/shapes/navigation/geometry_color", Color(0.1, 1.0, 0.7, 0.4)); - debug_navigation_disabled_color = GLOBAL_DEF("debug/shapes/navigation/disabled_geometry_color", Color(1.0, 0.7, 0.1, 0.4)); collision_debug_contacts = GLOBAL_DEF("debug/shapes/collision/max_contacts_displayed", 10000); ProjectSettings::get_singleton()->set_custom_property_info("debug/shapes/collision/max_contacts_displayed", PropertyInfo(Variant::INT, "debug/shapes/collision/max_contacts_displayed", PROPERTY_HINT_RANGE, "0,20000,1")); // No negative diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index 45653001ca..031a331a99 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -334,15 +334,7 @@ public: void set_debug_paths_width(float p_width); float get_debug_paths_width() const; - void set_debug_navigation_color(const Color &p_color); - Color get_debug_navigation_color() const; - - void set_debug_navigation_disabled_color(const Color &p_color); - Color get_debug_navigation_disabled_color() const; - Ref<Material> get_debug_paths_material(); - Ref<Material> get_debug_navigation_material(); - Ref<Material> get_debug_navigation_disabled_material(); Ref<Material> get_debug_collision_material(); Ref<ArrayMesh> get_debug_contact_mesh(); @@ -366,8 +358,8 @@ public: void set_current_scene(Node *p_scene); Node *get_current_scene() const; - Error change_scene(const String &p_path); - Error change_scene_to(const Ref<PackedScene> &p_scene); + Error change_scene_to_file(const String &p_path); + Error change_scene_to_packed(const Ref<PackedScene> &p_scene); Error reload_current_scene(); Ref<SceneTreeTimer> create_timer(double p_delay_sec, bool p_process_always = true, bool p_process_in_physics = false, bool p_ignore_time_scale = false); diff --git a/scene/main/shader_globals_override.cpp b/scene/main/shader_globals_override.cpp index 13034c5447..455b8c6866 100644 --- a/scene/main/shader_globals_override.cpp +++ b/scene/main/shader_globals_override.cpp @@ -271,8 +271,8 @@ void ShaderGlobalsOverride::_notification(int p_what) { } } -TypedArray<String> ShaderGlobalsOverride::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray ShaderGlobalsOverride::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (!active) { warnings.push_back(RTR("ShaderGlobalsOverride is not active because another node of the same type is in the scene.")); diff --git a/scene/main/shader_globals_override.h b/scene/main/shader_globals_override.h index af99bf9aa7..f3d0074f28 100644 --- a/scene/main/shader_globals_override.h +++ b/scene/main/shader_globals_override.h @@ -58,7 +58,7 @@ protected: static void _bind_methods(); public: - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; ShaderGlobalsOverride(); }; diff --git a/scene/main/timer.cpp b/scene/main/timer.cpp index bb9359ef59..210b60171a 100644 --- a/scene/main/timer.cpp +++ b/scene/main/timer.cpp @@ -180,8 +180,8 @@ void Timer::_set_process(bool p_process, bool p_force) { processing = p_process; } -TypedArray<String> Timer::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray Timer::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (wait_time < 0.05 - CMP_EPSILON) { warnings.push_back(RTR("Very low timer wait times (< 0.05 seconds) may behave in significantly different ways depending on the rendered or physics frame rate.\nConsider using a script's process loop instead of relying on a Timer for very low wait times.")); diff --git a/scene/main/timer.h b/scene/main/timer.h index 8785d31a8a..53503e31b2 100644 --- a/scene/main/timer.h +++ b/scene/main/timer.h @@ -73,7 +73,7 @@ public: double get_time_left() const; - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_timer_process_callback(TimerProcessCallback p_callback); TimerProcessCallback get_timer_process_callback() const; diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index e901f76c0a..a1c7139b25 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -795,11 +795,20 @@ void Viewport::_set_size(const Size2i &p_size, const Size2i &p_size_2d_override, stretch_transform = p_stretch_transform; to_screen_rect = p_to_screen_rect; - if (p_allocated) { - RS::get_singleton()->viewport_set_size(viewport, size.width, size.height); - } else { - RS::get_singleton()->viewport_set_size(viewport, 0, 0); - } +#ifndef _3D_DISABLED + if (!use_xr) { +#endif + + if (p_allocated) { + RS::get_singleton()->viewport_set_size(viewport, size.width, size.height); + } else { + RS::get_singleton()->viewport_set_size(viewport, 0, 0); + } + +#ifndef _3D_DISABLED + } // if (!use_xr) +#endif + _update_global_transform(); update_configuration_warnings(); @@ -813,6 +822,19 @@ void Viewport::_set_size(const Size2i &p_size, const Size2i &p_size_2d_override, } Size2i Viewport::_get_size() const { +#ifndef _3D_DISABLED + if (use_xr) { + if (XRServer::get_singleton() != nullptr) { + Ref<XRInterface> xr_interface = XRServer::get_singleton()->get_primary_interface(); + if (xr_interface.is_valid() && xr_interface->is_initialized()) { + Size2 xr_size = xr_interface->get_render_target_size(); + return (Size2i)xr_size; + } + } + return Size2i(); + } +#endif // _3D_DISABLED + return size; } @@ -2103,7 +2125,7 @@ void Viewport::_gui_set_drag_preview(Control *p_base, Control *p_control) { p_control->set_as_top_level(true); p_control->set_position(gui.last_mouse_pos); p_base->get_root_parent_control()->add_child(p_control); // Add as child of viewport. - p_control->raise(); + p_control->move_to_front(); gui.drag_preview_id = p_control->get_instance_id(); } @@ -2850,8 +2872,8 @@ Variant Viewport::gui_get_drag_data() const { return gui.drag_data; } -TypedArray<String> Viewport::get_configuration_warnings() const { - TypedArray<String> warnings = Node::get_configuration_warnings(); +PackedStringArray Viewport::get_configuration_warnings() const { + PackedStringArray warnings = Node::get_configuration_warnings(); if (size.x <= 1 || size.y <= 1) { warnings.push_back(RTR("The Viewport size must be greater than or equal to 2 pixels on both dimensions to render anything.")); @@ -3612,9 +3634,20 @@ void Viewport::_propagate_exit_world_3d(Node *p_node) { } void Viewport::set_use_xr(bool p_use_xr) { - use_xr = p_use_xr; + if (use_xr != p_use_xr) { + use_xr = p_use_xr; - RS::get_singleton()->viewport_set_use_xr(viewport, use_xr); + RS::get_singleton()->viewport_set_use_xr(viewport, use_xr); + + if (!use_xr) { + // Set viewport to previous size when exiting XR. + if (size_allocated) { + RS::get_singleton()->viewport_set_size(viewport, size.width, size.height); + } else { + RS::get_singleton()->viewport_set_size(viewport, 0, 0); + } + } + } } bool Viewport::is_using_xr() { diff --git a/scene/main/viewport.h b/scene/main/viewport.h index afea3ea56c..471dc41246 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -568,7 +568,7 @@ public: bool is_input_disabled() const; Vector2 get_mouse_position() const; - virtual void warp_mouse(const Vector2 &p_position); + void warp_mouse(const Vector2 &p_position); void set_physics_object_picking(bool p_enable); bool get_physics_object_picking(); @@ -581,7 +581,7 @@ public: void gui_release_focus(); Control *gui_get_focus_owner(); - TypedArray<String> get_configuration_warnings() const override; + PackedStringArray get_configuration_warnings() const override; void set_debug_draw(DebugDraw p_debug_draw); DebugDraw get_debug_draw() const; diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 04f56bb874..ebe9587b31 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -986,18 +986,6 @@ DisplayServer::WindowID Window::get_window_id() const { return window_id; } -void Window::warp_mouse(const Vector2 &p_position) { - Transform2D xform = get_screen_transform(); - Vector2 gpos = xform.xform(p_position); - - if (transient_parent && !transient_parent->is_embedding_subwindows()) { - Transform2D window_trans = Transform2D().translated(get_position() + (transient_parent->get_visible_rect().size - transient_parent->get_real_size())); - gpos = window_trans.xform(gpos); - } - - Input::get_singleton()->warp_mouse(gpos); -} - void Window::set_wrap_controls(bool p_enable) { wrap_controls = p_enable; if (wrap_controls) { @@ -1153,7 +1141,7 @@ void Window::popup_centered_clamped(const Size2i &p_size, float p_fallback_ratio Rect2 parent_rect; if (is_embedded()) { - parent_rect = get_parent_viewport()->get_visible_rect(); + parent_rect = _get_embedder()->get_visible_rect(); } else { DisplayServer::WindowID parent_id = get_parent_visible_window()->get_window_id(); int parent_screen = DisplayServer::get_singleton()->window_get_current_screen(parent_id); @@ -1179,7 +1167,7 @@ void Window::popup_centered(const Size2i &p_minsize) { Rect2 parent_rect; if (is_embedded()) { - parent_rect = get_parent_viewport()->get_visible_rect(); + parent_rect = _get_embedder()->get_visible_rect(); } else { DisplayServer::WindowID parent_id = get_parent_visible_window()->get_window_id(); int parent_screen = DisplayServer::get_singleton()->window_get_current_screen(parent_id); @@ -1207,7 +1195,7 @@ void Window::popup_centered_ratio(float p_ratio) { Rect2 parent_rect; if (is_embedded()) { - parent_rect = get_parent_viewport()->get_visible_rect(); + parent_rect = _get_embedder()->get_visible_rect(); } else { DisplayServer::WindowID parent_id = get_parent_visible_window()->get_window_id(); int parent_screen = DisplayServer::get_singleton()->window_get_current_screen(parent_id); diff --git a/scene/main/window.h b/scene/main/window.h index 8113117103..8c6ca65436 100644 --- a/scene/main/window.h +++ b/scene/main/window.h @@ -254,8 +254,6 @@ public: void set_use_font_oversampling(bool p_oversampling); bool is_using_font_oversampling() const; - void warp_mouse(const Vector2 &p_position) override; - void set_wrap_controls(bool p_enable); bool is_wrapping_controls() const; void child_controls_changed(); diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 72c57f1bfc..e536aeee51 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -794,6 +794,7 @@ void register_scene_types() { GDREGISTER_CLASS(CylinderMesh); GDREGISTER_CLASS(PlaneMesh); GDREGISTER_CLASS(PrismMesh); + GDREGISTER_CLASS(QuadMesh); GDREGISTER_CLASS(SphereMesh); GDREGISTER_CLASS(TextMesh); GDREGISTER_CLASS(TorusMesh); @@ -959,7 +960,6 @@ void register_scene_types() { ClassDB::add_compatibility_class("Navigation3D", "Node3D"); ClassDB::add_compatibility_class("Navigation2D", "Node2D"); ClassDB::add_compatibility_class("OpenSimplexNoise", "FastNoiseLite"); - ClassDB::add_compatibility_class("QuadMesh", "PlaneMesh"); ClassDB::add_compatibility_class("ToolButton", "Button"); ClassDB::add_compatibility_class("YSort", "Node2D"); // Portal and room occlusion was replaced by raster occlusion (OccluderInstance3D node). diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp index 9d5bc18c96..a52bfe97e7 100644 --- a/scene/resources/animation.cpp +++ b/scene/resources/animation.cpp @@ -2317,9 +2317,7 @@ Quaternion Animation::_interpolate(const Quaternion &p_a, const Quaternion &p_b, } Variant Animation::_interpolate(const Variant &p_a, const Variant &p_b, real_t p_c) const { - Variant dst; - Variant::interpolate(p_a, p_b, p_c, dst); - return dst; + return interpolate_variant(p_a, p_b, p_c); } real_t Animation::_interpolate(const real_t &p_a, const real_t &p_b, real_t p_c) const { @@ -5563,6 +5561,466 @@ bool Animation::_fetch_compressed_by_index(uint32_t p_compressed_track, int p_in return false; } +// Helper math functions for Variant. +Variant Animation::add_variant(const Variant &a, const Variant &b) { + if (a.get_type() != b.get_type()) { + return a; + } + + switch (a.get_type()) { + case Variant::NIL: { + return Variant(); + } + case Variant::BOOL: { + return (a.operator real_t()) + (b.operator real_t()); // It is cast for interpolation. + } + case Variant::RECT2: { + const Rect2 ra = a.operator Rect2(); + const Rect2 rb = b.operator Rect2(); + return Rect2(ra.position + rb.position, ra.size + rb.size); + } + case Variant::RECT2I: { + const Rect2i ra = a.operator Rect2i(); + const Rect2i rb = b.operator Rect2i(); + return Rect2i(ra.position + rb.position, ra.size + rb.size); + } + case Variant::PLANE: { + const Plane pa = a.operator Plane(); + const Plane pb = b.operator Plane(); + return Plane(pa.normal + pb.normal, pa.d + pb.d); + } + case Variant::AABB: { + const ::AABB aa = a.operator ::AABB(); + const ::AABB ab = b.operator ::AABB(); + return ::AABB(aa.position + ab.position, aa.size + ab.size); + } + case Variant::QUATERNION: { + return (a.operator Quaternion()) * (b.operator Quaternion()); + } + case Variant::TRANSFORM2D: { + return (a.operator Transform2D()) * (b.operator Transform2D()); + } + case Variant::TRANSFORM3D: { + return (a.operator Transform3D()) * (b.operator Transform3D()); + } + default: { + return Variant::evaluate(Variant::OP_ADD, a, b); + } + } +} + +Variant Animation::subtract_variant(const Variant &a, const Variant &b) { + if (a.get_type() != b.get_type()) { + return a; + } + + switch (a.get_type()) { + case Variant::NIL: { + return Variant(); + } + case Variant::BOOL: { + return (a.operator real_t()) - (b.operator real_t()); // It is cast for interpolation. + } + case Variant::RECT2: { + const Rect2 ra = a.operator Rect2(); + const Rect2 rb = b.operator Rect2(); + return Rect2(ra.position - rb.position, ra.size - rb.size); + } + case Variant::RECT2I: { + const Rect2i ra = a.operator Rect2i(); + const Rect2i rb = b.operator Rect2i(); + return Rect2i(ra.position - rb.position, ra.size - rb.size); + } + case Variant::PLANE: { + const Plane pa = a.operator Plane(); + const Plane pb = b.operator Plane(); + return Plane(pa.normal - pb.normal, pa.d - pb.d); + } + case Variant::AABB: { + const ::AABB aa = a.operator ::AABB(); + const ::AABB ab = b.operator ::AABB(); + return ::AABB(aa.position - ab.position, aa.size - ab.size); + } + case Variant::QUATERNION: { + return (b.operator Quaternion()).inverse() * (a.operator Quaternion()); + } + case Variant::TRANSFORM2D: { + return (b.operator Transform2D()).inverse() * (a.operator Transform2D()); + } + case Variant::TRANSFORM3D: { + return (b.operator Transform3D()).inverse() * (a.operator Transform3D()); + } + default: { + return Variant::evaluate(Variant::OP_SUBTRACT, a, b); + } + } +} + +Variant Animation::blend_variant(const Variant &a, const Variant &b, float c) { + if (a.get_type() != b.get_type()) { + if (a.is_num() && b.is_num()) { + real_t va = a; + real_t vb = b; + return va + vb * c; + } + return a; + } + + switch (a.get_type()) { + case Variant::NIL: { + return Variant(); + } + case Variant::INT: { + return int((a.operator int64_t()) + (b.operator int64_t()) * c + 0.5); + } + case Variant::FLOAT: { + return (a.operator double()) + (b.operator double()) * c; + } + case Variant::VECTOR2: { + return (a.operator Vector2()) + (b.operator Vector2()) * c; + } + case Variant::VECTOR2I: { + const Vector2i va = a.operator Vector2i(); + const Vector2i vb = b.operator Vector2i(); + return Vector2i(int32_t(va.x + vb.x * c + 0.5), int32_t(va.y + vb.y * c + 0.5)); + } + case Variant::RECT2: { + const Rect2 ra = a.operator Rect2(); + const Rect2 rb = b.operator Rect2(); + return Rect2(ra.position + rb.position * c, ra.size + rb.size * c); + } + case Variant::RECT2I: { + const Rect2i ra = a.operator Rect2i(); + const Rect2i rb = b.operator Rect2i(); + return Rect2i(int32_t(ra.position.x + rb.position.x * c + 0.5), int32_t(ra.position.y + rb.position.y * c + 0.5), int32_t(ra.size.x + rb.size.x * c + 0.5), int32_t(ra.size.y + rb.size.y * c + 0.5)); + } + case Variant::VECTOR3: { + return (a.operator Vector3()) + (b.operator Vector3()) * c; + } + case Variant::VECTOR3I: { + const Vector3i va = a.operator Vector3i(); + const Vector3i vb = b.operator Vector3i(); + return Vector3i(int32_t(va.x + vb.x * c + 0.5), int32_t(va.y + vb.y * c + 0.5), int32_t(va.z + vb.z * c + 0.5)); + } + case Variant::VECTOR4: { + return (a.operator Vector4()) + (b.operator Vector4()) * c; + } + case Variant::VECTOR4I: { + const Vector4i va = a.operator Vector4i(); + const Vector4i vb = b.operator Vector4i(); + return Vector4i(int32_t(va.x + vb.x * c + 0.5), int32_t(va.y + vb.y * c + 0.5), int32_t(va.z + vb.z * c + 0.5), int32_t(va.w + vb.w * c + 0.5)); + } + case Variant::PLANE: { + const Plane pa = a.operator Plane(); + const Plane pb = b.operator Plane(); + return Plane(pa.normal + pb.normal * c, pa.d + pb.d * c); + } + case Variant::COLOR: { + return (a.operator Color()) + (b.operator Color()) * c; + } + case Variant::AABB: { + const ::AABB aa = a.operator ::AABB(); + const ::AABB ab = b.operator ::AABB(); + return ::AABB(aa.position + ab.position * c, aa.size + ab.size * c); + } + case Variant::BASIS: { + return (a.operator Basis()) + (b.operator Basis()) * c; + } + case Variant::QUATERNION: { + return (a.operator Quaternion()) * Quaternion().slerp((b.operator Quaternion()), c); + } + case Variant::TRANSFORM2D: { + return (a.operator Transform2D()) * Transform2D().interpolate_with((b.operator Transform2D()), c); + } + case Variant::TRANSFORM3D: { + return (a.operator Transform3D()) * Transform3D().interpolate_with((b.operator Transform3D()), c); + } + default: { + return c < 0.5 ? a : b; + } + } +} + +Variant Animation::interpolate_variant(const Variant &a, const Variant &b, float c) { + if (a.get_type() != b.get_type()) { + if (a.is_num() && b.is_num()) { + real_t va = a; + real_t vb = b; + return va + (vb - va) * c; + } + return a; + } + + switch (a.get_type()) { + case Variant::NIL: { + return Variant(); + } + case Variant::INT: { + const int64_t va = a.operator int64_t(); + return int(va + ((b.operator int64_t()) - va) * c); + } + case Variant::FLOAT: { + const real_t va = a.operator real_t(); + return va + ((b.operator real_t()) - va) * c; + } + case Variant::VECTOR2: { + return (a.operator Vector2()).lerp(b.operator Vector2(), c); + } + case Variant::VECTOR2I: { + const Vector2i va = a.operator Vector2i(); + const Vector2i vb = b.operator Vector2i(); + return Vector2i(int32_t(va.x + (vb.x - va.x) * c), int32_t(va.y + (vb.y - va.y) * c)); + } + case Variant::RECT2: { + const Rect2 ra = a.operator Rect2(); + const Rect2 rb = b.operator Rect2(); + return Rect2(ra.position.lerp(rb.position, c), ra.size.lerp(rb.size, c)); + } + case Variant::RECT2I: { + const Rect2i ra = a.operator Rect2i(); + const Rect2i rb = b.operator Rect2i(); + return Rect2i(int32_t(ra.position.x + (rb.position.x - ra.position.x) * c), int32_t(ra.position.y + (rb.position.y - ra.position.y) * c), int32_t(ra.size.x + (rb.size.x - ra.size.x) * c), int32_t(ra.size.y + (rb.size.y - ra.size.y) * c)); + } + case Variant::VECTOR3: { + return (a.operator Vector3()).lerp(b.operator Vector3(), c); + } + case Variant::VECTOR3I: { + const Vector3i va = a.operator Vector3i(); + const Vector3i vb = b.operator Vector3i(); + return Vector3i(int32_t(va.x + (vb.x - va.x) * c), int32_t(va.y + (vb.y - va.y) * c), int32_t(va.z + (vb.z - va.z) * c)); + } + case Variant::VECTOR4: { + return (a.operator Vector4()).lerp(b.operator Vector4(), c); + } + case Variant::VECTOR4I: { + const Vector4i va = a.operator Vector4i(); + const Vector4i vb = b.operator Vector4i(); + return Vector4i(int32_t(va.x + (vb.x - va.x) * c), int32_t(va.y + (vb.y - va.y) * c), int32_t(va.z + (vb.z - va.z) * c), int32_t(va.w + (vb.w - va.w) * c)); + } + case Variant::PLANE: { + const Plane pa = a.operator Plane(); + const Plane pb = b.operator Plane(); + return Plane(pa.normal.lerp(pb.normal, c), pa.d + (pb.d - pa.d) * c); + } + case Variant::COLOR: { + return (a.operator Color()).lerp(b.operator Color(), c); + } + case Variant::AABB: { + const ::AABB aa = a.operator ::AABB(); + const ::AABB ab = b.operator ::AABB(); + return ::AABB(aa.position.lerp(ab.position, c), aa.size.lerp(ab.size, c)); + } + case Variant::BASIS: { + return (a.operator Basis()).lerp(b.operator Basis(), c); + } + case Variant::QUATERNION: { + return (a.operator Quaternion()).slerp(b.operator Quaternion(), c); + } + case Variant::TRANSFORM2D: { + return (a.operator Transform2D()).interpolate_with(b.operator Transform2D(), c); + } + case Variant::TRANSFORM3D: { + return (a.operator Transform3D()).interpolate_with(b.operator Transform3D(), c); + } + case Variant::STRING: { + // This is pretty funny and bizarre, but artists like to use it for typewriter effects. + const String sa = a.operator String(); + const String sb = b.operator String(); + String dst; + int sa_len = sa.length(); + int sb_len = sb.length(); + int csize = sa_len + (sb_len - sa_len) * c; + if (csize == 0) { + return ""; + } + dst.resize(csize + 1); + dst[csize] = 0; + int split = csize / 2; + + for (int i = 0; i < csize; i++) { + char32_t chr = ' '; + + if (i < split) { + if (i < sa.length()) { + chr = sa[i]; + } else if (i < sb.length()) { + chr = sb[i]; + } + + } else { + if (i < sb.length()) { + chr = sb[i]; + } else if (i < sa.length()) { + chr = sa[i]; + } + } + + dst[i] = chr; + } + + return dst; + } + case Variant::PACKED_INT32_ARRAY: { + const Vector<int32_t> *arr_a = Object::cast_to<Vector<int32_t>>(a); + const Vector<int32_t> *arr_b = Object::cast_to<Vector<int32_t>>(b); + int32_t sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<int32_t> v; + v.resize(sz); + { + int32_t *vw = v.ptrw(); + const int32_t *ar = arr_a->ptr(); + const int32_t *br = arr_b->ptr(); + + Variant va; + for (int32_t i = 0; i < sz; i++) { + va = interpolate_variant(ar[i], br[i], c); + vw[i] = va; + } + } + return v; + } + } + case Variant::PACKED_INT64_ARRAY: { + const Vector<int64_t> *arr_a = Object::cast_to<Vector<int64_t>>(a); + const Vector<int64_t> *arr_b = Object::cast_to<Vector<int64_t>>(b); + int64_t sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<int64_t> v; + v.resize(sz); + { + int64_t *vw = v.ptrw(); + const int64_t *ar = arr_a->ptr(); + const int64_t *br = arr_b->ptr(); + + Variant va; + for (int64_t i = 0; i < sz; i++) { + va = interpolate_variant(ar[i], br[i], c); + vw[i] = va; + } + } + return v; + } + } + case Variant::PACKED_FLOAT32_ARRAY: { + const Vector<float> *arr_a = Object::cast_to<Vector<float>>(a); + const Vector<float> *arr_b = Object::cast_to<Vector<float>>(b); + int sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<float> v; + v.resize(sz); + { + float *vw = v.ptrw(); + const float *ar = arr_a->ptr(); + const float *br = arr_b->ptr(); + + Variant va; + for (int i = 0; i < sz; i++) { + va = interpolate_variant(ar[i], br[i], c); + vw[i] = va; + } + } + return v; + } + } + case Variant::PACKED_FLOAT64_ARRAY: { + const Vector<double> *arr_a = Object::cast_to<Vector<double>>(a); + const Vector<double> *arr_b = Object::cast_to<Vector<double>>(b); + int sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<double> v; + v.resize(sz); + { + double *vw = v.ptrw(); + const double *ar = arr_a->ptr(); + const double *br = arr_b->ptr(); + + Variant va; + for (int i = 0; i < sz; i++) { + va = interpolate_variant(ar[i], br[i], c); + vw[i] = va; + } + } + return v; + } + } + case Variant::PACKED_VECTOR2_ARRAY: { + const Vector<Vector2> *arr_a = Object::cast_to<Vector<Vector2>>(a); + const Vector<Vector2> *arr_b = Object::cast_to<Vector<Vector2>>(b); + int sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<Vector2> v; + v.resize(sz); + { + Vector2 *vw = v.ptrw(); + const Vector2 *ar = arr_a->ptr(); + const Vector2 *br = arr_b->ptr(); + + for (int i = 0; i < sz; i++) { + vw[i] = ar[i].lerp(br[i], c); + } + } + return v; + } + } + case Variant::PACKED_VECTOR3_ARRAY: { + const Vector<Vector3> *arr_a = Object::cast_to<Vector<Vector3>>(a); + const Vector<Vector3> *arr_b = Object::cast_to<Vector<Vector3>>(b); + int sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<Vector3> v; + v.resize(sz); + { + Vector3 *vw = v.ptrw(); + const Vector3 *ar = arr_a->ptr(); + const Vector3 *br = arr_b->ptr(); + + for (int i = 0; i < sz; i++) { + vw[i] = ar[i].lerp(br[i], c); + } + } + return v; + } + } + case Variant::PACKED_COLOR_ARRAY: { + const Vector<Color> *arr_a = Object::cast_to<Vector<Color>>(a); + const Vector<Color> *arr_b = Object::cast_to<Vector<Color>>(b); + int sz = arr_a->size(); + if (sz == 0 || arr_b->size() != sz) { + return a; + } else { + Vector<Color> v; + v.resize(sz); + { + Color *vw = v.ptrw(); + const Color *ar = arr_a->ptr(); + const Color *br = arr_b->ptr(); + + for (int i = 0; i < sz; i++) { + vw[i] = ar[i].lerp(br[i], c); + } + } + return v; + } + } + default: { + return c < 0.5 ? a : b; + } + } +} + Animation::Animation() {} Animation::~Animation() { diff --git a/scene/resources/animation.h b/scene/resources/animation.h index 46a88df130..49c8fa4c22 100644 --- a/scene/resources/animation.h +++ b/scene/resources/animation.h @@ -496,6 +496,12 @@ public: void optimize(real_t p_allowed_velocity_err = 0.01, real_t p_allowed_angular_err = 0.01, int p_precision = 3); void compress(uint32_t p_page_size = 8192, uint32_t p_fps = 120, float p_split_tolerance = 4.0); // 4.0 seems to be the split tolerance sweet spot from many tests + // Helper math functions for Variant. + static Variant add_variant(const Variant &a, const Variant &b); + static Variant subtract_variant(const Variant &a, const Variant &b); + static Variant blend_variant(const Variant &a, const Variant &b, float c); + static Variant interpolate_variant(const Variant &a, const Variant &b, float c); + Animation(); ~Animation(); }; diff --git a/scene/resources/font.cpp b/scene/resources/font.cpp index 189d8d5502..3d9e4e4a63 100644 --- a/scene/resources/font.cpp +++ b/scene/resources/font.cpp @@ -554,7 +554,6 @@ Font::Font() { } Font::~Font() { - reset_state(); } /*************************************************************************/ @@ -2433,11 +2432,10 @@ int32_t FontFile::get_glyph_index(int p_size, char32_t p_char, char32_t p_variat } FontFile::FontFile() { - /* NOP */ } FontFile::~FontFile() { - reset_state(); + _clear_cache(); } /*************************************************************************/ @@ -2688,7 +2686,6 @@ FontVariation::FontVariation() { } FontVariation::~FontVariation() { - reset_state(); } /*************************************************************************/ @@ -3081,5 +3078,4 @@ SystemFont::SystemFont() { } SystemFont::~SystemFont() { - reset_state(); } diff --git a/scene/resources/importer_mesh.cpp b/scene/resources/importer_mesh.cpp index 0afca95de0..de3d502102 100644 --- a/scene/resources/importer_mesh.cpp +++ b/scene/resources/importer_mesh.cpp @@ -254,7 +254,20 @@ void ImporterMesh::set_surface_material(int p_surface, const Ref<Material> &p_ma mesh.unref(); } -void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_split_angle) { +#define VERTEX_SKIN_FUNC(bone_count, vert_idx, read_array, write_array, transform_array, bone_array, weight_array) \ + Vector3 transformed_vert = Vector3(); \ + for (unsigned int weight_idx = 0; weight_idx < bone_count; weight_idx++) { \ + int bone_idx = bone_array[vert_idx * bone_count + weight_idx]; \ + float w = weight_array[vert_idx * bone_count + weight_idx]; \ + if (w < FLT_EPSILON) { \ + continue; \ + } \ + ERR_FAIL_INDEX(bone_idx, static_cast<int>(transform_array.size())); \ + transformed_vert += transform_array[bone_idx].xform(read_array[vert_idx]) * w; \ + } \ + write_array[vert_idx] = transformed_vert; + +void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_split_angle, Array p_bone_transform_array) { if (!SurfaceTool::simplify_scale_func) { return; } @@ -265,6 +278,12 @@ void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_spli return; } + LocalVector<Transform3D> bone_transform_vector; + for (int i = 0; i < p_bone_transform_array.size(); i++) { + ERR_FAIL_COND(p_bone_transform_array[i].get_type() != Variant::TRANSFORM3D); + bone_transform_vector.push_back(p_bone_transform_array[i]); + } + for (int i = 0; i < surfaces.size(); i++) { if (surfaces[i].primitive != Mesh::PRIMITIVE_TRIANGLES) { continue; @@ -276,6 +295,8 @@ void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_spli Vector<Vector3> normals = surfaces[i].arrays[RS::ARRAY_NORMAL]; Vector<Vector2> uvs = surfaces[i].arrays[RS::ARRAY_TEX_UV]; Vector<Vector2> uv2s = surfaces[i].arrays[RS::ARRAY_TEX_UV2]; + Vector<int> bones = surfaces[i].arrays[RS::ARRAY_BONES]; + Vector<float> weights = surfaces[i].arrays[RS::ARRAY_WEIGHTS]; unsigned int index_count = indices.size(); unsigned int vertex_count = vertices.size(); @@ -301,6 +322,22 @@ void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_spli } } + if (bones.size() > 0 && weights.size() && bone_transform_vector.size() > 0) { + Vector3 *vertices_ptrw = vertices.ptrw(); + + // Apply bone transforms to regular surface. + unsigned int bone_weight_length = surfaces[i].flags & Mesh::ARRAY_FLAG_USE_8_BONE_WEIGHTS ? 8 : 4; + + const int *bo = bones.ptr(); + const float *we = weights.ptr(); + + for (unsigned int j = 0; j < vertex_count; j++) { + VERTEX_SKIN_FUNC(bone_weight_length, j, vertices_ptr, vertices_ptrw, bone_transform_vector, bo, we) + } + + vertices_ptr = vertices.ptr(); + } + float normal_merge_threshold = Math::cos(Math::deg_to_rad(p_normal_merge_angle)); float normal_pre_split_threshold = Math::cos(Math::deg_to_rad(MIN(180.0f, p_normal_split_angle * 2.0f))); float normal_split_threshold = Math::cos(Math::deg_to_rad(p_normal_split_angle)); @@ -1246,7 +1283,7 @@ void ImporterMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("set_surface_name", "surface_idx", "name"), &ImporterMesh::set_surface_name); ClassDB::bind_method(D_METHOD("set_surface_material", "surface_idx", "material"), &ImporterMesh::set_surface_material); - ClassDB::bind_method(D_METHOD("generate_lods", "normal_merge_angle", "normal_split_angle"), &ImporterMesh::generate_lods); + ClassDB::bind_method(D_METHOD("generate_lods", "normal_merge_angle", "normal_split_angle", "bone_transform_array"), &ImporterMesh::generate_lods); ClassDB::bind_method(D_METHOD("get_mesh", "base_mesh"), &ImporterMesh::get_mesh, DEFVAL(Ref<ArrayMesh>())); ClassDB::bind_method(D_METHOD("clear"), &ImporterMesh::clear); diff --git a/scene/resources/importer_mesh.h b/scene/resources/importer_mesh.h index dce2638c19..088a77edd1 100644 --- a/scene/resources/importer_mesh.h +++ b/scene/resources/importer_mesh.h @@ -112,7 +112,7 @@ public: void set_surface_material(int p_surface, const Ref<Material> &p_material); - void generate_lods(float p_normal_merge_angle, float p_normal_split_angle); + void generate_lods(float p_normal_merge_angle, float p_normal_split_angle, Array p_skin_pose_transform_array); void create_shadow_mesh(); Ref<ImporterMesh> get_shadow_mesh() const; diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp index 448ff74a53..c1e30dd93c 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -156,17 +156,7 @@ Material::~Material() { bool ShaderMaterial::_set(const StringName &p_name, const Variant &p_value) { if (shader.is_valid()) { - StringName pr = shader->remap_uniform(p_name); - if (!pr) { - String n = p_name; - if (n.find("shader_parameter/") == 0) { //backwards compatibility - pr = n.replace_first("shader_parameter/", ""); - } else if (n.find("shader_uniform/") == 0) { //backwards compatibility - pr = n.replace_first("shader_uniform/", ""); - } else if (n.find("param/") == 0) { //backwards compatibility - pr = n.substr(6, n.length()); - } - } + StringName pr = shader->remap_parameter(p_name); if (pr) { set_shader_parameter(pr, p_value); return true; @@ -178,25 +168,9 @@ bool ShaderMaterial::_set(const StringName &p_name, const Variant &p_value) { bool ShaderMaterial::_get(const StringName &p_name, Variant &r_ret) const { if (shader.is_valid()) { - StringName pr = shader->remap_uniform(p_name); - if (!pr) { - String n = p_name; - if (n.find("shader_parameter/") == 0) { //backwards compatibility - pr = n.replace_first("shader_parameter/", ""); - } else if (n.find("shader_uniform/") == 0) { //backwards compatibility - pr = n.replace_first("shader_uniform/", ""); - } else if (n.find("param/") == 0) { //backwards compatibility - pr = n.substr(6, n.length()); - } - } - + StringName pr = shader->remap_parameter(p_name); if (pr) { - HashMap<StringName, Variant>::ConstIterator E = param_cache.find(pr); - if (E) { - r_ret = E->value; - } else { - r_ret = Variant(); - } + r_ret = get_shader_parameter(pr); return true; } } @@ -238,6 +212,7 @@ void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const { PropertyInfo info; info.usage = PROPERTY_USAGE_GROUP; info.name = last_group.capitalize(); + info.hint_string = "shader_parameter/"; List<PropertyInfo> none_subgroup; none_subgroup.push_back(info); @@ -252,6 +227,7 @@ void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const { PropertyInfo info; info.usage = PROPERTY_USAGE_SUBGROUP; info.name = last_subgroup.capitalize(); + info.hint_string = "shader_parameter/"; List<PropertyInfo> subgroup; subgroup.push_back(info); @@ -271,39 +247,42 @@ void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const { PropertyInfo info; info.usage = PROPERTY_USAGE_GROUP; - info.name = "Shader Param"; + info.name = "Shader Parameters"; + info.hint_string = "shader_parameter/"; groups["<None>"]["<None>"].push_back(info); } PropertyInfo info = E->get(); - info.name = info.name; + info.name = "shader_parameter/" + info.name; groups[last_group][last_subgroup].push_back(info); } - // Sort groups alphabetically. - List<UniformProp> props; + List<String> group_names; for (HashMap<String, HashMap<String, List<PropertyInfo>>>::Iterator group = groups.begin(); group; ++group) { - for (HashMap<String, List<PropertyInfo>>::Iterator subgroup = group->value.begin(); subgroup; ++subgroup) { - for (List<PropertyInfo>::Element *item = subgroup->value.front(); item; item = item->next()) { - if (subgroup->key == "<None>") { - props.push_back({ group->key, item->get() }); - } else { - props.push_back({ group->key + "::" + subgroup->key, item->get() }); - } - } - } + group_names.push_back(group->key); } - props.sort_custom<UniformPropComparator>(); + group_names.sort(); - for (List<UniformProp>::Element *E = props.front(); E; E = E->next()) { - p_list->push_back(E->get().info); + for (const String &group_name : group_names) { + List<String> subgroup_names; + HashMap<String, List<PropertyInfo>> &subgroups = groups[group_name]; + for (HashMap<String, List<PropertyInfo>>::Iterator subgroup = subgroups.begin(); subgroup; ++subgroup) { + subgroup_names.push_back(subgroup->key); + } + subgroup_names.sort(); + for (const String &subgroup_name : subgroup_names) { + List<PropertyInfo> &prop_infos = subgroups[subgroup_name]; + for (List<PropertyInfo>::Element *item = prop_infos.front(); item; item = item->next()) { + p_list->push_back(item->get()); + } + } } } } bool ShaderMaterial::_property_can_revert(const StringName &p_name) const { if (shader.is_valid()) { - StringName pr = shader->remap_uniform(p_name); + StringName pr = shader->remap_parameter(p_name); if (pr) { Variant default_value = RenderingServer::get_singleton()->shader_get_parameter_default(shader->get_rid(), pr); Variant current_value; @@ -316,7 +295,7 @@ bool ShaderMaterial::_property_can_revert(const StringName &p_name) const { bool ShaderMaterial::_property_get_revert(const StringName &p_name, Variant &r_property) const { if (shader.is_valid()) { - StringName pr = shader->remap_uniform(p_name); + StringName pr = shader->remap_parameter(p_name); if (pr) { r_property = RenderingServer::get_singleton()->shader_get_parameter_default(shader->get_rid(), pr); return true; @@ -924,6 +903,7 @@ void BaseMaterial3D::_update_shader() { if (flags[FLAG_BILLBOARD_KEEP_SCALE]) { code += " MODELVIEW_MATRIX = MODELVIEW_MATRIX * mat4(vec4(length(MODEL_MATRIX[0].xyz), 0.0, 0.0, 0.0), vec4(0.0, length(MODEL_MATRIX[1].xyz), 0.0, 0.0), vec4(0.0, 0.0, length(MODEL_MATRIX[2].xyz), 0.0), vec4(0.0, 0.0, 0.0, 1.0));\n"; } + code += " MODELVIEW_NORMAL_MATRIX = mat3(MODELVIEW_MATRIX);\n"; } break; case BILLBOARD_FIXED_Y: { code += " MODELVIEW_MATRIX = VIEW_MATRIX * mat4(vec4(normalize(cross(vec3(0.0, 1.0, 0.0), INV_VIEW_MATRIX[2].xyz)), 0.0), vec4(0.0, 1.0, 0.0, 0.0), vec4(normalize(cross(INV_VIEW_MATRIX[0].xyz, vec3(0.0, 1.0, 0.0))), 0.0), MODEL_MATRIX[3]);\n"; @@ -931,6 +911,7 @@ void BaseMaterial3D::_update_shader() { if (flags[FLAG_BILLBOARD_KEEP_SCALE]) { code += " MODELVIEW_MATRIX = MODELVIEW_MATRIX * mat4(vec4(length(MODEL_MATRIX[0].xyz), 0.0, 0.0, 0.0),vec4(0.0, length(MODEL_MATRIX[1].xyz), 0.0, 0.0), vec4(0.0, 0.0, length(MODEL_MATRIX[2].xyz), 0.0), vec4(0.0, 0.0, 0.0, 1.0));\n"; } + code += " MODELVIEW_NORMAL_MATRIX = mat3(MODELVIEW_MATRIX);\n"; } break; case BILLBOARD_PARTICLES: { //make billboard @@ -939,6 +920,8 @@ void BaseMaterial3D::_update_shader() { code += " mat_world = mat_world * mat4(vec4(cos(INSTANCE_CUSTOM.x), -sin(INSTANCE_CUSTOM.x), 0.0, 0.0), vec4(sin(INSTANCE_CUSTOM.x), cos(INSTANCE_CUSTOM.x), 0.0, 0.0), vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0));\n"; //set modelview code += " MODELVIEW_MATRIX = VIEW_MATRIX * mat_world;\n"; + //set modelview normal + code += " MODELVIEW_NORMAL_MATRIX = mat3(MODELVIEW_MATRIX);\n"; //handle animation code += " float h_frames = float(particles_anim_h_frames);\n"; @@ -949,7 +932,7 @@ void BaseMaterial3D::_update_shader() { code += " particle_frame = clamp(particle_frame, 0.0, particle_total_frames - 1.0);\n"; code += " } else {\n"; code += " particle_frame = mod(particle_frame, particle_total_frames);\n"; - code += " }"; + code += " }\n"; code += " UV /= vec2(h_frames, v_frames);\n"; code += " UV += vec2(mod(particle_frame, h_frames) / h_frames, floor((particle_frame + 0.5) / h_frames) / v_frames);\n"; } break; diff --git a/scene/resources/material.h b/scene/resources/material.h index 6c81293ee3..dd9589c577 100644 --- a/scene/resources/material.h +++ b/scene/resources/material.h @@ -84,17 +84,6 @@ class ShaderMaterial : public Material { HashMap<StringName, Variant> param_cache; - struct UniformProp { - String str; - PropertyInfo info; - }; - - struct UniformPropComparator { - bool operator()(const UniformProp &p_a, const UniformProp &p_b) const { - return p_a.str.naturalnocasecmp_to(p_b.str) < 0; - } - }; - protected: bool _set(const StringName &p_name, const Variant &p_value); bool _get(const StringName &p_name, Variant &r_ret) const; diff --git a/scene/resources/navigation_mesh.cpp b/scene/resources/navigation_mesh.cpp index 6c9c8ffdba..90ea879012 100644 --- a/scene/resources/navigation_mesh.cpp +++ b/scene/resources/navigation_mesh.cpp @@ -32,7 +32,7 @@ #ifdef DEBUG_ENABLED #include "servers/navigation_server_3d.h" -#endif +#endif // DEBUG_ENABLED void NavigationMesh::create_from_mesh(const Ref<Mesh> &p_mesh) { ERR_FAIL_COND(p_mesh.is_null()); @@ -341,94 +341,8 @@ void NavigationMesh::clear_polygons() { polygons.clear(); } -#ifndef DISABLE_DEPRECATED -Ref<Mesh> NavigationMesh::get_debug_mesh() { - if (debug_mesh.is_valid()) { - return debug_mesh; - } - - Vector<Vector3> vertices = get_vertices(); - const Vector3 *vr = vertices.ptr(); - List<Face3> faces; - for (int i = 0; i < get_polygon_count(); i++) { - Vector<int> p = get_polygon(i); - - for (int j = 2; j < p.size(); j++) { - Face3 f; - f.vertex[0] = vr[p[0]]; - f.vertex[1] = vr[p[j - 1]]; - f.vertex[2] = vr[p[j]]; - - faces.push_back(f); - } - } - - HashMap<_EdgeKey, bool, _EdgeKey> edge_map; - Vector<Vector3> tmeshfaces; - tmeshfaces.resize(faces.size() * 3); - - { - Vector3 *tw = tmeshfaces.ptrw(); - int tidx = 0; - - for (const Face3 &f : faces) { - for (int j = 0; j < 3; j++) { - tw[tidx++] = f.vertex[j]; - _EdgeKey ek; - ek.from = f.vertex[j].snapped(Vector3(CMP_EPSILON, CMP_EPSILON, CMP_EPSILON)); - ek.to = f.vertex[(j + 1) % 3].snapped(Vector3(CMP_EPSILON, CMP_EPSILON, CMP_EPSILON)); - if (ek.from < ek.to) { - SWAP(ek.from, ek.to); - } - - HashMap<_EdgeKey, bool, _EdgeKey>::Iterator F = edge_map.find(ek); - - if (F) { - F->value = false; - - } else { - edge_map[ek] = true; - } - } - } - } - List<Vector3> lines; - - for (const KeyValue<_EdgeKey, bool> &E : edge_map) { - if (E.value) { - lines.push_back(E.key.from); - lines.push_back(E.key.to); - } - } - - Vector<Vector3> varr; - varr.resize(lines.size()); - { - Vector3 *w = varr.ptrw(); - int idx = 0; - for (const Vector3 &E : lines) { - w[idx++] = E; - } - } - - debug_mesh = Ref<ArrayMesh>(memnew(ArrayMesh)); - - if (!lines.size()) { - return debug_mesh; - } - - Array arr; - arr.resize(Mesh::ARRAY_MAX); - arr[Mesh::ARRAY_VERTEX] = varr; - - debug_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, arr); - - return debug_mesh; -} -#endif // DISABLE_DEPRECATED - #ifdef DEBUG_ENABLED -Ref<ArrayMesh> NavigationMesh::_get_debug_mesh() { +Ref<ArrayMesh> NavigationMesh::get_debug_mesh() { if (debug_mesh.is_valid()) { // Blocks further updates for now, code below is intended for dynamic updates e.g. when settings change. return debug_mesh; @@ -479,8 +393,6 @@ Ref<ArrayMesh> NavigationMesh::_get_debug_mesh() { for (int i = 0; i < polygon_count; i++) { polygon_color = debug_navigation_geometry_face_color * (Color(Math::randf(), Math::randf(), Math::randf())); - Vector<int> polygon = get_polygon(i); - face_color_array.push_back(polygon_color); face_color_array.push_back(polygon_color); face_color_array.push_back(polygon_color); @@ -490,7 +402,7 @@ Ref<ArrayMesh> NavigationMesh::_get_debug_mesh() { debug_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, face_mesh_array); Ref<StandardMaterial3D> debug_geometry_face_material = NavigationServer3D::get_singleton_mut()->get_debug_navigation_geometry_face_material(); - debug_mesh->surface_set_material(debug_mesh->get_surface_count(), debug_geometry_face_material); + debug_mesh->surface_set_material(0, debug_geometry_face_material); // if enabled build geometry edge line surface bool enabled_edge_lines = NavigationServer3D::get_singleton()->get_debug_navigation_enable_edge_lines(); @@ -515,12 +427,12 @@ Ref<ArrayMesh> NavigationMesh::_get_debug_mesh() { line_mesh_array[Mesh::ARRAY_VERTEX] = line_vertex_array; debug_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, line_mesh_array); Ref<StandardMaterial3D> debug_geometry_edge_material = NavigationServer3D::get_singleton_mut()->get_debug_navigation_geometry_edge_material(); - debug_mesh->surface_set_material(debug_mesh->get_surface_count(), debug_geometry_edge_material); + debug_mesh->surface_set_material(1, debug_geometry_edge_material); } return debug_mesh; } -#endif +#endif // DEBUG_ENABLED void NavigationMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("set_sample_partition_type", "sample_partition_type"), &NavigationMesh::set_sample_partition_type); diff --git a/scene/resources/navigation_mesh.h b/scene/resources/navigation_mesh.h index c66025dc6d..5ddbd75dcb 100644 --- a/scene/resources/navigation_mesh.h +++ b/scene/resources/navigation_mesh.h @@ -202,11 +202,9 @@ public: Vector<int> get_polygon(int p_idx); void clear_polygons(); -#ifndef DISABLE_DEPRECATED - Ref<Mesh> get_debug_mesh(); -#endif // DISABLE_DEPRECATED - - Ref<ArrayMesh> _get_debug_mesh(); +#ifdef DEBUG_ENABLED + Ref<ArrayMesh> get_debug_mesh(); +#endif // DEBUG_ENABLED NavigationMesh(); }; diff --git a/scene/resources/primitive_meshes.h b/scene/resources/primitive_meshes.h index 280477ebfa..65823a8f7f 100644 --- a/scene/resources/primitive_meshes.h +++ b/scene/resources/primitive_meshes.h @@ -262,6 +262,18 @@ public: VARIANT_ENUM_CAST(PlaneMesh::Orientation) +/* + A flat rectangle, inherits from PlaneMesh but defaults to facing the Z-plane. +*/ +class QuadMesh : public PlaneMesh { + GDCLASS(QuadMesh, PlaneMesh); + +public: + QuadMesh() { + set_orientation(FACE_Z); + } +}; + /** A prism shapen, handy for ramps, triangles, etc. */ diff --git a/scene/resources/shader.h b/scene/resources/shader.h index d267e6520e..57be142a95 100644 --- a/scene/resources/shader.h +++ b/scene/resources/shader.h @@ -87,15 +87,44 @@ public: virtual bool is_text_shader() const; - _FORCE_INLINE_ StringName remap_uniform(const StringName &p_uniform) const { + // Finds the shader parameter name for the given property name, which should start with "shader_parameter/". + _FORCE_INLINE_ StringName remap_parameter(const StringName &p_property) const { if (params_cache_dirty) { get_shader_uniform_list(nullptr); } - const HashMap<StringName, StringName>::Iterator E = params_cache.find(p_uniform); - if (E) { - return E->value; + String n = p_property; + + // Backwards compatibility with old shader parameter names. + // Note: The if statements are important to make sure we are only replacing text exactly at index 0. + if (n.find("param/") == 0) { + n = n.replace_first("param/", "shader_parameter/"); + } + if (n.find("shader_param/") == 0) { + n = n.replace_first("shader_param/", "shader_parameter/"); + } + if (n.find("shader_uniform/") == 0) { + n = n.replace_first("shader_uniform/", "shader_parameter/"); + } + + { + // Additional backwards compatibility for projects between #62972 and #64092 (about a month of v4.0 development). + // These projects did not have any prefix for shader uniforms due to a bug. + // This code should be removed during beta or rc of 4.0. + const HashMap<StringName, StringName>::Iterator E = params_cache.find(n); + if (E) { + return E->value; + } + } + + if (n.begins_with("shader_parameter/")) { + n = n.replace_first("shader_parameter/", ""); + const HashMap<StringName, StringName>::Iterator E = params_cache.find(n); + if (E) { + return E->value; + } } + return StringName(); } diff --git a/scene/resources/skeleton_modification_stack_2d.cpp b/scene/resources/skeleton_modification_stack_2d.cpp index 068c756849..56234a8a14 100644 --- a/scene/resources/skeleton_modification_stack_2d.cpp +++ b/scene/resources/skeleton_modification_stack_2d.cpp @@ -182,11 +182,11 @@ void SkeletonModificationStack2D::delete_modification(int p_mod_idx) { void SkeletonModificationStack2D::set_modification(int p_mod_idx, Ref<SkeletonModification2D> p_mod) { ERR_FAIL_INDEX(p_mod_idx, modifications.size()); - if (p_mod == nullptr) { - modifications.insert(p_mod_idx, nullptr); + if (p_mod.is_null()) { + modifications.write[p_mod_idx] = Ref<SkeletonModification2D>(); } else { + modifications.write[p_mod_idx] = p_mod; p_mod->_setup_modification(this); - modifications.insert(p_mod_idx, p_mod); } #ifdef TOOLS_ENABLED diff --git a/scene/resources/skeleton_profile.cpp b/scene/resources/skeleton_profile.cpp index 1367ea86dd..61a0350440 100644 --- a/scene/resources/skeleton_profile.cpp +++ b/scene/resources/skeleton_profile.cpp @@ -566,7 +566,7 @@ SkeletonProfileHumanoid::SkeletonProfileHumanoid() { bones.write[14].bone_name = "LeftThumbMetacarpal"; bones.write[14].bone_parent = "LeftHand"; - bones.write[14].reference_pose = Transform3D(0, -0.577, 0.816, 0.707, 0.577, 0.408, -0.707, 0.577, 0.408, -0.025, 0, 0); + bones.write[14].reference_pose = Transform3D(0, -0.577, 0.816, 0, 0.816, 0.577, -1, 0, 0, -0.025, 0.025, 0); bones.write[14].handle_offset = Vector2(0.4, 0.8); bones.write[14].group = "LeftHand"; @@ -686,7 +686,7 @@ SkeletonProfileHumanoid::SkeletonProfileHumanoid() { bones.write[33].bone_name = "RightThumbMetacarpal"; bones.write[33].bone_parent = "RightHand"; - bones.write[33].reference_pose = Transform3D(0, 0.577, -0.816, -0.707, 0.577, 0.408, 0.707, 0.577, 0.408, 0.025, 0, 0); + bones.write[33].reference_pose = Transform3D(0, 0.577, -0.816, 0, 0.816, 0.577, 1, 0, 0, 0.025, 0.025, 0); bones.write[33].handle_offset = Vector2(0.6, 0.8); bones.write[33].group = "RightHand"; diff --git a/scene/resources/sky_material.cpp b/scene/resources/sky_material.cpp index fc999d5fcb..d21f04fab8 100644 --- a/scene/resources/sky_material.cpp +++ b/scene/resources/sky_material.cpp @@ -34,7 +34,7 @@ #include "core/version.h" Mutex ProceduralSkyMaterial::shader_mutex; -RID ProceduralSkyMaterial::shader; +RID ProceduralSkyMaterial::shader_cache[2]; void ProceduralSkyMaterial::set_sky_top_color(const Color &p_sky_top) { sky_top_color = p_sky_top; @@ -147,7 +147,11 @@ float ProceduralSkyMaterial::get_sun_curve() const { void ProceduralSkyMaterial::set_use_debanding(bool p_use_debanding) { use_debanding = p_use_debanding; - RS::get_singleton()->material_set_param(_get_material(), "use_debanding", use_debanding); + _update_shader(); + // Only set if shader already compiled + if (shader_set) { + RS::get_singleton()->material_set_shader(_get_material(), shader_cache[int(use_debanding)]); + } } bool ProceduralSkyMaterial::get_use_debanding() const { @@ -161,7 +165,8 @@ Shader::Mode ProceduralSkyMaterial::get_shader_mode() const { RID ProceduralSkyMaterial::get_rid() const { _update_shader(); if (!shader_set) { - RS::get_singleton()->material_set_shader(_get_material(), shader); + RS::get_singleton()->material_set_shader(_get_material(), shader_cache[1 - int(use_debanding)]); + RS::get_singleton()->material_set_shader(_get_material(), shader_cache[int(use_debanding)]); shader_set = true; } return _get_material(); @@ -169,7 +174,7 @@ RID ProceduralSkyMaterial::get_rid() const { RID ProceduralSkyMaterial::get_shader_rid() const { _update_shader(); - return shader; + return shader_cache[int(use_debanding)]; } void ProceduralSkyMaterial::_validate_property(PropertyInfo &p_property) const { @@ -241,21 +246,24 @@ void ProceduralSkyMaterial::_bind_methods() { } void ProceduralSkyMaterial::cleanup_shader() { - if (shader.is_valid()) { - RS::get_singleton()->free(shader); + if (shader_cache[0].is_valid()) { + RS::get_singleton()->free(shader_cache[0]); + RS::get_singleton()->free(shader_cache[1]); } } void ProceduralSkyMaterial::_update_shader() { shader_mutex.lock(); - if (shader.is_null()) { - shader = RS::get_singleton()->shader_create(); + if (shader_cache[0].is_null()) { + for (int i = 0; i < 2; i++) { + shader_cache[i] = RS::get_singleton()->shader_create(); - // Add a comment to describe the shader origin (useful when converting to ShaderMaterial). - RS::get_singleton()->shader_set_code(shader, R"( + // Add a comment to describe the shader origin (useful when converting to ShaderMaterial). + RS::get_singleton()->shader_set_code(shader_cache[i], vformat(R"( // NOTE: Shader automatically converted from )" VERSION_NAME " " VERSION_FULL_CONFIG R"('s ProceduralSkyMaterial. shader_type sky; +%s uniform vec4 sky_top_color : source_color = vec4(0.385, 0.454, 0.55, 1.0); uniform vec4 sky_horizon_color : source_color = vec4(0.646, 0.656, 0.67, 1.0); @@ -269,14 +277,6 @@ uniform float ground_curve : hint_range(0, 1) = 0.02; uniform float ground_energy = 1.0; uniform float sun_angle_max = 30.0; uniform float sun_curve : hint_range(0, 1) = 0.15; -uniform bool use_debanding = true; - -// https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare -vec3 interleaved_gradient_noise(vec2 pos) { - const vec3 magic = vec3(0.06711056f, 0.00583715f, 52.9829189f); - float res = fract(magic.z * fract(dot(pos, magic.xy))) * 2.0 - 1.0; - return vec3(res, -res, res) / 255.0; -} void sky() { float v_angle = acos(clamp(EYEDIR.y, -1.0, 1.0)); @@ -332,11 +332,10 @@ void sky() { ground *= ground_energy; COLOR = mix(ground, sky, step(0.0, EYEDIR.y)); - if (use_debanding) { - COLOR += interleaved_gradient_noise(FRAGCOORD.xy); - } } -)"); +)", + i ? "render_mode use_debanding;" : "")); + } } shader_mutex.unlock(); } @@ -546,7 +545,11 @@ float PhysicalSkyMaterial::get_energy_multiplier() const { void PhysicalSkyMaterial::set_use_debanding(bool p_use_debanding) { use_debanding = p_use_debanding; - RS::get_singleton()->material_set_param(_get_material(), "use_debanding", use_debanding); + _update_shader(); + // Only set if shader already compiled + if (shader_set) { + RS::get_singleton()->material_set_shader(_get_material(), shader_cache[int(use_debanding)]); + } } bool PhysicalSkyMaterial::get_use_debanding() const { @@ -570,7 +573,8 @@ Shader::Mode PhysicalSkyMaterial::get_shader_mode() const { RID PhysicalSkyMaterial::get_rid() const { _update_shader(); if (!shader_set) { - RS::get_singleton()->material_set_shader(_get_material(), shader); + RS::get_singleton()->material_set_shader(_get_material(), shader_cache[1 - int(use_debanding)]); + RS::get_singleton()->material_set_shader(_get_material(), shader_cache[int(use_debanding)]); shader_set = true; } return _get_material(); @@ -578,7 +582,7 @@ RID PhysicalSkyMaterial::get_rid() const { RID PhysicalSkyMaterial::get_shader_rid() const { _update_shader(); - return shader; + return shader_cache[int(use_debanding)]; } void PhysicalSkyMaterial::_validate_property(PropertyInfo &p_property) const { @@ -588,7 +592,7 @@ void PhysicalSkyMaterial::_validate_property(PropertyInfo &p_property) const { } Mutex PhysicalSkyMaterial::shader_mutex; -RID PhysicalSkyMaterial::shader; +RID PhysicalSkyMaterial::shader_cache[2]; void PhysicalSkyMaterial::_bind_methods() { ClassDB::bind_method(D_METHOD("set_rayleigh_coefficient", "rayleigh"), &PhysicalSkyMaterial::set_rayleigh_coefficient); @@ -642,21 +646,24 @@ void PhysicalSkyMaterial::_bind_methods() { } void PhysicalSkyMaterial::cleanup_shader() { - if (shader.is_valid()) { - RS::get_singleton()->free(shader); + if (shader_cache[0].is_valid()) { + RS::get_singleton()->free(shader_cache[0]); + RS::get_singleton()->free(shader_cache[1]); } } void PhysicalSkyMaterial::_update_shader() { shader_mutex.lock(); - if (shader.is_null()) { - shader = RS::get_singleton()->shader_create(); + if (shader_cache[0].is_null()) { + for (int i = 0; i < 2; i++) { + shader_cache[i] = RS::get_singleton()->shader_create(); - // Add a comment to describe the shader origin (useful when converting to ShaderMaterial). - RS::get_singleton()->shader_set_code(shader, R"( + // Add a comment to describe the shader origin (useful when converting to ShaderMaterial). + RS::get_singleton()->shader_set_code(shader_cache[i], vformat(R"( // NOTE: Shader automatically converted from )" VERSION_NAME " " VERSION_FULL_CONFIG R"('s PhysicalSkyMaterial. shader_type sky; +%s uniform float rayleigh : hint_range(0, 64) = 2.0; uniform vec4 rayleigh_color : source_color = vec4(0.3, 0.405, 0.6, 1.0); @@ -668,7 +675,6 @@ uniform float turbidity : hint_range(0, 1000) = 10.0; uniform float sun_disk_scale : hint_range(0, 360) = 1.0; uniform vec4 ground_color : source_color = vec4(0.1, 0.07, 0.034, 1.0); uniform float exposure : hint_range(0, 128) = 1.0; -uniform bool use_debanding = true; uniform sampler2D night_sky : source_color, hint_default_black; @@ -683,13 +689,6 @@ float henyey_greenstein(float cos_theta, float g) { return k * (1.0 - g * g) / (pow(1.0 + g * g - 2.0 * g * cos_theta, 1.5)); } -// https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare -vec3 interleaved_gradient_noise(vec2 pos) { - const vec3 magic = vec3(0.06711056f, 0.00583715f, 52.9829189f); - float res = fract(magic.z * fract(dot(pos, magic.xy))) * 2.0 - 1.0; - return vec3(res, -res, res) / 255.0; -} - void sky() { if (LIGHT0_ENABLED) { float zenith_angle = clamp( dot(UP, normalize(LIGHT0_DIRECTION)), -1.0, 1.0 ); @@ -737,16 +736,15 @@ void sky() { vec3 color = Lin + L0; COLOR = pow(color, vec3(1.0 / (1.2 + (1.2 * sun_fade)))); COLOR *= exposure; - if (use_debanding) { - COLOR += interleaved_gradient_noise(FRAGCOORD.xy); - } } else { // There is no sun, so display night_sky and nothing else. COLOR = texture(night_sky, SKY_COORDS).xyz; COLOR *= exposure; } } -)"); +)", + i ? "render_mode use_debanding;" : "")); + } } shader_mutex.unlock(); diff --git a/scene/resources/sky_material.h b/scene/resources/sky_material.h index b517fd806b..fbb202d8d8 100644 --- a/scene/resources/sky_material.h +++ b/scene/resources/sky_material.h @@ -55,7 +55,7 @@ private: bool use_debanding = true; static Mutex shader_mutex; - static RID shader; + static RID shader_cache[2]; static void _update_shader(); mutable bool shader_set = false; @@ -160,7 +160,7 @@ class PhysicalSkyMaterial : public Material { private: static Mutex shader_mutex; - static RID shader; + static RID shader_cache[2]; float rayleigh = 0.0f; Color rayleigh_color; diff --git a/scene/resources/texture.cpp b/scene/resources/texture.cpp index 979d87c028..d53dc1a8fc 100644 --- a/scene/resources/texture.cpp +++ b/scene/resources/texture.cpp @@ -2617,26 +2617,30 @@ void AnimatedTexture::_update_proxy() { time += delta; - float limit; - - if (fps == 0) { - limit = 0; - } else { - limit = 1.0 / fps; - } + float speed = speed_scale == 0 ? 0 : abs(1.0 / speed_scale); int iter_max = frame_count; while (iter_max && !pause) { - float frame_limit = limit + frames[current_frame].delay_sec; + float frame_limit = frames[current_frame].duration * speed; if (time > frame_limit) { - current_frame++; + if (speed_scale > 0.0) { + current_frame++; + } else { + current_frame--; + } if (current_frame >= frame_count) { if (one_shot) { current_frame = frame_count - 1; } else { current_frame = 0; } + } else if (current_frame < 0) { + if (one_shot) { + current_frame = 0; + } else { + current_frame = frame_count - 1; + } } time -= frame_limit; @@ -2710,30 +2714,30 @@ Ref<Texture2D> AnimatedTexture::get_frame_texture(int p_frame) const { return frames[p_frame].texture; } -void AnimatedTexture::set_frame_delay(int p_frame, float p_delay_sec) { +void AnimatedTexture::set_frame_duration(int p_frame, float p_duration) { ERR_FAIL_INDEX(p_frame, MAX_FRAMES); RWLockRead r(rw_lock); - frames[p_frame].delay_sec = p_delay_sec; + frames[p_frame].duration = p_duration; } -float AnimatedTexture::get_frame_delay(int p_frame) const { +float AnimatedTexture::get_frame_duration(int p_frame) const { ERR_FAIL_INDEX_V(p_frame, MAX_FRAMES, 0); RWLockRead r(rw_lock); - return frames[p_frame].delay_sec; + return frames[p_frame].duration; } -void AnimatedTexture::set_fps(float p_fps) { - ERR_FAIL_COND(p_fps < 0 || p_fps >= 1000); +void AnimatedTexture::set_speed_scale(float p_scale) { + ERR_FAIL_COND(p_scale < -1000 || p_scale >= 1000); - fps = p_fps; + speed_scale = p_scale; } -float AnimatedTexture::get_fps() const { - return fps; +float AnimatedTexture::get_speed_scale() const { + return speed_scale; } int AnimatedTexture::get_width() const { @@ -2812,24 +2816,24 @@ void AnimatedTexture::_bind_methods() { ClassDB::bind_method(D_METHOD("set_one_shot", "one_shot"), &AnimatedTexture::set_one_shot); ClassDB::bind_method(D_METHOD("get_one_shot"), &AnimatedTexture::get_one_shot); - ClassDB::bind_method(D_METHOD("set_fps", "fps"), &AnimatedTexture::set_fps); - ClassDB::bind_method(D_METHOD("get_fps"), &AnimatedTexture::get_fps); + ClassDB::bind_method(D_METHOD("set_speed_scale", "scale"), &AnimatedTexture::set_speed_scale); + ClassDB::bind_method(D_METHOD("get_speed_scale"), &AnimatedTexture::get_speed_scale); ClassDB::bind_method(D_METHOD("set_frame_texture", "frame", "texture"), &AnimatedTexture::set_frame_texture); ClassDB::bind_method(D_METHOD("get_frame_texture", "frame"), &AnimatedTexture::get_frame_texture); - ClassDB::bind_method(D_METHOD("set_frame_delay", "frame", "delay"), &AnimatedTexture::set_frame_delay); - ClassDB::bind_method(D_METHOD("get_frame_delay", "frame"), &AnimatedTexture::get_frame_delay); + ClassDB::bind_method(D_METHOD("set_frame_duration", "frame", "duration"), &AnimatedTexture::set_frame_duration); + ClassDB::bind_method(D_METHOD("get_frame_duration", "frame"), &AnimatedTexture::get_frame_duration); 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, "", PROPERTY_USAGE_NONE), "set_current_frame", "get_current_frame"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "pause"), "set_pause", "get_pause"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "one_shot"), "set_one_shot", "get_one_shot"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fps", PROPERTY_HINT_RANGE, "0,1024,0.1"), "set_fps", "get_fps"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "speed_scale", PROPERTY_HINT_RANGE, "-60,60,0.1,or_greater,or_lesser"), "set_speed_scale", "get_speed_scale"); for (int i = 0; i < MAX_FRAMES; i++) { ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "frame_" + itos(i) + "/texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "set_frame_texture", "get_frame_texture", i); - ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "frame_" + itos(i) + "/delay_sec", PROPERTY_HINT_RANGE, "0.0,16.0,0.01,suffix:s", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "set_frame_delay", "get_frame_delay", i); + ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "frame_" + itos(i) + "/duration", PROPERTY_HINT_RANGE, "0.0,16.0,0.01,or_greater,suffix:s", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "set_frame_duration", "get_frame_duration", i); } BIND_CONSTANT(MAX_FRAMES); diff --git a/scene/resources/texture.h b/scene/resources/texture.h index 1ce3b27065..da4b8046a5 100644 --- a/scene/resources/texture.h +++ b/scene/resources/texture.h @@ -922,7 +922,7 @@ private: struct Frame { Ref<Texture2D> texture; - float delay_sec = 0.0; + float duration = 1.0; }; Frame frames[MAX_FRAMES]; @@ -930,7 +930,7 @@ private: int current_frame = 0; bool pause = false; bool one_shot = false; - float fps = 4.0; + float speed_scale = 1.0; float time = 0.0; @@ -958,11 +958,11 @@ public: void set_frame_texture(int p_frame, const Ref<Texture2D> &p_texture); Ref<Texture2D> get_frame_texture(int p_frame) const; - void set_frame_delay(int p_frame, float p_delay_sec); - float get_frame_delay(int p_frame) const; + void set_frame_duration(int p_frame, float p_duration); + float get_frame_duration(int p_frame) const; - void set_fps(float p_fps); - float get_fps() const; + void set_speed_scale(float p_scale); + float get_speed_scale() const; virtual int get_width() const override; virtual int get_height() const override; diff --git a/servers/display_server.cpp b/servers/display_server.cpp index dda8e29b6a..e1a1c71420 100644 --- a/servers/display_server.cpp +++ b/servers/display_server.cpp @@ -678,6 +678,7 @@ void DisplayServer::_bind_methods() { ClassDB::bind_method(D_METHOD("window_set_flag", "flag", "enabled", "window_id"), &DisplayServer::window_set_flag, DEFVAL(MAIN_WINDOW_ID)); ClassDB::bind_method(D_METHOD("window_get_flag", "flag", "window_id"), &DisplayServer::window_get_flag, DEFVAL(MAIN_WINDOW_ID)); + ClassDB::bind_method(D_METHOD("window_set_window_buttons_offset", "offset", "window_id"), &DisplayServer::window_set_window_buttons_offset, DEFVAL(MAIN_WINDOW_ID)); ClassDB::bind_method(D_METHOD("window_get_safe_title_margins", "window_id"), &DisplayServer::window_get_safe_title_margins, DEFVAL(MAIN_WINDOW_ID)); ClassDB::bind_method(D_METHOD("window_request_attention", "window_id"), &DisplayServer::window_request_attention, DEFVAL(MAIN_WINDOW_ID)); diff --git a/servers/display_server.h b/servers/display_server.h index ab4f9fc499..42c254cd2f 100644 --- a/servers/display_server.h +++ b/servers/display_server.h @@ -380,7 +380,8 @@ public: virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) = 0; virtual void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) = 0; - virtual Vector2i window_get_safe_title_margins(WindowID p_window = MAIN_WINDOW_ID) const { return Vector2i(); }; + virtual void window_set_window_buttons_offset(const Vector2i &p_offset, WindowID p_window = MAIN_WINDOW_ID) {} + virtual Vector2i window_get_safe_title_margins(WindowID p_window = MAIN_WINDOW_ID) const { return Vector2i(); } virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const = 0; diff --git a/servers/extensions/physics_server_2d_extension.cpp b/servers/extensions/physics_server_2d_extension.cpp index c56f31e6f9..769315daa7 100644 --- a/servers/extensions/physics_server_2d_extension.cpp +++ b/servers/extensions/physics_server_2d_extension.cpp @@ -123,6 +123,8 @@ bool PhysicsServer2DExtension::body_test_motion_is_excluding_object(ObjectID p_o } void PhysicsServer2DExtension::_bind_methods() { + /* SHAPE API */ + GDVIRTUAL_BIND(_world_boundary_shape_create); GDVIRTUAL_BIND(_separation_ray_shape_create); GDVIRTUAL_BIND(_segment_shape_create); @@ -133,18 +135,32 @@ void PhysicsServer2DExtension::_bind_methods() { GDVIRTUAL_BIND(_concave_polygon_shape_create); GDVIRTUAL_BIND(_shape_set_data, "shape", "data"); + GDVIRTUAL_BIND(_shape_set_custom_solver_bias, "shape", "bias"); GDVIRTUAL_BIND(_shape_get_type, "shape"); GDVIRTUAL_BIND(_shape_get_data, "shape"); + GDVIRTUAL_BIND(_shape_get_custom_solver_bias, "shape"); + GDVIRTUAL_BIND(_shape_collide, "shape_A", "xform_A", "motion_A", "shape_B", "xform_B", "motion_B", "results", "result_max", "result_count"); + + /* SPACE API */ GDVIRTUAL_BIND(_space_create); GDVIRTUAL_BIND(_space_set_active, "space", "active"); GDVIRTUAL_BIND(_space_is_active, "space"); + GDVIRTUAL_BIND(_space_set_param, "space", "param", "value"); GDVIRTUAL_BIND(_space_get_param, "space", "param"); + GDVIRTUAL_BIND(_space_get_direct_state, "space"); + GDVIRTUAL_BIND(_space_set_debug_contacts, "space", "max_contacts"); + GDVIRTUAL_BIND(_space_get_contacts, "space"); + GDVIRTUAL_BIND(_space_get_contact_count, "space"); + + /* AREA API */ + GDVIRTUAL_BIND(_area_create); + GDVIRTUAL_BIND(_area_set_space, "area", "space"); GDVIRTUAL_BIND(_area_get_space, "area"); @@ -160,8 +176,11 @@ void PhysicsServer2DExtension::_bind_methods() { GDVIRTUAL_BIND(_area_remove_shape, "area", "shape_idx"); GDVIRTUAL_BIND(_area_clear_shapes, "area"); - GDVIRTUAL_BIND(_area_set_collision_layer, "area", "layer"); - GDVIRTUAL_BIND(_area_set_collision_mask, "area", "mask"); + GDVIRTUAL_BIND(_area_attach_object_instance_id, "area", "id"); + GDVIRTUAL_BIND(_area_get_object_instance_id, "area"); + + GDVIRTUAL_BIND(_area_attach_canvas_instance_id, "area", "id"); + GDVIRTUAL_BIND(_area_get_canvas_instance_id, "area"); GDVIRTUAL_BIND(_area_set_param, "area", "param", "value"); GDVIRTUAL_BIND(_area_set_transform, "area", "transform"); @@ -169,15 +188,16 @@ void PhysicsServer2DExtension::_bind_methods() { GDVIRTUAL_BIND(_area_get_param, "area", "param"); GDVIRTUAL_BIND(_area_get_transform, "area"); - GDVIRTUAL_BIND(_area_attach_object_instance_id, "area", "id"); - GDVIRTUAL_BIND(_area_get_object_instance_id, "area"); + GDVIRTUAL_BIND(_area_set_collision_layer, "area", "layer"); + GDVIRTUAL_BIND(_area_set_collision_mask, "area", "mask"); - GDVIRTUAL_BIND(_area_attach_canvas_instance_id, "area", "id"); - GDVIRTUAL_BIND(_area_get_canvas_instance_id, "area"); + GDVIRTUAL_BIND(_area_set_monitorable, "area", "monitorable"); + GDVIRTUAL_BIND(_area_set_pickable, "area", "pickable"); GDVIRTUAL_BIND(_area_set_monitor_callback, "area", "callback"); GDVIRTUAL_BIND(_area_set_area_monitor_callback, "area", "callback"); - GDVIRTUAL_BIND(_area_set_monitorable, "area", "monitorable"); + + /* BODY API */ GDVIRTUAL_BIND(_body_create); @@ -195,12 +215,12 @@ void PhysicsServer2DExtension::_bind_methods() { GDVIRTUAL_BIND(_body_get_shape, "body", "shape_idx"); GDVIRTUAL_BIND(_body_get_shape_transform, "body", "shape_idx"); - GDVIRTUAL_BIND(_body_remove_shape, "body", "shape_idx"); - GDVIRTUAL_BIND(_body_clear_shapes, "body"); - GDVIRTUAL_BIND(_body_set_shape_disabled, "body", "shape_idx", "disabled"); GDVIRTUAL_BIND(_body_set_shape_as_one_way_collision, "body", "shape_idx", "enable", "margin"); + GDVIRTUAL_BIND(_body_remove_shape, "body", "shape_idx"); + GDVIRTUAL_BIND(_body_clear_shapes, "body"); + GDVIRTUAL_BIND(_body_attach_object_instance_id, "body", "id"); GDVIRTUAL_BIND(_body_get_object_instance_id, "body"); @@ -249,25 +269,39 @@ void PhysicsServer2DExtension::_bind_methods() { GDVIRTUAL_BIND(_body_add_collision_exception, "body", "excepted_body"); GDVIRTUAL_BIND(_body_remove_collision_exception, "body", "excepted_body"); + GDVIRTUAL_BIND(_body_get_collision_exceptions, "body"); GDVIRTUAL_BIND(_body_set_max_contacts_reported, "body", "amount"); GDVIRTUAL_BIND(_body_get_max_contacts_reported, "body"); + GDVIRTUAL_BIND(_body_set_contacts_reported_depth_threshold, "body", "threshold"); + GDVIRTUAL_BIND(_body_get_contacts_reported_depth_threshold, "body"); + GDVIRTUAL_BIND(_body_set_omit_force_integration, "body", "enable"); GDVIRTUAL_BIND(_body_is_omitting_force_integration, "body"); + GDVIRTUAL_BIND(_body_set_state_sync_callback, "body", "callable"); GDVIRTUAL_BIND(_body_set_force_integration_callback, "body", "callable", "userdata"); - GDVIRTUAL_BIND(_body_test_motion, "body", "from", "motion", "margin", "collide_separation_ray", "recovery_as_collision", "result"); + GDVIRTUAL_BIND(_body_collide_shape, "body", "body_shape", "shape", "shape_xform", "motion", "results", "result_max", "result_count"); + + GDVIRTUAL_BIND(_body_set_pickable, "body", "pickable"); GDVIRTUAL_BIND(_body_get_direct_state, "body"); + GDVIRTUAL_BIND(_body_test_motion, "body", "from", "motion", "margin", "collide_separation_ray", "recovery_as_collision", "result"); + + /* JOINT API */ + GDVIRTUAL_BIND(_joint_create); GDVIRTUAL_BIND(_joint_clear, "joint"); GDVIRTUAL_BIND(_joint_set_param, "joint", "param", "value"); GDVIRTUAL_BIND(_joint_get_param, "joint", "param"); + GDVIRTUAL_BIND(_joint_disable_collisions_between_bodies, "joint", "disable"); + GDVIRTUAL_BIND(_joint_is_disabled_collisions_between_bodies, "joint"); + GDVIRTUAL_BIND(_joint_make_pin, "joint", "anchor", "body_a", "body_b"); GDVIRTUAL_BIND(_joint_make_groove, "joint", "a_groove1", "a_groove2", "b_anchor", "body_a", "body_b"); GDVIRTUAL_BIND(_joint_make_damped_spring, "joint", "anchor_a", "anchor_b", "body_a", "body_b"); @@ -280,6 +314,8 @@ void PhysicsServer2DExtension::_bind_methods() { GDVIRTUAL_BIND(_joint_get_type, "joint"); + /* MISC */ + GDVIRTUAL_BIND(_free_rid, "rid"); GDVIRTUAL_BIND(_set_active, "active"); diff --git a/servers/extensions/physics_server_2d_extension.h b/servers/extensions/physics_server_2d_extension.h index 4c83664b14..a6dbe35264 100644 --- a/servers/extensions/physics_server_2d_extension.h +++ b/servers/extensions/physics_server_2d_extension.h @@ -94,7 +94,6 @@ public: EXBIND1RC(Vector2, get_contact_local_position, int) EXBIND1RC(Vector2, get_contact_local_normal, int) EXBIND1RC(int, get_contact_local_shape, int) - EXBIND1RC(RID, get_contact_collider, int) EXBIND1RC(Vector2, get_contact_collider_position, int) EXBIND1RC(ObjectID, get_contact_collider_id, int) @@ -183,13 +182,7 @@ public: typedef PhysicsServer2D::MotionResult PhysicsServer2DExtensionMotionResult; -struct PhysicsServer2DExtensionStateCallback { - void *instance = nullptr; - void (*callback)(void *p_instance, PhysicsDirectBodyState2D *p_state); -}; - GDVIRTUAL_NATIVE_PTR(PhysicsServer2DExtensionMotionResult) -GDVIRTUAL_NATIVE_PTR(PhysicsServer2DExtensionStateCallback) class PhysicsServer2DExtension : public PhysicsServer2D { GDCLASS(PhysicsServer2DExtension, PhysicsServer2D); @@ -204,6 +197,8 @@ protected: public: // The warning is valid, but unavoidable. If the function is not overridden it will error anyway. + /* SHAPE API */ + EXBIND0R(RID, world_boundary_shape_create) EXBIND0R(RID, separation_ray_shape_create) EXBIND0R(RID, segment_shape_create) @@ -252,6 +247,7 @@ public: EXBIND4(area_add_shape, RID, RID, const Transform2D &, bool) EXBIND3(area_set_shape, RID, int, RID) EXBIND3(area_set_shape_transform, RID, int, const Transform2D &) + EXBIND3(area_set_shape_disabled, RID, int, bool) EXBIND1RC(int, area_get_shape_count, RID) EXBIND2RC(RID, area_get_shape, RID, int) @@ -260,8 +256,6 @@ public: EXBIND2(area_remove_shape, RID, int) EXBIND1(area_clear_shapes, RID) - EXBIND3(area_set_shape_disabled, RID, int, bool) - EXBIND2(area_attach_object_instance_id, RID, ObjectID) EXBIND1RC(ObjectID, area_get_object_instance_id, RID) @@ -375,13 +369,7 @@ public: EXBIND2(body_set_omit_force_integration, RID, bool) EXBIND1RC(bool, body_is_omitting_force_integration, RID) - GDVIRTUAL2(_body_set_state_sync_callback, RID, GDNativePtr<PhysicsServer2DExtensionStateCallback>) - void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) override { - PhysicsServer2DExtensionStateCallback callback; - callback.callback = p_callback; - callback.instance = p_instance; - GDVIRTUAL_REQUIRED_CALL(_body_set_state_sync_callback, p_body, &callback); - } + EXBIND2(body_set_state_sync_callback, RID, const Callable &) EXBIND3(body_set_force_integration_callback, RID, const Callable &, const Variant &) virtual bool body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count) override { @@ -415,7 +403,6 @@ public: /* JOINT API */ EXBIND0R(RID, joint_create) - EXBIND1(joint_clear, RID) EXBIND3(joint_set_param, RID, JointParam, real_t) diff --git a/servers/extensions/physics_server_3d_extension.cpp b/servers/extensions/physics_server_3d_extension.cpp index 6ed5dca968..4785fa33fb 100644 --- a/servers/extensions/physics_server_3d_extension.cpp +++ b/servers/extensions/physics_server_3d_extension.cpp @@ -125,6 +125,8 @@ bool PhysicsServer3DExtension::body_test_motion_is_excluding_object(ObjectID p_o } void PhysicsServer3DExtension::_bind_methods() { + /* SHAPE API */ + GDVIRTUAL_BIND(_world_boundary_shape_create); GDVIRTUAL_BIND(_separation_ray_shape_create); GDVIRTUAL_BIND(_sphere_shape_create); @@ -137,18 +139,34 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_custom_shape_create); GDVIRTUAL_BIND(_shape_set_data, "shape", "data"); + GDVIRTUAL_BIND(_shape_set_custom_solver_bias, "shape", "bias"); + + GDVIRTUAL_BIND(_shape_set_margin, "shape", "margin"); + GDVIRTUAL_BIND(_shape_get_margin, "shape"); GDVIRTUAL_BIND(_shape_get_type, "shape"); GDVIRTUAL_BIND(_shape_get_data, "shape"); + GDVIRTUAL_BIND(_shape_get_custom_solver_bias, "shape"); + + /* SPACE API */ GDVIRTUAL_BIND(_space_create); GDVIRTUAL_BIND(_space_set_active, "space", "active"); GDVIRTUAL_BIND(_space_is_active, "space"); + GDVIRTUAL_BIND(_space_set_param, "space", "param", "value"); GDVIRTUAL_BIND(_space_get_param, "space", "param"); + GDVIRTUAL_BIND(_space_get_direct_state, "space"); + GDVIRTUAL_BIND(_space_set_debug_contacts, "space", "max_contacts"); + GDVIRTUAL_BIND(_space_get_contacts, "space"); + GDVIRTUAL_BIND(_space_get_contact_count, "space"); + + /* AREA API */ + GDVIRTUAL_BIND(_area_create); + GDVIRTUAL_BIND(_area_set_space, "area", "space"); GDVIRTUAL_BIND(_area_get_space, "area"); @@ -164,8 +182,8 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_area_remove_shape, "area", "shape_idx"); GDVIRTUAL_BIND(_area_clear_shapes, "area"); - GDVIRTUAL_BIND(_area_set_collision_layer, "area", "layer"); - GDVIRTUAL_BIND(_area_set_collision_mask, "area", "mask"); + GDVIRTUAL_BIND(_area_attach_object_instance_id, "area", "id"); + GDVIRTUAL_BIND(_area_get_object_instance_id, "area"); GDVIRTUAL_BIND(_area_set_param, "area", "param", "value"); GDVIRTUAL_BIND(_area_set_transform, "area", "transform"); @@ -173,14 +191,16 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_area_get_param, "area", "param"); GDVIRTUAL_BIND(_area_get_transform, "area"); - GDVIRTUAL_BIND(_area_attach_object_instance_id, "area", "id"); - GDVIRTUAL_BIND(_area_get_object_instance_id, "area"); + GDVIRTUAL_BIND(_area_set_collision_layer, "area", "layer"); + GDVIRTUAL_BIND(_area_set_collision_mask, "area", "mask"); + + GDVIRTUAL_BIND(_area_set_monitorable, "area", "monitorable"); + GDVIRTUAL_BIND(_area_set_ray_pickable, "area", "enable"); GDVIRTUAL_BIND(_area_set_monitor_callback, "area", "callback"); GDVIRTUAL_BIND(_area_set_area_monitor_callback, "area", "callback"); - GDVIRTUAL_BIND(_area_set_monitorable, "area", "monitorable"); - GDVIRTUAL_BIND(_area_set_ray_pickable, "area", "enable"); + /* BODY API */ GDVIRTUAL_BIND(_body_create); @@ -190,15 +210,6 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_body_set_mode, "body", "mode"); GDVIRTUAL_BIND(_body_get_mode, "body"); - GDVIRTUAL_BIND(_body_set_collision_layer, "body", "layer"); - GDVIRTUAL_BIND(_body_get_collision_layer, "body"); - - GDVIRTUAL_BIND(_body_set_collision_mask, "body", "mask"); - GDVIRTUAL_BIND(_body_get_collision_mask, "body"); - - GDVIRTUAL_BIND(_body_set_collision_priority, "body", "priority"); - GDVIRTUAL_BIND(_body_get_collision_priority, "body"); - GDVIRTUAL_BIND(_body_add_shape, "body", "shape", "transform", "disabled"); GDVIRTUAL_BIND(_body_set_shape, "body", "shape_idx", "shape"); GDVIRTUAL_BIND(_body_set_shape_transform, "body", "shape_idx", "transform"); @@ -217,6 +228,18 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_body_set_enable_continuous_collision_detection, "body", "enable"); GDVIRTUAL_BIND(_body_is_continuous_collision_detection_enabled, "body"); + GDVIRTUAL_BIND(_body_set_collision_layer, "body", "layer"); + GDVIRTUAL_BIND(_body_get_collision_layer, "body"); + + GDVIRTUAL_BIND(_body_set_collision_mask, "body", "mask"); + GDVIRTUAL_BIND(_body_get_collision_mask, "body"); + + GDVIRTUAL_BIND(_body_set_collision_priority, "body", "priority"); + GDVIRTUAL_BIND(_body_get_collision_priority, "body"); + + GDVIRTUAL_BIND(_body_set_user_flags, "body", "flags"); + GDVIRTUAL_BIND(_body_get_user_flags, "body"); + GDVIRTUAL_BIND(_body_set_param, "body", "param", "value"); GDVIRTUAL_BIND(_body_get_param, "body", "param"); @@ -250,13 +273,18 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_body_add_collision_exception, "body", "excepted_body"); GDVIRTUAL_BIND(_body_remove_collision_exception, "body", "excepted_body"); + GDVIRTUAL_BIND(_body_get_collision_exceptions, "body"); GDVIRTUAL_BIND(_body_set_max_contacts_reported, "body", "amount"); GDVIRTUAL_BIND(_body_get_max_contacts_reported, "body"); + GDVIRTUAL_BIND(_body_set_contacts_reported_depth_threshold, "body", "threshold"); + GDVIRTUAL_BIND(_body_get_contacts_reported_depth_threshold, "body"); + GDVIRTUAL_BIND(_body_set_omit_force_integration, "body", "enable"); GDVIRTUAL_BIND(_body_is_omitting_force_integration, "body"); + GDVIRTUAL_BIND(_body_set_state_sync_callback, "body", "callable"); GDVIRTUAL_BIND(_body_set_force_integration_callback, "body", "callable", "userdata"); GDVIRTUAL_BIND(_body_set_ray_pickable, "body", "enable"); @@ -265,12 +293,68 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_body_get_direct_state, "body"); + /* SOFT BODY API */ + + GDVIRTUAL_BIND(_soft_body_create); + + GDVIRTUAL_BIND(_soft_body_update_rendering_server, "body", "rendering_server_handler"); + + GDVIRTUAL_BIND(_soft_body_set_space, "body", "space"); + GDVIRTUAL_BIND(_soft_body_get_space, "body"); + + GDVIRTUAL_BIND(_soft_body_set_ray_pickable, "body", "enable"); + + GDVIRTUAL_BIND(_soft_body_set_collision_layer, "body", "layer"); + GDVIRTUAL_BIND(_soft_body_get_collision_layer, "body"); + + GDVIRTUAL_BIND(_soft_body_set_collision_mask, "body", "mask"); + GDVIRTUAL_BIND(_soft_body_get_collision_mask, "body"); + + GDVIRTUAL_BIND(_soft_body_add_collision_exception, "body", "body_b"); + GDVIRTUAL_BIND(_soft_body_remove_collision_exception, "body", "body_b"); + GDVIRTUAL_BIND(_soft_body_get_collision_exceptions, "body"); + + GDVIRTUAL_BIND(_soft_body_set_state, "body", "state", "variant"); + GDVIRTUAL_BIND(_soft_body_get_state, "body", "state"); + + GDVIRTUAL_BIND(_soft_body_set_transform, "body", "transform"); + + GDVIRTUAL_BIND(_soft_body_set_simulation_precision, "body", "simulation_precision"); + GDVIRTUAL_BIND(_soft_body_get_simulation_precision, "body"); + + GDVIRTUAL_BIND(_soft_body_set_total_mass, "body", "total_mass"); + GDVIRTUAL_BIND(_soft_body_get_total_mass, "body"); + + GDVIRTUAL_BIND(_soft_body_set_linear_stiffness, "body", "linear_stiffness"); + GDVIRTUAL_BIND(_soft_body_get_linear_stiffness, "body"); + + GDVIRTUAL_BIND(_soft_body_set_pressure_coefficient, "body", "pressure_coefficient"); + GDVIRTUAL_BIND(_soft_body_get_pressure_coefficient, "body"); + + GDVIRTUAL_BIND(_soft_body_set_damping_coefficient, "body", "damping_coefficient"); + GDVIRTUAL_BIND(_soft_body_get_damping_coefficient, "body"); + + GDVIRTUAL_BIND(_soft_body_set_drag_coefficient, "body", "drag_coefficient"); + GDVIRTUAL_BIND(_soft_body_get_drag_coefficient, "body"); + + GDVIRTUAL_BIND(_soft_body_set_mesh, "body", "mesh"); + GDVIRTUAL_BIND(_soft_body_get_bounds, "body"); + GDVIRTUAL_BIND(_soft_body_move_point, "body", "point_index", "global_position"); + GDVIRTUAL_BIND(_soft_body_get_point_global_position, "body", "point_index"); + + GDVIRTUAL_BIND(_soft_body_remove_all_pinned_points, "body"); + GDVIRTUAL_BIND(_soft_body_pin_point, "body", "point_index", "pin"); + GDVIRTUAL_BIND(_soft_body_is_point_pinned, "body", "point_index"); + + /* JOINT API */ + GDVIRTUAL_BIND(_joint_create); GDVIRTUAL_BIND(_joint_clear, "joint"); GDVIRTUAL_BIND(_joint_make_pin, "joint", "body_A", "local_A", "body_B", "local_B"); + GDVIRTUAL_BIND(_pin_joint_set_param, "joint", "param", "value"); GDVIRTUAL_BIND(_pin_joint_get_param, "joint", "param"); @@ -281,6 +365,7 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_pin_joint_get_local_b, "joint"); GDVIRTUAL_BIND(_joint_make_hinge, "joint", "body_A", "hinge_A", "body_B", "hinge_B"); + GDVIRTUAL_BIND(_joint_make_hinge_simple, "joint", "body_A", "pivot_A", "axis_A", "body_B", "pivot_B", "axis_B"); GDVIRTUAL_BIND(_hinge_joint_set_param, "joint", "param", "value"); GDVIRTUAL_BIND(_hinge_joint_get_param, "joint", "param"); @@ -298,11 +383,6 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_cone_twist_joint_set_param, "joint", "param", "value"); GDVIRTUAL_BIND(_cone_twist_joint_get_param, "joint", "param"); - GDVIRTUAL_BIND(_joint_get_type, "joint"); - - GDVIRTUAL_BIND(_joint_set_solver_priority, "joint", "priority"); - GDVIRTUAL_BIND(_joint_get_solver_priority, "joint"); - GDVIRTUAL_BIND(_joint_make_generic_6dof, "joint", "body_A", "local_ref_A", "body_B", "local_ref_B"); GDVIRTUAL_BIND(_generic_6dof_joint_set_param, "joint", "axis", "param", "value"); @@ -311,6 +391,11 @@ void PhysicsServer3DExtension::_bind_methods() { GDVIRTUAL_BIND(_generic_6dof_joint_set_flag, "joint", "axis", "flag", "enable"); GDVIRTUAL_BIND(_generic_6dof_joint_get_flag, "joint", "axis", "flag"); + GDVIRTUAL_BIND(_joint_get_type, "joint"); + + GDVIRTUAL_BIND(_joint_set_solver_priority, "joint", "priority"); + GDVIRTUAL_BIND(_joint_get_solver_priority, "joint"); + GDVIRTUAL_BIND(_free_rid, "rid"); GDVIRTUAL_BIND(_set_active, "active"); diff --git a/servers/extensions/physics_server_3d_extension.h b/servers/extensions/physics_server_3d_extension.h index c84582bf31..f1e522aca8 100644 --- a/servers/extensions/physics_server_3d_extension.h +++ b/servers/extensions/physics_server_3d_extension.h @@ -192,14 +192,8 @@ public: typedef PhysicsServer3D::MotionCollision PhysicsServer3DExtensionMotionCollision; typedef PhysicsServer3D::MotionResult PhysicsServer3DExtensionMotionResult; -struct PhysicsServer3DExtensionStateCallback { - void *instance = nullptr; - void (*callback)(void *p_instance, PhysicsDirectBodyState3D *p_state); -}; - GDVIRTUAL_NATIVE_PTR(PhysicsServer3DExtensionMotionCollision) GDVIRTUAL_NATIVE_PTR(PhysicsServer3DExtensionMotionResult) -GDVIRTUAL_NATIVE_PTR(PhysicsServer3DExtensionStateCallback) class PhysicsServer3DExtension : public PhysicsServer3D { GDCLASS(PhysicsServer3DExtension, PhysicsServer3D); @@ -210,6 +204,8 @@ protected: public: // The warning is valid, but unavoidable. If the function is not overridden it will error anyway. + /* SHAPE API */ + EXBIND0R(RID, world_boundary_shape_create) EXBIND0R(RID, separation_ray_shape_create) EXBIND0R(RID, sphere_shape_create) @@ -262,6 +258,7 @@ public: EXBIND1RC(int, area_get_shape_count, RID) EXBIND2RC(RID, area_get_shape, RID, int) EXBIND2RC(Transform3D, area_get_shape_transform, RID, int) + EXBIND2(area_remove_shape, RID, int) EXBIND1(area_clear_shapes, RID) @@ -297,12 +294,11 @@ public: EXBIND4(body_add_shape, RID, RID, const Transform3D &, bool) EXBIND3(body_set_shape, RID, int, RID) EXBIND3(body_set_shape_transform, RID, int, const Transform3D &) + EXBIND3(body_set_shape_disabled, RID, int, bool) EXBIND1RC(int, body_get_shape_count, RID) - EXBIND2RC(Transform3D, body_get_shape_transform, RID, int) EXBIND2RC(RID, body_get_shape, RID, int) - - EXBIND3(body_set_shape_disabled, RID, int, bool) + EXBIND2RC(Transform3D, body_get_shape_transform, RID, int) EXBIND2(body_remove_shape, RID, int) EXBIND1(body_clear_shapes, RID) @@ -333,9 +329,9 @@ public: EXBIND3(body_set_state, RID, BodyState, const Variant &) EXBIND2RC(Variant, body_get_state, RID, BodyState) - EXBIND2(body_apply_torque_impulse, RID, const Vector3 &) EXBIND2(body_apply_central_impulse, RID, const Vector3 &) EXBIND3(body_apply_impulse, RID, const Vector3 &, const Vector3 &) + EXBIND2(body_apply_torque_impulse, RID, const Vector3 &) EXBIND2(body_apply_central_force, RID, const Vector3 &) EXBIND3(body_apply_force, RID, const Vector3 &, const Vector3 &) @@ -378,13 +374,7 @@ public: EXBIND2(body_set_omit_force_integration, RID, bool) EXBIND1RC(bool, body_is_omitting_force_integration, RID) - GDVIRTUAL2(_body_set_state_sync_callback, RID, GDNativePtr<PhysicsServer3DExtensionStateCallback>) - void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) override { - PhysicsServer3DExtensionStateCallback callback; - callback.callback = p_callback; - callback.instance = p_instance; - GDVIRTUAL_REQUIRED_CALL(_body_set_state_sync_callback, p_body, &callback); - } + EXBIND2(body_set_state_sync_callback, RID, const Callable &) EXBIND3(body_set_force_integration_callback, RID, const Callable &, const Variant &) EXBIND2(body_set_ray_pickable, RID, bool) @@ -476,7 +466,6 @@ public: /* JOINT API */ EXBIND0R(RID, joint_create) - EXBIND1(joint_clear, RID) EXBIND5(joint_make_pin, RID, RID, const Vector3 &, RID, const Vector3 &) diff --git a/servers/physics_2d/godot_body_2d.cpp b/servers/physics_2d/godot_body_2d.cpp index ef6a6b1ae2..90124cd991 100644 --- a/servers/physics_2d/godot_body_2d.cpp +++ b/servers/physics_2d/godot_body_2d.cpp @@ -615,7 +615,7 @@ void GodotBody2D::integrate_velocities(real_t p_step) { return; } - if (fi_callback_data || body_state_callback) { + if (fi_callback_data || body_state_callback.get_object()) { get_space()->body_add_to_state_query_list(&direct_state_query_list); } @@ -673,11 +673,12 @@ void GodotBody2D::wakeup_neighbours() { } void GodotBody2D::call_queries() { + Variant direct_state_variant = get_direct_state(); + if (fi_callback_data) { if (!fi_callback_data->callable.get_object()) { set_force_integration_callback(Callable()); } else { - Variant direct_state_variant = get_direct_state(); const Variant *vp[2] = { &direct_state_variant, &fi_callback_data->udata }; Callable::CallError ce; @@ -691,8 +692,11 @@ void GodotBody2D::call_queries() { } } - if (body_state_callback) { - (body_state_callback)(body_state_callback_instance, get_direct_state()); + if (body_state_callback.get_object()) { + const Variant *vp[1] = { &direct_state_variant }; + Callable::CallError ce; + Variant rv; + body_state_callback.callp(vp, 1, rv, ce); } } @@ -713,9 +717,8 @@ bool GodotBody2D::sleep_test(real_t p_step) { } } -void GodotBody2D::set_state_sync_callback(void *p_instance, PhysicsServer2D::BodyStateCallback p_callback) { - body_state_callback_instance = p_instance; - body_state_callback = p_callback; +void GodotBody2D::set_state_sync_callback(const Callable &p_callable) { + body_state_callback = p_callable; } void GodotBody2D::set_force_integration_callback(const Callable &p_callable, const Variant &p_udata) { diff --git a/servers/physics_2d/godot_body_2d.h b/servers/physics_2d/godot_body_2d.h index 409940d4f8..86d42ae7f8 100644 --- a/servers/physics_2d/godot_body_2d.h +++ b/servers/physics_2d/godot_body_2d.h @@ -137,8 +137,7 @@ class GodotBody2D : public GodotCollisionObject2D { Vector<Contact> contacts; //no contacts by default int contact_count = 0; - void *body_state_callback_instance = nullptr; - PhysicsServer2D::BodyStateCallback body_state_callback = nullptr; + Callable body_state_callback; struct ForceIntegrationCallbackData { Callable callable; @@ -156,7 +155,7 @@ class GodotBody2D : public GodotCollisionObject2D { friend class GodotPhysicsDirectBodyState2D; // i give up, too many functions to expose public: - void set_state_sync_callback(void *p_instance, PhysicsServer2D::BodyStateCallback p_callback); + void set_state_sync_callback(const Callable &p_callable); void set_force_integration_callback(const Callable &p_callable, const Variant &p_udata = Variant()); GodotPhysicsDirectBodyState2D *get_direct_state(); diff --git a/servers/physics_2d/godot_collision_solver_2d.cpp b/servers/physics_2d/godot_collision_solver_2d.cpp index 0d7b42b80d..52237539c0 100644 --- a/servers/physics_2d/godot_collision_solver_2d.cpp +++ b/servers/physics_2d/godot_collision_solver_2d.cpp @@ -34,7 +34,7 @@ #define collision_solver sat_2d_calculate_penetration //#define collision_solver gjk_epa_calculate_penetration -bool GodotCollisionSolver2D::solve_static_world_boundary(const GodotShape2D *p_shape_A, const Transform2D &p_transform_A, const GodotShape2D *p_shape_B, const Transform2D &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result) { +bool GodotCollisionSolver2D::solve_static_world_boundary(const GodotShape2D *p_shape_A, const Transform2D &p_transform_A, const GodotShape2D *p_shape_B, const Transform2D &p_transform_B, const Vector2 &p_motion_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, real_t p_margin) { const GodotWorldBoundaryShape2D *world_boundary = static_cast<const GodotWorldBoundaryShape2D *>(p_shape_A); if (p_shape_B->get_type() == PhysicsServer2D::SHAPE_WORLD_BOUNDARY) { return false; @@ -52,7 +52,9 @@ bool GodotCollisionSolver2D::solve_static_world_boundary(const GodotShape2D *p_s bool found = false; for (int i = 0; i < support_count; i++) { + supports[i] += p_margin * supports[i].normalized(); supports[i] = p_transform_B.xform(supports[i]); + supports[i] += p_motion_B; real_t pd = n.dot(supports[i]); if (pd >= d) { continue; @@ -227,17 +229,19 @@ bool GodotCollisionSolver2D::solve(const GodotShape2D *p_shape_A, const Transfor if (type_A == PhysicsServer2D::SHAPE_WORLD_BOUNDARY) { if (type_B == PhysicsServer2D::SHAPE_WORLD_BOUNDARY) { + WARN_PRINT_ONCE("Collisions between world boundaries are not supported."); return false; } if (swap) { - return solve_static_world_boundary(p_shape_B, p_transform_B, p_shape_A, p_transform_A, p_result_callback, p_userdata, true); + return solve_static_world_boundary(p_shape_B, p_transform_B, p_shape_A, p_transform_A, p_motion_A, p_result_callback, p_userdata, true, p_margin_A); } else { - return solve_static_world_boundary(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback, p_userdata, false); + return solve_static_world_boundary(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_motion_B, p_result_callback, p_userdata, false, p_margin_B); } } else if (type_A == PhysicsServer2D::SHAPE_SEPARATION_RAY) { if (type_B == PhysicsServer2D::SHAPE_SEPARATION_RAY) { + WARN_PRINT_ONCE("Collisions between two rays are not supported."); return false; //no ray-ray } @@ -249,6 +253,7 @@ bool GodotCollisionSolver2D::solve(const GodotShape2D *p_shape_A, const Transfor } else if (concave_B) { if (concave_A) { + WARN_PRINT_ONCE("Collisions between two concave shapes are not supported."); return false; } diff --git a/servers/physics_2d/godot_collision_solver_2d.h b/servers/physics_2d/godot_collision_solver_2d.h index bd90641f04..3aac2751e0 100644 --- a/servers/physics_2d/godot_collision_solver_2d.h +++ b/servers/physics_2d/godot_collision_solver_2d.h @@ -38,7 +38,7 @@ public: typedef void (*CallbackResult)(const Vector2 &p_point_A, const Vector2 &p_point_B, void *p_userdata); private: - static bool solve_static_world_boundary(const GodotShape2D *p_shape_A, const Transform2D &p_transform_A, const GodotShape2D *p_shape_B, const Transform2D &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result); + static bool solve_static_world_boundary(const GodotShape2D *p_shape_A, const Transform2D &p_transform_A, const GodotShape2D *p_shape_B, const Transform2D &p_transform_B, const Vector2 &p_motion_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, real_t p_margin = 0); static bool concave_callback(void *p_userdata, GodotShape2D *p_convex); static bool solve_concave(const GodotShape2D *p_shape_A, const Transform2D &p_transform_A, const Vector2 &p_motion_A, const GodotShape2D *p_shape_B, const Transform2D &p_transform_B, const Vector2 &p_motion_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, Vector2 *r_sep_axis = nullptr, real_t p_margin_A = 0, real_t p_margin_B = 0); static bool solve_separation_ray(const GodotShape2D *p_shape_A, const Vector2 &p_motion_A, const Transform2D &p_transform_A, const GodotShape2D *p_shape_B, const Transform2D &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, Vector2 *r_sep_axis = nullptr, real_t p_margin = 0); diff --git a/servers/physics_2d/godot_physics_server_2d.cpp b/servers/physics_2d/godot_physics_server_2d.cpp index cec31bdc31..11f6bd9c1e 100644 --- a/servers/physics_2d/godot_physics_server_2d.cpp +++ b/servers/physics_2d/godot_physics_server_2d.cpp @@ -951,10 +951,10 @@ int GodotPhysicsServer2D::body_get_max_contacts_reported(RID p_body) const { return body->get_max_contacts_reported(); } -void GodotPhysicsServer2D::body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) { +void GodotPhysicsServer2D::body_set_state_sync_callback(RID p_body, const Callable &p_callable) { GodotBody2D *body = body_owner.get_or_null(p_body); ERR_FAIL_COND(!body); - body->set_state_sync_callback(p_instance, p_callback); + body->set_state_sync_callback(p_callable); } void GodotPhysicsServer2D::body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata) { diff --git a/servers/physics_2d/godot_physics_server_2d.h b/servers/physics_2d/godot_physics_server_2d.h index 20e492d87a..c780ef3b66 100644 --- a/servers/physics_2d/godot_physics_server_2d.h +++ b/servers/physics_2d/godot_physics_server_2d.h @@ -243,7 +243,7 @@ public: virtual void body_set_max_contacts_reported(RID p_body, int p_contacts) override; virtual int body_get_max_contacts_reported(RID p_body) const override; - virtual void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) override; + virtual void body_set_state_sync_callback(RID p_body, const Callable &p_callable) override; virtual void body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata = Variant()) override; virtual bool body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count) override; diff --git a/servers/physics_3d/godot_body_3d.cpp b/servers/physics_3d/godot_body_3d.cpp index b632f7f461..19f065c319 100644 --- a/servers/physics_3d/godot_body_3d.cpp +++ b/servers/physics_3d/godot_body_3d.cpp @@ -674,7 +674,7 @@ void GodotBody3D::integrate_velocities(real_t p_step) { return; } - if (fi_callback_data || body_state_callback) { + if (fi_callback_data || body_state_callback.get_object()) { get_space()->body_add_to_state_query_list(&direct_state_query_list); } @@ -756,11 +756,12 @@ void GodotBody3D::wakeup_neighbours() { } void GodotBody3D::call_queries() { + Variant direct_state_variant = get_direct_state(); + if (fi_callback_data) { if (!fi_callback_data->callable.get_object()) { set_force_integration_callback(Callable()); } else { - Variant direct_state_variant = get_direct_state(); const Variant *vp[2] = { &direct_state_variant, &fi_callback_data->udata }; Callable::CallError ce; @@ -770,8 +771,11 @@ void GodotBody3D::call_queries() { } } - if (body_state_callback_instance) { - (body_state_callback)(body_state_callback_instance, get_direct_state()); + if (body_state_callback.get_object()) { + const Variant *vp[1] = { &direct_state_variant }; + Callable::CallError ce; + Variant rv; + body_state_callback.callp(vp, 1, rv, ce); } } @@ -792,9 +796,8 @@ bool GodotBody3D::sleep_test(real_t p_step) { } } -void GodotBody3D::set_state_sync_callback(void *p_instance, PhysicsServer3D::BodyStateCallback p_callback) { - body_state_callback_instance = p_instance; - body_state_callback = p_callback; +void GodotBody3D::set_state_sync_callback(const Callable &p_callable) { + body_state_callback = p_callable; } void GodotBody3D::set_force_integration_callback(const Callable &p_callable, const Variant &p_udata) { diff --git a/servers/physics_3d/godot_body_3d.h b/servers/physics_3d/godot_body_3d.h index 2153ca4e91..412cbebc7d 100644 --- a/servers/physics_3d/godot_body_3d.h +++ b/servers/physics_3d/godot_body_3d.h @@ -131,8 +131,7 @@ class GodotBody3D : public GodotCollisionObject3D { Vector<Contact> contacts; //no contacts by default int contact_count = 0; - void *body_state_callback_instance = nullptr; - PhysicsServer3D::BodyStateCallback body_state_callback = nullptr; + Callable body_state_callback; struct ForceIntegrationCallbackData { Callable callable; @@ -150,7 +149,7 @@ class GodotBody3D : public GodotCollisionObject3D { friend class GodotPhysicsDirectBodyState3D; // i give up, too many functions to expose public: - void set_state_sync_callback(void *p_instance, PhysicsServer3D::BodyStateCallback p_callback); + void set_state_sync_callback(const Callable &p_callable); void set_force_integration_callback(const Callable &p_callable, const Variant &p_udata = Variant()); GodotPhysicsDirectBodyState3D *get_direct_state(); diff --git a/servers/physics_3d/godot_collision_solver_3d.cpp b/servers/physics_3d/godot_collision_solver_3d.cpp index 094d77a582..9fe0e3eb84 100644 --- a/servers/physics_3d/godot_collision_solver_3d.cpp +++ b/servers/physics_3d/godot_collision_solver_3d.cpp @@ -370,12 +370,15 @@ bool GodotCollisionSolver3D::solve_static(const GodotShape3D *p_shape_A, const T if (type_A == PhysicsServer3D::SHAPE_WORLD_BOUNDARY) { if (type_B == PhysicsServer3D::SHAPE_WORLD_BOUNDARY) { + WARN_PRINT_ONCE("Collisions between world boundaries are not supported."); return false; } if (type_B == PhysicsServer3D::SHAPE_SEPARATION_RAY) { + WARN_PRINT_ONCE("Collisions between world boundaries and rays are not supported."); return false; } if (type_B == PhysicsServer3D::SHAPE_SOFT_BODY) { + WARN_PRINT_ONCE("Collisions between world boundaries and soft bodies are not supported."); return false; } @@ -387,6 +390,7 @@ bool GodotCollisionSolver3D::solve_static(const GodotShape3D *p_shape_A, const T } else if (type_A == PhysicsServer3D::SHAPE_SEPARATION_RAY) { if (type_B == PhysicsServer3D::SHAPE_SEPARATION_RAY) { + WARN_PRINT_ONCE("Collisions between rays are not supported."); return false; } @@ -398,7 +402,7 @@ bool GodotCollisionSolver3D::solve_static(const GodotShape3D *p_shape_A, const T } else if (type_B == PhysicsServer3D::SHAPE_SOFT_BODY) { if (type_A == PhysicsServer3D::SHAPE_SOFT_BODY) { - // Soft Body / Soft Body not supported. + WARN_PRINT_ONCE("Collisions between soft bodies are not supported."); return false; } @@ -410,6 +414,7 @@ bool GodotCollisionSolver3D::solve_static(const GodotShape3D *p_shape_A, const T } else if (concave_B) { if (concave_A) { + WARN_PRINT_ONCE("Collisions between two concave shapes are not supported."); return false; } diff --git a/servers/physics_3d/godot_physics_server_3d.cpp b/servers/physics_3d/godot_physics_server_3d.cpp index b028c00a31..7f2ec72921 100644 --- a/servers/physics_3d/godot_physics_server_3d.cpp +++ b/servers/physics_3d/godot_physics_server_3d.cpp @@ -877,10 +877,10 @@ int GodotPhysicsServer3D::body_get_max_contacts_reported(RID p_body) const { return body->get_max_contacts_reported(); } -void GodotPhysicsServer3D::body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) { +void GodotPhysicsServer3D::body_set_state_sync_callback(RID p_body, const Callable &p_callable) { GodotBody3D *body = body_owner.get_or_null(p_body); ERR_FAIL_COND(!body); - body->set_state_sync_callback(p_instance, p_callback); + body->set_state_sync_callback(p_callable); } void GodotPhysicsServer3D::body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata) { diff --git a/servers/physics_3d/godot_physics_server_3d.h b/servers/physics_3d/godot_physics_server_3d.h index b429f23a0c..6dc9330caf 100644 --- a/servers/physics_3d/godot_physics_server_3d.h +++ b/servers/physics_3d/godot_physics_server_3d.h @@ -242,7 +242,7 @@ public: virtual void body_set_max_contacts_reported(RID p_body, int p_contacts) override; virtual int body_get_max_contacts_reported(RID p_body) const override; - virtual void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) override; + virtual void body_set_state_sync_callback(RID p_body, const Callable &p_callable) override; virtual void body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata = Variant()) override; virtual void body_set_ray_pickable(RID p_body, bool p_enable) override; diff --git a/servers/physics_server_2d.h b/servers/physics_server_2d.h index d5b4dc05e6..bd57a6a375 100644 --- a/servers/physics_server_2d.h +++ b/servers/physics_server_2d.h @@ -470,10 +470,7 @@ public: virtual void body_set_omit_force_integration(RID p_body, bool p_omit) = 0; virtual bool body_is_omitting_force_integration(RID p_body) const = 0; - // Callback for C++ use only. - typedef void (*BodyStateCallback)(void *p_instance, PhysicsDirectBodyState2D *p_state); - virtual void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) = 0; - + virtual void body_set_state_sync_callback(RID p_body, const Callable &p_callable) = 0; virtual void body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata = Variant()) = 0; virtual bool body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count) = 0; @@ -490,7 +487,7 @@ public: bool collide_separation_ray = false; HashSet<RID> exclude_bodies; HashSet<ObjectID> exclude_objects; - bool recovery_as_collision = false; + bool recovery_as_collision = false; // Don't report margin recovery as collision by default, only used for floor snapping. MotionParameters() {} diff --git a/servers/physics_server_2d_wrap_mt.h b/servers/physics_server_2d_wrap_mt.h index d080aac438..1353d8de6d 100644 --- a/servers/physics_server_2d_wrap_mt.h +++ b/servers/physics_server_2d_wrap_mt.h @@ -249,7 +249,7 @@ public: FUNC2(body_set_omit_force_integration, RID, bool); FUNC1RC(bool, body_is_omitting_force_integration, RID); - FUNC3(body_set_state_sync_callback, RID, void *, BodyStateCallback); + FUNC2(body_set_state_sync_callback, RID, const Callable &); FUNC3(body_set_force_integration_callback, RID, const Callable &, const Variant &); bool body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count) override { diff --git a/servers/physics_server_3d.h b/servers/physics_server_3d.h index 1308e4cd36..2151d84e40 100644 --- a/servers/physics_server_3d.h +++ b/servers/physics_server_3d.h @@ -508,10 +508,7 @@ public: virtual void body_set_omit_force_integration(RID p_body, bool p_omit) = 0; virtual bool body_is_omitting_force_integration(RID p_body) const = 0; - // Callback for C++ use only. - typedef void (*BodyStateCallback)(void *p_instance, PhysicsDirectBodyState3D *p_state); - virtual void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) = 0; - + virtual void body_set_state_sync_callback(RID p_body, const Callable &p_callable) = 0; virtual void body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata = Variant()) = 0; virtual void body_set_ray_pickable(RID p_body, bool p_enable) = 0; @@ -527,7 +524,7 @@ public: bool collide_separation_ray = false; HashSet<RID> exclude_bodies; HashSet<ObjectID> exclude_objects; - bool recovery_as_collision = false; + bool recovery_as_collision = false; // Don't report margin recovery as collision by default, only used for floor snapping. MotionParameters() {} diff --git a/servers/physics_server_3d_wrap_mt.h b/servers/physics_server_3d_wrap_mt.h index ed4546b240..9b07e19e50 100644 --- a/servers/physics_server_3d_wrap_mt.h +++ b/servers/physics_server_3d_wrap_mt.h @@ -252,7 +252,7 @@ public: FUNC2(body_set_omit_force_integration, RID, bool); FUNC1RC(bool, body_is_omitting_force_integration, RID); - FUNC3(body_set_state_sync_callback, RID, void *, BodyStateCallback); + FUNC2(body_set_state_sync_callback, RID, const Callable &); FUNC3(body_set_force_integration_callback, RID, const Callable &, const Variant &); FUNC2(body_set_ray_pickable, RID, bool); diff --git a/servers/register_server_types.cpp b/servers/register_server_types.cpp index a810402672..1356fedb82 100644 --- a/servers/register_server_types.cpp +++ b/servers/register_server_types.cpp @@ -145,7 +145,6 @@ void register_server_types() { GDREGISTER_NATIVE_STRUCT(PhysicsServer2DExtensionShapeResult, "RID rid;ObjectID collider_id;Object *collider;int shape"); GDREGISTER_NATIVE_STRUCT(PhysicsServer2DExtensionShapeRestInfo, "Vector2 point;Vector2 normal;RID rid;ObjectID collider_id;int shape;Vector2 linear_velocity"); GDREGISTER_NATIVE_STRUCT(PhysicsServer2DExtensionMotionResult, "Vector2 travel;Vector2 remainder;Vector2 collision_point;Vector2 collision_normal;Vector2 collider_velocity;real_t collision_depth;real_t collision_safe_fraction;real_t collision_unsafe_fraction;int collision_local_shape;ObjectID collider_id;RID collider;int collider_shape"); - GDREGISTER_NATIVE_STRUCT(PhysicsServer2DExtensionStateCallback, "void *instance;void (*callback)(void *p_instance, PhysicsDirectBodyState2D *p_state)"); GDREGISTER_CLASS(PhysicsServer3DManager); Engine::get_singleton()->add_singleton(Engine::Singleton("PhysicsServer3DManager", PhysicsServer3DManager::get_singleton(), "PhysicsServer3DManager")); @@ -161,7 +160,6 @@ void register_server_types() { GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionShapeRestInfo, "Vector3 point;Vector3 normal;RID rid;ObjectID collider_id;int shape;Vector3 linear_velocity"); GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionMotionCollision, "Vector3 position;Vector3 normal;Vector3 collider_velocity;real_t depth;int local_shape;ObjectID collider_id;RID collider;int collider_shape"); GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionMotionResult, "Vector3 travel;Vector3 remainder;real_t collision_safe_fraction;real_t collision_unsafe_fraction;PhysicsServer3DExtensionMotionCollision collisions[32];int collision_count"); - GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionStateCallback, "void *instance;void (*callback)(void *p_instance, PhysicsDirectBodyState3D *p_state)"); GDREGISTER_ABSTRACT_CLASS(NavigationServer2D); GDREGISTER_ABSTRACT_CLASS(NavigationServer3D); diff --git a/servers/rendering/dummy/rasterizer_scene_dummy.h b/servers/rendering/dummy/rasterizer_scene_dummy.h index 4a2a947b94..e41373ed37 100644 --- a/servers/rendering/dummy/rasterizer_scene_dummy.h +++ b/servers/rendering/dummy/rasterizer_scene_dummy.h @@ -180,7 +180,7 @@ public: void voxel_gi_set_quality(RS::VoxelGIQuality) override {} - void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RendererScene::RenderInfo *r_info = nullptr) override {} + void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RenderingMethod::RenderInfo *r_info = nullptr) override {} void render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) override {} void render_particle_collider_heightfield(RID p_collider, const Transform3D &p_transform, const PagedArray<RenderGeometryInstance *> &p_instances) override {} diff --git a/servers/rendering/renderer_canvas_cull.cpp b/servers/rendering/renderer_canvas_cull.cpp index aa9772a483..c5818d9290 100644 --- a/servers/rendering/renderer_canvas_cull.cpp +++ b/servers/rendering/renderer_canvas_cull.cpp @@ -189,7 +189,7 @@ void RendererCanvasCull::_attach_canvas_item_for_draw(RendererCanvasCull::Item * RenderingServerDefault::redraw_request(); } - if (ci->commands != nullptr) { + if (ci->commands != nullptr || ci->copy_back_buffer) { ci->final_transform = xform; ci->final_modulate = modulate * ci->self_modulate; ci->global_rect_cache = global_rect; diff --git a/servers/rendering/renderer_compositor.h b/servers/rendering/renderer_compositor.h index 78d4ded617..8e04191e35 100644 --- a/servers/rendering/renderer_compositor.h +++ b/servers/rendering/renderer_compositor.h @@ -34,7 +34,7 @@ #include "servers/rendering/environment/renderer_fog.h" #include "servers/rendering/environment/renderer_gi.h" #include "servers/rendering/renderer_canvas_render.h" -#include "servers/rendering/renderer_scene.h" +#include "servers/rendering/rendering_method.h" #include "servers/rendering/storage/camera_attributes_storage.h" #include "servers/rendering/storage/light_storage.h" #include "servers/rendering/storage/material_storage.h" diff --git a/servers/rendering/renderer_rd/effects/ss_effects.cpp b/servers/rendering/renderer_rd/effects/ss_effects.cpp index 315bea2e67..582c5abbdd 100644 --- a/servers/rendering/renderer_rd/effects/ss_effects.cpp +++ b/servers/rendering/renderer_rd/effects/ss_effects.cpp @@ -443,6 +443,11 @@ void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_ RD::get_singleton()->draw_command_begin_label("Downsample Depth"); if (p_invalidate_uniform_set || use_full_mips != ss_effects.used_full_mips_last_frame || use_half_size != ss_effects.used_half_size_last_frame || use_mips != ss_effects.used_mips_last_frame) { + if (ss_effects.downsample_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(ss_effects.downsample_uniform_set)) { + RD::get_singleton()->free(ss_effects.downsample_uniform_set); + ss_effects.downsample_uniform_set = RID(); + } + Vector<RD::Uniform> uniforms; { RD::Uniform u; @@ -516,6 +521,7 @@ void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_ ss_effects.used_full_mips_last_frame = use_full_mips; ss_effects.used_half_size_last_frame = use_half_size; + ss_effects.used_mips_last_frame = use_mips; } /* SSIL */ @@ -1484,7 +1490,7 @@ void SSEffects::ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const Rend } } -void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, RenderingServer::EnvironmentSSRRoughnessQuality p_roughness_quality, const RID *p_metallic_slices, const Color &p_metallic_mask, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets) { +void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, RenderingServer::EnvironmentSSRRoughnessQuality p_roughness_quality, const RID *p_metallic_slices, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets) { UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); ERR_FAIL_NULL(uniform_set_cache); MaterialStorage *material_storage = MaterialStorage::get_singleton(); @@ -1579,10 +1585,6 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R push_constant.proj_info[1] = -2.0f / (p_screen_size.height * p_projections[v].matrix[1][1]); push_constant.proj_info[2] = (1.0f - p_projections[v].matrix[0][2]) / p_projections[v].matrix[0][0]; push_constant.proj_info[3] = (1.0f + p_projections[v].matrix[1][2]) / p_projections[v].matrix[1][1]; - push_constant.metallic_mask[0] = CLAMP(p_metallic_mask.r * 255.0, 0, 255); - push_constant.metallic_mask[1] = CLAMP(p_metallic_mask.g * 255.0, 0, 255); - push_constant.metallic_mask[2] = CLAMP(p_metallic_mask.b * 255.0, 0, 255); - push_constant.metallic_mask[3] = CLAMP(p_metallic_mask.a * 255.0, 0, 255); ScreenSpaceReflectionMode mode = (p_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) ? SCREEN_SPACE_REFLECTION_ROUGH : SCREEN_SPACE_REFLECTION_NORMAL; RID shader = ssr.shader.version_get_shader(ssr.shader_version, mode); diff --git a/servers/rendering/renderer_rd/effects/ss_effects.h b/servers/rendering/renderer_rd/effects/ss_effects.h index a60f3a48ab..d50319c46f 100644 --- a/servers/rendering/renderer_rd/effects/ss_effects.h +++ b/servers/rendering/renderer_rd/effects/ss_effects.h @@ -168,7 +168,7 @@ public: }; void ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format, RenderingServer::EnvironmentSSRRoughnessQuality p_roughness_quality, const Size2i &p_screen_size, const uint32_t p_view_count); - void screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, RS::EnvironmentSSRRoughnessQuality p_roughness_quality, const RID *p_metallic_slices, const Color &p_metallic_mask, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets); + void screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, RS::EnvironmentSSRRoughnessQuality p_roughness_quality, const RID *p_metallic_slices, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets); void ssr_free(SSRRenderBuffers &p_ssr_buffers); /* subsurface scattering */ @@ -465,10 +465,7 @@ private: uint32_t orthogonal; // 4 - 52 float filter_mipmap_levels; // 4 - 56 uint32_t use_half_res; // 4 - 60 - uint8_t metallic_mask[4]; // 4 - 64 - - uint32_t view_index; // 4 - 68 - uint32_t pad[3]; // 12 - 80 + uint32_t view_index; // 4 - 64 // float projection[16]; // this is in our ScreenSpaceReflectionSceneData now }; diff --git a/servers/rendering/renderer_rd/environment/sky.cpp b/servers/rendering/renderer_rd/environment/sky.cpp index 65d1d9e705..307af99e91 100644 --- a/servers/rendering/renderer_rd/environment/sky.cpp +++ b/servers/rendering/renderer_rd/environment/sky.cpp @@ -907,6 +907,7 @@ void SkyRD::init() { actions.usage_defines["HALF_RES_COLOR"] = "\n#define USES_HALF_RES_COLOR\n"; actions.usage_defines["QUARTER_RES_COLOR"] = "\n#define USES_QUARTER_RES_COLOR\n"; actions.render_mode_defines["disable_fog"] = "#define DISABLE_FOG\n"; + actions.render_mode_defines["use_debanding"] = "#define USE_DEBANDING\n"; actions.sampler_array_name = "material_samplers"; actions.base_texture_binding_index = 1; @@ -1260,6 +1261,7 @@ void SkyRD::setup(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, const P light_data_dirty = true; for (uint32_t i = sky_scene_state.ubo.directional_light_count; i < sky_scene_state.max_directional_lights; i++) { sky_scene_state.directional_lights[i].enabled = false; + sky_scene_state.last_frame_directional_lights[i].enabled = false; } } diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp index a0f6e69fd5..63fd10886d 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp @@ -124,7 +124,7 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::configure(RenderS render_buffers = p_render_buffers; ERR_FAIL_NULL(render_buffers); - bool msaa_3d = render_buffers->get_msaa_3d(); + RS::ViewportMSAA msaa_3d = render_buffers->get_msaa_3d(); if (msaa_3d != RS::VIEWPORT_MSAA_DISABLED) { RD::DataFormat format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; @@ -477,6 +477,10 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p prev_material_uniform_set = material_uniform_set; } + if ((surf->owner->base_flags & (INSTANCE_DATA_FLAG_MULTIMESH | INSTANCE_DATA_FLAG_PARTICLES)) == INSTANCE_DATA_FLAG_MULTIMESH) { + mesh_storage->_multimesh_get_motion_vectors_offsets(surf->owner->data->base, push_constant.multimesh_motion_vectors_current_offset, push_constant.multimesh_motion_vectors_previous_offset); + } + RD::get_singleton()->draw_list_set_push_constant(draw_list, &push_constant, sizeof(SceneState::PushConstant)); uint32_t instance_count = surf->owner->instance_count > 1 ? surf->owner->instance_count : element_info.repeat; @@ -574,47 +578,21 @@ void RenderForwardClustered::_render_list_with_threads(RenderListParameters *p_p void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, bool p_flip_y, const Color &p_default_bg_color, bool p_opaque_render_buffers, bool p_pancake_shadows, int p_index) { Ref<RenderSceneBuffersRD> rd = p_render_data->render_buffers; + RID env = is_environment(p_render_data->environment) ? p_render_data->environment : RID(); + RID reflection_probe_instance = p_render_data->reflection_probe.is_valid() ? reflection_probe_instance_get_probe(p_render_data->reflection_probe) : RID(); - //Projection projection = p_render_data->cam_projection; - //projection.flip_y(); // Vulkan and modern APIs use Y-Down - Projection correction; - correction.set_depth_correction(p_flip_y); - correction.add_jitter_offset(p_render_data->taa_jitter); - Projection projection = correction * p_render_data->cam_projection; - - //store camera into ubo - RendererRD::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix); - RendererRD::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix); - RendererRD::MaterialStorage::store_transform(p_render_data->cam_transform, scene_state.ubo.inv_view_matrix); - RendererRD::MaterialStorage::store_transform(p_render_data->cam_transform.affine_inverse(), scene_state.ubo.view_matrix); - - for (uint32_t v = 0; v < p_render_data->view_count; v++) { - projection = correction * p_render_data->view_projection[v]; - RendererRD::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix_view[v]); - RendererRD::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix_view[v]); - - scene_state.ubo.eye_offset[v][0] = p_render_data->view_eye_offset[v].x; - scene_state.ubo.eye_offset[v][1] = p_render_data->view_eye_offset[v].y; - scene_state.ubo.eye_offset[v][2] = p_render_data->view_eye_offset[v].z; - scene_state.ubo.eye_offset[v][3] = 0.0; + // May do this earlier in RenderSceneRenderRD::render_scene + if (p_index >= (int)scene_state.uniform_buffers.size()) { + uint32_t from = scene_state.uniform_buffers.size(); + scene_state.uniform_buffers.resize(p_index + 1); + for (uint32_t i = from; i < scene_state.uniform_buffers.size(); i++) { + scene_state.uniform_buffers[i] = p_render_data->scene_data->create_uniform_buffer(); + } } - scene_state.ubo.taa_jitter[0] = p_render_data->taa_jitter.x; - scene_state.ubo.taa_jitter[1] = p_render_data->taa_jitter.y; - - scene_state.ubo.z_far = p_render_data->z_far; - scene_state.ubo.z_near = p_render_data->z_near; - - scene_state.ubo.pancake_shadows = p_pancake_shadows; + p_render_data->scene_data->update_ubo(scene_state.uniform_buffers[p_index], get_debug_draw_mode(), env, reflection_probe_instance, p_render_data->camera_attributes, p_flip_y, p_pancake_shadows, p_screen_size, p_default_bg_color, _render_buffers_get_luminance_multiplier(), p_opaque_render_buffers); - RendererRD::MaterialStorage::store_soft_shadow_kernel(directional_penumbra_shadow_kernel_get(), scene_state.ubo.directional_penumbra_shadow_kernel); - RendererRD::MaterialStorage::store_soft_shadow_kernel(directional_soft_shadow_kernel_get(), scene_state.ubo.directional_soft_shadow_kernel); - RendererRD::MaterialStorage::store_soft_shadow_kernel(penumbra_shadow_kernel_get(), scene_state.ubo.penumbra_shadow_kernel); - RendererRD::MaterialStorage::store_soft_shadow_kernel(soft_shadow_kernel_get(), scene_state.ubo.soft_shadow_kernel); - - Size2 screen_pixel_size = Vector2(1.0, 1.0) / Size2(p_screen_size); - scene_state.ubo.screen_pixel_size[0] = screen_pixel_size.x; - scene_state.ubo.screen_pixel_size[1] = screen_pixel_size.y; + // now do implementation UBO scene_state.ubo.cluster_shift = get_shift_from_power_of_2(p_render_data->cluster_size); scene_state.ubo.max_cluster_element_count_div_32 = p_render_data->cluster_max_elements / 32; @@ -625,22 +603,8 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat scene_state.ubo.cluster_width = cluster_screen_width; } - if (p_render_data->shadow_atlas.is_valid()) { - Vector2 sas = shadow_atlas_get_size(p_render_data->shadow_atlas); - scene_state.ubo.shadow_atlas_pixel_size[0] = 1.0 / sas.x; - scene_state.ubo.shadow_atlas_pixel_size[1] = 1.0 / sas.y; - } - { - Vector2 dss = directional_shadow_get_size(); - scene_state.ubo.directional_shadow_pixel_size[0] = 1.0 / dss.x; - scene_state.ubo.directional_shadow_pixel_size[1] = 1.0 / dss.y; - } - //time global variables - scene_state.ubo.time = time; - scene_state.ubo.gi_upscale_for_msaa = false; scene_state.ubo.volumetric_fog_enabled = false; - scene_state.ubo.fog_enabled = false; if (rd.is_valid()) { if (rd->get_msaa_3d() != RS::VIEWPORT_MSAA_DISABLED) { @@ -668,59 +632,8 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat } if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_UNSHADED) { - scene_state.ubo.use_ambient_light = true; - scene_state.ubo.ambient_light_color_energy[0] = 1; - scene_state.ubo.ambient_light_color_energy[1] = 1; - scene_state.ubo.ambient_light_color_energy[2] = 1; - scene_state.ubo.ambient_light_color_energy[3] = 1.0; - scene_state.ubo.use_ambient_cubemap = false; - scene_state.ubo.use_reflection_cubemap = false; scene_state.ubo.ss_effects_flags = 0; - } else if (is_environment(p_render_data->environment)) { - RS::EnvironmentBG env_bg = environment_get_background(p_render_data->environment); - RS::EnvironmentAmbientSource ambient_src = environment_get_ambient_source(p_render_data->environment); - - float bg_energy_multiplier = environment_get_bg_energy_multiplier(p_render_data->environment); - - scene_state.ubo.ambient_light_color_energy[3] = bg_energy_multiplier; - - scene_state.ubo.ambient_color_sky_mix = environment_get_ambient_sky_contribution(p_render_data->environment); - - //ambient - if (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && (env_bg == RS::ENV_BG_CLEAR_COLOR || env_bg == RS::ENV_BG_COLOR)) { - Color color = env_bg == RS::ENV_BG_CLEAR_COLOR ? p_default_bg_color : environment_get_bg_color(p_render_data->environment); - color = color.srgb_to_linear(); - - scene_state.ubo.ambient_light_color_energy[0] = color.r * bg_energy_multiplier; - scene_state.ubo.ambient_light_color_energy[1] = color.g * bg_energy_multiplier; - scene_state.ubo.ambient_light_color_energy[2] = color.b * bg_energy_multiplier; - scene_state.ubo.use_ambient_light = true; - scene_state.ubo.use_ambient_cubemap = false; - } else { - float energy = environment_get_ambient_light_energy(p_render_data->environment); - Color color = environment_get_ambient_light(p_render_data->environment); - color = color.srgb_to_linear(); - scene_state.ubo.ambient_light_color_energy[0] = color.r * energy; - scene_state.ubo.ambient_light_color_energy[1] = color.g * energy; - scene_state.ubo.ambient_light_color_energy[2] = color.b * energy; - - Basis sky_transform = environment_get_sky_orientation(p_render_data->environment); - sky_transform = sky_transform.inverse() * p_render_data->cam_transform.basis; - RendererRD::MaterialStorage::store_transform_3x3(sky_transform, scene_state.ubo.radiance_inverse_xform); - - scene_state.ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY; - scene_state.ubo.use_ambient_light = scene_state.ubo.use_ambient_cubemap || ambient_src == RS::ENV_AMBIENT_SOURCE_COLOR; - } - - //specular - RS::EnvironmentReflectionSource ref_src = environment_get_reflection_source(p_render_data->environment); - if ((ref_src == RS::ENV_REFLECTION_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ref_src == RS::ENV_REFLECTION_SOURCE_SKY) { - scene_state.ubo.use_reflection_cubemap = true; - } else { - scene_state.ubo.use_reflection_cubemap = false; - } - scene_state.ubo.ssao_ao_affect = environment_get_ssao_ao_channel_affect(p_render_data->environment); scene_state.ubo.ssao_light_affect = environment_get_ssao_direct_light_affect(p_render_data->environment); uint32_t ss_flags = 0; @@ -729,97 +642,19 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat ss_flags |= environment_get_ssil_enabled(p_render_data->environment) ? 2 : 0; } scene_state.ubo.ss_effects_flags = ss_flags; - - scene_state.ubo.fog_enabled = environment_get_fog_enabled(p_render_data->environment); - scene_state.ubo.fog_density = environment_get_fog_density(p_render_data->environment); - scene_state.ubo.fog_height = environment_get_fog_height(p_render_data->environment); - scene_state.ubo.fog_height_density = environment_get_fog_height_density(p_render_data->environment); - scene_state.ubo.fog_aerial_perspective = environment_get_fog_aerial_perspective(p_render_data->environment); - - Color fog_color = environment_get_fog_light_color(p_render_data->environment).srgb_to_linear(); - float fog_energy = environment_get_fog_light_energy(p_render_data->environment); - - scene_state.ubo.fog_light_color[0] = fog_color.r * fog_energy; - scene_state.ubo.fog_light_color[1] = fog_color.g * fog_energy; - scene_state.ubo.fog_light_color[2] = fog_color.b * fog_energy; - - scene_state.ubo.fog_sun_scatter = environment_get_fog_sun_scatter(p_render_data->environment); - } else { - if (p_render_data->reflection_probe.is_valid() && RendererRD::LightStorage::get_singleton()->reflection_probe_is_interior(reflection_probe_instance_get_probe(p_render_data->reflection_probe))) { - scene_state.ubo.use_ambient_light = false; - } else { - scene_state.ubo.use_ambient_light = true; - Color clear_color = p_default_bg_color; - clear_color = clear_color.srgb_to_linear(); - scene_state.ubo.ambient_light_color_energy[0] = clear_color.r; - scene_state.ubo.ambient_light_color_energy[1] = clear_color.g; - scene_state.ubo.ambient_light_color_energy[2] = clear_color.b; - scene_state.ubo.ambient_light_color_energy[3] = 1.0; - } - - scene_state.ubo.use_ambient_cubemap = false; - scene_state.ubo.use_reflection_cubemap = false; scene_state.ubo.ss_effects_flags = 0; } - if (p_render_data->camera_attributes.is_valid()) { - scene_state.ubo.emissive_exposure_normalization = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); - scene_state.ubo.IBL_exposure_normalization = 1.0; - if (is_environment(p_render_data->environment)) { - RID sky_rid = environment_get_sky(p_render_data->environment); - if (sky_rid.is_valid()) { - float current_exposure = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes) * environment_get_bg_intensity(p_render_data->environment) / _render_buffers_get_luminance_multiplier(); - scene_state.ubo.IBL_exposure_normalization = current_exposure / MAX(0.001, sky.sky_get_baked_exposure(sky_rid)); - } - } - } else if (scene_state.ubo.emissive_exposure_normalization > 0.0) { - // This branch is triggered when using render_material(). - // Emissive is set outside the function, so don't set it. - // IBL isn't used don't set it. - } else { - scene_state.ubo.emissive_exposure_normalization = 1.0; - scene_state.ubo.IBL_exposure_normalization = 1.0; - } - - scene_state.ubo.roughness_limiter_enabled = p_opaque_render_buffers && screen_space_roughness_limiter_is_active(); - scene_state.ubo.roughness_limiter_amount = screen_space_roughness_limiter_get_amount(); - scene_state.ubo.roughness_limiter_limit = screen_space_roughness_limiter_get_limit(); - - if (rd.is_valid()) { - if (rd->get_use_taa() || get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_MOTION_VECTORS) { - memcpy(&scene_state.prev_ubo, &scene_state.ubo, sizeof(SceneState::UBO)); - - Projection prev_correction; - prev_correction.set_depth_correction(true); - prev_correction.add_jitter_offset(p_render_data->prev_taa_jitter); - Projection prev_projection = prev_correction * p_render_data->prev_cam_projection; - - //store camera into ubo - RendererRD::MaterialStorage::store_camera(prev_projection, scene_state.prev_ubo.projection_matrix); - RendererRD::MaterialStorage::store_camera(prev_projection.inverse(), scene_state.prev_ubo.inv_projection_matrix); - RendererRD::MaterialStorage::store_transform(p_render_data->prev_cam_transform, scene_state.prev_ubo.inv_view_matrix); - RendererRD::MaterialStorage::store_transform(p_render_data->prev_cam_transform.affine_inverse(), scene_state.prev_ubo.view_matrix); - - for (uint32_t v = 0; v < p_render_data->view_count; v++) { - prev_projection = prev_correction * p_render_data->view_projection[v]; - RendererRD::MaterialStorage::store_camera(prev_projection, scene_state.prev_ubo.projection_matrix_view[v]); - RendererRD::MaterialStorage::store_camera(prev_projection.inverse(), scene_state.prev_ubo.inv_projection_matrix_view[v]); - } - scene_state.prev_ubo.taa_jitter[0] = p_render_data->prev_taa_jitter.x; - scene_state.prev_ubo.taa_jitter[1] = p_render_data->prev_taa_jitter.y; - scene_state.prev_ubo.time -= time_step; + if (p_index >= (int)scene_state.implementation_uniform_buffers.size()) { + uint32_t from = scene_state.implementation_uniform_buffers.size(); + scene_state.implementation_uniform_buffers.resize(p_index + 1); + for (uint32_t i = from; i < scene_state.implementation_uniform_buffers.size(); i++) { + scene_state.implementation_uniform_buffers[i] = RD::get_singleton()->uniform_buffer_create(sizeof(SceneState::UBO)); } } - if (p_index >= (int)scene_state.uniform_buffers.size()) { - uint32_t from = scene_state.uniform_buffers.size(); - scene_state.uniform_buffers.resize(p_index + 1); - for (uint32_t i = from; i < scene_state.uniform_buffers.size(); i++) { - scene_state.uniform_buffers[i] = RD::get_singleton()->uniform_buffer_create(sizeof(SceneState::UBO) * 2); - } - } - RD::get_singleton()->buffer_update(scene_state.uniform_buffers[p_index], 0, sizeof(SceneState::UBO) * 2, &scene_state.ubo_data, RD::BARRIER_MASK_RASTER); + RD::get_singleton()->buffer_update(scene_state.implementation_uniform_buffers[p_index], 0, sizeof(SceneState::UBO), &scene_state.ubo, RD::BARRIER_MASK_RASTER); } void RenderForwardClustered::_update_instance_data_buffer(RenderListType p_render_list) { @@ -924,7 +759,7 @@ _FORCE_INLINE_ static uint32_t _indices_to_primitives(RS::PrimitiveType p_primit static const uint32_t subtractor[RS::PRIMITIVE_MAX] = { 0, 0, 1, 0, 1 }; return (p_indices - subtractor[p_primitive]) / divisor[p_primitive]; } -void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, const RenderDataRD *p_render_data, PassMode p_pass_mode, bool p_using_sdfgi, bool p_using_opaque_gi, bool p_append) { +void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, const RenderDataRD *p_render_data, PassMode p_pass_mode, uint32_t p_color_pass_flags = 0, bool p_using_sdfgi, bool p_using_opaque_gi, bool p_append) { RendererRD::MeshStorage *mesh_storage = RendererRD::MeshStorage::get_singleton(); if (p_render_list == RENDER_LIST_OPAQUE) { @@ -935,9 +770,9 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con } uint32_t lightmap_captures_used = 0; - Plane near_plane = Plane(-p_render_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->cam_transform.origin); - near_plane.d += p_render_data->cam_projection.get_z_near(); - float z_max = p_render_data->cam_projection.get_z_far() - p_render_data->cam_projection.get_z_near(); + Plane near_plane = Plane(-p_render_data->scene_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->scene_data->cam_transform.origin); + near_plane.d += p_render_data->scene_data->cam_projection.get_z_near(); + float z_max = p_render_data->scene_data->cam_projection.get_z_far() - p_render_data->scene_data->cam_projection.get_z_near(); RenderList *rl = &render_list[p_render_list]; _update_dirty_geometry_instances(); @@ -968,7 +803,7 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con float fade_alpha = 1.0; if (inst->fade_near || inst->fade_far) { - float fade_dist = inst->transform.origin.distance_to(p_render_data->cam_transform.origin); + float fade_dist = inst->transform.origin.distance_to(p_render_data->scene_data->cam_transform.origin); // Use `smoothstep()` to make opacity changes more gradual and less noticeable to the player. if (inst->fade_far && fade_dist > inst->fade_far_begin) { fade_alpha = Math::smoothstep(0.0f, 1.0f, 1.0f - (fade_dist - inst->fade_far_begin) / (inst->fade_far_end - inst->fade_far_begin)); @@ -1063,13 +898,13 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con // LOD - if (p_render_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) { + if (p_render_data->scene_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) { //lod - Vector3 lod_support_min = inst->transformed_aabb.get_support(-p_render_data->lod_camera_plane.normal); - Vector3 lod_support_max = inst->transformed_aabb.get_support(p_render_data->lod_camera_plane.normal); + Vector3 lod_support_min = inst->transformed_aabb.get_support(-p_render_data->scene_data->lod_camera_plane.normal); + Vector3 lod_support_max = inst->transformed_aabb.get_support(p_render_data->scene_data->lod_camera_plane.normal); - float distance_min = p_render_data->lod_camera_plane.distance_to(lod_support_min); - float distance_max = p_render_data->lod_camera_plane.distance_to(lod_support_max); + float distance_min = p_render_data->scene_data->lod_camera_plane.distance_to(lod_support_min); + float distance_max = p_render_data->scene_data->lod_camera_plane.distance_to(lod_support_max); float distance = 0.0; @@ -1082,12 +917,12 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con distance = -distance_max; } - if (p_render_data->cam_orthogonal) { + if (p_render_data->scene_data->cam_orthogonal) { distance = 1.0; } uint32_t indices; - surf->sort.lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, distance * p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, &indices); + surf->sort.lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, distance * p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, &indices); if (p_render_data->render_info) { indices = _indices_to_primitives(surf->primitive, indices); if (p_render_list == RENDER_LIST_OPAQUE) { //opaque @@ -1149,6 +984,12 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con scene_state.used_depth_texture = true; } + if (p_color_pass_flags & COLOR_PASS_FLAG_MOTION_VECTORS) { + if ((flags & (INSTANCE_DATA_FLAG_MULTIMESH | INSTANCE_DATA_FLAG_PARTICLES)) == INSTANCE_DATA_FLAG_MULTIMESH && RendererRD::MeshStorage::get_singleton()->_multimesh_enable_motion_vectors(inst->data->base)) { + inst->transforms_uniform_set = mesh_storage->multimesh_get_3d_uniform_set(inst->data->base, scene_shader.default_shader_rd, TRANSFORMS_UNIFORM_SET); + } + } + } else if (p_pass_mode == PASS_MODE_SHADOW || p_pass_mode == PASS_MODE_SHADOW_DP) { if (surf->flags & GeometryInstanceSurfaceDataCache::FLAG_PASS_SHADOW) { rl->add_element(surf); @@ -1220,9 +1061,18 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co RENDER_TIMESTAMP("Setup 3D Scene"); - //scene_state.ubo.subsurface_scatter_width = subsurface_scatter_size; - scene_state.ubo.directional_light_count = 0; - scene_state.ubo.opaque_prepass_threshold = 0.99f; + // check if we need motion vectors + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_MOTION_VECTORS) { + p_render_data->scene_data->calculate_motion_vectors = true; + } else if (rb.is_valid() && rb->get_use_taa()) { + p_render_data->scene_data->calculate_motion_vectors = true; + } else { + p_render_data->scene_data->calculate_motion_vectors = false; + } + + //p_render_data->scene_data->subsurface_scatter_width = subsurface_scatter_size; + p_render_data->scene_data->directional_light_count = 0; + p_render_data->scene_data->opaque_prepass_threshold = 0.99f; Size2i screen_size; RID color_framebuffer; @@ -1285,7 +1135,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co }; } - if (p_render_data->view_count > 1) { + if (p_render_data->scene_data->view_count > 1) { color_pass_flags |= COLOR_PASS_FLAG_MULTIVIEW; } @@ -1309,20 +1159,17 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co ERR_FAIL(); //bug? } - scene_state.ubo.viewport_size[0] = screen_size.x; - scene_state.ubo.viewport_size[1] = screen_size.y; - - scene_state.ubo.emissive_exposure_normalization = -1.0; + p_render_data->scene_data->emissive_exposure_normalization = -1.0; RD::get_singleton()->draw_command_begin_label("Render Setup"); - _setup_lightmaps(p_render_data, *p_render_data->lightmaps, p_render_data->cam_transform); + _setup_lightmaps(p_render_data, *p_render_data->lightmaps, p_render_data->scene_data->cam_transform); _setup_voxelgis(*p_render_data->voxel_gi_instances); _setup_environment(p_render_data, p_render_data->reflection_probe.is_valid(), screen_size, !p_render_data->reflection_probe.is_valid(), p_default_bg_color, false); _update_render_base_uniform_set(); //may have changed due to the above (light buffer enlarged, as an example) - _fill_render_list(RENDER_LIST_OPAQUE, p_render_data, PASS_MODE_COLOR, using_sdfgi, using_sdfgi || using_voxelgi); + _fill_render_list(RENDER_LIST_OPAQUE, p_render_data, PASS_MODE_COLOR, color_pass_flags, using_sdfgi, using_sdfgi || using_voxelgi); render_list[RENDER_LIST_OPAQUE].sort_by_key(); render_list[RENDER_LIST_ALPHA].sort_by_reverse_depth_and_priority(); _fill_instance_data(RENDER_LIST_OPAQUE, p_render_data->render_info ? p_render_data->render_info->info[RS::VIEWPORT_RENDER_INFO_TYPE_VISIBLE] : (int *)nullptr); @@ -1396,20 +1243,20 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co if (draw_sky || draw_sky_fog_only || environment_get_reflection_source(p_render_data->environment) == RS::ENV_REFLECTION_SOURCE_SKY || environment_get_ambient_source(p_render_data->environment) == RS::ENV_AMBIENT_SOURCE_SKY) { RENDER_TIMESTAMP("Setup Sky"); RD::get_singleton()->draw_command_begin_label("Setup Sky"); - Projection projection = p_render_data->cam_projection; + Projection projection = p_render_data->scene_data->cam_projection; if (p_render_data->reflection_probe.is_valid()) { Projection correction; correction.set_depth_correction(true); - projection = correction * p_render_data->cam_projection; + projection = correction * p_render_data->scene_data->cam_projection; } - sky.setup(p_render_data->environment, rb, *p_render_data->lights, p_render_data->camera_attributes, projection, p_render_data->cam_transform, screen_size, this); + sky.setup(p_render_data->environment, rb, *p_render_data->lights, p_render_data->camera_attributes, projection, p_render_data->scene_data->cam_transform, screen_size, this); sky_energy_multiplier *= bg_energy_multiplier; RID sky_rid = environment_get_sky(p_render_data->environment); if (sky_rid.is_valid()) { - sky.update(p_render_data->environment, projection, p_render_data->cam_transform, time, sky_energy_multiplier); + sky.update(p_render_data->environment, projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); radiance_texture = sky.sky_get_radiance_texture_rd(sky_rid); } else { // do not try to draw sky if invalid @@ -1448,7 +1295,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_OPAQUE, nullptr, RID()); bool finish_depth = using_ssao || using_sdfgi || using_voxelgi; - RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, depth_pass_mode, 0, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->lod_camera_plane, p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, p_render_data->view_count); + RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, depth_pass_mode, 0, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_camera_plane, p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count); _render_list_with_threads(&render_list_params, depth_framebuffer, needs_pre_resolve ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, needs_pre_resolve ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_CLEAR, finish_depth ? RD::FINAL_ACTION_READ : RD::FINAL_ACTION_CONTINUE, needs_pre_resolve ? Vector<Color>() : depth_pass_clear); RD::get_singleton()->draw_command_end_label(); @@ -1488,8 +1335,8 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co RD::get_singleton()->draw_command_begin_label("Render Opaque Pass"); - scene_state.ubo.directional_light_count = p_render_data->directional_light_count; - scene_state.ubo.opaque_prepass_threshold = 0.0f; + p_render_data->scene_data->directional_light_count = p_render_data->directional_light_count; + p_render_data->scene_data->opaque_prepass_threshold = 0.0f; _setup_environment(p_render_data, p_render_data->reflection_probe.is_valid(), screen_size, !p_render_data->reflection_probe.is_valid(), p_default_bg_color, rb.is_valid()); @@ -1518,7 +1365,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co } } - RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, PASS_MODE_COLOR, color_pass_flags, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->lod_camera_plane, p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, p_render_data->view_count); + RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, PASS_MODE_COLOR, color_pass_flags, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_camera_plane, p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count); _render_list_with_threads(&render_list_params, color_framebuffer, keep_color ? RD::INITIAL_ACTION_KEEP : RD::INITIAL_ACTION_CLEAR, will_continue_color ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ, depth_pre_pass ? (continue_depth ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_KEEP) : RD::INITIAL_ACTION_CLEAR, will_continue_depth ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ, c, 1.0, 0); if (will_continue_color && using_separate_specular) { // close the specular framebuffer, as it's no longer used @@ -1536,7 +1383,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co Projection dc; dc.set_depth_correction(true); - Projection cm = (dc * p_render_data->cam_projection) * Projection(p_render_data->cam_transform.affine_inverse()); + Projection cm = (dc * p_render_data->scene_data->cam_projection) * Projection(p_render_data->scene_data->cam_transform.affine_inverse()); RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(color_only_framebuffer, RD::INITIAL_ACTION_CONTINUE, will_continue_color ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_CONTINUE, will_continue_depth ? RD::FINAL_ACTION_CONTINUE : RD::FINAL_ACTION_READ); RD::get_singleton()->draw_command_begin_label("Debug VoxelGIs"); for (int i = 0; i < (int)p_render_data->voxel_gi_instances->size(); i++) { @@ -1554,10 +1401,10 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co Projection dc; dc.set_depth_correction(true); Projection cms[RendererSceneRender::MAX_RENDER_VIEWS]; - for (uint32_t v = 0; v < p_render_data->view_count; v++) { - cms[v] = (dc * p_render_data->view_projection[v]) * Projection(p_render_data->cam_transform.affine_inverse()); + for (uint32_t v = 0; v < p_render_data->scene_data->view_count; v++) { + cms[v] = (dc * p_render_data->scene_data->view_projection[v]) * Projection(p_render_data->scene_data->cam_transform.affine_inverse()); } - _debug_sdfgi_probes(rb, color_only_framebuffer, p_render_data->view_count, cms, will_continue_color, will_continue_depth); + _debug_sdfgi_probes(rb, color_only_framebuffer, p_render_data->scene_data->view_count, cms, will_continue_color, will_continue_depth); } if (draw_sky || draw_sky_fog_only) { @@ -1568,10 +1415,10 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co if (p_render_data->reflection_probe.is_valid()) { Projection correction; correction.set_depth_correction(true); - Projection projection = correction * p_render_data->cam_projection; - sky.draw(p_render_data->environment, can_continue_color, can_continue_depth, color_only_framebuffer, 1, &projection, p_render_data->cam_transform, time, sky_energy_multiplier); + Projection projection = correction * p_render_data->scene_data->cam_projection; + sky.draw(p_render_data->environment, can_continue_color, can_continue_depth, color_only_framebuffer, 1, &projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); } else { - sky.draw(p_render_data->environment, can_continue_color, can_continue_depth, color_only_framebuffer, p_render_data->view_count, p_render_data->view_projection, p_render_data->cam_transform, time, sky_energy_multiplier); + sky.draw(p_render_data->environment, can_continue_color, can_continue_depth, color_only_framebuffer, p_render_data->scene_data->view_count, p_render_data->scene_data->view_projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); } RD::get_singleton()->draw_command_end_label(); } @@ -1598,7 +1445,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co if (using_sss) { RENDER_TIMESTAMP("Sub-Surface Scattering"); RD::get_singleton()->draw_command_begin_label("Process Sub-Surface Scattering"); - _process_sss(rb, p_render_data->cam_projection); + _process_sss(rb, p_render_data->scene_data->cam_projection); RD::get_singleton()->draw_command_end_label(); } @@ -1606,15 +1453,15 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co RENDER_TIMESTAMP("Screen-Space Reflections"); RD::get_singleton()->draw_command_begin_label("Process Screen-Space Reflections"); RID specular_views[RendererSceneRender::MAX_RENDER_VIEWS]; - for (uint32_t v = 0; v < p_render_data->view_count; v++) { + for (uint32_t v = 0; v < p_render_data->scene_data->view_count; v++) { specular_views[v] = rb_data->get_specular(v); } - _process_ssr(rb, color_only_framebuffer, normal_roughness_views, rb_data->get_specular(), specular_views, Color(0, 0, 0, 1), p_render_data->environment, p_render_data->view_projection, p_render_data->view_eye_offset, rb->get_msaa_3d() == RS::VIEWPORT_MSAA_DISABLED); + _process_ssr(rb, color_only_framebuffer, normal_roughness_views, rb_data->get_specular(), specular_views, p_render_data->environment, p_render_data->scene_data->view_projection, p_render_data->scene_data->view_eye_offset, rb->get_msaa_3d() == RS::VIEWPORT_MSAA_DISABLED); RD::get_singleton()->draw_command_end_label(); } else { //just mix specular back RENDER_TIMESTAMP("Merge Specular"); - copy_effects->merge_specular(color_only_framebuffer, rb_data->get_specular(), rb->get_msaa_3d() == RS::VIEWPORT_MSAA_DISABLED ? RID() : rb->get_internal_texture(), RID(), p_render_data->view_count); + copy_effects->merge_specular(color_only_framebuffer, rb_data->get_specular(), rb->get_msaa_3d() == RS::VIEWPORT_MSAA_DISABLED ? RID() : rb->get_internal_texture(), RID(), p_render_data->scene_data->view_count); } } @@ -1639,7 +1486,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co { uint32_t transparent_color_pass_flags = (color_pass_flags | COLOR_PASS_FLAG_TRANSPARENT) & ~(COLOR_PASS_FLAG_SEPARATE_SPECULAR); RID alpha_framebuffer = rb_data.is_valid() ? rb_data->get_color_pass_fb(transparent_color_pass_flags) : color_only_framebuffer; - RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), false, PASS_MODE_COLOR, transparent_color_pass_flags, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->lod_camera_plane, p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, p_render_data->view_count); + RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), false, PASS_MODE_COLOR, transparent_color_pass_flags, rb_data.is_null(), p_render_data->directional_light_soft_shadows, rp_uniform_set, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_camera_plane, p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count); _render_list_with_threads(&render_list_params, alpha_framebuffer, can_continue_color ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, can_continue_depth ? RD::INITIAL_ACTION_CONTINUE : RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ); } @@ -1670,7 +1517,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co if (rb.is_valid() && taa && rb->get_use_taa()) { RENDER_TIMESTAMP("TAA") - taa->process(rb, _render_buffers_get_color_format(), p_render_data->z_near, p_render_data->z_far); + taa->process(rb, _render_buffers_get_color_format(), p_render_data->scene_data->z_near, p_render_data->scene_data->z_far); } if (rb.is_valid()) { @@ -1691,39 +1538,41 @@ void RenderForwardClustered::_render_shadow_begin() { scene_state.instance_data[RENDER_LIST_SECONDARY].clear(); } -void RenderForwardClustered::_render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &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, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, const Rect2i &p_rect, bool p_flip_y, bool p_clear_region, bool p_begin, bool p_end, RendererScene::RenderInfo *p_render_info) { +void RenderForwardClustered::_render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &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, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, const Rect2i &p_rect, bool p_flip_y, bool p_clear_region, bool p_begin, bool p_end, RenderingMethod::RenderInfo *p_render_info) { uint32_t shadow_pass_index = scene_state.shadow_passes.size(); SceneState::ShadowPass shadow_pass; + RenderSceneDataRD scene_data; + scene_data.cam_projection = p_projection; + scene_data.cam_transform = p_transform; + scene_data.view_projection[0] = p_projection; + scene_data.z_far = p_zfar; + scene_data.z_near = 0.0; + scene_data.lod_camera_plane = p_camera_plane; + scene_data.lod_distance_multiplier = p_lod_distance_multiplier; + scene_data.dual_paraboloid_side = p_use_dp_flip ? -1 : 1; + scene_data.opaque_prepass_threshold = 0.1f; + RenderDataRD render_data; - render_data.cam_projection = p_projection; - render_data.cam_transform = p_transform; - render_data.view_projection[0] = p_projection; - render_data.z_far = p_zfar; - render_data.z_near = 0.0; + render_data.scene_data = &scene_data; render_data.cluster_size = 1; render_data.cluster_max_elements = 32; render_data.instances = &p_instances; - render_data.lod_camera_plane = p_camera_plane; - render_data.lod_distance_multiplier = p_lod_distance_multiplier; render_data.render_info = p_render_info; - scene_state.ubo.dual_paraboloid_side = p_use_dp_flip ? -1 : 1; - scene_state.ubo.opaque_prepass_threshold = 0.1f; - _setup_environment(&render_data, true, Vector2(1, 1), !p_flip_y, Color(), false, p_use_pancake, shadow_pass_index); if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_DISABLE_LOD) { - render_data.screen_mesh_lod_threshold = 0.0; + scene_data.screen_mesh_lod_threshold = 0.0; } else { - render_data.screen_mesh_lod_threshold = p_screen_mesh_lod_threshold; + scene_data.screen_mesh_lod_threshold = p_screen_mesh_lod_threshold; } PassMode pass_mode = p_use_dp ? PASS_MODE_SHADOW_DP : PASS_MODE_SHADOW; uint32_t render_list_from = render_list[RENDER_LIST_SECONDARY].elements.size(); - _fill_render_list(RENDER_LIST_SECONDARY, &render_data, pass_mode, false, false, true); + _fill_render_list(RENDER_LIST_SECONDARY, &render_data, pass_mode, 0, false, false, true); uint32_t render_list_size = render_list[RENDER_LIST_SECONDARY].elements.size() - render_list_from; render_list[RENDER_LIST_SECONDARY].sort_by_key_range(render_list_from, render_list_size); _fill_instance_data(RENDER_LIST_SECONDARY, p_render_info ? p_render_info->info[RS::VIEWPORT_RENDER_INFO_TYPE_SHADOW] : (int *)nullptr, render_list_from, render_list_size, false); @@ -1742,8 +1591,8 @@ void RenderForwardClustered::_render_shadow_append(RID p_framebuffer, const Page shadow_pass.rp_uniform_set = RID(); //will be filled later when instance buffer is complete shadow_pass.camera_plane = p_camera_plane; - shadow_pass.screen_mesh_lod_threshold = render_data.screen_mesh_lod_threshold; - shadow_pass.lod_distance_multiplier = render_data.lod_distance_multiplier; + shadow_pass.screen_mesh_lod_threshold = scene_data.screen_mesh_lod_threshold; + shadow_pass.lod_distance_multiplier = scene_data.lod_distance_multiplier; shadow_pass.framebuffer = p_framebuffer; shadow_pass.initial_depth_action = p_begin ? (p_clear_region ? RD::INITIAL_ACTION_CLEAR_REGION : RD::INITIAL_ACTION_CLEAR) : (p_clear_region ? RD::INITIAL_ACTION_CLEAR_REGION_CONTINUE : RD::INITIAL_ACTION_CONTINUE); @@ -1786,19 +1635,22 @@ void RenderForwardClustered::_render_particle_collider_heightfield(RID p_fb, con RD::get_singleton()->draw_command_begin_label("Render Collider Heightfield"); + RenderSceneDataRD scene_data; + scene_data.cam_projection = p_cam_projection; + scene_data.cam_transform = p_cam_transform; + scene_data.view_projection[0] = p_cam_projection; + scene_data.z_near = 0.0; + scene_data.z_far = p_cam_projection.get_z_far(); + scene_data.dual_paraboloid_side = 0; + scene_data.opaque_prepass_threshold = 0.0; + RenderDataRD render_data; - render_data.cam_projection = p_cam_projection; - render_data.cam_transform = p_cam_transform; - render_data.view_projection[0] = p_cam_projection; - render_data.z_near = 0.0; - render_data.z_far = p_cam_projection.get_z_far(); + render_data.scene_data = &scene_data; render_data.cluster_size = 1; render_data.cluster_max_elements = 32; render_data.instances = &p_instances; _update_render_base_uniform_set(); - scene_state.ubo.dual_paraboloid_side = 0; - scene_state.ubo.opaque_prepass_threshold = 0.0; _setup_environment(&render_data, true, Vector2(1, 1), true, Color(), false, false); @@ -1825,21 +1677,23 @@ void RenderForwardClustered::_render_material(const Transform3D &p_cam_transform RD::get_singleton()->draw_command_begin_label("Render 3D Material"); + RenderSceneDataRD scene_data; + scene_data.cam_projection = p_cam_projection; + scene_data.cam_transform = p_cam_transform; + scene_data.view_projection[0] = p_cam_projection; + scene_data.dual_paraboloid_side = 0; + scene_data.material_uv2_mode = false; + scene_data.opaque_prepass_threshold = 0.0f; + scene_data.emissive_exposure_normalization = p_exposure_normalization; + RenderDataRD render_data; - render_data.cam_projection = p_cam_projection; - render_data.cam_transform = p_cam_transform; - render_data.view_projection[0] = p_cam_projection; + render_data.scene_data = &scene_data; render_data.cluster_size = 1; render_data.cluster_max_elements = 32; render_data.instances = &p_instances; _update_render_base_uniform_set(); - scene_state.ubo.dual_paraboloid_side = 0; - scene_state.ubo.material_uv2_mode = false; - scene_state.ubo.opaque_prepass_threshold = 0.0f; - scene_state.ubo.emissive_exposure_normalization = p_exposure_normalization; - _setup_environment(&render_data, true, Vector2(1, 1), false, Color()); PassMode pass_mode = PASS_MODE_DEPTH_MATERIAL; @@ -1875,18 +1729,20 @@ void RenderForwardClustered::_render_uv2(const PagedArray<RenderGeometryInstance RD::get_singleton()->draw_command_begin_label("Render UV2"); + RenderSceneDataRD scene_data; + scene_data.dual_paraboloid_side = 0; + scene_data.material_uv2_mode = true; + scene_data.opaque_prepass_threshold = 0.0; + scene_data.emissive_exposure_normalization = -1.0; + RenderDataRD render_data; + render_data.scene_data = &scene_data; render_data.cluster_size = 1; render_data.cluster_max_elements = 32; render_data.instances = &p_instances; _update_render_base_uniform_set(); - scene_state.ubo.dual_paraboloid_side = 0; - scene_state.ubo.material_uv2_mode = true; - scene_state.ubo.opaque_prepass_threshold = 0.0; - scene_state.ubo.emissive_exposure_normalization = -1.0; - _setup_environment(&render_data, true, Vector2(1, 1), false, Color()); PassMode pass_mode = PASS_MODE_DEPTH_MATERIAL; @@ -1946,7 +1802,10 @@ void RenderForwardClustered::_render_sdfgi(Ref<RenderSceneBuffersRD> p_render_bu RD::get_singleton()->draw_command_begin_label("Render SDFGI Voxel"); + RenderSceneDataRD scene_data; + RenderDataRD render_data; + render_data.scene_data = &scene_data; render_data.cluster_size = 1; render_data.cluster_max_elements = 32; render_data.instances = &p_instances; @@ -1987,26 +1846,26 @@ void RenderForwardClustered::_render_sdfgi(Ref<RenderSceneBuffersRD> p_render_bu fb_size.x = p_size[right_axis]; fb_size.y = p_size[up_axis]; - render_data.cam_transform.origin = center + axis * half_extents; - render_data.cam_transform.basis.set_column(0, right); - render_data.cam_transform.basis.set_column(1, up); - render_data.cam_transform.basis.set_column(2, axis); + scene_data.cam_transform.origin = center + axis * half_extents; + scene_data.cam_transform.basis.set_column(0, right); + scene_data.cam_transform.basis.set_column(1, up); + scene_data.cam_transform.basis.set_column(2, axis); - //print_line("pass: " + itos(i) + " xform " + render_data.cam_transform); + //print_line("pass: " + itos(i) + " xform " + scene_data.cam_transform); float h_size = half_extents[right_axis]; float v_size = half_extents[up_axis]; float d_size = half_extents[i] * 2.0; - render_data.cam_projection.set_orthogonal(-h_size, h_size, -v_size, v_size, 0, d_size); + scene_data.cam_projection.set_orthogonal(-h_size, h_size, -v_size, v_size, 0, d_size); //print_line("pass: " + itos(i) + " cam hsize: " + rtos(h_size) + " vsize: " + rtos(v_size) + " dsize " + rtos(d_size)); Transform3D to_bounds; to_bounds.origin = p_bounds.position; to_bounds.basis.scale(p_bounds.size); - RendererRD::MaterialStorage::store_transform(to_bounds.affine_inverse() * render_data.cam_transform, scene_state.ubo.sdf_to_bounds); + RendererRD::MaterialStorage::store_transform(to_bounds.affine_inverse() * scene_data.cam_transform, scene_state.ubo.sdf_to_bounds); - scene_state.ubo.emissive_exposure_normalization = p_exposure_normalization; + scene_data.emissive_exposure_normalization = p_exposure_normalization; _setup_environment(&render_data, true, Vector2(1, 1), false, Color()); RID rp_uniform_set = _setup_sdfgi_render_pass_uniform_set(p_albedo_texture, p_emission_texture, p_emission_aniso_texture, p_geom_facing_texture); @@ -2248,6 +2107,13 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend { RD::Uniform u; u.binding = 1; + u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; + u.append_id(scene_state.implementation_uniform_buffers[p_index]); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 2; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; RID instance_buffer = scene_state.instance_buffer[p_render_list]; if (instance_buffer == RID()) { @@ -2264,16 +2130,15 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend radiance_texture = texture_storage->texture_rd_get_default(is_using_radiance_cubemap_array() ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_BLACK); } RD::Uniform u; - u.binding = 2; + u.binding = 3; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; u.append_id(radiance_texture); uniforms.push_back(u); } - { RID ref_texture = (p_render_data && p_render_data->reflection_atlas.is_valid()) ? reflection_atlas_get_texture(p_render_data->reflection_atlas) : RID(); RD::Uniform u; - u.binding = 3; + u.binding = 4; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; if (ref_texture.is_valid()) { u.append_id(ref_texture); @@ -2282,10 +2147,9 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend } uniforms.push_back(u); } - { RD::Uniform u; - u.binding = 4; + u.binding = 5; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID texture; if (p_render_data && p_render_data->shadow_atlas.is_valid()) { @@ -2299,7 +2163,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend } { RD::Uniform u; - u.binding = 5; + u.binding = 6; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; if (p_use_directional_shadow_atlas && directional_shadow_get_texture().is_valid()) { u.append_id(directional_shadow_get_texture()); @@ -2310,7 +2174,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend } { RD::Uniform u; - u.binding = 6; + u.binding = 7; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID default_tex = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); @@ -2329,7 +2193,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend } { RD::Uniform u; - u.binding = 7; + u.binding = 8; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID default_tex = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); for (int i = 0; i < MAX_VOXEL_GI_INSTANCESS; i++) { @@ -2349,7 +2213,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend { RD::Uniform u; - u.binding = 8; + u.binding = 9; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; RID cb = (p_render_data && p_render_data->cluster_buffer.is_valid()) ? p_render_data->cluster_buffer : scene_shader.default_vec4_xform_buffer; u.append_id(cb); @@ -2358,7 +2222,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend { RD::Uniform u; - u.binding = 9; + u.binding = 10; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID texture; if (rb.is_valid() && rb->has_texture(RB_SCOPE_BUFFERS, RB_TEX_BACK_DEPTH)) { @@ -2371,7 +2235,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend } { RD::Uniform u; - u.binding = 10; + u.binding = 11; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID bbt = rb_data.is_valid() ? rb->get_back_buffer_texture() : RID(); RID texture = bbt.is_valid() ? bbt : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); @@ -2380,110 +2244,108 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend } { - { - RD::Uniform u; - u.binding = 11; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID texture = rb_data.is_valid() && rb_data->has_normal_roughness() ? rb_data->get_normal_roughness() : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_NORMAL); - u.append_id(texture); - uniforms.push_back(u); - } + RD::Uniform u; + u.binding = 12; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID texture = rb_data.is_valid() && rb_data->has_normal_roughness() ? rb_data->get_normal_roughness() : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_NORMAL); + u.append_id(texture); + uniforms.push_back(u); + } - { - RD::Uniform u; - u.binding = 12; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID aot = rb_data.is_valid() ? rb->get_ao_texture() : RID(); - RID texture = aot.is_valid() ? aot : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); - u.append_id(texture); - uniforms.push_back(u); - } + { + RD::Uniform u; + u.binding = 13; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID aot = rb_data.is_valid() ? rb->get_ao_texture() : RID(); + RID texture = aot.is_valid() ? aot : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); + u.append_id(texture); + uniforms.push_back(u); + } - { - RD::Uniform u; - u.binding = 13; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID texture = rb_data.is_valid() && rb->has_texture(RB_SCOPE_GI, RB_TEX_AMBIENT) ? rb->get_texture(RB_SCOPE_GI, RB_TEX_AMBIENT) : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); - u.append_id(texture); - uniforms.push_back(u); - } + { + RD::Uniform u; + u.binding = 14; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID texture = rb_data.is_valid() && rb->has_texture(RB_SCOPE_GI, RB_TEX_AMBIENT) ? rb->get_texture(RB_SCOPE_GI, RB_TEX_AMBIENT) : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); + u.append_id(texture); + uniforms.push_back(u); + } - { - RD::Uniform u; - u.binding = 14; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID texture = rb_data.is_valid() && rb->has_texture(RB_SCOPE_GI, RB_TEX_REFLECTION) ? rb->get_texture(RB_SCOPE_GI, RB_TEX_REFLECTION) : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); - u.append_id(texture); - uniforms.push_back(u); + { + RD::Uniform u; + u.binding = 15; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID texture = rb_data.is_valid() && rb->has_texture(RB_SCOPE_GI, RB_TEX_REFLECTION) ? rb->get_texture(RB_SCOPE_GI, RB_TEX_REFLECTION) : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); + u.append_id(texture); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 16; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID t; + if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) { + Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); + t = sdfgi->lightprobe_texture; } - { - RD::Uniform u; - u.binding = 15; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID t; - if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) { - Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); - t = sdfgi->lightprobe_texture; - } - if (t.is_null()) { - t = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); - } - u.append_id(t); - uniforms.push_back(u); + if (t.is_null()) { + t = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); } - { - RD::Uniform u; - u.binding = 16; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID t; - if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) { - Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); - t = sdfgi->occlusion_texture; - } - if (t.is_null()) { - t = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); - } - u.append_id(t); - uniforms.push_back(u); + u.append_id(t); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 17; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID t; + if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) { + Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); + t = sdfgi->occlusion_texture; } - { - RD::Uniform u; - u.binding = 17; - u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; - RID voxel_gi; - if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_GI)) { - Ref<RendererRD::GI::RenderBuffersGI> rbgi = rb->get_custom_data(RB_SCOPE_GI); - voxel_gi = rbgi->get_voxel_gi_buffer(); - } - u.append_id(voxel_gi.is_valid() ? voxel_gi : render_buffers_get_default_voxel_gi_buffer()); - uniforms.push_back(u); + if (t.is_null()) { + t = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); } - { - RD::Uniform u; - u.binding = 18; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID vfog = RID(); - if (rb_data.is_valid() && rb->has_custom_data(RB_SCOPE_FOG)) { - Ref<RendererRD::Fog::VolumetricFog> fog = rb->get_custom_data(RB_SCOPE_FOG); - vfog = fog->fog_map; - if (vfog.is_null()) { - vfog = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); - } - } else { + u.append_id(t); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 18; + u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; + RID voxel_gi; + if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_GI)) { + Ref<RendererRD::GI::RenderBuffersGI> rbgi = rb->get_custom_data(RB_SCOPE_GI); + voxel_gi = rbgi->get_voxel_gi_buffer(); + } + u.append_id(voxel_gi.is_valid() ? voxel_gi : render_buffers_get_default_voxel_gi_buffer()); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 19; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID vfog = RID(); + if (rb_data.is_valid() && rb->has_custom_data(RB_SCOPE_FOG)) { + Ref<RendererRD::Fog::VolumetricFog> fog = rb->get_custom_data(RB_SCOPE_FOG); + vfog = fog->fog_map; + if (vfog.is_null()) { vfog = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); } - u.append_id(vfog); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.binding = 19; - u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID ssil = rb_data.is_valid() ? rb->get_ssil_texture() : RID(); - RID texture = ssil.is_valid() ? ssil : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); - u.append_id(texture); - uniforms.push_back(u); + } else { + vfog = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); } + u.append_id(vfog); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 20; + u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; + RID ssil = rb_data.is_valid() ? rb->get_ssil_texture() : RID(); + RID texture = ssil.is_valid() ? ssil : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); + u.append_id(texture); + uniforms.push_back(u); } return UniformSetCacheRD::get_singleton()->get_cache_vec(scene_shader.default_shader_rd, RENDER_PASS_UNIFORM_SET, uniforms); @@ -2503,6 +2365,13 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { RD::Uniform u; u.binding = 1; + u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; + u.append_id(scene_state.implementation_uniform_buffers[0]); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 2; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; RID instance_buffer = scene_state.instance_buffer[RENDER_LIST_SECONDARY]; if (instance_buffer == RID()) { @@ -2515,7 +2384,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te // No radiance texture. RID radiance_texture = texture_storage->texture_rd_get_default(is_using_radiance_cubemap_array() ? RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK : RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_BLACK); RD::Uniform u; - u.binding = 2; + u.binding = 3; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; u.append_id(radiance_texture); uniforms.push_back(u); @@ -2525,7 +2394,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te // No reflection atlas. RID ref_texture = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK); RD::Uniform u; - u.binding = 3; + u.binding = 4; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; u.append_id(ref_texture); uniforms.push_back(u); @@ -2534,7 +2403,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { // No shadow atlas. RD::Uniform u; - u.binding = 4; + u.binding = 5; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID texture = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_DEPTH); u.append_id(texture); @@ -2544,7 +2413,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { // No directional shadow atlas. RD::Uniform u; - u.binding = 5; + u.binding = 6; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID texture = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_DEPTH); u.append_id(texture); @@ -2554,7 +2423,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { // No Lightmaps RD::Uniform u; - u.binding = 6; + u.binding = 7; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID default_tex = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE); @@ -2568,7 +2437,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { // No VoxelGIs RD::Uniform u; - u.binding = 7; + u.binding = 8; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; RID default_tex = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE); @@ -2581,7 +2450,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { RD::Uniform u; - u.binding = 8; + u.binding = 9; u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; RID cb = scene_shader.default_vec4_xform_buffer; u.append_id(cb); @@ -2593,28 +2462,28 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te { RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 9; + u.binding = 10; u.append_id(p_albedo_texture); uniforms.push_back(u); } { RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 10; + u.binding = 11; u.append_id(p_emission_texture); uniforms.push_back(u); } { RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 11; + u.binding = 12; u.append_id(p_emission_aniso_texture); uniforms.push_back(u); } { RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 12; + u.binding = 13; u.append_id(p_geom_facing_texture); uniforms.push_back(u); } @@ -2925,6 +2794,7 @@ void RenderForwardClustered::_geometry_instance_update(RenderGeometryInstance *p ginstance->transforms_uniform_set = mesh_storage->multimesh_get_3d_uniform_set(ginstance->data->base, scene_shader.default_shader_rd, TRANSFORMS_UNIFORM_SET); } else if (ginstance->data->base_type == RS::INSTANCE_PARTICLES) { + ginstance->base_flags |= INSTANCE_DATA_FLAG_PARTICLES; ginstance->base_flags |= INSTANCE_DATA_FLAG_MULTIMESH; ginstance->base_flags |= INSTANCE_DATA_FLAG_MULTIMESH_HAS_COLOR; @@ -3195,6 +3065,9 @@ RenderForwardClustered::~RenderForwardClustered() { for (uint32_t i = 0; i < scene_state.uniform_buffers.size(); i++) { RD::get_singleton()->free(scene_state.uniform_buffers[i]); } + for (uint32_t i = 0; i < scene_state.implementation_uniform_buffers.size(); i++) { + RD::get_singleton()->free(scene_state.implementation_uniform_buffers[i]); + } RD::get_singleton()->free(scene_state.lightmap_buffer); RD::get_singleton()->free(scene_state.lightmap_capture_buffer); for (uint32_t i = 0; i < RENDER_LIST_MAX; i++) { diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h index 35379cd69b..cde241f231 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h @@ -37,7 +37,7 @@ #include "servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h" #include "servers/rendering/renderer_rd/pipeline_cache_rd.h" #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h" -#include "servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl.gen.h" +#include "servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl.gen.h" #include "servers/rendering/renderer_rd/storage_rd/utilities.h" #define RB_SCOPE_FORWARD_CLUSTERED SNAME("forward_clustered") @@ -231,13 +231,14 @@ class RenderForwardClustered : public RendererSceneRenderRD { }; enum { - INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 5, - INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 6, - INSTANCE_DATA_FLAG_USE_SDFGI = 1 << 7, - INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 8, - INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 9, - INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 10, - INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 11, + INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 4, + INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 5, + INSTANCE_DATA_FLAG_USE_SDFGI = 1 << 6, + INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 7, + INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 8, + INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 9, + INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 10, + INSTANCE_DATA_FLAG_PARTICLES = 1 << 11, INSTANCE_DATA_FLAG_MULTIMESH = 1 << 12, INSTANCE_DATA_FLAG_MULTIMESH_FORMAT_2D = 1 << 13, INSTANCE_DATA_FLAG_MULTIMESH_HAS_COLOR = 1 << 14, @@ -249,61 +250,22 @@ class RenderForwardClustered : public RendererSceneRenderRD { }; struct SceneState { - // This struct is loaded into Set 1 - Binding 0, populated at start of rendering a frame, must match with shader code + // This struct is loaded into Set 1 - Binding 1, populated at start of rendering a frame, must match with shader code struct UBO { - float projection_matrix[16]; - float inv_projection_matrix[16]; - float inv_view_matrix[16]; - float view_matrix[16]; - - float projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; - float inv_projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; - float eye_offset[RendererSceneRender::MAX_RENDER_VIEWS][4]; - - float viewport_size[2]; - float screen_pixel_size[2]; - uint32_t cluster_shift; uint32_t cluster_width; uint32_t cluster_type_size; uint32_t max_cluster_element_count_div_32; - float directional_penumbra_shadow_kernel[128]; //32 vec4s - float directional_soft_shadow_kernel[128]; - float penumbra_shadow_kernel[128]; - float soft_shadow_kernel[128]; - - float ambient_light_color_energy[4]; - - float ambient_color_sky_mix; - uint32_t use_ambient_light; - uint32_t use_ambient_cubemap; - uint32_t use_reflection_cubemap; - - float radiance_inverse_xform[12]; - - float shadow_atlas_pixel_size[2]; - float directional_shadow_pixel_size[2]; - - uint32_t directional_light_count; - float dual_paraboloid_side; - float z_far; - float z_near; - uint32_t ss_effects_flags; float ssao_light_affect; float ssao_ao_affect; - uint32_t roughness_limiter_enabled; - - float roughness_limiter_amount; - float roughness_limiter_limit; - float opaque_prepass_threshold; - uint32_t roughness_limiter_pad; + uint32_t pad1; float sdf_to_bounds[16]; int32_t sdf_offset[3]; - uint32_t material_uv2_mode; + uint32_t pad2; int32_t sdf_size[3]; uint32_t gi_upscale_for_msaa; @@ -312,32 +274,13 @@ class RenderForwardClustered : public RendererSceneRenderRD { float volumetric_fog_inv_length; float volumetric_fog_detail_spread; uint32_t volumetric_fog_pad; - - // Fog - uint32_t fog_enabled; - float fog_density; - float fog_height; - float fog_height_density; - - float fog_light_color[3]; - float fog_sun_scatter; - - float fog_aerial_perspective; - - float time; - float reflection_multiplier; - - uint32_t pancake_shadows; - - float taa_jitter[2]; - float emissive_exposure_normalization; // Needed to normalize emissive when using physical units. - float IBL_exposure_normalization; }; struct PushConstant { uint32_t base_index; // uint32_t uv_offset; //packed - uint32_t pad[2]; + uint32_t multimesh_motion_vectors_current_offset; + uint32_t multimesh_motion_vectors_previous_offset; }; struct InstanceData { @@ -350,11 +293,10 @@ class RenderForwardClustered : public RendererSceneRenderRD { float lightmap_uv_scale[4]; }; - UBO ubo_data[2]; - UBO &ubo = ubo_data[0]; - UBO &prev_ubo = ubo_data[1]; + UBO ubo; LocalVector<RID> uniform_buffers; + LocalVector<RID> implementation_uniform_buffers; LightmapData lightmaps[MAX_LIGHTMAPS]; RID lightmap_ids[MAX_LIGHTMAPS]; @@ -429,7 +371,7 @@ class RenderForwardClustered : public RendererSceneRenderRD { void _update_instance_data_buffer(RenderListType p_render_list); void _fill_instance_data(RenderListType p_render_list, int *p_render_info = nullptr, uint32_t p_offset = 0, int32_t p_max_elements = -1, bool p_update_buffer = true); - void _fill_render_list(RenderListType p_render_list, const RenderDataRD *p_render_data, PassMode p_pass_mode, bool p_using_sdfgi = false, bool p_using_opaque_gi = false, bool p_append = false); + void _fill_render_list(RenderListType p_render_list, const RenderDataRD *p_render_data, PassMode p_pass_mode, uint32_t p_color_pass_flags, bool p_using_sdfgi = false, bool p_using_opaque_gi = false, bool p_append = false); HashMap<Size2i, RID> sdfgi_framebuffer_size_cache; @@ -622,7 +564,7 @@ protected: virtual void _render_scene(RenderDataRD *p_render_data, const Color &p_default_bg_color) override; virtual void _render_shadow_begin() override; - virtual void _render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &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, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0.0, float p_screen_mesh_lod_threshold = 0.0, const Rect2i &p_rect = Rect2i(), bool p_flip_y = false, bool p_clear_region = true, bool p_begin = true, bool p_end = true, RendererScene::RenderInfo *p_render_info = nullptr) override; + virtual void _render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &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, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0.0, float p_screen_mesh_lod_threshold = 0.0, const Rect2i &p_rect = Rect2i(), bool p_flip_y = false, bool p_clear_region = true, bool p_begin = true, bool p_end = true, RenderingMethod::RenderInfo *p_render_info = nullptr) override; virtual void _render_shadow_process() override; virtual void _render_shadow_end(uint32_t p_barrier = RD::BARRIER_MASK_ALL) override; diff --git a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h index c2f56eb164..a9a9fa94de 100644 --- a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h @@ -32,7 +32,7 @@ #define SCENE_SHADER_FORWARD_CLUSTERED_H #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h" -#include "servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl.gen.h" +#include "servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl.gen.h" namespace RendererSceneRenderImplementation { diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp index 46d90e75fb..6c1b69148c 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp @@ -504,8 +504,20 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color RENDER_TIMESTAMP("Setup 3D Scene"); - scene_state.ubo.directional_light_count = 0; - scene_state.ubo.opaque_prepass_threshold = 0.0; + /* TODO + // check if we need motion vectors + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_MOTION_VECTORS) { + p_render_data->scene_data->calculate_motion_vectors = true; + } else if (render target has velocity override) { // TODO + p_render_data->scene_data->calculate_motion_vectors = true; + } else { + p_render_data->scene_data->calculate_motion_vectors = false; + } + */ + p_render_data->scene_data->calculate_motion_vectors = false; // for now, not yet supported... + + p_render_data->scene_data->directional_light_count = 0; + p_render_data->scene_data->opaque_prepass_threshold = 0.0; // We can only use our full subpass approach if we're: // - not reading from SCREEN_TEXTURE/DEPTH_TEXTURE @@ -581,13 +593,11 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color ERR_FAIL(); //bug? } - scene_state.ubo.viewport_size[0] = screen_size.x; - scene_state.ubo.viewport_size[1] = screen_size.y; - scene_state.ubo.emissive_exposure_normalization = -1.0; + p_render_data->scene_data->emissive_exposure_normalization = -1.0; RD::get_singleton()->draw_command_begin_label("Render Setup"); - _setup_lightmaps(p_render_data, *p_render_data->lightmaps, p_render_data->cam_transform); + _setup_lightmaps(p_render_data, *p_render_data->lightmaps, p_render_data->scene_data->cam_transform); _setup_environment(p_render_data, p_render_data->reflection_probe.is_valid(), screen_size, !p_render_data->reflection_probe.is_valid(), p_default_bg_color, false); _update_render_base_uniform_set(); //may have changed due to the above (light buffer enlarged, as an example) @@ -658,20 +668,20 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color if (draw_sky || draw_sky_fog_only || environment_get_reflection_source(p_render_data->environment) == RS::ENV_REFLECTION_SOURCE_SKY || environment_get_ambient_source(p_render_data->environment) == RS::ENV_AMBIENT_SOURCE_SKY) { RENDER_TIMESTAMP("Setup Sky"); RD::get_singleton()->draw_command_begin_label("Setup Sky"); - Projection projection = p_render_data->cam_projection; + Projection projection = p_render_data->scene_data->cam_projection; if (p_render_data->reflection_probe.is_valid()) { Projection correction; correction.set_depth_correction(true); - projection = correction * p_render_data->cam_projection; + projection = correction * p_render_data->scene_data->cam_projection; } - sky.setup(p_render_data->environment, p_render_data->render_buffers, *p_render_data->lights, p_render_data->camera_attributes, projection, p_render_data->cam_transform, screen_size, this); + sky.setup(p_render_data->environment, p_render_data->render_buffers, *p_render_data->lights, p_render_data->camera_attributes, projection, p_render_data->scene_data->cam_transform, screen_size, this); sky_energy_multiplier *= bg_energy_multiplier; RID sky_rid = environment_get_sky(p_render_data->environment); if (sky_rid.is_valid()) { - sky.update(p_render_data->environment, projection, p_render_data->cam_transform, time, sky_energy_multiplier); + sky.update(p_render_data->environment, projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); radiance_texture = sky.sky_get_radiance_texture_rd(sky_rid); } else { // do not try to draw sky if invalid @@ -694,10 +704,10 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color if (p_render_data->reflection_probe.is_valid()) { Projection correction; correction.set_depth_correction(true); - Projection projection = correction * p_render_data->cam_projection; - sky.update_res_buffers(p_render_data->environment, 1, &projection, p_render_data->cam_transform, time, sky_energy_multiplier); + Projection projection = correction * p_render_data->scene_data->cam_projection; + sky.update_res_buffers(p_render_data->environment, 1, &projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); } else { - sky.update_res_buffers(p_render_data->environment, p_render_data->view_count, p_render_data->view_projection, p_render_data->cam_transform, time, sky_energy_multiplier); + sky.update_res_buffers(p_render_data->environment, p_render_data->scene_data->view_count, p_render_data->scene_data->view_projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); } RD::get_singleton()->draw_command_end_label(); // Setup Sky resolution buffers @@ -719,7 +729,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color spec_constant_base_flags |= 1 << SPEC_CONSTANT_DISABLE_DIRECTIONAL_LIGHTS; } - if (!is_environment(p_render_data->environment) || environment_get_fog_enabled(p_render_data->environment)) { + if (!is_environment(p_render_data->environment) || !environment_get_fog_enabled(p_render_data->environment)) { spec_constant_base_flags |= 1 << SPEC_CONSTANT_DISABLE_FOG; } } @@ -734,7 +744,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color RD::get_singleton()->draw_command_begin_label("Render Opaque Subpass"); - scene_state.ubo.directional_light_count = p_render_data->directional_light_count; + p_render_data->scene_data->directional_light_count = p_render_data->directional_light_count; _setup_environment(p_render_data, p_render_data->reflection_probe.is_valid(), screen_size, !p_render_data->reflection_probe.is_valid(), p_default_bg_color, p_render_data->render_buffers.is_valid()); @@ -765,7 +775,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color } RD::FramebufferFormatID fb_format = RD::get_singleton()->framebuffer_get_format(framebuffer); - RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, PASS_MODE_COLOR, rp_uniform_set, spec_constant_base_flags, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->lod_camera_plane, p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, p_render_data->view_count); + RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].element_info.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, PASS_MODE_COLOR, rp_uniform_set, spec_constant_base_flags, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_camera_plane, p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count); render_list_params.framebuffer_format = fb_format; if ((uint32_t)render_list_params.element_count > render_list_thread_threshold && false) { // secondary command buffers need more testing at this time @@ -793,10 +803,10 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color if (p_render_data->reflection_probe.is_valid()) { Projection correction; correction.set_depth_correction(true); - Projection projection = correction * p_render_data->cam_projection; - sky.draw(draw_list, p_render_data->environment, framebuffer, 1, &projection, p_render_data->cam_transform, time, sky_energy_multiplier); + Projection projection = correction * p_render_data->scene_data->cam_projection; + sky.draw(draw_list, p_render_data->environment, framebuffer, 1, &projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); } else { - sky.draw(draw_list, p_render_data->environment, framebuffer, p_render_data->view_count, p_render_data->view_projection, p_render_data->cam_transform, time, sky_energy_multiplier); + sky.draw(draw_list, p_render_data->environment, framebuffer, p_render_data->scene_data->view_count, p_render_data->scene_data->view_projection, p_render_data->scene_data->cam_transform, time, sky_energy_multiplier); } RD::get_singleton()->draw_command_end_label(); // Draw Sky Subpass @@ -832,7 +842,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color if (using_subpass_transparent) { RD::FramebufferFormatID fb_format = RD::get_singleton()->framebuffer_get_format(framebuffer); - RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), reverse_cull, PASS_MODE_COLOR_TRANSPARENT, rp_uniform_set, spec_constant_base_flags, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->lod_camera_plane, p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, p_render_data->view_count); + RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), reverse_cull, PASS_MODE_COLOR_TRANSPARENT, rp_uniform_set, spec_constant_base_flags, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_camera_plane, p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count); render_list_params.framebuffer_format = fb_format; if ((uint32_t)render_list_params.element_count > render_list_thread_threshold && false) { // secondary command buffers need more testing at this time @@ -871,7 +881,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color // _setup_environment(p_render_data, p_render_data->reflection_probe.is_valid(), screen_size, !p_render_data->reflection_probe.is_valid(), p_default_bg_color, false); RD::FramebufferFormatID fb_format = RD::get_singleton()->framebuffer_get_format(framebuffer); - RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), reverse_cull, PASS_MODE_COLOR, rp_uniform_set, spec_constant_base_flags, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->lod_camera_plane, p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, p_render_data->view_count); + RenderListParameters render_list_params(render_list[RENDER_LIST_ALPHA].elements.ptr(), render_list[RENDER_LIST_ALPHA].element_info.ptr(), render_list[RENDER_LIST_ALPHA].elements.size(), reverse_cull, PASS_MODE_COLOR, rp_uniform_set, spec_constant_base_flags, get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME, Vector2(), p_render_data->scene_data->lod_camera_plane, p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, p_render_data->scene_data->view_count); render_list_params.framebuffer_format = fb_format; if ((uint32_t)render_list_params.element_count > render_list_thread_threshold && false) { // secondary command buffers need more testing at this time @@ -919,7 +929,7 @@ void RenderForwardMobile::_render_shadow_begin() { render_list[RENDER_LIST_SECONDARY].clear(); } -void RenderForwardMobile::_render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &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, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, const Rect2i &p_rect, bool p_flip_y, bool p_clear_region, bool p_begin, bool p_end, RendererScene::RenderInfo *p_render_info) { +void RenderForwardMobile::_render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &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, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, const Rect2i &p_rect, bool p_flip_y, bool p_clear_region, bool p_begin, bool p_end, RenderingMethod::RenderInfo *p_render_info) { uint32_t shadow_pass_index = scene_state.shadow_passes.size(); SceneState::ShadowPass shadow_pass; @@ -928,26 +938,29 @@ void RenderForwardMobile::_render_shadow_append(RID p_framebuffer, const PagedAr p_render_info->info[RS::VIEWPORT_RENDER_INFO_TYPE_SHADOW][RS::VIEWPORT_RENDER_INFO_DRAW_CALLS_IN_FRAME] = p_instances.size(); p_render_info->info[RS::VIEWPORT_RENDER_INFO_TYPE_SHADOW][RS::VIEWPORT_RENDER_INFO_OBJECTS_IN_FRAME] = p_instances.size(); } + + RenderSceneDataRD scene_data; + scene_data.cam_projection = p_projection; + scene_data.cam_transform = p_transform; + scene_data.view_projection[0] = p_projection; + scene_data.z_near = 0.0; + scene_data.z_far = p_zfar; + scene_data.lod_camera_plane = p_camera_plane; + scene_data.lod_distance_multiplier = p_lod_distance_multiplier; + scene_data.dual_paraboloid_side = p_use_dp_flip ? -1 : 1; + scene_data.opaque_prepass_threshold = 0.1; + RenderDataRD render_data; - render_data.cam_projection = p_projection; - render_data.cam_transform = p_transform; - render_data.view_projection[0] = p_projection; - render_data.z_near = 0.0; - render_data.z_far = p_zfar; + render_data.scene_data = &scene_data; render_data.instances = &p_instances; render_data.render_info = p_render_info; - render_data.lod_camera_plane = p_camera_plane; - render_data.lod_distance_multiplier = p_lod_distance_multiplier; - - scene_state.ubo.dual_paraboloid_side = p_use_dp_flip ? -1 : 1; - scene_state.ubo.opaque_prepass_threshold = 0.1; _setup_environment(&render_data, true, Vector2(1, 1), !p_flip_y, Color(), false, p_use_pancake, shadow_pass_index); if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_DISABLE_LOD) { - render_data.screen_mesh_lod_threshold = 0.0; + scene_data.screen_mesh_lod_threshold = 0.0; } else { - render_data.screen_mesh_lod_threshold = p_screen_mesh_lod_threshold; + scene_data.screen_mesh_lod_threshold = p_screen_mesh_lod_threshold; } PassMode pass_mode = p_use_dp ? PASS_MODE_SHADOW_DP : PASS_MODE_SHADOW; @@ -972,8 +985,8 @@ void RenderForwardMobile::_render_shadow_append(RID p_framebuffer, const PagedAr shadow_pass.rp_uniform_set = RID(); //will be filled later when instance buffer is complete shadow_pass.camera_plane = p_camera_plane; - shadow_pass.screen_mesh_lod_threshold = render_data.screen_mesh_lod_threshold; - shadow_pass.lod_distance_multiplier = render_data.lod_distance_multiplier; + shadow_pass.screen_mesh_lod_threshold = scene_data.screen_mesh_lod_threshold; + shadow_pass.lod_distance_multiplier = scene_data.lod_distance_multiplier; shadow_pass.framebuffer = p_framebuffer; shadow_pass.initial_depth_action = p_begin ? (p_clear_region ? RD::INITIAL_ACTION_CLEAR_REGION : RD::INITIAL_ACTION_CLEAR) : (p_clear_region ? RD::INITIAL_ACTION_CLEAR_REGION_CONTINUE : RD::INITIAL_ACTION_CONTINUE); @@ -1020,15 +1033,17 @@ void RenderForwardMobile::_render_material(const Transform3D &p_cam_transform, c _update_render_base_uniform_set(); - scene_state.ubo.dual_paraboloid_side = 0; - scene_state.ubo.material_uv2_mode = false; - scene_state.ubo.opaque_prepass_threshold = 0.0f; - scene_state.ubo.emissive_exposure_normalization = p_exposure_normalization; + RenderSceneDataRD scene_data; + scene_data.cam_projection = p_cam_projection; + scene_data.cam_transform = p_cam_transform; + scene_data.view_projection[0] = p_cam_projection; + scene_data.dual_paraboloid_side = 0; + scene_data.material_uv2_mode = false; + scene_data.opaque_prepass_threshold = 0.0f; + scene_data.emissive_exposure_normalization = p_exposure_normalization; RenderDataRD render_data; - render_data.cam_projection = p_cam_projection; - render_data.cam_transform = p_cam_transform; - render_data.view_projection[0] = p_cam_projection; + render_data.scene_data = &scene_data; render_data.instances = &p_instances; _setup_environment(&render_data, true, Vector2(1, 1), false, Color()); @@ -1067,11 +1082,13 @@ void RenderForwardMobile::_render_uv2(const PagedArray<RenderGeometryInstance *> _update_render_base_uniform_set(); - scene_state.ubo.dual_paraboloid_side = 0; - scene_state.ubo.material_uv2_mode = true; - scene_state.ubo.emissive_exposure_normalization = -1.0; + RenderSceneDataRD scene_data; + scene_data.dual_paraboloid_side = 0; + scene_data.material_uv2_mode = true; + scene_data.emissive_exposure_normalization = -1.0; RenderDataRD render_data; + render_data.scene_data = &scene_data; render_data.instances = &p_instances; _setup_environment(&render_data, true, Vector2(1, 1), false, Color()); @@ -1138,15 +1155,18 @@ void RenderForwardMobile::_render_particle_collider_heightfield(RID p_fb, const RD::get_singleton()->draw_command_begin_label("Render Collider Heightfield"); _update_render_base_uniform_set(); - scene_state.ubo.dual_paraboloid_side = 0; - scene_state.ubo.opaque_prepass_threshold = 0.0; + + RenderSceneDataRD scene_data; + scene_data.cam_projection = p_cam_projection; + scene_data.cam_transform = p_cam_transform; + scene_data.view_projection[0] = p_cam_projection; + scene_data.z_near = 0.0; + scene_data.z_far = p_cam_projection.get_z_far(); + scene_data.dual_paraboloid_side = 0; + scene_data.opaque_prepass_threshold = 0.0; RenderDataRD render_data; - render_data.cam_projection = p_cam_projection; - render_data.cam_transform = p_cam_transform; - render_data.view_projection[0] = p_cam_projection; - render_data.z_near = 0.0; - render_data.z_far = p_cam_projection.get_z_far(); + render_data.scene_data = &scene_data; render_data.instances = &p_instances; _setup_environment(&render_data, true, Vector2(1, 1), true, Color(), false, false); @@ -1385,9 +1405,9 @@ void RenderForwardMobile::_fill_render_list(RenderListType p_render_list, const } uint32_t lightmap_captures_used = 0; - Plane near_plane(-p_render_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->cam_transform.origin); - near_plane.d += p_render_data->cam_projection.get_z_near(); - float z_max = p_render_data->cam_projection.get_z_far() - p_render_data->cam_projection.get_z_near(); + Plane near_plane(-p_render_data->scene_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->scene_data->cam_transform.origin); + near_plane.d += p_render_data->scene_data->cam_projection.get_z_near(); + float z_max = p_render_data->scene_data->cam_projection.get_z_far() - p_render_data->scene_data->cam_projection.get_z_near(); RenderList *rl = &render_list[p_render_list]; @@ -1466,13 +1486,13 @@ void RenderForwardMobile::_fill_render_list(RenderListType p_render_list, const // LOD - if (p_render_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) { + if (p_render_data->scene_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) { //lod - Vector3 lod_support_min = inst->transformed_aabb.get_support(-p_render_data->lod_camera_plane.normal); - Vector3 lod_support_max = inst->transformed_aabb.get_support(p_render_data->lod_camera_plane.normal); + Vector3 lod_support_min = inst->transformed_aabb.get_support(-p_render_data->scene_data->lod_camera_plane.normal); + Vector3 lod_support_max = inst->transformed_aabb.get_support(p_render_data->scene_data->lod_camera_plane.normal); - float distance_min = p_render_data->lod_camera_plane.distance_to(lod_support_min); - float distance_max = p_render_data->lod_camera_plane.distance_to(lod_support_max); + float distance_min = p_render_data->scene_data->lod_camera_plane.distance_to(lod_support_min); + float distance_max = p_render_data->scene_data->lod_camera_plane.distance_to(lod_support_max); float distance = 0.0; @@ -1485,12 +1505,12 @@ void RenderForwardMobile::_fill_render_list(RenderListType p_render_list, const distance = -distance_max; } - if (p_render_data->cam_orthogonal) { + if (p_render_data->scene_data->cam_orthogonal) { distance = 1.0; } uint32_t indices; - surf->lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, distance * p_render_data->lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, &indices); + surf->lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, distance * p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, &indices); if (p_render_data->render_info) { indices = _indices_to_primitives(surf->primitive, indices); if (p_render_list == RENDER_LIST_OPAQUE) { //opaque @@ -1562,184 +1582,20 @@ void RenderForwardMobile::_fill_render_list(RenderListType p_render_list, const } void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data, bool p_no_fog, const Size2i &p_screen_size, bool p_flip_y, const Color &p_default_bg_color, bool p_opaque_render_buffers, bool p_pancake_shadows, int p_index) { - //!BAS! need to go through this and find out what we don't need anymore - - // This populates our UBO with main scene data that is pushed into set 1 - - //Projection projection = p_render_data->cam_projection; - //projection.flip_y(); // Vulkan and modern APIs use Y-Down - Projection correction; - correction.set_depth_correction(p_flip_y); - Projection projection = correction * p_render_data->cam_projection; - - //store camera into ubo - RendererRD::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix); - RendererRD::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix); - RendererRD::MaterialStorage::store_transform(p_render_data->cam_transform, scene_state.ubo.inv_view_matrix); - RendererRD::MaterialStorage::store_transform(p_render_data->cam_transform.affine_inverse(), scene_state.ubo.view_matrix); - - for (uint32_t v = 0; v < p_render_data->view_count; v++) { - projection = correction * p_render_data->view_projection[v]; - RendererRD::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix_view[v]); - RendererRD::MaterialStorage::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix_view[v]); - - scene_state.ubo.eye_offset[v][0] = p_render_data->view_eye_offset[v].x; - scene_state.ubo.eye_offset[v][1] = p_render_data->view_eye_offset[v].y; - scene_state.ubo.eye_offset[v][2] = p_render_data->view_eye_offset[v].z; - scene_state.ubo.eye_offset[v][3] = 0.0; - } - - scene_state.ubo.z_far = p_render_data->z_far; - scene_state.ubo.z_near = p_render_data->z_near; - - scene_state.ubo.pancake_shadows = p_pancake_shadows; - - RendererRD::MaterialStorage::store_soft_shadow_kernel(directional_penumbra_shadow_kernel_get(), scene_state.ubo.directional_penumbra_shadow_kernel); - RendererRD::MaterialStorage::store_soft_shadow_kernel(directional_soft_shadow_kernel_get(), scene_state.ubo.directional_soft_shadow_kernel); - RendererRD::MaterialStorage::store_soft_shadow_kernel(penumbra_shadow_kernel_get(), scene_state.ubo.penumbra_shadow_kernel); - RendererRD::MaterialStorage::store_soft_shadow_kernel(soft_shadow_kernel_get(), scene_state.ubo.soft_shadow_kernel); - - Size2 screen_pixel_size = Vector2(1.0, 1.0) / Size2(p_screen_size); - scene_state.ubo.screen_pixel_size[0] = screen_pixel_size.x; - scene_state.ubo.screen_pixel_size[1] = screen_pixel_size.y; - - if (p_render_data->shadow_atlas.is_valid()) { - Vector2 sas = shadow_atlas_get_size(p_render_data->shadow_atlas); - scene_state.ubo.shadow_atlas_pixel_size[0] = 1.0 / sas.x; - scene_state.ubo.shadow_atlas_pixel_size[1] = 1.0 / sas.y; - } - { - Vector2 dss = directional_shadow_get_size(); - scene_state.ubo.directional_shadow_pixel_size[0] = 1.0 / dss.x; - scene_state.ubo.directional_shadow_pixel_size[1] = 1.0 / dss.y; - } - - //time global variables - scene_state.ubo.time = time; - - if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_UNSHADED) { - scene_state.ubo.use_ambient_light = true; - scene_state.ubo.ambient_light_color_energy[0] = 1; - scene_state.ubo.ambient_light_color_energy[1] = 1; - scene_state.ubo.ambient_light_color_energy[2] = 1; - scene_state.ubo.ambient_light_color_energy[3] = 1.0; - scene_state.ubo.use_ambient_cubemap = false; - scene_state.ubo.use_reflection_cubemap = false; - scene_state.ubo.ssao_enabled = false; - - } else if (is_environment(p_render_data->environment)) { - RS::EnvironmentBG env_bg = environment_get_background(p_render_data->environment); - RS::EnvironmentAmbientSource ambient_src = environment_get_ambient_source(p_render_data->environment); - - float bg_energy_multiplier = environment_get_bg_energy_multiplier(p_render_data->environment); - - scene_state.ubo.ambient_light_color_energy[3] = bg_energy_multiplier; - - scene_state.ubo.ambient_color_sky_mix = environment_get_ambient_sky_contribution(p_render_data->environment); - - //ambient - if (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && (env_bg == RS::ENV_BG_CLEAR_COLOR || env_bg == RS::ENV_BG_COLOR)) { - Color color = env_bg == RS::ENV_BG_CLEAR_COLOR ? p_default_bg_color : environment_get_bg_color(p_render_data->environment); - color = color.srgb_to_linear(); - - scene_state.ubo.ambient_light_color_energy[0] = color.r * bg_energy_multiplier; - scene_state.ubo.ambient_light_color_energy[1] = color.g * bg_energy_multiplier; - scene_state.ubo.ambient_light_color_energy[2] = color.b * bg_energy_multiplier; - scene_state.ubo.use_ambient_light = true; - scene_state.ubo.use_ambient_cubemap = false; - } else { - float energy = environment_get_ambient_light_energy(p_render_data->environment); - Color color = environment_get_ambient_light(p_render_data->environment); - color = color.srgb_to_linear(); - scene_state.ubo.ambient_light_color_energy[0] = color.r * energy; - scene_state.ubo.ambient_light_color_energy[1] = color.g * energy; - scene_state.ubo.ambient_light_color_energy[2] = color.b * energy; - - Basis sky_transform = environment_get_sky_orientation(p_render_data->environment); - sky_transform = sky_transform.inverse() * p_render_data->cam_transform.basis; - RendererRD::MaterialStorage::store_transform_3x3(sky_transform, scene_state.ubo.radiance_inverse_xform); - - scene_state.ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY; - scene_state.ubo.use_ambient_light = scene_state.ubo.use_ambient_cubemap || ambient_src == RS::ENV_AMBIENT_SOURCE_COLOR; - } - - //specular - RS::EnvironmentReflectionSource ref_src = environment_get_reflection_source(p_render_data->environment); - if ((ref_src == RS::ENV_REFLECTION_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ref_src == RS::ENV_REFLECTION_SOURCE_SKY) { - scene_state.ubo.use_reflection_cubemap = true; - } else { - scene_state.ubo.use_reflection_cubemap = false; - } - - scene_state.ubo.ssao_enabled = p_opaque_render_buffers && environment_get_ssao_enabled(p_render_data->environment); - scene_state.ubo.ssao_ao_affect = environment_get_ssao_ao_channel_affect(p_render_data->environment); - scene_state.ubo.ssao_light_affect = environment_get_ssao_direct_light_affect(p_render_data->environment); - - scene_state.ubo.fog_enabled = environment_get_fog_enabled(p_render_data->environment); - scene_state.ubo.fog_density = environment_get_fog_density(p_render_data->environment); - scene_state.ubo.fog_height = environment_get_fog_height(p_render_data->environment); - scene_state.ubo.fog_height_density = environment_get_fog_height_density(p_render_data->environment); - scene_state.ubo.fog_aerial_perspective = environment_get_fog_aerial_perspective(p_render_data->environment); - - Color fog_color = environment_get_fog_light_color(p_render_data->environment).srgb_to_linear(); - float fog_energy = environment_get_fog_light_energy(p_render_data->environment); - - scene_state.ubo.fog_light_color[0] = fog_color.r * fog_energy; - scene_state.ubo.fog_light_color[1] = fog_color.g * fog_energy; - scene_state.ubo.fog_light_color[2] = fog_color.b * fog_energy; - - scene_state.ubo.fog_sun_scatter = environment_get_fog_sun_scatter(p_render_data->environment); - - } else { - if (p_render_data->reflection_probe.is_valid() && RendererRD::LightStorage::get_singleton()->reflection_probe_is_interior(reflection_probe_instance_get_probe(p_render_data->reflection_probe))) { - scene_state.ubo.use_ambient_light = false; - } else { - scene_state.ubo.use_ambient_light = true; - Color clear_color = p_default_bg_color; - clear_color = clear_color.srgb_to_linear(); - scene_state.ubo.ambient_light_color_energy[0] = clear_color.r; - scene_state.ubo.ambient_light_color_energy[1] = clear_color.g; - scene_state.ubo.ambient_light_color_energy[2] = clear_color.b; - scene_state.ubo.ambient_light_color_energy[3] = 1.0; - } - - scene_state.ubo.use_ambient_cubemap = false; - scene_state.ubo.use_reflection_cubemap = false; - scene_state.ubo.ssao_enabled = false; - } - - if (p_render_data->camera_attributes.is_valid()) { - scene_state.ubo.emissive_exposure_normalization = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes); - scene_state.ubo.IBL_exposure_normalization = 1.0; - if (is_environment(p_render_data->environment)) { - RID sky_rid = environment_get_sky(p_render_data->environment); - if (sky_rid.is_valid()) { - float current_exposure = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes) * environment_get_bg_intensity(p_render_data->environment) / _render_buffers_get_luminance_multiplier(); - scene_state.ubo.IBL_exposure_normalization = current_exposure / MAX(0.001, sky.sky_get_baked_exposure(sky_rid)); - } - } - } else if (scene_state.ubo.emissive_exposure_normalization > 0.0) { - // This branch is triggered when using render_material(). - // Emissive is set outside the function, so don't set it. - // IBL isn't used don't set it. - } else { - scene_state.ubo.emissive_exposure_normalization = 1.0; - scene_state.ubo.IBL_exposure_normalization = 1.0; - } - - scene_state.ubo.roughness_limiter_enabled = p_opaque_render_buffers && screen_space_roughness_limiter_is_active(); - scene_state.ubo.roughness_limiter_amount = screen_space_roughness_limiter_get_amount(); - scene_state.ubo.roughness_limiter_limit = screen_space_roughness_limiter_get_limit(); + Ref<RenderSceneBuffersRD> rd = p_render_data->render_buffers; + RID env = is_environment(p_render_data->environment) ? p_render_data->environment : RID(); + RID reflection_probe_instance = p_render_data->reflection_probe.is_valid() ? reflection_probe_instance_get_probe(p_render_data->reflection_probe) : RID(); + // May do this earlier in RenderSceneRenderRD::render_scene if (p_index >= (int)scene_state.uniform_buffers.size()) { uint32_t from = scene_state.uniform_buffers.size(); scene_state.uniform_buffers.resize(p_index + 1); - render_pass_uniform_sets.resize(p_index + 1); for (uint32_t i = from; i < scene_state.uniform_buffers.size(); i++) { - scene_state.uniform_buffers[i] = RD::get_singleton()->uniform_buffer_create(sizeof(SceneState::UBO)); + scene_state.uniform_buffers[i] = p_render_data->scene_data->create_uniform_buffer(); } } - RD::get_singleton()->buffer_update(scene_state.uniform_buffers[p_index], 0, sizeof(SceneState::UBO), &scene_state.ubo, RD::BARRIER_MASK_RASTER); + + p_render_data->scene_data->update_ubo(scene_state.uniform_buffers[p_index], get_debug_draw_mode(), env, reflection_probe_instance, p_render_data->camera_attributes, p_flip_y, p_pancake_shadows, p_screen_size, p_default_bg_color, _render_buffers_get_luminance_multiplier(), p_opaque_render_buffers); } void RenderForwardMobile::_fill_element_info(RenderListType p_render_list, uint32_t p_offset, int32_t p_max_elements) { diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h index da1cd85fb3..1b31d2749d 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h @@ -209,7 +209,7 @@ protected: virtual void _render_scene(RenderDataRD *p_render_data, const Color &p_default_bg_color) override; virtual void _render_shadow_begin() override; - virtual void _render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &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, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0.0, float p_screen_mesh_lod_threshold = 0.0, const Rect2i &p_rect = Rect2i(), bool p_flip_y = false, bool p_clear_region = true, bool p_begin = true, bool p_end = true, RendererScene::RenderInfo *p_render_info = nullptr) override; + virtual void _render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &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, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0.0, float p_screen_mesh_lod_threshold = 0.0, const Rect2i &p_rect = Rect2i(), bool p_flip_y = false, bool p_clear_region = true, bool p_begin = true, bool p_end = true, RenderingMethod::RenderInfo *p_render_info = nullptr) override; virtual void _render_shadow_process() override; virtual void _render_shadow_end(uint32_t p_barrier = RD::BARRIER_MASK_ALL) override; @@ -252,75 +252,6 @@ protected: /* Scene state */ struct SceneState { - // This struct is loaded into Set 1 - Binding 0, populated at start of rendering a frame, must match with shader code - struct UBO { - float projection_matrix[16]; - float inv_projection_matrix[16]; - float inv_view_matrix[16]; - float view_matrix[16]; - - float projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; - float inv_projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; - float eye_offset[RendererSceneRender::MAX_RENDER_VIEWS][4]; - - float viewport_size[2]; - float screen_pixel_size[2]; - - float directional_penumbra_shadow_kernel[128]; //32 vec4s - float directional_soft_shadow_kernel[128]; - float penumbra_shadow_kernel[128]; - float soft_shadow_kernel[128]; - - float ambient_light_color_energy[4]; - - float ambient_color_sky_mix; - uint32_t use_ambient_light; - uint32_t use_ambient_cubemap; - uint32_t use_reflection_cubemap; - - float radiance_inverse_xform[12]; - - float shadow_atlas_pixel_size[2]; - float directional_shadow_pixel_size[2]; - - uint32_t directional_light_count; - float dual_paraboloid_side; - float z_far; - float z_near; - - uint32_t ssao_enabled; - float ssao_light_affect; - float ssao_ao_affect; - uint32_t roughness_limiter_enabled; - - float roughness_limiter_amount; - float roughness_limiter_limit; - float opaque_prepass_threshold; - uint32_t roughness_limiter_pad; - - // Fog - uint32_t fog_enabled; - float fog_density; - float fog_height; - float fog_height_density; - - float fog_light_color[3]; - float fog_sun_scatter; - - float fog_aerial_perspective; - uint32_t material_uv2_mode; - - float time; - float reflection_multiplier; - - uint32_t pancake_shadows; - float emissive_exposure_normalization; // Needed to normalize emissive when using physical units. - float IBL_exposure_normalization; // Adjusts for baked exposure. - uint32_t pad3; - }; - - UBO ubo; - LocalVector<RID> uniform_buffers; // !BAS! We need to change lightmaps, we're not going to do this with a buffer but pushing the used lightmap in @@ -442,13 +373,14 @@ protected: // check which ones of these apply, probably all except GI and SDFGI enum { - INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 5, - INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 6, - INSTANCE_DATA_FLAG_USE_SDFGI = 1 << 7, - INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 8, - INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 9, - INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 10, - INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 11, + INSTANCE_DATA_FLAGS_NON_UNIFORM_SCALE = 1 << 4, + INSTANCE_DATA_FLAG_USE_GI_BUFFERS = 1 << 5, + INSTANCE_DATA_FLAG_USE_SDFGI = 1 << 6, + INSTANCE_DATA_FLAG_USE_LIGHTMAP_CAPTURE = 1 << 7, + INSTANCE_DATA_FLAG_USE_LIGHTMAP = 1 << 8, + INSTANCE_DATA_FLAG_USE_SH_LIGHTMAP = 1 << 9, + INSTANCE_DATA_FLAG_USE_VOXEL_GI = 1 << 10, + INSTANCE_DATA_FLAG_PARTICLES = 1 << 11, INSTANCE_DATA_FLAG_MULTIMESH = 1 << 12, INSTANCE_DATA_FLAG_MULTIMESH_FORMAT_2D = 1 << 13, INSTANCE_DATA_FLAG_MULTIMESH_HAS_COLOR = 1 << 14, diff --git a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h index 21270d7c62..f67665a02f 100644 --- a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h +++ b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h @@ -32,7 +32,7 @@ #define SCENE_SHADER_FORWARD_MOBILE_H #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h" -#include "servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl.gen.h" +#include "servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl.gen.h" namespace RendererSceneRenderImplementation { diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index ab3e3ebe51..0210151420 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -1362,9 +1362,12 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p default_repeat = p_default_repeat; } - //fill the list until rendering is possible. - bool material_screen_texture_found = false; Item *ci = p_item_list; + + //fill the list until rendering is possible. + bool material_screen_texture_cached = false; + bool material_screen_texture_mipmaps_cached = false; + Rect2 back_buffer_rect; bool backbuffer_copy = false; bool backbuffer_gen_mipmaps = false; @@ -1393,10 +1396,12 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p CanvasMaterialData *md = static_cast<CanvasMaterialData *>(material_storage->material_get_data(material, RendererRD::MaterialStorage::SHADER_TYPE_2D)); if (md && md->shader_data->valid) { if (md->shader_data->uses_screen_texture && canvas_group_owner == nullptr) { - if (!material_screen_texture_found) { + if (!material_screen_texture_cached) { backbuffer_copy = true; back_buffer_rect = Rect2(); backbuffer_gen_mipmaps = md->shader_data->uses_screen_texture_mipmaps; + } else if (!material_screen_texture_mipmaps_cached) { + backbuffer_gen_mipmaps = md->shader_data->uses_screen_texture_mipmaps; } } @@ -1486,7 +1491,15 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p backbuffer_copy = false; backbuffer_gen_mipmaps = false; - material_screen_texture_found = true; //after a backbuffer copy, screen texture makes no further copies + material_screen_texture_cached = true; // After a backbuffer copy, screen texture makes no further copies. + material_screen_texture_mipmaps_cached = backbuffer_gen_mipmaps; + } + + if (backbuffer_gen_mipmaps) { + texture_storage->render_target_gen_back_buffer_mipmaps(p_to_render_target, back_buffer_rect); + + backbuffer_gen_mipmaps = false; + material_screen_texture_mipmaps_cached = true; } items[item_count++] = ci; diff --git a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp index e7abcf5674..f169692ea0 100644 --- a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp @@ -299,14 +299,19 @@ RendererCompositorRD::RendererCompositorRD() { fog = memnew(RendererRD::Fog); canvas = memnew(RendererCanvasRenderRD()); - back_end = (bool)(int)GLOBAL_GET("rendering/vulkan/rendering/back_end"); + String rendering_method = GLOBAL_GET("rendering/renderer/rendering_method"); uint64_t textures_per_stage = RD::get_singleton()->limit_get(RD::LIMIT_MAX_TEXTURES_PER_SHADER_STAGE); - if (back_end || textures_per_stage < 48) { + if (rendering_method == "mobile" || textures_per_stage < 48) { scene = memnew(RendererSceneRenderImplementation::RenderForwardMobile()); - } else { // back_end == false + if (rendering_method == "forward_plus") { + WARN_PRINT_ONCE("Platform supports less than 48 textures per stage which is less than required by the Clustered renderer. Defaulting to Mobile renderer."); + } + } else if (rendering_method == "forward_plus") { // default to our high end renderer scene = memnew(RendererSceneRenderImplementation::RenderForwardClustered()); + } else { + ERR_FAIL_MSG("Cannot instantiate RenderingDevice-based renderer with renderer type " + rendering_method); } scene->init(); diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp index 78c83d1fb4..2190f41603 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp @@ -1328,7 +1328,7 @@ void RendererSceneRenderRD::_process_sss(Ref<RenderSceneBuffersRD> p_render_buff } } -void RendererSceneRenderRD::_process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_slices, RID p_specular_buffer, const RID *p_metallic_slices, const Color &p_metallic_mask, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive) { +void RendererSceneRenderRD::_process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_slices, RID p_specular_buffer, const RID *p_metallic_slices, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive) { ERR_FAIL_NULL(ss_effects); ERR_FAIL_COND(p_render_buffers.is_null()); @@ -1355,7 +1355,7 @@ void RendererSceneRenderRD::_process_ssr(Ref<RenderSceneBuffersRD> p_render_buff texture_slices[v] = p_render_buffers->get_internal_texture(v); depth_slices[v] = p_render_buffers->get_depth_texture(v); } - ss_effects->screen_space_reflection(p_render_buffers->ssr, texture_slices, p_normal_slices, ssr_roughness_quality, p_metallic_slices, p_metallic_mask, depth_slices, half_size, environment_get_ssr_max_steps(p_environment), environment_get_ssr_fade_in(p_environment), environment_get_ssr_fade_out(p_environment), environment_get_ssr_depth_tolerance(p_environment), view_count, p_projections, p_eye_offsets); + ss_effects->screen_space_reflection(p_render_buffers->ssr, texture_slices, p_normal_slices, ssr_roughness_quality, p_metallic_slices, depth_slices, half_size, environment_get_ssr_max_steps(p_environment), environment_get_ssr_fade_in(p_environment), environment_get_ssr_fade_out(p_environment), environment_get_ssr_depth_tolerance(p_environment), view_count, p_projections, p_eye_offsets); copy_effects->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : p_render_buffers->get_internal_texture(), p_render_buffers->ssr.output, view_count); } @@ -1492,7 +1492,7 @@ void RendererSceneRenderRD::_render_buffers_copy_depth_texture(const RenderDataR bool can_use_storage = _render_buffers_can_be_storage(); Size2i size = rb->get_internal_size(); - for (uint32_t v = 0; v < p_render_data->view_count; v++) { + for (uint32_t v = 0; v < p_render_data->scene_data->view_count; v++) { RID depth_texture = rb->get_depth_texture(v); RID depth_back_texture = rb->get_texture_slice(RB_SCOPE_BUFFERS, RB_TEX_BACK_DEPTH, v, 0); @@ -1544,9 +1544,9 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende buffers.depth_texture = rb->get_depth_texture(i); // In stereo p_render_data->z_near and p_render_data->z_far can be offset for our combined frustrum - float z_near = p_render_data->view_projection[i].get_z_near(); - float z_far = p_render_data->view_projection[i].get_z_far(); - bokeh_dof->bokeh_dof_compute(buffers, p_render_data->camera_attributes, z_near, z_far, p_render_data->cam_orthogonal); + float z_near = p_render_data->scene_data->view_projection[i].get_z_near(); + float z_far = p_render_data->scene_data->view_projection[i].get_z_far(); + bokeh_dof->bokeh_dof_compute(buffers, p_render_data->camera_attributes, z_near, z_far, p_render_data->scene_data->cam_orthogonal); }; } else { // Set framebuffers. @@ -1567,9 +1567,9 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende buffers.base_fb = FramebufferCacheRD::get_singleton()->get_cache(buffers.base_texture); // TODO move this into bokeh_dof_raster, we can do this internally // In stereo p_render_data->z_near and p_render_data->z_far can be offset for our combined frustrum - float z_near = p_render_data->view_projection[i].get_z_near(); - float z_far = p_render_data->view_projection[i].get_z_far(); - bokeh_dof->bokeh_dof_raster(buffers, p_render_data->camera_attributes, z_near, z_far, p_render_data->cam_orthogonal); + float z_near = p_render_data->scene_data->view_projection[i].get_z_near(); + float z_far = p_render_data->scene_data->view_projection[i].get_z_far(); + bokeh_dof->bokeh_dof_raster(buffers, p_render_data->camera_attributes, z_near, z_far, p_render_data->scene_data->cam_orthogonal); } } RD::get_singleton()->draw_command_end_label(); @@ -2901,8 +2901,8 @@ void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool render_state.shadows.clear(); render_state.directional_shadows.clear(); - Plane camera_plane(-p_render_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->cam_transform.origin); - float lod_distance_multiplier = p_render_data->cam_projection.get_lod_multiplier(); + Plane camera_plane(-p_render_data->scene_data->cam_transform.basis.get_column(Vector3::AXIS_Z), p_render_data->scene_data->cam_transform.origin); + float lod_distance_multiplier = p_render_data->scene_data->cam_projection.get_lod_multiplier(); { for (int i = 0; i < render_state.render_shadow_count; i++) { LightInstance *li = light_instance_owner.get_or_null(render_state.render_shadows[i].light); @@ -2918,7 +2918,7 @@ void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool //cube shadows are rendered in their own way for (uint32_t i = 0; i < render_state.cube_shadows.size(); i++) { - _render_shadow_pass(render_state.render_shadows[render_state.cube_shadows[i]].light, p_render_data->shadow_atlas, render_state.render_shadows[render_state.cube_shadows[i]].pass, render_state.render_shadows[render_state.cube_shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, true, true, true, p_render_data->render_info); + _render_shadow_pass(render_state.render_shadows[render_state.cube_shadows[i]].light, p_render_data->shadow_atlas, render_state.render_shadows[render_state.cube_shadows[i]].pass, render_state.render_shadows[render_state.cube_shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, true, true, true, p_render_data->render_info); } if (render_state.directional_shadows.size()) { @@ -2948,11 +2948,11 @@ void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool //render directional shadows for (uint32_t i = 0; i < render_state.directional_shadows.size(); i++) { - _render_shadow_pass(render_state.render_shadows[render_state.directional_shadows[i]].light, p_render_data->shadow_atlas, render_state.render_shadows[render_state.directional_shadows[i]].pass, render_state.render_shadows[render_state.directional_shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, false, i == render_state.directional_shadows.size() - 1, false, p_render_data->render_info); + _render_shadow_pass(render_state.render_shadows[render_state.directional_shadows[i]].light, p_render_data->shadow_atlas, render_state.render_shadows[render_state.directional_shadows[i]].pass, render_state.render_shadows[render_state.directional_shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, false, i == render_state.directional_shadows.size() - 1, false, p_render_data->render_info); } //render positional shadows for (uint32_t i = 0; i < render_state.shadows.size(); i++) { - _render_shadow_pass(render_state.render_shadows[render_state.shadows[i]].light, p_render_data->shadow_atlas, render_state.render_shadows[render_state.shadows[i]].pass, render_state.render_shadows[render_state.shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->screen_mesh_lod_threshold, i == 0, i == render_state.shadows.size() - 1, true, p_render_data->render_info); + _render_shadow_pass(render_state.render_shadows[render_state.shadows[i]].light, p_render_data->shadow_atlas, render_state.render_shadows[render_state.shadows[i]].pass, render_state.render_shadows[render_state.shadows[i]].instances, camera_plane, lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, i == 0, i == render_state.shadows.size() - 1, true, p_render_data->render_info); } _render_shadow_process(); @@ -2960,7 +2960,7 @@ void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool //start GI if (render_gi) { - gi.process_gi(p_render_data->render_buffers, p_normal_roughness_slices, p_voxel_gi_buffer, p_render_data->environment, p_render_data->view_count, p_render_data->view_projection, p_render_data->view_eye_offset, p_render_data->cam_transform, *p_render_data->voxel_gi_instances); + gi.process_gi(p_render_data->render_buffers, p_normal_roughness_slices, p_voxel_gi_buffer, p_render_data->environment, p_render_data->scene_data->view_count, p_render_data->scene_data->view_projection, p_render_data->scene_data->view_eye_offset, p_render_data->scene_data->cam_transform, *p_render_data->voxel_gi_instances); } //Do shadow rendering (in parallel with GI) @@ -2999,17 +2999,17 @@ void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool } RID depth_texture = rb->get_depth_texture(); - ss_effects->downsample_depth(depth_texture, rb->ss_effects.linear_depth_slices, ssao_quality, ssil_quality, invalidate_uniform_set, ssao_half_size, ssil_half_size, size, p_render_data->cam_projection); + ss_effects->downsample_depth(depth_texture, rb->ss_effects.linear_depth_slices, ssao_quality, ssil_quality, invalidate_uniform_set, ssao_half_size, ssil_half_size, size, p_render_data->scene_data->cam_projection); } if (p_use_ssao) { // TODO make these proper stereo - _process_ssao(p_render_data->render_buffers, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->cam_projection); + _process_ssao(p_render_data->render_buffers, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->scene_data->cam_projection); } if (p_use_ssil) { // TODO make these proper stereo - _process_ssil(p_render_data->render_buffers, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->cam_projection, p_render_data->cam_transform); + _process_ssil(p_render_data->render_buffers, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->scene_data->cam_projection, p_render_data->scene_data->cam_transform); } } @@ -3017,7 +3017,7 @@ void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool RD::get_singleton()->barrier(RD::BARRIER_MASK_ALL, RD::BARRIER_MASK_ALL); if (current_cluster_builder) { - current_cluster_builder->begin(p_render_data->cam_transform, p_render_data->cam_projection, !p_render_data->reflection_probe.is_valid()); + current_cluster_builder->begin(p_render_data->scene_data->cam_transform, p_render_data->scene_data->cam_projection, !p_render_data->reflection_probe.is_valid()); } bool using_shadows = true; @@ -3028,13 +3028,13 @@ void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool } } else { //do not render reflections when rendering a reflection probe - _setup_reflections(p_render_data, *p_render_data->reflection_probes, p_render_data->cam_transform.affine_inverse(), p_render_data->environment); + _setup_reflections(p_render_data, *p_render_data->reflection_probes, p_render_data->scene_data->cam_transform.affine_inverse(), p_render_data->environment); } uint32_t directional_light_count = 0; uint32_t positional_light_count = 0; - _setup_lights(p_render_data, *p_render_data->lights, p_render_data->cam_transform, p_render_data->shadow_atlas, using_shadows, directional_light_count, positional_light_count, p_render_data->directional_light_soft_shadows); - _setup_decals(*p_render_data->decals, p_render_data->cam_transform.affine_inverse()); + _setup_lights(p_render_data, *p_render_data->lights, p_render_data->scene_data->cam_transform, p_render_data->shadow_atlas, using_shadows, directional_light_count, positional_light_count, p_render_data->directional_light_soft_shadows); + _setup_decals(*p_render_data->decals, p_render_data->scene_data->cam_transform.affine_inverse()); p_render_data->directional_light_count = directional_light_count; @@ -3051,12 +3051,12 @@ void RendererSceneRenderRD::_pre_opaque_render(RenderDataRD *p_render_data, bool } } if (is_volumetric_supported()) { - _update_volumetric_fog(p_render_data->render_buffers, p_render_data->environment, p_render_data->cam_projection, p_render_data->cam_transform, p_render_data->prev_cam_transform.affine_inverse(), p_render_data->shadow_atlas, directional_light_count, directional_shadows, positional_light_count, render_state.voxel_gi_count, *p_render_data->fog_volumes); + _update_volumetric_fog(p_render_data->render_buffers, p_render_data->environment, p_render_data->scene_data->cam_projection, p_render_data->scene_data->cam_transform, p_render_data->scene_data->prev_cam_transform.affine_inverse(), p_render_data->shadow_atlas, directional_light_count, directional_shadows, positional_light_count, render_state.voxel_gi_count, *p_render_data->fog_volumes); } } } -void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data, RendererScene::RenderInfo *r_render_info) { +void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data, RenderingMethod::RenderInfo *r_render_info) { RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); // getting this here now so we can direct call a bunch of things more easily @@ -3066,33 +3066,62 @@ void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render ERR_FAIL_COND(rb.is_null()); } - //assign render data - RenderDataRD render_data; + // setup scene data + RenderSceneDataRD scene_data; { - render_data.render_buffers = rb; - // Our first camera is used by default - render_data.cam_transform = p_camera_data->main_transform; - render_data.cam_projection = p_camera_data->main_projection; - render_data.cam_orthogonal = p_camera_data->is_orthogonal; - render_data.taa_jitter = p_camera_data->taa_jitter; + scene_data.cam_transform = p_camera_data->main_transform; + scene_data.cam_projection = p_camera_data->main_projection; + scene_data.cam_orthogonal = p_camera_data->is_orthogonal; + scene_data.taa_jitter = p_camera_data->taa_jitter; - render_data.view_count = p_camera_data->view_count; + scene_data.view_count = p_camera_data->view_count; for (uint32_t v = 0; v < p_camera_data->view_count; v++) { - render_data.view_eye_offset[v] = p_camera_data->view_offset[v].origin; - render_data.view_projection[v] = p_camera_data->view_projection[v]; + scene_data.view_eye_offset[v] = p_camera_data->view_offset[v].origin; + scene_data.view_projection[v] = p_camera_data->view_projection[v]; } - render_data.prev_cam_transform = p_prev_camera_data->main_transform; - render_data.prev_cam_projection = p_prev_camera_data->main_projection; - render_data.prev_taa_jitter = p_prev_camera_data->taa_jitter; + scene_data.prev_cam_transform = p_prev_camera_data->main_transform; + scene_data.prev_cam_projection = p_prev_camera_data->main_projection; + scene_data.prev_taa_jitter = p_prev_camera_data->taa_jitter; for (uint32_t v = 0; v < p_camera_data->view_count; v++) { - render_data.prev_view_projection[v] = p_prev_camera_data->view_projection[v]; + scene_data.prev_view_projection[v] = p_prev_camera_data->view_projection[v]; + } + + scene_data.z_near = p_camera_data->main_projection.get_z_near(); + scene_data.z_far = p_camera_data->main_projection.get_z_far(); + + // this should be the same for all cameras.. + scene_data.lod_distance_multiplier = p_camera_data->main_projection.get_lod_multiplier(); + scene_data.lod_camera_plane = Plane(-p_camera_data->main_transform.basis.get_column(Vector3::AXIS_Z), p_camera_data->main_transform.get_origin()); + + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_DISABLE_LOD) { + scene_data.screen_mesh_lod_threshold = 0.0; + } else { + scene_data.screen_mesh_lod_threshold = p_screen_mesh_lod_threshold; + } + + if (p_shadow_atlas.is_valid()) { + Vector2 sas = shadow_atlas_get_size(p_shadow_atlas); + scene_data.shadow_atlas_pixel_size.x = 1.0 / sas.x; + scene_data.shadow_atlas_pixel_size.y = 1.0 / sas.y; } + { + Vector2 dss = directional_shadow_get_size(); + scene_data.directional_shadow_pixel_size.x = 1.0 / dss.x; + scene_data.directional_shadow_pixel_size.y = 1.0 / dss.y; + } + + scene_data.time = time; + scene_data.time_step = time_step; + } - render_data.z_near = p_camera_data->main_projection.get_z_near(); - render_data.z_far = p_camera_data->main_projection.get_z_far(); + //assign render data + RenderDataRD render_data; + { + render_data.render_buffers = rb; + render_data.scene_data = &scene_data; render_data.instances = &p_instances; render_data.lights = &p_lights; @@ -3108,16 +3137,6 @@ void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render render_data.reflection_probe = p_reflection_probe; render_data.reflection_probe_pass = p_reflection_probe_pass; - // this should be the same for all cameras.. - render_data.lod_distance_multiplier = p_camera_data->main_projection.get_lod_multiplier(); - render_data.lod_camera_plane = Plane(-p_camera_data->main_transform.basis.get_column(Vector3::AXIS_Z), p_camera_data->main_transform.get_origin()); - - if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_DISABLE_LOD) { - render_data.screen_mesh_lod_threshold = 0.0; - } else { - render_data.screen_mesh_lod_threshold = p_screen_mesh_lod_threshold; - } - render_state.render_shadows = p_render_shadows; render_state.render_shadow_count = p_render_shadow_count; render_state.render_sdfgi_regions = p_render_sdfgi_regions; @@ -3134,7 +3153,7 @@ void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render render_data.voxel_gi_instances = ∅ } - //sdfgi first + // sdfgi first if (rb.is_valid() && rb->has_custom_data(RB_SCOPE_SDFGI)) { Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); float exposure_normalization = 1.0; @@ -3191,12 +3210,12 @@ void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render Ref<RendererRD::GI::SDFGI> sdfgi = rb->get_custom_data(RB_SCOPE_SDFGI); if (sdfgi.is_valid()) { sdfgi->update_cascades(); - sdfgi->pre_process_gi(render_data.cam_transform, &render_data, this); + sdfgi->pre_process_gi(scene_data.cam_transform, &render_data, this); sdfgi->update_light(); } } - gi.setup_voxel_gi_instances(&render_data, render_data.render_buffers, render_data.cam_transform, *render_data.voxel_gi_instances, render_state.voxel_gi_count, this); + gi.setup_voxel_gi_instances(&render_data, render_data.render_buffers, scene_data.cam_transform, *render_data.voxel_gi_instances, render_state.voxel_gi_count, this); } render_state.depth_prepass_used = false; @@ -3246,7 +3265,7 @@ void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render view_rids.push_back(rb->get_internal_texture(v)); } - sdfgi->debug_draw(render_data.view_count, render_data.view_projection, render_data.cam_transform, size.x, size.y, rb->get_render_target(), source_texture, view_rids); + sdfgi->debug_draw(scene_data.view_count, scene_data.view_projection, scene_data.cam_transform, size.x, size.y, rb->get_render_target(), source_texture, view_rids); } } } @@ -3278,7 +3297,7 @@ void RendererSceneRenderRD::_debug_draw_cluster(Ref<RenderSceneBuffersRD> p_rend } } -void RendererSceneRenderRD::_render_shadow_pass(RID p_light, RID p_shadow_atlas, int p_pass, const PagedArray<RenderGeometryInstance *> &p_instances, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, bool p_open_pass, bool p_close_pass, bool p_clear_region, RendererScene::RenderInfo *p_render_info) { +void RendererSceneRenderRD::_render_shadow_pass(RID p_light, RID p_shadow_atlas, int p_pass, const PagedArray<RenderGeometryInstance *> &p_instances, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, bool p_open_pass, bool p_close_pass, bool p_clear_region, RenderingMethod::RenderInfo *p_render_info) { LightInstance *light_instance = light_instance_owner.get_or_null(p_light); ERR_FAIL_COND(!light_instance); diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.h b/servers/rendering/renderer_rd/renderer_scene_render_rd.h index 76d2bc68fe..82dc2fd09f 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.h +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.h @@ -46,30 +46,14 @@ #include "servers/rendering/renderer_rd/environment/sky.h" #include "servers/rendering/renderer_rd/framebuffer_cache_rd.h" #include "servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h" -#include "servers/rendering/renderer_scene.h" +#include "servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.h" #include "servers/rendering/renderer_scene_render.h" #include "servers/rendering/rendering_device.h" +#include "servers/rendering/rendering_method.h" struct RenderDataRD { Ref<RenderSceneBuffersRD> render_buffers; - - Transform3D cam_transform; - Projection cam_projection; - Vector2 taa_jitter; - bool cam_orthogonal = false; - - // For stereo rendering - uint32_t view_count = 1; - Vector3 view_eye_offset[RendererSceneRender::MAX_RENDER_VIEWS]; - Projection view_projection[RendererSceneRender::MAX_RENDER_VIEWS]; - - Transform3D prev_cam_transform; - Projection prev_cam_projection; - Vector2 prev_taa_jitter; - Projection prev_view_projection[RendererSceneRender::MAX_RENDER_VIEWS]; - - float z_near = 0.0; - float z_far = 0.0; + RenderSceneDataRD *scene_data; const PagedArray<RenderGeometryInstance *> *instances = nullptr; const PagedArray<RID> *lights = nullptr; @@ -85,10 +69,6 @@ struct RenderDataRD { RID reflection_probe; int reflection_probe_pass = 0; - float lod_distance_multiplier = 0.0; - Plane lod_camera_plane; - float screen_mesh_lod_threshold = 0.0; - RID cluster_buffer; uint32_t cluster_size = 0; uint32_t cluster_max_elements = 0; @@ -96,7 +76,7 @@ struct RenderDataRD { uint32_t directional_light_count = 0; bool directional_light_soft_shadows = false; - RendererScene::RenderInfo *render_info = nullptr; + RenderingMethod::RenderInfo *render_info = nullptr; }; class RendererSceneRenderRD : public RendererSceneRender { @@ -121,7 +101,7 @@ protected: virtual void _render_scene(RenderDataRD *p_render_data, const Color &p_default_color) = 0; virtual void _render_shadow_begin() = 0; - virtual void _render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &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, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0.0, float p_screen_mesh_lod_threshold = 0.0, const Rect2i &p_rect = Rect2i(), bool p_flip_y = false, bool p_clear_region = true, bool p_begin = true, bool p_end = true, RendererScene::RenderInfo *p_render_info = nullptr) = 0; + virtual void _render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &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, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0.0, float p_screen_mesh_lod_threshold = 0.0, const Rect2i &p_rect = Rect2i(), bool p_flip_y = false, bool p_clear_region = true, bool p_begin = true, bool p_end = true, RenderingMethod::RenderInfo *p_render_info = nullptr) = 0; virtual void _render_shadow_process() = 0; virtual void _render_shadow_end(uint32_t p_barrier = RD::BARRIER_MASK_ALL) = 0; @@ -138,7 +118,7 @@ protected: virtual RID _render_buffers_get_velocity_texture(Ref<RenderSceneBuffersRD> p_render_buffers) = 0; void _process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection); - void _process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_buffer_slices, RID p_specular_buffer, const RID *p_metallic_slices, const Color &p_metallic_mask, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive); + void _process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_buffer_slices, RID p_specular_buffer, const RID *p_metallic_slices, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive); void _process_sss(Ref<RenderSceneBuffersRD> p_render_buffers, const Projection &p_camera); void _process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection, const Transform3D &p_transform); @@ -598,16 +578,9 @@ private: uint64_t scene_pass = 0; uint64_t shadow_atlas_realloc_tolerance_msec = 500; - /* !BAS! is this used anywhere? - struct SDFGICosineNeighbour { - uint32_t neighbour; - float weight; - }; - */ - uint32_t max_cluster_elements = 512; - void _render_shadow_pass(RID p_light, RID p_shadow_atlas, int p_pass, const PagedArray<RenderGeometryInstance *> &p_instances, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0, float p_screen_mesh_lod_threshold = 0.0, bool p_open_pass = true, bool p_close_pass = true, bool p_clear_region = true, RendererScene::RenderInfo *p_render_info = nullptr); + void _render_shadow_pass(RID p_light, RID p_shadow_atlas, int p_pass, const PagedArray<RenderGeometryInstance *> &p_instances, const Plane &p_camera_plane = Plane(), float p_lod_distance_multiplier = 0, float p_screen_mesh_lod_threshold = 0.0, bool p_open_pass = true, bool p_close_pass = true, bool p_clear_region = true, RenderingMethod::RenderInfo *p_render_info = nullptr); /* Volumetric Fog */ @@ -627,6 +600,10 @@ public: RendererRD::GI *get_gi() { return &gi; } + /* SKY */ + + RendererRD::SkyRD *get_sky() { return &sky; } + /* SHADOW ATLAS API */ virtual RID shadow_atlas_create() override; @@ -969,7 +946,7 @@ public: virtual void update_uniform_sets(){}; - virtual void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RendererScene::RenderInfo *r_render_info = nullptr) override; + virtual void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RenderingMethod::RenderInfo *r_render_info = nullptr) override; virtual void render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) override; diff --git a/servers/rendering/renderer_rd/shaders/SCsub b/servers/rendering/renderer_rd/shaders/SCsub index d352743908..5405985741 100644 --- a/servers/rendering/renderer_rd/shaders/SCsub +++ b/servers/rendering/renderer_rd/shaders/SCsub @@ -18,3 +18,5 @@ if "RD_GLSL" in env["BUILDERS"]: SConscript("effects/SCsub") SConscript("environment/SCsub") +SConscript("forward_clustered/SCsub") +SConscript("forward_mobile/SCsub") diff --git a/servers/rendering/renderer_rd/shaders/effects/bokeh_dof.glsl b/servers/rendering/renderer_rd/shaders/effects/bokeh_dof.glsl index bdf84bb03a..fe770ac065 100644 --- a/servers/rendering/renderer_rd/shaders/effects/bokeh_dof.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/bokeh_dof.glsl @@ -186,6 +186,7 @@ void main() { uv += pixel_size * 0.5; //half pixel to read centers vec4 color = texture(color_texture, uv); + float initial_blur = color.a; float accum = 1.0; float radius = params.blur_scale; @@ -193,8 +194,8 @@ void main() { vec2 suv = uv + vec2(cos(ang), sin(ang)) * pixel_size * radius; vec4 sample_color = texture(color_texture, suv); float sample_size = abs(sample_color.a); - if (sample_color.a > color.a) { - sample_size = clamp(sample_size, 0.0, abs(color.a) * 2.0); + if (sample_color.a > initial_blur) { + sample_size = clamp(sample_size, 0.0, abs(initial_blur) * 2.0); } float m = smoothstep(radius - 0.5, radius + 0.5, sample_size); diff --git a/servers/rendering/renderer_rd/shaders/effects/bokeh_dof_raster.glsl b/servers/rendering/renderer_rd/shaders/effects/bokeh_dof_raster.glsl index a2bdc2e90e..1b487835d2 100644 --- a/servers/rendering/renderer_rd/shaders/effects/bokeh_dof_raster.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/bokeh_dof_raster.glsl @@ -221,12 +221,9 @@ void main() { vec4 sample_color = texture(source_color, uv_adj); sample_color.a = texture(source_weight, uv_adj).r; - float limit; - - if (sample_color.a < color.a) { - limit = abs(sample_color.a); - } else { - limit = abs(color.a); + float limit = abs(sample_color.a); + if (sample_color.a > color.a) { + limit = clamp(limit, 0.0, abs(color.a) * 2.0); } limit -= DEPTH_GAP; diff --git a/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl index 246ef81cb2..9f86643e52 100644 --- a/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl @@ -30,12 +30,7 @@ layout(push_constant, std430) uniform Params { bool orthogonal; float filter_mipmap_levels; bool use_half_res; - uint metallic_mask; - uint view_index; - uint pad1; - uint pad2; - uint pad3; } params; @@ -167,7 +162,7 @@ void main() { if (depth > z_to) { // if depth was surpassed - if (depth <= max(z_to, z_from) + params.depth_tolerance && -depth < params.camera_z_far) { + if (depth <= max(z_to, z_from) + params.depth_tolerance && -depth < params.camera_z_far * 0.95) { // check the depth tolerance and far clip // check that normal is valid found = true; @@ -231,18 +226,20 @@ void main() { } } - // Isn't this going to be overwritten after our endif? - final_color = imageLoad(source_diffuse, ivec2((final_pos - 0.5) * pixel_size)); - imageStore(blur_radius_image, ssC, vec4(blur_radius / 255.0)); //stored in r8 #endif // MODE_ROUGH final_color = vec4(imageLoad(source_diffuse, ivec2(final_pos - 0.5)).rgb, fade * margin_blend); - //change blend by metallic - vec4 metallic_mask = unpackUnorm4x8(params.metallic_mask); - final_color.a *= dot(metallic_mask, texelFetch(source_metallic, ssC << 1, 0)); + // Schlick term. + float metallic = texelFetch(source_metallic, ssC << 1, 0).w; + float f0 = mix(0.04, 1.0, metallic); // Assume a "specular" amount of 0.5 + normal.y = -normal.y; + float m = clamp(1.0 - dot(normalize(normal), -view_dir), 0.0, 1.0); + float m2 = m * m; + m = m2 * m2 * m; // pow(m,5) + final_color.a *= f0 + (1.0 - f0) * m; // Fresnel Schlick term. imageStore(ssr_image, ssC, final_color); diff --git a/servers/rendering/renderer_rd/shaders/environment/sky.glsl b/servers/rendering/renderer_rd/shaders/environment/sky.glsl index 0eb0f5f8fd..d523461600 100644 --- a/servers/rendering/renderer_rd/shaders/environment/sky.glsl +++ b/servers/rendering/renderer_rd/shaders/environment/sky.glsl @@ -153,6 +153,15 @@ layout(set = 3, binding = 0) uniform texture3D volumetric_fog_texture; layout(location = 0) out vec4 frag_color; +#ifdef USE_DEBANDING +// https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare +vec3 interleaved_gradient_noise(vec2 pos) { + const vec3 magic = vec3(0.06711056f, 0.00583715f, 52.9829189f); + float res = fract(magic.z * fract(dot(pos, magic.xy))) * 2.0 - 1.0; + return vec3(res, -res, res) / 255.0; +} +#endif + vec4 volumetric_fog_process(vec2 screen_uv) { vec3 fog_pos = vec3(screen_uv, 1.0); @@ -252,4 +261,8 @@ void main() { // For mobile renderer we're multiplying by 0.5 as we're using a UNORM buffer. // For both mobile and clustered, we also bake in the exposure value for the environment and camera. frag_color.rgb = frag_color.rgb * params.luminance_multiplier; + +#ifdef USE_DEBANDING + frag_color.rgb += interleaved_gradient_noise(gl_FragCoord.xy); +#endif } diff --git a/servers/rendering/renderer_rd/shaders/forward_clustered/SCsub b/servers/rendering/renderer_rd/shaders/forward_clustered/SCsub new file mode 100644 index 0000000000..741da8fe69 --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/SCsub @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +Import("env") + +if "RD_GLSL" in env["BUILDERS"]: + # find all include files + gl_include_files = [str(f) for f in Glob("*_inc.glsl")] + + # find all shader code(all glsl files excluding our include files) + glsl_files = [str(f) for f in Glob("*.glsl") if str(f) not in gl_include_files] + + # make sure we recompile shaders if include files change + env.Depends([f + ".gen.h" for f in glsl_files], gl_include_files + ["#glsl_builders.py"]) + + # compile shaders + for glsl_file in glsl_files: + env.RD_GLSL(glsl_file) diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl index 26b96b358f..d41474118d 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl @@ -129,7 +129,7 @@ invariant gl_Position; #GLOBALS -void vertex_shader(in uint instance_index, in bool is_multimesh, in SceneData scene_data, in mat4 model_matrix, out vec4 screen_pos) { +void vertex_shader(in uint instance_index, in bool is_multimesh, in uint multimesh_offset, in SceneData scene_data, in mat4 model_matrix, out vec4 screen_pos) { vec4 instance_custom = vec4(0.0); #if defined(COLOR_USED) color_interp = color_attrib; @@ -208,7 +208,7 @@ void vertex_shader(in uint instance_index, in bool is_multimesh, in SceneData sc } } - uint offset = stride * gl_InstanceIndex; + uint offset = stride * (gl_InstanceIndex + multimesh_offset); if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_MULTIMESH_FORMAT_2D)) { matrix = mat4(transforms.data[offset + 0], transforms.data[offset + 1], vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0)); @@ -326,10 +326,6 @@ void vertex_shader(in uint instance_index, in bool is_multimesh, in SceneData sc vertex_interp = vertex; -#ifdef MOTION_VECTORS - screen_pos = projection_matrix * vec4(vertex_interp, 1.0); -#endif - #ifdef NORMAL_USED normal_interp = normal; #endif @@ -367,6 +363,10 @@ void vertex_shader(in uint instance_index, in bool is_multimesh, in SceneData sc gl_Position = projection_matrix * vec4(vertex_interp, 1.0); #endif +#ifdef MOTION_VECTORS + screen_pos = gl_Position; +#endif + #ifdef MODE_RENDER_DEPTH if (scene_data.pancake_shadows) { if (gl_Position.z <= 0.00001) { @@ -397,13 +397,13 @@ void main() { mat4 model_matrix = instances.data[instance_index].transform; #if defined(MOTION_VECTORS) global_time = scene_data_block.prev_data.time; - vertex_shader(instance_index, is_multimesh, scene_data_block.prev_data, instances.data[instance_index].prev_transform, prev_screen_position); + vertex_shader(instance_index, is_multimesh, draw_call.multimesh_motion_vectors_previous_offset, scene_data_block.prev_data, instances.data[instance_index].prev_transform, prev_screen_position); global_time = scene_data_block.data.time; - vertex_shader(instance_index, is_multimesh, scene_data_block.data, model_matrix, screen_position); + vertex_shader(instance_index, is_multimesh, draw_call.multimesh_motion_vectors_current_offset, scene_data_block.data, model_matrix, screen_position); #else global_time = scene_data_block.data.time; vec4 screen_position; - vertex_shader(instance_index, is_multimesh, scene_data_block.data, model_matrix, screen_position); + vertex_shader(instance_index, is_multimesh, draw_call.multimesh_motion_vectors_current_offset, scene_data_block.data, model_matrix, screen_position); #endif } @@ -553,7 +553,7 @@ layout(location = 0) out vec4 frag_color; layout(location = 2) out vec2 motion_vector; #endif -#include "scene_forward_aa_inc.glsl" +#include "../scene_forward_aa_inc.glsl" #if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) @@ -562,20 +562,20 @@ layout(location = 2) out vec2 motion_vector; #define SPECULAR_SCHLICK_GGX #endif -#include "scene_forward_lights_inc.glsl" +#include "../scene_forward_lights_inc.glsl" -#include "scene_forward_gi_inc.glsl" +#include "../scene_forward_gi_inc.glsl" #endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) #ifndef MODE_RENDER_DEPTH vec4 volumetric_fog_process(vec2 screen_uv, float z) { - vec3 fog_pos = vec3(screen_uv, z * scene_data_block.data.volumetric_fog_inv_length); + vec3 fog_pos = vec3(screen_uv, z * implementation_data.volumetric_fog_inv_length); if (fog_pos.z < 0.0) { return vec4(0.0); } else if (fog_pos.z < 1.0) { - fog_pos.z = pow(fog_pos.z, scene_data_block.data.volumetric_fog_detail_spread); + fog_pos.z = pow(fog_pos.z, implementation_data.volumetric_fog_detail_spread); } return texture(sampler3D(volumetric_fog_texture, material_samplers[SAMPLER_LINEAR_CLAMP]), fog_pos); @@ -821,7 +821,7 @@ void fragment_shader(in SceneData scene_data) { fog = fog_process(vertex); } - if (scene_data.volumetric_fog_enabled) { + if (implementation_data.volumetric_fog_enabled) { vec4 volumetric_fog = volumetric_fog_process(screen_uv, -vertex.z); if (scene_data.fog_enabled) { //must use the full blending equation here to blend fogs @@ -849,8 +849,8 @@ void fragment_shader(in SceneData scene_data) { #ifndef MODE_RENDER_DEPTH - uvec2 cluster_pos = uvec2(gl_FragCoord.xy) >> scene_data.cluster_shift; - uint cluster_offset = (scene_data.cluster_width * cluster_pos.y + cluster_pos.x) * (scene_data.max_cluster_element_count_div_32 + 32); + uvec2 cluster_pos = uvec2(gl_FragCoord.xy) >> implementation_data.cluster_shift; + uint cluster_offset = (implementation_data.cluster_width * cluster_pos.y + cluster_pos.x) * (implementation_data.max_cluster_element_count_div_32 + 32); uint cluster_z = uint(clamp((-vertex.z / scene_data.z_far) * 32.0, 0.0, 31.0)); @@ -860,14 +860,14 @@ void fragment_shader(in SceneData scene_data) { { // process decals - uint cluster_decal_offset = cluster_offset + scene_data.cluster_type_size * 2; + uint cluster_decal_offset = cluster_offset + implementation_data.cluster_type_size * 2; uint item_min; uint item_max; uint item_from; uint item_to; - cluster_get_item_range(cluster_decal_offset + scene_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); + cluster_get_item_range(cluster_decal_offset + implementation_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); #ifdef USE_SUBGROUPS item_from = subgroupBroadcastFirst(subgroupMin(item_from)); @@ -1256,7 +1256,7 @@ void fragment_shader(in SceneData scene_data) { vec2 coord; - if (scene_data.gi_upscale_for_msaa) { + if (implementation_data.gi_upscale_for_msaa) { vec2 base_coord = screen_uv; vec2 closest_coord = base_coord; #ifdef USE_MULTIVIEW @@ -1298,10 +1298,10 @@ void fragment_shader(in SceneData scene_data) { } #endif // !USE_LIGHTMAP - if (bool(scene_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSAO)) { + if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSAO)) { float ssao = texture(sampler2D(ao_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv).r; ao = min(ao, ssao); - ao_light_affect = mix(ao_light_affect, max(ao_light_affect, scene_data.ssao_light_affect), scene_data.ssao_ao_affect); + ao_light_affect = mix(ao_light_affect, max(ao_light_affect, implementation_data.ssao_light_affect), implementation_data.ssao_ao_affect); } { // process reflections @@ -1309,14 +1309,14 @@ void fragment_shader(in SceneData scene_data) { vec4 reflection_accum = vec4(0.0, 0.0, 0.0, 0.0); vec4 ambient_accum = vec4(0.0, 0.0, 0.0, 0.0); - uint cluster_reflection_offset = cluster_offset + scene_data.cluster_type_size * 3; + uint cluster_reflection_offset = cluster_offset + implementation_data.cluster_type_size * 3; uint item_min; uint item_max; uint item_from; uint item_to; - cluster_get_item_range(cluster_reflection_offset + scene_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); + cluster_get_item_range(cluster_reflection_offset + implementation_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); #ifdef USE_SUBGROUPS item_from = subgroupBroadcastFirst(subgroupMin(item_from)); @@ -1380,7 +1380,7 @@ void fragment_shader(in SceneData scene_data) { // convert ao to direct light ao ao = mix(1.0, ao, ao_light_affect); - if (bool(scene_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSIL)) { + if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSIL)) { vec4 ssil = textureLod(sampler2D(ssil_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv, 0.0); ambient_light *= 1.0 - ssil.a; ambient_light += ssil.rgb * albedo.rgb; @@ -1748,7 +1748,7 @@ void fragment_shader(in SceneData scene_data) { uint item_from; uint item_to; - cluster_get_item_range(cluster_omni_offset + scene_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); + cluster_get_item_range(cluster_omni_offset + implementation_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); #ifdef USE_SUBGROUPS item_from = subgroupBroadcastFirst(subgroupMin(item_from)); @@ -1812,14 +1812,14 @@ void fragment_shader(in SceneData scene_data) { { //spot lights - uint cluster_spot_offset = cluster_offset + scene_data.cluster_type_size; + uint cluster_spot_offset = cluster_offset + implementation_data.cluster_type_size; uint item_min; uint item_max; uint item_from; uint item_to; - cluster_get_item_range(cluster_spot_offset + scene_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); + cluster_get_item_range(cluster_spot_offset + implementation_data.max_cluster_element_count_div_32 + cluster_z, item_min, item_max, item_from, item_to); #ifdef USE_SUBGROUPS item_from = subgroupBroadcastFirst(subgroupMin(item_from)); @@ -1909,8 +1909,8 @@ void fragment_shader(in SceneData scene_data) { #ifdef MODE_RENDER_SDF { - vec3 local_pos = (scene_data.sdf_to_bounds * vec4(vertex, 1.0)).xyz; - ivec3 grid_pos = scene_data.sdf_offset + ivec3(local_pos * vec3(scene_data.sdf_size)); + vec3 local_pos = (implementation_data.sdf_to_bounds * vec4(vertex, 1.0)).xyz; + ivec3 grid_pos = implementation_data.sdf_offset + ivec3(local_pos * vec3(implementation_data.sdf_size)); uint albedo16 = 0x1; //solid flag albedo16 |= clamp(uint(albedo.r * 31.0), 0, 31) << 11; diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_clustered_inc.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl index 45484b8c47..e8e2dce990 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_clustered_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl @@ -17,8 +17,9 @@ #extension GL_EXT_multiview : enable #endif -#include "cluster_data_inc.glsl" -#include "decal_data_inc.glsl" +#include "../cluster_data_inc.glsl" +#include "../decal_data_inc.glsl" +#include "../scene_data_inc.glsl" #if !defined(MODE_RENDER_DEPTH) || defined(MODE_RENDER_MATERIAL) || defined(MODE_RENDER_SDF) || defined(MODE_RENDER_NORMAL_ROUGHNESS) || defined(MODE_RENDER_VOXEL_GI) || defined(TANGENT_USED) || defined(NORMAL_MAP_USED) || defined(LIGHT_ANISOTROPY_USED) #ifndef NORMAL_USED @@ -29,8 +30,8 @@ layout(push_constant, std430) uniform DrawCall { uint instance_index; uint uv_offset; - uint pad0; - uint pad1; + uint multimesh_motion_vectors_current_offset; + uint multimesh_motion_vectors_previous_offset; } draw_call; @@ -38,7 +39,7 @@ draw_call; /* Set 0: Base Pass (never changes) */ -#include "light_data_inc.glsl" +#include "../light_data_inc.glsl" #define SAMPLER_NEAREST_CLAMP 0 #define SAMPLER_LINEAR_CLAMP 1 @@ -175,62 +176,27 @@ sdfgi; /* Set 1: Render Pass (changes per render pass) */ -struct SceneData { - mat4 projection_matrix; - mat4 inv_projection_matrix; - mat4 inv_view_matrix; - mat4 view_matrix; - - // only used for multiview - mat4 projection_matrix_view[MAX_VIEWS]; - mat4 inv_projection_matrix_view[MAX_VIEWS]; - vec4 eye_offset[MAX_VIEWS]; - - vec2 viewport_size; - vec2 screen_pixel_size; +layout(set = 1, binding = 0, std140) uniform SceneDataBlock { + SceneData data; + SceneData prev_data; +} +scene_data_block; +struct ImplementationData { uint cluster_shift; uint cluster_width; uint cluster_type_size; uint max_cluster_element_count_div_32; - // Use vec4s because std140 doesn't 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]; - - vec4 ambient_light_color_energy; - - float ambient_color_sky_mix; - bool use_ambient_light; - bool use_ambient_cubemap; - bool use_reflection_cubemap; - - mat3 radiance_inverse_xform; - - vec2 shadow_atlas_pixel_size; - vec2 directional_shadow_pixel_size; - - uint directional_light_count; - float dual_paraboloid_side; - float z_far; - float z_near; - uint ss_effects_flags; float ssao_light_affect; float ssao_ao_affect; - bool roughness_limiter_enabled; - - float roughness_limiter_amount; - float roughness_limiter_limit; - float opaque_prepass_threshold; - uint roughness_limiter_pad; + uint pad1; mat4 sdf_to_bounds; ivec3 sdf_offset; - bool material_uv2_mode; + uint pad2; ivec3 sdf_size; bool gi_upscale_for_msaa; @@ -239,31 +205,14 @@ struct SceneData { float volumetric_fog_inv_length; float volumetric_fog_detail_spread; uint volumetric_fog_pad; - - bool fog_enabled; - float fog_density; - float fog_height; - float fog_height_density; - - vec3 fog_light_color; - float fog_sun_scatter; - - float fog_aerial_perspective; - - float time; - float reflection_multiplier; // one normally, zero when rendering reflections - - bool pancake_shadows; - vec2 taa_jitter; - float emissive_exposure_normalization; - float IBL_exposure_normalization; }; -layout(set = 1, binding = 0, std140) uniform SceneDataBlock { - SceneData data; - SceneData prev_data; +layout(set = 1, binding = 1, std140) uniform ImplementationDataBlock { + ImplementationData data; } -scene_data_block; +implementation_data_block; + +#define implementation_data implementation_data_block.data struct InstanceData { mat4 transform; @@ -275,42 +224,42 @@ struct InstanceData { vec4 lightmap_uv_scale; }; -layout(set = 1, binding = 1, std430) buffer restrict readonly InstanceDataBuffer { +layout(set = 1, binding = 2, std430) buffer restrict readonly InstanceDataBuffer { InstanceData data[]; } instances; #ifdef USE_RADIANCE_CUBEMAP_ARRAY -layout(set = 1, binding = 2) uniform textureCubeArray radiance_cubemap; +layout(set = 1, binding = 3) uniform textureCubeArray radiance_cubemap; #else -layout(set = 1, binding = 2) uniform textureCube radiance_cubemap; +layout(set = 1, binding = 3) uniform textureCube radiance_cubemap; #endif -layout(set = 1, binding = 3) uniform textureCubeArray reflection_atlas; +layout(set = 1, binding = 4) uniform textureCubeArray reflection_atlas; -layout(set = 1, binding = 4) uniform texture2D shadow_atlas; +layout(set = 1, binding = 5) uniform texture2D shadow_atlas; -layout(set = 1, binding = 5) uniform texture2D directional_shadow_atlas; +layout(set = 1, binding = 6) uniform texture2D directional_shadow_atlas; -layout(set = 1, binding = 6) uniform texture2DArray lightmap_textures[MAX_LIGHTMAP_TEXTURES]; +layout(set = 1, binding = 7) uniform texture2DArray lightmap_textures[MAX_LIGHTMAP_TEXTURES]; -layout(set = 1, binding = 7) uniform texture3D voxel_gi_textures[MAX_VOXEL_GI_INSTANCES]; +layout(set = 1, binding = 8) uniform texture3D voxel_gi_textures[MAX_VOXEL_GI_INSTANCES]; -layout(set = 1, binding = 8, std430) buffer restrict readonly ClusterBuffer { +layout(set = 1, binding = 9, std430) buffer restrict readonly ClusterBuffer { uint data[]; } cluster_buffer; #ifdef MODE_RENDER_SDF -layout(r16ui, set = 1, binding = 9) uniform restrict writeonly uimage3D albedo_volume_grid; -layout(r32ui, set = 1, binding = 10) uniform restrict writeonly uimage3D emission_grid; -layout(r32ui, set = 1, binding = 11) uniform restrict writeonly uimage3D emission_aniso_grid; -layout(r32ui, set = 1, binding = 12) uniform restrict uimage3D geom_facing_grid; +layout(r16ui, set = 1, binding = 10) uniform restrict writeonly uimage3D albedo_volume_grid; +layout(r32ui, set = 1, binding = 11) uniform restrict writeonly uimage3D emission_grid; +layout(r32ui, set = 1, binding = 12) uniform restrict writeonly uimage3D emission_aniso_grid; +layout(r32ui, set = 1, binding = 13) uniform restrict uimage3D geom_facing_grid; //still need to be present for shaders that use it, so remap them to something #define depth_buffer shadow_atlas @@ -319,21 +268,21 @@ layout(r32ui, set = 1, binding = 12) uniform restrict uimage3D geom_facing_grid; #else -layout(set = 1, binding = 9) uniform texture2D depth_buffer; -layout(set = 1, binding = 10) uniform texture2D color_buffer; +layout(set = 1, binding = 10) uniform texture2D depth_buffer; +layout(set = 1, binding = 11) uniform texture2D color_buffer; #ifdef USE_MULTIVIEW -layout(set = 1, binding = 11) uniform texture2DArray normal_roughness_buffer; -layout(set = 1, binding = 13) uniform texture2DArray ambient_buffer; -layout(set = 1, binding = 14) uniform texture2DArray reflection_buffer; +layout(set = 1, binding = 12) uniform texture2DArray normal_roughness_buffer; +layout(set = 1, binding = 14) uniform texture2DArray ambient_buffer; +layout(set = 1, binding = 15) uniform texture2DArray reflection_buffer; #else // USE_MULTIVIEW -layout(set = 1, binding = 11) uniform texture2D normal_roughness_buffer; -layout(set = 1, binding = 13) uniform texture2D ambient_buffer; -layout(set = 1, binding = 14) uniform texture2D reflection_buffer; +layout(set = 1, binding = 12) uniform texture2D normal_roughness_buffer; +layout(set = 1, binding = 14) uniform texture2D ambient_buffer; +layout(set = 1, binding = 15) uniform texture2D reflection_buffer; #endif -layout(set = 1, binding = 12) uniform texture2D ao_buffer; -layout(set = 1, binding = 15) uniform texture2DArray sdfgi_lightprobe_texture; -layout(set = 1, binding = 16) uniform texture3D sdfgi_occlusion_cascades; +layout(set = 1, binding = 13) uniform texture2D ao_buffer; +layout(set = 1, binding = 16) uniform texture2DArray sdfgi_lightprobe_texture; +layout(set = 1, binding = 17) uniform texture3D sdfgi_occlusion_cascades; struct VoxelGIData { mat4 xform; // 64 - 64 @@ -350,14 +299,14 @@ struct VoxelGIData { float exposure_normalization; // 4 - 112 }; -layout(set = 1, binding = 17, std140) uniform VoxelGIs { +layout(set = 1, binding = 18, std140) uniform VoxelGIs { VoxelGIData data[MAX_VOXEL_GI_INSTANCES]; } voxel_gi_instances; -layout(set = 1, binding = 18) uniform texture3D volumetric_fog_texture; +layout(set = 1, binding = 19) uniform texture3D volumetric_fog_texture; -layout(set = 1, binding = 19) uniform texture2D ssil_buffer; +layout(set = 1, binding = 20) uniform texture2D ssil_buffer; #endif diff --git a/servers/rendering/renderer_rd/shaders/forward_mobile/SCsub b/servers/rendering/renderer_rd/shaders/forward_mobile/SCsub new file mode 100644 index 0000000000..741da8fe69 --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/forward_mobile/SCsub @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +Import("env") + +if "RD_GLSL" in env["BUILDERS"]: + # find all include files + gl_include_files = [str(f) for f in Glob("*_inc.glsl")] + + # find all shader code(all glsl files excluding our include files) + glsl_files = [str(f) for f in Glob("*.glsl") if str(f) not in gl_include_files] + + # make sure we recompile shaders if include files change + env.Depends([f + ".gen.h" for f in glsl_files], gl_include_files + ["#glsl_builders.py"]) + + # compile shaders + for glsl_file in glsl_files: + env.RD_GLSL(glsl_file) diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl index 5a5ada7231..a109fd4d75 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl @@ -101,7 +101,7 @@ layout(set = MATERIAL_UNIFORM_SET, binding = 0, std140) uniform MaterialUniforms #ifdef MODE_DUAL_PARABOLOID -layout(location = 8) out highp float dp_clip; +layout(location = 9) out highp float dp_clip; #endif @@ -450,7 +450,7 @@ layout(location = 6) mediump in vec3 binormal_interp; #ifdef MODE_DUAL_PARABOLOID -layout(location = 8) highp in float dp_clip; +layout(location = 9) highp in float dp_clip; #endif @@ -519,7 +519,7 @@ layout(location = 0) out mediump vec4 frag_color; #endif // RENDER DEPTH -#include "scene_forward_aa_inc.glsl" +#include "../scene_forward_aa_inc.glsl" #if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) @@ -528,7 +528,7 @@ layout(location = 0) out mediump vec4 frag_color; #define SPECULAR_SCHLICK_GGX #endif -#include "scene_forward_lights_inc.glsl" +#include "../scene_forward_lights_inc.glsl" #endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_mobile_inc.glsl b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile_inc.glsl index 3a9c52f5bc..5e4999fa0f 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_mobile_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile_inc.glsl @@ -5,7 +5,8 @@ #extension GL_EXT_multiview : enable #endif -#include "decal_data_inc.glsl" +#include "../decal_data_inc.glsl" +#include "../scene_data_inc.glsl" #if !defined(MODE_RENDER_DEPTH) || defined(MODE_RENDER_MATERIAL) || defined(TANGENT_USED) || defined(NORMAL_MAP_USED) || defined(LIGHT_ANISOTROPY_USED) #ifndef NORMAL_USED @@ -32,7 +33,7 @@ draw_call; /* Set 0: Base Pass (never changes) */ -#include "light_data_inc.glsl" +#include "../light_data_inc.glsl" #define SAMPLER_NEAREST_CLAMP 0 #define SAMPLER_LINEAR_CLAMP 1 @@ -127,75 +128,9 @@ global_shader_uniforms; /* Set 1: Render Pass (changes per render pass) */ -struct SceneData { - highp mat4 projection_matrix; - highp mat4 inv_projection_matrix; - highp mat4 inv_view_matrix; - highp mat4 view_matrix; - - // only used for multiview - highp mat4 projection_matrix_view[MAX_VIEWS]; - highp mat4 inv_projection_matrix_view[MAX_VIEWS]; - highp vec4 eye_offset[MAX_VIEWS]; - - highp vec2 viewport_size; - highp vec2 screen_pixel_size; - - // Use vec4s because std140 doesn't play nice with vec2s, z and w are wasted. - highp vec4 directional_penumbra_shadow_kernel[32]; - highp vec4 directional_soft_shadow_kernel[32]; - highp vec4 penumbra_shadow_kernel[32]; - highp vec4 soft_shadow_kernel[32]; - - mediump vec4 ambient_light_color_energy; - - mediump float ambient_color_sky_mix; - bool use_ambient_light; - bool use_ambient_cubemap; - bool use_reflection_cubemap; - - mediump mat3 radiance_inverse_xform; - - highp vec2 shadow_atlas_pixel_size; - highp vec2 directional_shadow_pixel_size; - - uint directional_light_count; - mediump float dual_paraboloid_side; - highp float z_far; - highp float z_near; - - bool ssao_enabled; - mediump float ssao_light_affect; - mediump float ssao_ao_affect; - bool roughness_limiter_enabled; - - mediump float roughness_limiter_amount; - mediump float roughness_limiter_limit; - mediump float opaque_prepass_threshold; - uint roughness_limiter_pad; - - bool fog_enabled; - highp float fog_density; - highp float fog_height; - highp float fog_height_density; - - mediump vec3 fog_light_color; - mediump float fog_sun_scatter; - - mediump float fog_aerial_perspective; - bool material_uv2_mode; - - highp float time; - mediump float reflection_multiplier; // one normally, zero when rendering reflections - - bool pancake_shadows; - float emissive_exposure_normalization; - float IBL_exposure_normalization; - uint pad3; -}; - layout(set = 1, binding = 0, std140) uniform SceneDataBlock { SceneData data; + SceneData prev_data; } scene_data_block; diff --git a/servers/rendering/renderer_rd/shaders/scene_data_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_data_inc.glsl new file mode 100644 index 0000000000..048257e9ef --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/scene_data_inc.glsl @@ -0,0 +1,69 @@ +// Scene data stores all our 3D rendering globals for a frame such as our matrices +// where this information is independent of the different RD implementations. +// This enables us to use this UBO in our main scene render shaders but also in +// effects that need access to this data. + +struct SceneData { + highp mat4 projection_matrix; + highp mat4 inv_projection_matrix; + highp mat4 inv_view_matrix; + highp mat4 view_matrix; + + // only used for multiview + highp mat4 projection_matrix_view[MAX_VIEWS]; + highp mat4 inv_projection_matrix_view[MAX_VIEWS]; + highp vec4 eye_offset[MAX_VIEWS]; + + highp vec2 viewport_size; + highp vec2 screen_pixel_size; + + // Use vec4s because std140 doesn't play nice with vec2s, z and w are wasted. + highp vec4 directional_penumbra_shadow_kernel[32]; + highp vec4 directional_soft_shadow_kernel[32]; + highp vec4 penumbra_shadow_kernel[32]; + highp vec4 soft_shadow_kernel[32]; + + mediump mat3 radiance_inverse_xform; + + mediump vec4 ambient_light_color_energy; + + mediump float ambient_color_sky_mix; + bool use_ambient_light; + bool use_ambient_cubemap; + bool use_reflection_cubemap; + + highp vec2 shadow_atlas_pixel_size; + highp vec2 directional_shadow_pixel_size; + + uint directional_light_count; + mediump float dual_paraboloid_side; + highp float z_far; + highp float z_near; + + bool roughness_limiter_enabled; + mediump float roughness_limiter_amount; + mediump float roughness_limiter_limit; + mediump float opaque_prepass_threshold; + + bool fog_enabled; + highp float fog_density; + highp float fog_height; + highp float fog_height_density; + + mediump vec3 fog_light_color; + mediump float fog_sun_scatter; + + mediump float fog_aerial_perspective; + highp float time; + mediump float reflection_multiplier; // one normally, zero when rendering reflections + bool material_uv2_mode; + + vec2 taa_jitter; + float emissive_exposure_normalization; + float IBL_exposure_normalization; + + bool pancake_shadows; + uint pad1; + uint pad2; + uint pad3; +}; diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl index 4e6e29b315..2fba1351f7 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl @@ -97,11 +97,12 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte float diffuse_brdf_NL; // BRDF times N.L for calculating diffuse radiance #if defined(DIFFUSE_LAMBERT_WRAP) - // energy conserving lambert wrap shader - diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness))); + // Energy conserving lambert wrap shader. + // https://web.archive.org/web/20210228210901/http://blog.stevemcauley.com/2011/12/03/energy-conserving-wrapped-diffuse/ + diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness))) * (1.0 / M_PI); #elif defined(DIFFUSE_TOON) - diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL); + diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL) * (1.0 / M_PI); #elif defined(DIFFUSE_BURLEY) diff --git a/servers/rendering/renderer_rd/storage_rd/light_storage.h b/servers/rendering/renderer_rd/storage_rd/light_storage.h index 82d609291c..4b34cc74cb 100644 --- a/servers/rendering/renderer_rd/storage_rd/light_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/light_storage.h @@ -34,6 +34,7 @@ #include "core/templates/local_vector.h" #include "core/templates/rid_owner.h" #include "core/templates/self_list.h" +#include "servers/rendering/renderer_rd/storage_rd/texture_storage.h" #include "servers/rendering/storage/light_storage.h" #include "servers/rendering/storage/utilities.h" @@ -235,7 +236,7 @@ public: const Light *light = light_owner.get_or_null(p_light); ERR_FAIL_COND_V(!light, RS::LIGHT_DIRECTIONAL); - return light_owner.owns(light->projector); + return TextureStorage::get_singleton()->owns_texture(light->projector); } _FORCE_INLINE_ bool light_is_negative(RID p_light) const { diff --git a/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp b/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp index 49e3543ba5..1827b73507 100644 --- a/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "mesh_storage.h" +#include "../../rendering_server_globals.h" using namespace RendererRD; @@ -1211,7 +1212,13 @@ void MeshStorage::multimesh_allocate_data(RID p_multimesh, int p_instances, RS:: if (multimesh->data_cache_dirty_regions) { memdelete_arr(multimesh->data_cache_dirty_regions); multimesh->data_cache_dirty_regions = nullptr; - multimesh->data_cache_used_dirty_regions = 0; + multimesh->data_cache_dirty_region_count = 0; + } + + if (multimesh->previous_data_cache_dirty_regions) { + memdelete_arr(multimesh->previous_data_cache_dirty_regions); + multimesh->previous_data_cache_dirty_regions = nullptr; + multimesh->previous_data_cache_dirty_region_count = 0; } multimesh->instances = p_instances; @@ -1228,14 +1235,67 @@ void MeshStorage::multimesh_allocate_data(RID p_multimesh, int p_instances, RS:: multimesh->aabb = AABB(); multimesh->aabb_dirty = false; multimesh->visible_instances = MIN(multimesh->visible_instances, multimesh->instances); + multimesh->motion_vectors_current_offset = 0; + multimesh->motion_vectors_previous_offset = 0; + multimesh->motion_vectors_last_change = -1; if (multimesh->instances) { - multimesh->buffer = RD::get_singleton()->storage_buffer_create(multimesh->instances * multimesh->stride_cache * 4); + uint32_t buffer_size = multimesh->instances * multimesh->stride_cache * sizeof(float); + if (multimesh->motion_vectors_enabled) { + buffer_size *= 2; + } + multimesh->buffer = RD::get_singleton()->storage_buffer_create(buffer_size); } multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MULTIMESH); } +bool MeshStorage::_multimesh_enable_motion_vectors(RID p_multimesh) { + MultiMesh *multimesh = multimesh_owner.get_or_null(p_multimesh); + ERR_FAIL_COND_V(!multimesh, false); + + if (multimesh->motion_vectors_enabled) { + return false; + } + + multimesh->motion_vectors_enabled = true; + + multimesh->motion_vectors_current_offset = 0; + multimesh->motion_vectors_previous_offset = 0; + multimesh->motion_vectors_last_change = -1; + + if (!multimesh->data_cache.is_empty()) { + multimesh->data_cache.append_array(multimesh->data_cache); + } + + if (multimesh->buffer_set) { + RD::get_singleton()->barrier(); + Vector<uint8_t> buffer_data = RD::get_singleton()->buffer_get_data(multimesh->buffer); + if (!multimesh->data_cache.is_empty()) { + memcpy(buffer_data.ptrw(), multimesh->data_cache.ptr(), buffer_data.size()); + } + + RD::get_singleton()->free(multimesh->buffer); + uint32_t buffer_size = multimesh->instances * multimesh->stride_cache * sizeof(float) * 2; + multimesh->buffer = RD::get_singleton()->storage_buffer_create(buffer_size); + RD::get_singleton()->buffer_update(multimesh->buffer, 0, buffer_data.size(), buffer_data.ptr(), RD::BARRIER_MASK_NO_BARRIER); + RD::get_singleton()->buffer_update(multimesh->buffer, buffer_data.size(), buffer_data.size(), buffer_data.ptr()); + multimesh->uniform_set_3d = RID(); // Cleared by dependency + return true; + } + return false; // Update the transforms uniform set cache +} + +void MeshStorage::_multimesh_get_motion_vectors_offsets(RID p_multimesh, uint32_t &r_current_offset, uint32_t &r_prev_offset) { + MultiMesh *multimesh = multimesh_owner.get_or_null(p_multimesh); + ERR_FAIL_COND(!multimesh); + r_current_offset = multimesh->motion_vectors_current_offset; + if (RSG::rasterizer->get_frame_number() - multimesh->motion_vectors_last_change >= 2) { + multimesh->motion_vectors_previous_offset = multimesh->motion_vectors_current_offset; + } + r_prev_offset = multimesh->motion_vectors_previous_offset; +} + int MeshStorage::multimesh_get_instance_count(RID p_multimesh) const { MultiMesh *multimesh = multimesh_owner.get_or_null(p_multimesh); ERR_FAIL_COND_V(!multimesh, 0); @@ -1261,7 +1321,7 @@ void MeshStorage::multimesh_set_mesh(RID p_multimesh, RID p_mesh) { //need to re-create AABB unfortunately, calling this has a penalty if (multimesh->buffer_set) { Vector<uint8_t> buffer = RD::get_singleton()->buffer_get_data(multimesh->buffer); - const uint8_t *r = buffer.ptr(); + const uint8_t *r = buffer.ptr() + multimesh->motion_vectors_current_offset * multimesh->stride_cache * sizeof(float); const float *data = reinterpret_cast<const float *>(r); _multimesh_re_create_aabb(multimesh, data, multimesh->instances); } @@ -1276,10 +1336,14 @@ void MeshStorage::_multimesh_make_local(MultiMesh *multimesh) const { if (multimesh->data_cache.size() > 0) { return; //already local } - ERR_FAIL_COND(multimesh->data_cache.size() > 0); + // this means that the user wants to load/save individual elements, // for this, the data must reside on CPU, so just copy it there. - multimesh->data_cache.resize(multimesh->instances * multimesh->stride_cache); + uint32_t buffer_size = multimesh->instances * multimesh->stride_cache; + if (multimesh->motion_vectors_enabled) { + buffer_size *= 2; + } + multimesh->data_cache.resize(buffer_size); { float *w = multimesh->data_cache.ptrw(); @@ -1290,15 +1354,48 @@ void MeshStorage::_multimesh_make_local(MultiMesh *multimesh) const { memcpy(w, r, buffer.size()); } } else { - memset(w, 0, (size_t)multimesh->instances * multimesh->stride_cache * sizeof(float)); + memset(w, 0, buffer_size * sizeof(float)); } } uint32_t data_cache_dirty_region_count = (multimesh->instances - 1) / MULTIMESH_DIRTY_REGION_SIZE + 1; multimesh->data_cache_dirty_regions = memnew_arr(bool, data_cache_dirty_region_count); - for (uint32_t i = 0; i < data_cache_dirty_region_count; i++) { - multimesh->data_cache_dirty_regions[i] = false; + memset(multimesh->data_cache_dirty_regions, 0, data_cache_dirty_region_count * sizeof(bool)); + multimesh->data_cache_dirty_region_count = 0; + + multimesh->previous_data_cache_dirty_regions = memnew_arr(bool, data_cache_dirty_region_count); + memset(multimesh->previous_data_cache_dirty_regions, 0, data_cache_dirty_region_count * sizeof(bool)); + multimesh->previous_data_cache_dirty_region_count = 0; +} + +void MeshStorage::_multimesh_update_motion_vectors_data_cache(MultiMesh *multimesh) { + ERR_FAIL_COND(multimesh->data_cache.is_empty()); + + if (!multimesh->motion_vectors_enabled) { + return; + } + + uint32_t frame = RSG::rasterizer->get_frame_number(); + if (multimesh->motion_vectors_last_change != frame) { + multimesh->motion_vectors_previous_offset = multimesh->motion_vectors_current_offset; + multimesh->motion_vectors_current_offset = multimesh->instances - multimesh->motion_vectors_current_offset; + multimesh->motion_vectors_last_change = frame; + + if (multimesh->previous_data_cache_dirty_region_count > 0) { + uint8_t *data = (uint8_t *)multimesh->data_cache.ptrw(); + uint32_t current_ofs = multimesh->motion_vectors_current_offset * multimesh->stride_cache * sizeof(float); + uint32_t previous_ofs = multimesh->motion_vectors_previous_offset * multimesh->stride_cache * sizeof(float); + uint32_t visible_instances = multimesh->visible_instances >= 0 ? multimesh->visible_instances : multimesh->instances; + uint32_t visible_region_count = visible_instances == 0 ? 0 : (visible_instances - 1) / MULTIMESH_DIRTY_REGION_SIZE + 1; + uint32_t region_size = multimesh->stride_cache * MULTIMESH_DIRTY_REGION_SIZE * sizeof(float); + uint32_t size = multimesh->stride_cache * (uint32_t)multimesh->instances * (uint32_t)sizeof(float); + for (uint32_t i = 0; i < visible_region_count; i++) { + if (multimesh->previous_data_cache_dirty_regions[i]) { + uint32_t offset = i * region_size; + memcpy(data + current_ofs + offset, data + previous_ofs + offset, MIN(region_size, size - offset)); + } + } + } } - multimesh->data_cache_used_dirty_regions = 0; } void MeshStorage::_multimesh_mark_dirty(MultiMesh *multimesh, int p_index, bool p_aabb) { @@ -1309,7 +1406,7 @@ void MeshStorage::_multimesh_mark_dirty(MultiMesh *multimesh, int p_index, bool #endif if (!multimesh->data_cache_dirty_regions[region_index]) { multimesh->data_cache_dirty_regions[region_index] = true; - multimesh->data_cache_used_dirty_regions++; + multimesh->data_cache_dirty_region_count++; } if (p_aabb) { @@ -1330,7 +1427,7 @@ void MeshStorage::_multimesh_mark_all_dirty(MultiMesh *multimesh, bool p_data, b for (uint32_t i = 0; i < data_cache_dirty_region_count; i++) { if (!multimesh->data_cache_dirty_regions[i]) { multimesh->data_cache_dirty_regions[i] = true; - multimesh->data_cache_used_dirty_regions++; + multimesh->data_cache_dirty_region_count++; } } } @@ -1395,11 +1492,12 @@ void MeshStorage::multimesh_instance_set_transform(RID p_multimesh, int p_index, ERR_FAIL_COND(multimesh->xform_format != RS::MULTIMESH_TRANSFORM_3D); _multimesh_make_local(multimesh); + _multimesh_update_motion_vectors_data_cache(multimesh); { float *w = multimesh->data_cache.ptrw(); - float *dataptr = w + p_index * multimesh->stride_cache; + float *dataptr = w + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache; dataptr[0] = p_transform.basis.rows[0][0]; dataptr[1] = p_transform.basis.rows[0][1]; @@ -1425,11 +1523,12 @@ void MeshStorage::multimesh_instance_set_transform_2d(RID p_multimesh, int p_ind ERR_FAIL_COND(multimesh->xform_format != RS::MULTIMESH_TRANSFORM_2D); _multimesh_make_local(multimesh); + _multimesh_update_motion_vectors_data_cache(multimesh); { float *w = multimesh->data_cache.ptrw(); - float *dataptr = w + p_index * multimesh->stride_cache; + float *dataptr = w + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache; dataptr[0] = p_transform.columns[0][0]; dataptr[1] = p_transform.columns[1][0]; @@ -1451,11 +1550,12 @@ void MeshStorage::multimesh_instance_set_color(RID p_multimesh, int p_index, con ERR_FAIL_COND(!multimesh->uses_colors); _multimesh_make_local(multimesh); + _multimesh_update_motion_vectors_data_cache(multimesh); { float *w = multimesh->data_cache.ptrw(); - float *dataptr = w + p_index * multimesh->stride_cache + multimesh->color_offset_cache; + float *dataptr = w + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache + multimesh->color_offset_cache; dataptr[0] = p_color.r; dataptr[1] = p_color.g; @@ -1473,11 +1573,12 @@ void MeshStorage::multimesh_instance_set_custom_data(RID p_multimesh, int p_inde ERR_FAIL_COND(!multimesh->uses_custom_data); _multimesh_make_local(multimesh); + _multimesh_update_motion_vectors_data_cache(multimesh); { float *w = multimesh->data_cache.ptrw(); - float *dataptr = w + p_index * multimesh->stride_cache + multimesh->custom_data_offset_cache; + float *dataptr = w + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache + multimesh->custom_data_offset_cache; dataptr[0] = p_color.r; dataptr[1] = p_color.g; @@ -1514,7 +1615,7 @@ Transform3D MeshStorage::multimesh_instance_get_transform(RID p_multimesh, int p { const float *r = multimesh->data_cache.ptr(); - const float *dataptr = r + p_index * multimesh->stride_cache; + const float *dataptr = r + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache; t.basis.rows[0][0] = dataptr[0]; t.basis.rows[0][1] = dataptr[1]; @@ -1545,7 +1646,7 @@ Transform2D MeshStorage::multimesh_instance_get_transform_2d(RID p_multimesh, in { const float *r = multimesh->data_cache.ptr(); - const float *dataptr = r + p_index * multimesh->stride_cache; + const float *dataptr = r + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache; t.columns[0][0] = dataptr[0]; t.columns[1][0] = dataptr[1]; @@ -1570,7 +1671,7 @@ Color MeshStorage::multimesh_instance_get_color(RID p_multimesh, int p_index) co { const float *r = multimesh->data_cache.ptr(); - const float *dataptr = r + p_index * multimesh->stride_cache + multimesh->color_offset_cache; + const float *dataptr = r + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache + multimesh->color_offset_cache; c.r = dataptr[0]; c.g = dataptr[1]; @@ -1593,7 +1694,7 @@ Color MeshStorage::multimesh_instance_get_custom_data(RID p_multimesh, int p_ind { const float *r = multimesh->data_cache.ptr(); - const float *dataptr = r + p_index * multimesh->stride_cache + multimesh->custom_data_offset_cache; + const float *dataptr = r + (multimesh->motion_vectors_current_offset + p_index) * multimesh->stride_cache + multimesh->custom_data_offset_cache; c.r = dataptr[0]; c.g = dataptr[1]; @@ -1609,25 +1710,26 @@ void MeshStorage::multimesh_set_buffer(RID p_multimesh, const Vector<float> &p_b ERR_FAIL_COND(!multimesh); ERR_FAIL_COND(p_buffer.size() != (multimesh->instances * (int)multimesh->stride_cache)); + if (multimesh->motion_vectors_enabled) { + uint32_t frame = RSG::rasterizer->get_frame_number(); + + if (multimesh->motion_vectors_last_change != frame) { + multimesh->motion_vectors_previous_offset = multimesh->motion_vectors_current_offset; + multimesh->motion_vectors_current_offset = multimesh->instances - multimesh->motion_vectors_current_offset; + multimesh->motion_vectors_last_change = frame; + } + } + { const float *r = p_buffer.ptr(); - RD::get_singleton()->buffer_update(multimesh->buffer, 0, p_buffer.size() * sizeof(float), r); + RD::get_singleton()->buffer_update(multimesh->buffer, multimesh->motion_vectors_current_offset * multimesh->stride_cache * sizeof(float), p_buffer.size() * sizeof(float), r); multimesh->buffer_set = true; } if (multimesh->data_cache.size()) { - //if we have a data cache, just update it - multimesh->data_cache = p_buffer; - { - //clear dirty since nothing will be dirty anymore - uint32_t data_cache_dirty_region_count = (multimesh->instances - 1) / MULTIMESH_DIRTY_REGION_SIZE + 1; - for (uint32_t i = 0; i < data_cache_dirty_region_count; i++) { - multimesh->data_cache_dirty_regions[i] = false; - } - multimesh->data_cache_used_dirty_regions = 0; - } - - _multimesh_mark_all_dirty(multimesh, false, true); //update AABB + float *cache_data = multimesh->data_cache.ptrw(); + memcpy(cache_data + (multimesh->motion_vectors_current_offset * multimesh->stride_cache), p_buffer.ptr(), p_buffer.size() * sizeof(float)); + _multimesh_mark_all_dirty(multimesh, true, true); //update AABB } else if (multimesh->mesh.is_valid()) { //if we have a mesh set, we need to re-generate the AABB from the new data const float *data = p_buffer.ptr(); @@ -1642,20 +1744,19 @@ Vector<float> MeshStorage::multimesh_get_buffer(RID p_multimesh) const { ERR_FAIL_COND_V(!multimesh, Vector<float>()); if (multimesh->buffer.is_null()) { return Vector<float>(); - } else if (multimesh->data_cache.size()) { - return multimesh->data_cache; } else { - //get from memory - - Vector<uint8_t> buffer = RD::get_singleton()->buffer_get_data(multimesh->buffer); Vector<float> ret; ret.resize(multimesh->instances * multimesh->stride_cache); - { - float *w = ret.ptrw(); - const uint8_t *r = buffer.ptr(); - memcpy(w, r, buffer.size()); - } + float *w = ret.ptrw(); + if (multimesh->data_cache.size()) { + const uint8_t *r = (uint8_t *)multimesh->data_cache.ptr() + multimesh->motion_vectors_current_offset * multimesh->stride_cache * sizeof(float); + memcpy(w, r, ret.size() * sizeof(float)); + } else { + Vector<uint8_t> buffer = RD::get_singleton()->buffer_get_data(multimesh->buffer); + const uint8_t *r = buffer.ptr() + multimesh->motion_vectors_current_offset * multimesh->stride_cache * sizeof(float); + memcpy(w, r, ret.size() * sizeof(float)); + } return ret; } } @@ -1698,36 +1799,38 @@ void MeshStorage::_update_dirty_multimeshes() { MultiMesh *multimesh = multimesh_dirty_list; if (multimesh->data_cache.size()) { //may have been cleared, so only process if it exists - const float *data = multimesh->data_cache.ptr(); uint32_t visible_instances = multimesh->visible_instances >= 0 ? multimesh->visible_instances : multimesh->instances; + uint32_t buffer_offset = multimesh->motion_vectors_current_offset * multimesh->stride_cache; + const float *data = multimesh->data_cache.ptr() + buffer_offset; - if (multimesh->data_cache_used_dirty_regions) { + uint32_t total_dirty_regions = multimesh->data_cache_dirty_region_count + multimesh->previous_data_cache_dirty_region_count; + if (total_dirty_regions != 0) { uint32_t data_cache_dirty_region_count = (multimesh->instances - 1) / MULTIMESH_DIRTY_REGION_SIZE + 1; uint32_t visible_region_count = visible_instances == 0 ? 0 : (visible_instances - 1) / MULTIMESH_DIRTY_REGION_SIZE + 1; uint32_t region_size = multimesh->stride_cache * MULTIMESH_DIRTY_REGION_SIZE * sizeof(float); - - if (multimesh->data_cache_used_dirty_regions > 32 || multimesh->data_cache_used_dirty_regions > visible_region_count / 2) { + if (total_dirty_regions > 32 || total_dirty_regions > visible_region_count / 2) { //if there too many dirty regions, or represent the majority of regions, just copy all, else transfer cost piles up too much - RD::get_singleton()->buffer_update(multimesh->buffer, 0, MIN(visible_region_count * region_size, multimesh->instances * (uint32_t)multimesh->stride_cache * (uint32_t)sizeof(float)), data); + RD::get_singleton()->buffer_update(multimesh->buffer, buffer_offset * sizeof(float), MIN(visible_region_count * region_size, multimesh->instances * (uint32_t)multimesh->stride_cache * (uint32_t)sizeof(float)), data); } else { //not that many regions? update them all for (uint32_t i = 0; i < visible_region_count; i++) { - if (multimesh->data_cache_dirty_regions[i]) { + if (multimesh->data_cache_dirty_regions[i] || multimesh->previous_data_cache_dirty_regions[i]) { uint32_t offset = i * region_size; uint32_t size = multimesh->stride_cache * (uint32_t)multimesh->instances * (uint32_t)sizeof(float); uint32_t region_start_index = multimesh->stride_cache * MULTIMESH_DIRTY_REGION_SIZE * i; - RD::get_singleton()->buffer_update(multimesh->buffer, offset, MIN(region_size, size - offset), &data[region_start_index]); + RD::get_singleton()->buffer_update(multimesh->buffer, buffer_offset * sizeof(float) + offset, MIN(region_size, size - offset), &data[region_start_index], RD::BARRIER_MASK_NO_BARRIER); } } + RD::get_singleton()->barrier(RD::BARRIER_MASK_NO_BARRIER, RD::BARRIER_MASK_ALL); } - for (uint32_t i = 0; i < data_cache_dirty_region_count; i++) { - multimesh->data_cache_dirty_regions[i] = false; - } + memcpy(multimesh->previous_data_cache_dirty_regions, multimesh->data_cache_dirty_regions, data_cache_dirty_region_count * sizeof(bool)); + memset(multimesh->data_cache_dirty_regions, 0, data_cache_dirty_region_count * sizeof(bool)); - multimesh->data_cache_used_dirty_regions = 0; + multimesh->previous_data_cache_dirty_region_count = multimesh->data_cache_dirty_region_count; + multimesh->data_cache_dirty_region_count = 0; } if (multimesh->aabb_dirty) { diff --git a/servers/rendering/renderer_rd/storage_rd/mesh_storage.h b/servers/rendering/renderer_rd/storage_rd/mesh_storage.h index 5c0d019c15..622f3911c7 100644 --- a/servers/rendering/renderer_rd/storage_rd/mesh_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/mesh_storage.h @@ -205,13 +205,19 @@ private: AABB aabb; bool aabb_dirty = false; bool buffer_set = false; + bool motion_vectors_enabled = false; + uint32_t motion_vectors_current_offset = 0; + uint32_t motion_vectors_previous_offset = 0; + uint64_t motion_vectors_last_change = -1; uint32_t stride_cache = 0; uint32_t color_offset_cache = 0; uint32_t custom_data_offset_cache = 0; Vector<float> data_cache; //used if individual setting is used bool *data_cache_dirty_regions = nullptr; - uint32_t data_cache_used_dirty_regions = 0; + uint32_t data_cache_dirty_region_count = 0; + bool *previous_data_cache_dirty_regions = nullptr; + uint32_t previous_data_cache_dirty_region_count = 0; RID buffer; //storage buffer RID uniform_set_3d; @@ -228,6 +234,7 @@ private: MultiMesh *multimesh_dirty_list = nullptr; _FORCE_INLINE_ void _multimesh_make_local(MultiMesh *multimesh) const; + _FORCE_INLINE_ void _multimesh_update_motion_vectors_data_cache(MultiMesh *multimesh); _FORCE_INLINE_ void _multimesh_mark_dirty(MultiMesh *multimesh, int p_index, bool p_aabb); _FORCE_INLINE_ void _multimesh_mark_all_dirty(MultiMesh *multimesh, bool p_data, bool p_aabb); _FORCE_INLINE_ void _multimesh_re_create_aabb(MultiMesh *multimesh, const float *p_data, int p_instances); @@ -579,6 +586,8 @@ public: virtual AABB multimesh_get_aabb(RID p_multimesh) const override; void _update_dirty_multimeshes(); + bool _multimesh_enable_motion_vectors(RID p_multimesh); + void _multimesh_get_motion_vectors_offsets(RID p_multimesh, uint32_t &r_current_offset, uint32_t &r_prev_offset); _FORCE_INLINE_ RS::MultimeshTransformFormat multimesh_get_transform_format(RID p_multimesh) const { MultiMesh *multimesh = multimesh_owner.get_or_null(p_multimesh); diff --git a/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.cpp b/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.cpp index 576ec81124..16fdbc07f5 100644 --- a/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.cpp +++ b/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.cpp @@ -128,6 +128,11 @@ void RenderSceneBuffersRD::cleanup() { ss_effects.linear_depth_slices.clear(); } + if (ss_effects.downsample_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(ss_effects.downsample_uniform_set)) { + RD::get_singleton()->free(ss_effects.downsample_uniform_set); + ss_effects.downsample_uniform_set = RID(); + } + sse->ssao_free(ss_effects.ssao); sse->ssil_free(ss_effects.ssil); sse->ssr_free(ssr); @@ -535,7 +540,9 @@ void RenderSceneBuffersRD::ensure_velocity() { RD::TEXTURE_SAMPLES_8, }; - create_texture(RB_SCOPE_BUFFERS, RB_TEX_VELOCITY_MSAA, RD::DATA_FORMAT_R16G16_SFLOAT, msaa_usage_bits, ts[msaa_3d]); + RD::TextureSamples texture_samples = ts[msaa_3d]; + + create_texture(RB_SCOPE_BUFFERS, RB_TEX_VELOCITY_MSAA, RD::DATA_FORMAT_R16G16_SFLOAT, msaa_usage_bits, texture_samples); } create_texture(RB_SCOPE_BUFFERS, RB_TEX_VELOCITY, RD::DATA_FORMAT_R16G16_SFLOAT, usage_bits); diff --git a/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h b/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h index adaf075f80..1975eec7b0 100644 --- a/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h +++ b/servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.h @@ -35,8 +35,8 @@ #include "servers/rendering/renderer_rd/effects/vrs.h" #include "servers/rendering/renderer_rd/framebuffer_cache_rd.h" #include "servers/rendering/renderer_rd/storage_rd/render_buffer_custom_data_rd.h" -#include "servers/rendering/renderer_scene.h" #include "servers/rendering/rendering_device.h" +#include "servers/rendering/rendering_method.h" #include "servers/rendering/storage/render_scene_buffers.h" // These can be retired in due time diff --git a/servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.cpp b/servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.cpp new file mode 100644 index 0000000000..f925f87cbe --- /dev/null +++ b/servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.cpp @@ -0,0 +1,246 @@ +/*************************************************************************/ +/* render_scene_data_rd.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 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 "render_scene_data_rd.h" +#include "servers/rendering/renderer_rd/renderer_scene_render_rd.h" +#include "servers/rendering/renderer_rd/storage_rd/light_storage.h" +#include "servers/rendering/renderer_rd/storage_rd/texture_storage.h" +#include "servers/rendering/rendering_server_default.h" + +RID RenderSceneDataRD::create_uniform_buffer() { + return RD::get_singleton()->uniform_buffer_create(sizeof(UBODATA)); +} + +void RenderSceneDataRD::update_ubo(RID p_uniform_buffer, RS::ViewportDebugDraw p_debug_mode, RID p_env, RID p_reflection_probe_instance, RID p_camera_attributes, bool p_flip_y, bool p_pancake_shadows, const Size2i &p_screen_size, const Color &p_default_bg_color, float p_luminance_multiplier, bool p_opaque_render_buffers) { + RendererSceneRenderRD *render_scene_render = RendererSceneRenderRD::get_singleton(); + + UBODATA ubo_data; + memset(&ubo_data, 0, sizeof(UBODATA)); + + // just for easy access.. + UBO &ubo = ubo_data.ubo; + UBO &prev_ubo = ubo_data.prev_ubo; + + Projection correction; + correction.set_depth_correction(p_flip_y); + correction.add_jitter_offset(taa_jitter); + Projection projection = correction * cam_projection; + + //store camera into ubo + RendererRD::MaterialStorage::store_camera(projection, ubo.projection_matrix); + RendererRD::MaterialStorage::store_camera(projection.inverse(), ubo.inv_projection_matrix); + RendererRD::MaterialStorage::store_transform(cam_transform, ubo.inv_view_matrix); + RendererRD::MaterialStorage::store_transform(cam_transform.affine_inverse(), ubo.view_matrix); + + for (uint32_t v = 0; v < view_count; v++) { + projection = correction * view_projection[v]; + RendererRD::MaterialStorage::store_camera(projection, ubo.projection_matrix_view[v]); + RendererRD::MaterialStorage::store_camera(projection.inverse(), ubo.inv_projection_matrix_view[v]); + + ubo.eye_offset[v][0] = view_eye_offset[v].x; + ubo.eye_offset[v][1] = view_eye_offset[v].y; + ubo.eye_offset[v][2] = view_eye_offset[v].z; + ubo.eye_offset[v][3] = 0.0; + } + + ubo.taa_jitter[0] = taa_jitter.x; + ubo.taa_jitter[1] = taa_jitter.y; + + ubo.z_far = z_far; + ubo.z_near = z_near; + + ubo.pancake_shadows = p_pancake_shadows; + + RendererRD::MaterialStorage::store_soft_shadow_kernel(render_scene_render->directional_penumbra_shadow_kernel_get(), ubo.directional_penumbra_shadow_kernel); + RendererRD::MaterialStorage::store_soft_shadow_kernel(render_scene_render->directional_soft_shadow_kernel_get(), ubo.directional_soft_shadow_kernel); + RendererRD::MaterialStorage::store_soft_shadow_kernel(render_scene_render->penumbra_shadow_kernel_get(), ubo.penumbra_shadow_kernel); + RendererRD::MaterialStorage::store_soft_shadow_kernel(render_scene_render->soft_shadow_kernel_get(), ubo.soft_shadow_kernel); + + ubo.viewport_size[0] = p_screen_size.x; + ubo.viewport_size[1] = p_screen_size.y; + + Size2 screen_pixel_size = Vector2(1.0, 1.0) / Size2(p_screen_size); + ubo.screen_pixel_size[0] = screen_pixel_size.x; + ubo.screen_pixel_size[1] = screen_pixel_size.y; + + ubo.shadow_atlas_pixel_size[0] = shadow_atlas_pixel_size.x; + ubo.shadow_atlas_pixel_size[1] = shadow_atlas_pixel_size.y; + + ubo.directional_shadow_pixel_size[0] = directional_shadow_pixel_size.x; + ubo.directional_shadow_pixel_size[1] = directional_shadow_pixel_size.y; + + ubo.time = time; + + ubo.directional_light_count = directional_light_count; + ubo.dual_paraboloid_side = dual_paraboloid_side; + ubo.opaque_prepass_threshold = opaque_prepass_threshold; + ubo.material_uv2_mode = material_uv2_mode; + + ubo.fog_enabled = false; + + if (p_debug_mode == RS::VIEWPORT_DEBUG_DRAW_UNSHADED) { + ubo.use_ambient_light = true; + ubo.ambient_light_color_energy[0] = 1; + ubo.ambient_light_color_energy[1] = 1; + ubo.ambient_light_color_energy[2] = 1; + ubo.ambient_light_color_energy[3] = 1.0; + ubo.use_ambient_cubemap = false; + ubo.use_reflection_cubemap = false; + } else if (p_env.is_valid()) { + RS::EnvironmentBG env_bg = render_scene_render->environment_get_background(p_env); + RS::EnvironmentAmbientSource ambient_src = render_scene_render->environment_get_ambient_source(p_env); + + float bg_energy_multiplier = render_scene_render->environment_get_bg_energy_multiplier(p_env); + + ubo.ambient_light_color_energy[3] = bg_energy_multiplier; + + ubo.ambient_color_sky_mix = render_scene_render->environment_get_ambient_sky_contribution(p_env); + + //ambient + if (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && (env_bg == RS::ENV_BG_CLEAR_COLOR || env_bg == RS::ENV_BG_COLOR)) { + Color color = env_bg == RS::ENV_BG_CLEAR_COLOR ? p_default_bg_color : render_scene_render->environment_get_bg_color(p_env); + color = color.srgb_to_linear(); + + ubo.ambient_light_color_energy[0] = color.r * bg_energy_multiplier; + ubo.ambient_light_color_energy[1] = color.g * bg_energy_multiplier; + ubo.ambient_light_color_energy[2] = color.b * bg_energy_multiplier; + ubo.use_ambient_light = true; + ubo.use_ambient_cubemap = false; + } else { + float energy = render_scene_render->environment_get_ambient_light_energy(p_env); + Color color = render_scene_render->environment_get_ambient_light(p_env); + color = color.srgb_to_linear(); + ubo.ambient_light_color_energy[0] = color.r * energy; + ubo.ambient_light_color_energy[1] = color.g * energy; + ubo.ambient_light_color_energy[2] = color.b * energy; + + Basis sky_transform = render_scene_render->environment_get_sky_orientation(p_env); + sky_transform = sky_transform.inverse() * cam_transform.basis; + RendererRD::MaterialStorage::store_transform_3x3(sky_transform, ubo.radiance_inverse_xform); + + ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY; + ubo.use_ambient_light = ubo.use_ambient_cubemap || ambient_src == RS::ENV_AMBIENT_SOURCE_COLOR; + } + + //specular + RS::EnvironmentReflectionSource ref_src = render_scene_render->environment_get_reflection_source(p_env); + if ((ref_src == RS::ENV_REFLECTION_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ref_src == RS::ENV_REFLECTION_SOURCE_SKY) { + ubo.use_reflection_cubemap = true; + } else { + ubo.use_reflection_cubemap = false; + } + + ubo.fog_enabled = render_scene_render->environment_get_fog_enabled(p_env); + ubo.fog_density = render_scene_render->environment_get_fog_density(p_env); + ubo.fog_height = render_scene_render->environment_get_fog_height(p_env); + ubo.fog_height_density = render_scene_render->environment_get_fog_height_density(p_env); + ubo.fog_aerial_perspective = render_scene_render->environment_get_fog_aerial_perspective(p_env); + + Color fog_color = render_scene_render->environment_get_fog_light_color(p_env).srgb_to_linear(); + float fog_energy = render_scene_render->environment_get_fog_light_energy(p_env); + + ubo.fog_light_color[0] = fog_color.r * fog_energy; + ubo.fog_light_color[1] = fog_color.g * fog_energy; + ubo.fog_light_color[2] = fog_color.b * fog_energy; + + ubo.fog_sun_scatter = render_scene_render->environment_get_fog_sun_scatter(p_env); + } else { + if (p_reflection_probe_instance.is_valid() && RendererRD::LightStorage::get_singleton()->reflection_probe_is_interior(p_reflection_probe_instance)) { + ubo.use_ambient_light = false; + } else { + ubo.use_ambient_light = true; + Color clear_color = p_default_bg_color; + clear_color = clear_color.srgb_to_linear(); + ubo.ambient_light_color_energy[0] = clear_color.r; + ubo.ambient_light_color_energy[1] = clear_color.g; + ubo.ambient_light_color_energy[2] = clear_color.b; + ubo.ambient_light_color_energy[3] = 1.0; + } + + ubo.use_ambient_cubemap = false; + ubo.use_reflection_cubemap = false; + } + + if (p_camera_attributes.is_valid()) { + ubo.emissive_exposure_normalization = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_camera_attributes); + ubo.IBL_exposure_normalization = 1.0; + if (p_env.is_valid()) { + RID sky_rid = render_scene_render->environment_get_sky(p_env); + if (sky_rid.is_valid()) { + float current_exposure = RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_camera_attributes) * render_scene_render->environment_get_bg_intensity(p_env) / p_luminance_multiplier; + ubo.IBL_exposure_normalization = current_exposure / MAX(0.001, render_scene_render->get_sky()->sky_get_baked_exposure(sky_rid)); + } + } + } else if (emissive_exposure_normalization > 0.0) { + // This branch is triggered when using render_material(). + // Emissive is set outside the function. + ubo.emissive_exposure_normalization = emissive_exposure_normalization; + // IBL isn't used don't set it. + } else { + ubo.emissive_exposure_normalization = 1.0; + ubo.IBL_exposure_normalization = 1.0; + } + + ubo.roughness_limiter_enabled = p_opaque_render_buffers && render_scene_render->screen_space_roughness_limiter_is_active(); + ubo.roughness_limiter_amount = render_scene_render->screen_space_roughness_limiter_get_amount(); + ubo.roughness_limiter_limit = render_scene_render->screen_space_roughness_limiter_get_limit(); + + if (calculate_motion_vectors) { + // Q : Should we make a complete copy or should we define a separate UBO with just the components we need? + memcpy(&prev_ubo, &ubo, sizeof(UBO)); + + Projection prev_correction; + prev_correction.set_depth_correction(true); + prev_correction.add_jitter_offset(prev_taa_jitter); + Projection prev_projection = prev_correction * prev_cam_projection; + + //store camera into ubo + RendererRD::MaterialStorage::store_camera(prev_projection, prev_ubo.projection_matrix); + RendererRD::MaterialStorage::store_camera(prev_projection.inverse(), prev_ubo.inv_projection_matrix); + RendererRD::MaterialStorage::store_transform(prev_cam_transform, prev_ubo.inv_view_matrix); + RendererRD::MaterialStorage::store_transform(prev_cam_transform.affine_inverse(), prev_ubo.view_matrix); + + for (uint32_t v = 0; v < view_count; v++) { + prev_projection = prev_correction * view_projection[v]; + RendererRD::MaterialStorage::store_camera(prev_projection, prev_ubo.projection_matrix_view[v]); + RendererRD::MaterialStorage::store_camera(prev_projection.inverse(), prev_ubo.inv_projection_matrix_view[v]); + } + prev_ubo.taa_jitter[0] = prev_taa_jitter.x; + prev_ubo.taa_jitter[1] = prev_taa_jitter.y; + prev_ubo.time -= time_step; + } + + uniform_buffer = p_uniform_buffer; + RD::get_singleton()->buffer_update(uniform_buffer, 0, sizeof(UBODATA), &ubo, RD::BARRIER_MASK_RASTER); +} + +RID RenderSceneDataRD::get_uniform_buffer() { + return uniform_buffer; +} diff --git a/servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.h b/servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.h new file mode 100644 index 0000000000..c2dc7d5f4c --- /dev/null +++ b/servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.h @@ -0,0 +1,157 @@ +/*************************************************************************/ +/* render_scene_data_rd.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 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 RENDER_SCENE_DATA_RD_H +#define RENDER_SCENE_DATA_RD_H + +#include "render_scene_buffers_rd.h" +#include "servers/rendering/renderer_scene_render.h" +#include "servers/rendering/rendering_device.h" + +// This is a container for data related to rendering a single frame of a viewport where we load this data into a UBO +// that can be used by the main scene shader but also by various effects. + +class RenderSceneDataRD { +public: + bool calculate_motion_vectors = false; + + Transform3D cam_transform; + Projection cam_projection; + Vector2 taa_jitter; + bool cam_orthogonal = false; + + // For stereo rendering + uint32_t view_count = 1; + Vector3 view_eye_offset[RendererSceneRender::MAX_RENDER_VIEWS]; + Projection view_projection[RendererSceneRender::MAX_RENDER_VIEWS]; + + Transform3D prev_cam_transform; + Projection prev_cam_projection; + Vector2 prev_taa_jitter; + Projection prev_view_projection[RendererSceneRender::MAX_RENDER_VIEWS]; + + float z_near = 0.0; + float z_far = 0.0; + + float lod_distance_multiplier = 0.0; + Plane lod_camera_plane; + float screen_mesh_lod_threshold = 0.0; + + uint32_t directional_light_count = 0; + float dual_paraboloid_side = 0.0; + float opaque_prepass_threshold = 0.0; + bool material_uv2_mode = false; + float emissive_exposure_normalization = 0.0; + + Size2 shadow_atlas_pixel_size; + Size2 directional_shadow_pixel_size; + + float time; + float time_step; + + RID create_uniform_buffer(); + void update_ubo(RID p_uniform_buffer, RS::ViewportDebugDraw p_debug_mode, RID p_env, RID p_reflection_probe_instance, RID p_camera_attributes, bool p_flip_y, bool p_pancake_shadows, const Size2i &p_screen_size, const Color &p_default_bg_color, float p_luminance_multiplier, bool p_opaque_render_buffers); + RID get_uniform_buffer(); + +private: + RID uniform_buffer; // loaded into this uniform buffer (supplied externally) + + // This struct is loaded into Set 1 - Binding 0, populated at start of rendering a frame, must match with shader code + struct UBO { + float projection_matrix[16]; + float inv_projection_matrix[16]; + float inv_view_matrix[16]; + float view_matrix[16]; + + float projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; + float inv_projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; + float eye_offset[RendererSceneRender::MAX_RENDER_VIEWS][4]; + + float viewport_size[2]; + float screen_pixel_size[2]; + + float directional_penumbra_shadow_kernel[128]; //32 vec4s + float directional_soft_shadow_kernel[128]; + float penumbra_shadow_kernel[128]; + float soft_shadow_kernel[128]; + + float radiance_inverse_xform[12]; + + float ambient_light_color_energy[4]; + + float ambient_color_sky_mix; + uint32_t use_ambient_light; + uint32_t use_ambient_cubemap; + uint32_t use_reflection_cubemap; + + float shadow_atlas_pixel_size[2]; + float directional_shadow_pixel_size[2]; + + uint32_t directional_light_count; + float dual_paraboloid_side; + float z_far; + float z_near; + + uint32_t roughness_limiter_enabled; + float roughness_limiter_amount; + float roughness_limiter_limit; + float opaque_prepass_threshold; + + // Fog + uint32_t fog_enabled; + float fog_density; + float fog_height; + float fog_height_density; + + float fog_light_color[3]; + float fog_sun_scatter; + + float fog_aerial_perspective; + float time; + float reflection_multiplier; + uint32_t material_uv2_mode; + + float taa_jitter[2]; + float emissive_exposure_normalization; // Needed to normalize emissive when using physical units. + float IBL_exposure_normalization; // Adjusts for baked exposure. + + uint32_t pancake_shadows; + uint32_t pad1; + uint32_t pad2; + uint32_t pad3; + }; + + struct UBODATA { + UBO ubo; + UBO prev_ubo; + }; +}; + +#endif // RENDER_SCENE_DATA_RD_H diff --git a/servers/rendering/renderer_scene_cull.cpp b/servers/rendering/renderer_scene_cull.cpp index 04dedc0646..c2dece8b46 100644 --- a/servers/rendering/renderer_scene_cull.cpp +++ b/servers/rendering/renderer_scene_cull.cpp @@ -2910,7 +2910,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul } } -void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_camera_data, const Ref<RenderSceneBuffers> &p_render_buffers, RID p_environment, RID p_force_camera_attributes, uint32_t p_visible_layers, RID p_scenario, RID p_viewport, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, bool p_using_shadows, RendererScene::RenderInfo *r_render_info) { +void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_camera_data, const Ref<RenderSceneBuffers> &p_render_buffers, RID p_environment, RID p_force_camera_attributes, uint32_t p_visible_layers, RID p_scenario, RID p_viewport, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, bool p_using_shadows, RenderingMethod::RenderInfo *r_render_info) { Instance *render_reflection_probe = instance_owner.get_or_null(p_reflection_probe); //if null, not rendering to it Scenario *scenario = scenario_owner.get_or_null(p_scenario); diff --git a/servers/rendering/renderer_scene_cull.h b/servers/rendering/renderer_scene_cull.h index c799553f87..fedaac99b1 100644 --- a/servers/rendering/renderer_scene_cull.h +++ b/servers/rendering/renderer_scene_cull.h @@ -39,13 +39,13 @@ #include "core/templates/pass_func.h" #include "core/templates/rid_owner.h" #include "core/templates/self_list.h" -#include "servers/rendering/renderer_scene.h" #include "servers/rendering/renderer_scene_occlusion_cull.h" #include "servers/rendering/renderer_scene_render.h" +#include "servers/rendering/rendering_method.h" #include "servers/rendering/storage/utilities.h" #include "servers/xr/xr_interface.h" -class RendererSceneCull : public RendererScene { +class RendererSceneCull : public RenderingMethod { public: RendererSceneRender *scene_render = nullptr; @@ -1058,7 +1058,7 @@ public: void _render_scene(const RendererSceneRender::CameraData *p_camera_data, const Ref<RenderSceneBuffers> &p_render_buffers, RID p_environment, RID p_force_camera_attributes, uint32_t p_visible_layers, RID p_scenario, RID p_viewport, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, bool p_using_shadows = true, RenderInfo *r_render_info = nullptr); void render_empty_scene(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_scenario, RID p_shadow_atlas); - void render_camera(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_camera, RID p_scenario, RID p_viewport, Size2 p_viewport_size, bool p_use_taa, float p_screen_mesh_lod_threshold, RID p_shadow_atlas, Ref<XRInterface> &p_xr_interface, RendererScene::RenderInfo *r_render_info = nullptr); + void render_camera(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_camera, RID p_scenario, RID p_viewport, Size2 p_viewport_size, bool p_use_taa, float p_screen_mesh_lod_threshold, RID p_shadow_atlas, Ref<XRInterface> &p_xr_interface, RenderingMethod::RenderInfo *r_render_info = nullptr); void update_dirty_instances(); void render_particle_colliders(); diff --git a/servers/rendering/renderer_scene_render.h b/servers/rendering/renderer_scene_render.h index 9aa4108412..34f4980f05 100644 --- a/servers/rendering/renderer_scene_render.h +++ b/servers/rendering/renderer_scene_render.h @@ -34,7 +34,7 @@ #include "core/math/projection.h" #include "core/templates/paged_array.h" #include "servers/rendering/renderer_geometry_instance.h" -#include "servers/rendering/renderer_scene.h" +#include "servers/rendering/rendering_method.h" #include "servers/rendering/storage/environment_storage.h" #include "storage/render_scene_buffers.h" #include "storage/utilities.h" @@ -320,7 +320,7 @@ public: void set_multiview_camera(uint32_t p_view_count, const Transform3D *p_transforms, const Projection *p_projections, bool p_is_orthogonal, bool p_vaspect); }; - virtual void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RendererScene::RenderInfo *r_render_info = nullptr) = 0; + virtual void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RenderingMethod::RenderInfo *r_render_info = nullptr) = 0; virtual void render_material(const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal, const PagedArray<RenderGeometryInstance *> &p_instances, RID p_framebuffer, const Rect2i &p_region) = 0; virtual void render_particle_collider_heightfield(RID p_collider, const Transform3D &p_transform, const PagedArray<RenderGeometryInstance *> &p_instances) = 0; diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp index d466f90e79..2b05e23a96 100644 --- a/servers/rendering/renderer_viewport.cpp +++ b/servers/rendering/renderer_viewport.cpp @@ -73,33 +73,36 @@ static Transform2D _canvas_get_transform(RendererViewport::Viewport *p_viewport, } Vector<RendererViewport::Viewport *> RendererViewport::_sort_active_viewports() { - // We need to sort the viewports in a "topological order", - // children first and parents last, we use the Kahn's algorithm to achieve that. + // We need to sort the viewports in a "topological order", children first and + // parents last. We also need to keep sibling viewports in the original order + // from top to bottom. Vector<Viewport *> result; List<Viewport *> nodes; - for (Viewport *viewport : active_viewports) { + for (int i = active_viewports.size() - 1; i >= 0; --i) { + Viewport *viewport = active_viewports[i]; if (viewport->parent.is_valid()) { continue; } nodes.push_back(viewport); + result.insert(0, viewport); } while (!nodes.is_empty()) { - Viewport *node = nodes[0]; + const Viewport *node = nodes[0]; nodes.pop_front(); - result.insert(0, node); - - for (Viewport *child : active_viewports) { + for (int i = active_viewports.size() - 1; i >= 0; --i) { + Viewport *child = active_viewports[i]; if (child->parent != node->self) { continue; } if (!nodes.find(child)) { nodes.push_back(child); + result.insert(0, child); } } } @@ -176,7 +179,7 @@ void RendererViewport::_configure_3d_render_buffers(Viewport *p_viewport) { // to compensate for the loss of sharpness. const float texture_mipmap_bias = log2f(MIN(scaling_3d_scale, 1.0)) + p_viewport->texture_mipmap_bias; - p_viewport->render_buffers->configure(p_viewport->render_target, Size2i(render_width, render_height), Size2(width, height), p_viewport->fsr_sharpness, texture_mipmap_bias, p_viewport->msaa_3d, p_viewport->screen_space_aa, p_viewport->use_taa, p_viewport->use_debanding, p_viewport->get_view_count()); + p_viewport->render_buffers->configure(p_viewport->render_target, Size2i(render_width, render_height), Size2(width, height), p_viewport->fsr_sharpness, texture_mipmap_bias, p_viewport->msaa_3d, p_viewport->screen_space_aa, p_viewport->use_taa, p_viewport->use_debanding, p_viewport->view_count); } } } @@ -217,7 +220,7 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { timestamp_vp_map[rt_id] = p_viewport->self; } - if (OS::get_singleton()->get_current_rendering_driver_name() == "opengl3") { + if (OS::get_singleton()->get_current_rendering_method() == "gl_compatibility") { // This is currently needed for GLES to keep the current window being rendered to up to date DisplayServer::get_singleton()->gl_window_make_current(p_viewport->viewport_to_screen); } @@ -613,14 +616,7 @@ void RendererViewport::draw_viewports() { if (xr_interface.is_valid()) { // Override our size, make sure it matches our required size and is created as a stereo target Size2 xr_size = xr_interface->get_render_target_size(); - - // Would have been nice if we could call viewport_set_size here, - // but alas that takes our RID and we now have our pointer, - // also we only check if view_count changes in render_target_set_size so we need to call that for this to reliably change - vp->occlusion_buffer_dirty = vp->occlusion_buffer_dirty || (vp->size != xr_size); - vp->size = xr_size; - uint32_t view_count = xr_interface->get_view_count(); - RSG::texture_storage->render_target_set_size(vp->render_target, vp->size.x, vp->size.y, view_count); + _viewport_set_size(vp, xr_size.width, xr_size.height, xr_interface->get_view_count()); // Inform xr interface we're about to render its viewport, if this returns false we don't render visible = xr_interface->pre_draw_viewport(vp->render_target); @@ -683,12 +679,17 @@ void RendererViewport::draw_viewports() { // commit our eyes Vector<BlitToScreen> blits = xr_interface->post_draw_viewport(vp->render_target, vp->viewport_to_screen_rect); if (vp->viewport_to_screen != DisplayServer::INVALID_WINDOW_ID && blits.size() > 0) { - if (!blit_to_screen_list.has(vp->viewport_to_screen)) { - blit_to_screen_list[vp->viewport_to_screen] = Vector<BlitToScreen>(); - } + if (OS::get_singleton()->get_current_rendering_driver_name() == "opengl3") { + RSG::rasterizer->blit_render_targets_to_screen(vp->viewport_to_screen, blits.ptr(), blits.size()); + RSG::rasterizer->end_frame(true); + } else { + if (!blit_to_screen_list.has(vp->viewport_to_screen)) { + blit_to_screen_list[vp->viewport_to_screen] = Vector<BlitToScreen>(); + } - for (int b = 0; b < blits.size(); b++) { - blit_to_screen_list[vp->viewport_to_screen].push_back(blits[b]); + for (int b = 0; b < blits.size(); b++) { + blit_to_screen_list[vp->viewport_to_screen].push_back(blits[b]); + } } } } else { @@ -714,7 +715,14 @@ void RendererViewport::draw_viewports() { blit_to_screen_list[vp->viewport_to_screen] = Vector<BlitToScreen>(); } - blit_to_screen_list[vp->viewport_to_screen].push_back(blit); + if (OS::get_singleton()->get_current_rendering_driver_name() == "opengl3") { + Vector<BlitToScreen> blit_to_screen_vec; + blit_to_screen_vec.push_back(blit); + RSG::rasterizer->blit_render_targets_to_screen(vp->viewport_to_screen, blit_to_screen_vec.ptr(), 1); + RSG::rasterizer->end_frame(true); + } else { + blit_to_screen_list[vp->viewport_to_screen].push_back(blit); + } } } @@ -767,7 +775,13 @@ void RendererViewport::viewport_set_use_xr(RID p_viewport, bool p_use_xr) { } viewport->use_xr = p_use_xr; - _configure_3d_render_buffers(viewport); + + // Re-configure the 3D render buffers when disabling XR. They'll get + // re-configured when enabling XR in draw_viewports(). + if (!p_use_xr) { + viewport->view_count = 1; + _configure_3d_render_buffers(viewport); + } } void RendererViewport::viewport_set_scaling_3d_mode(RID p_viewport, RS::ViewportScaling3DMode p_mode) { @@ -813,34 +827,27 @@ void RendererViewport::viewport_set_scaling_3d_scale(RID p_viewport, float p_sca _configure_3d_render_buffers(viewport); } -uint32_t RendererViewport::Viewport::get_view_count() { - uint32_t view_count = 1; - - if (use_xr && XRServer::get_singleton() != nullptr) { - Ref<XRInterface> xr_interface; - - xr_interface = XRServer::get_singleton()->get_primary_interface(); - if (xr_interface.is_valid()) { - view_count = xr_interface->get_view_count(); - } - } - - return view_count; -} - void RendererViewport::viewport_set_size(RID p_viewport, int p_width, int p_height) { ERR_FAIL_COND(p_width < 0 && p_height < 0); Viewport *viewport = viewport_owner.get_or_null(p_viewport); ERR_FAIL_COND(!viewport); + ERR_FAIL_COND_MSG(viewport->use_xr, "Cannot set viewport size when using XR"); - viewport->size = Size2(p_width, p_height); + _viewport_set_size(viewport, p_width, p_height, 1); +} - uint32_t view_count = viewport->get_view_count(); - RSG::texture_storage->render_target_set_size(viewport->render_target, p_width, p_height, view_count); - _configure_3d_render_buffers(viewport); +void RendererViewport::_viewport_set_size(Viewport *p_viewport, int p_width, int p_height, uint32_t p_view_count) { + Size2i new_size(p_width, p_height); + if (p_viewport->size != new_size || p_viewport->view_count != p_view_count) { + p_viewport->size = new_size; + p_viewport->view_count = p_view_count; - viewport->occlusion_buffer_dirty = true; + RSG::texture_storage->render_target_set_size(p_viewport->render_target, p_width, p_height, p_view_count); + _configure_3d_render_buffers(p_viewport); + + p_viewport->occlusion_buffer_dirty = true; + } } void RendererViewport::viewport_set_active(RID p_viewport, bool p_active) { @@ -880,7 +887,7 @@ void RendererViewport::viewport_attach_to_screen(RID p_viewport, const Rect2 &p_ // If using OpenGL we can optimize this operation by rendering directly to system_fbo // instead of rendering to fbo and copying to system_fbo after if (RSG::rasterizer->is_low_end() && viewport->viewport_render_direct_to_screen) { - RSG::texture_storage->render_target_set_size(viewport->render_target, p_rect.size.x, p_rect.size.y, viewport->get_view_count()); + RSG::texture_storage->render_target_set_size(viewport->render_target, p_rect.size.x, p_rect.size.y, viewport->view_count); RSG::texture_storage->render_target_set_position(viewport->render_target, p_rect.position.x, p_rect.position.y); } @@ -890,7 +897,7 @@ void RendererViewport::viewport_attach_to_screen(RID p_viewport, const Rect2 &p_ // if render_direct_to_screen was used, reset size and position if (RSG::rasterizer->is_low_end() && viewport->viewport_render_direct_to_screen) { RSG::texture_storage->render_target_set_position(viewport->render_target, 0, 0); - RSG::texture_storage->render_target_set_size(viewport->render_target, viewport->size.x, viewport->size.y, viewport->get_view_count()); + RSG::texture_storage->render_target_set_size(viewport->render_target, viewport->size.x, viewport->size.y, viewport->view_count); } viewport->viewport_to_screen_rect = Rect2(); @@ -909,7 +916,7 @@ void RendererViewport::viewport_set_render_direct_to_screen(RID p_viewport, bool // if disabled, reset render_target size and position if (!p_enable) { RSG::texture_storage->render_target_set_position(viewport->render_target, 0, 0); - RSG::texture_storage->render_target_set_size(viewport->render_target, viewport->size.x, viewport->size.y, viewport->get_view_count()); + RSG::texture_storage->render_target_set_size(viewport->render_target, viewport->size.x, viewport->size.y, viewport->view_count); } RSG::texture_storage->render_target_set_direct_to_screen(viewport->render_target, p_enable); @@ -917,7 +924,7 @@ void RendererViewport::viewport_set_render_direct_to_screen(RID p_viewport, bool // if attached to screen already, setup screen size and position, this needs to happen after setting flag to avoid an unnecessary buffer allocation if (RSG::rasterizer->is_low_end() && viewport->viewport_to_screen_rect != Rect2() && p_enable) { - RSG::texture_storage->render_target_set_size(viewport->render_target, viewport->viewport_to_screen_rect.size.x, viewport->viewport_to_screen_rect.size.y, viewport->get_view_count()); + RSG::texture_storage->render_target_set_size(viewport->render_target, viewport->viewport_to_screen_rect.size.x, viewport->viewport_to_screen_rect.size.y, viewport->view_count); RSG::texture_storage->render_target_set_position(viewport->render_target, viewport->viewport_to_screen_rect.position.x, viewport->viewport_to_screen_rect.position.y); } } diff --git a/servers/rendering/renderer_viewport.h b/servers/rendering/renderer_viewport.h index a123c70372..55058a30b8 100644 --- a/servers/rendering/renderer_viewport.h +++ b/servers/rendering/renderer_viewport.h @@ -34,8 +34,8 @@ #include "core/templates/local_vector.h" #include "core/templates/rid_owner.h" #include "core/templates/self_list.h" -#include "servers/rendering/renderer_scene.h" #include "servers/rendering/renderer_scene_render.h" +#include "servers/rendering/rendering_method.h" #include "servers/rendering_server.h" #include "servers/xr/xr_interface.h" #include "storage/render_scene_buffers.h" @@ -54,6 +54,7 @@ public: Size2i internal_size; Size2i size; + uint32_t view_count; RID camera; RID scenario; @@ -147,9 +148,10 @@ public: HashMap<RID, CanvasData> canvas_map; - RendererScene::RenderInfo render_info; + RenderingMethod::RenderInfo render_info; Viewport() { + view_count = 1; update_mode = RS::VIEWPORT_UPDATE_WHEN_VISIBLE; clear_mode = RS::VIEWPORT_CLEAR_ALWAYS; transparent_bg = false; @@ -176,8 +178,6 @@ public: time_gpu_begin = 0; time_gpu_end = 0; } - - uint32_t get_view_count(); }; HashMap<String, RID> timestamp_vp_map; @@ -196,6 +196,7 @@ public: private: Vector<Viewport *> _sort_active_viewports(); + void _viewport_set_size(Viewport *p_viewport, int p_width, int p_height, uint32_t p_view_count); void _configure_3d_render_buffers(Viewport *p_viewport); void _draw_3d(Viewport *p_viewport); void _draw_viewport(Viewport *p_viewport); diff --git a/servers/rendering/renderer_scene.cpp b/servers/rendering/rendering_method.cpp index b3fdd88626..16a4e35ad3 100644 --- a/servers/rendering/renderer_scene.cpp +++ b/servers/rendering/rendering_method.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* renderer_scene.cpp */ +/* rendering_method.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,10 +28,10 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "renderer_scene.h" +#include "rendering_method.h" -RendererScene::RendererScene() { +RenderingMethod::RenderingMethod() { } -RendererScene::~RendererScene() { +RenderingMethod::~RenderingMethod() { } diff --git a/servers/rendering/renderer_scene.h b/servers/rendering/rendering_method.h index 29c65fcffb..a178b00424 100644 --- a/servers/rendering/renderer_scene.h +++ b/servers/rendering/rendering_method.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* renderer_scene.h */ +/* rendering_method.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,14 +28,14 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef RENDERER_SCENE_H -#define RENDERER_SCENE_H +#ifndef RENDERING_METHOD_H +#define RENDERING_METHOD_H #include "servers/rendering/storage/render_scene_buffers.h" #include "servers/rendering_server.h" #include "servers/xr/xr_interface.h" -class RendererScene { +class RenderingMethod { public: virtual RID camera_allocate() = 0; virtual void camera_initialize(RID p_rid) = 0; @@ -318,8 +318,8 @@ public: virtual bool free(RID p_rid) = 0; - RendererScene(); - virtual ~RendererScene(); + RenderingMethod(); + virtual ~RenderingMethod(); }; -#endif // RENDERER_SCENE_H +#endif // RENDERING_METHOD_H diff --git a/servers/rendering/rendering_server_default.cpp b/servers/rendering/rendering_server_default.cpp index 1f686069bd..9103b0cf56 100644 --- a/servers/rendering/rendering_server_default.cpp +++ b/servers/rendering/rendering_server_default.cpp @@ -91,7 +91,10 @@ void RenderingServerDefault::_draw(bool p_swap_buffers, double frame_step) { RSG::viewport->draw_viewports(); RSG::canvas_render->update(); - RSG::rasterizer->end_frame(p_swap_buffers); + if (OS::get_singleton()->get_current_rendering_driver_name() != "opengl3") { + // Already called for gl_compatibility renderer. + RSG::rasterizer->end_frame(p_swap_buffers); + } XRServer *xr_server = XRServer::get_singleton(); if (xr_server != nullptr) { diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h index dfe16431bd..5ee29d5e2a 100644 --- a/servers/rendering/rendering_server_default.h +++ b/servers/rendering/rendering_server_default.h @@ -550,7 +550,7 @@ public: #undef server_name #undef ServerName //from now on, calls forwarded to this singleton -#define ServerName RendererScene +#define ServerName RenderingMethod #define server_name RSG::scene /* CAMERA API */ @@ -649,7 +649,7 @@ public: #undef server_name #undef ServerName //from now on, calls forwarded to this singleton -#define ServerName RendererScene +#define ServerName RenderingMethod #define server_name RSG::scene FUNC2(directional_shadow_atlas_set_size, int, bool) @@ -739,7 +739,7 @@ public: #undef server_name #undef ServerName -#define ServerName RendererScene +#define ServerName RenderingMethod #define server_name RSG::scene FUNCRIDSPLIT(scenario) diff --git a/servers/rendering/rendering_server_globals.cpp b/servers/rendering/rendering_server_globals.cpp index ce7383a03f..ca24042ef9 100644 --- a/servers/rendering/rendering_server_globals.cpp +++ b/servers/rendering/rendering_server_globals.cpp @@ -46,4 +46,4 @@ RendererCompositor *RenderingServerGlobals::rasterizer = nullptr; RendererCanvasCull *RenderingServerGlobals::canvas = nullptr; RendererViewport *RenderingServerGlobals::viewport = nullptr; -RendererScene *RenderingServerGlobals::scene = nullptr; +RenderingMethod *RenderingServerGlobals::scene = nullptr; diff --git a/servers/rendering/rendering_server_globals.h b/servers/rendering/rendering_server_globals.h index 6c4ab5a26e..23f3810ce8 100644 --- a/servers/rendering/rendering_server_globals.h +++ b/servers/rendering/rendering_server_globals.h @@ -35,7 +35,7 @@ #include "servers/rendering/environment/renderer_gi.h" #include "servers/rendering/renderer_canvas_cull.h" #include "servers/rendering/renderer_canvas_render.h" -#include "servers/rendering/renderer_scene.h" +#include "servers/rendering/rendering_method.h" #include "servers/rendering/storage/camera_attributes_storage.h" #include "servers/rendering/storage/light_storage.h" #include "servers/rendering/storage/material_storage.h" @@ -46,7 +46,7 @@ class RendererCanvasCull; class RendererViewport; -class RendererScene; +class RenderingMethod; class RenderingServerGlobals { public: @@ -66,7 +66,7 @@ public: static RendererCanvasCull *canvas; static RendererViewport *viewport; - static RendererScene *scene; + static RenderingMethod *scene; }; #define RSG RenderingServerGlobals diff --git a/servers/rendering/shader_language.cpp b/servers/rendering/shader_language.cpp index e2519ba8d1..6754d84cd4 100644 --- a/servers/rendering/shader_language.cpp +++ b/servers/rendering/shader_language.cpp @@ -1069,7 +1069,7 @@ String ShaderLanguage::get_uniform_hint_name(ShaderNode::Uniform::Hint p_hint) { result = "hint_range"; } break; case ShaderNode::Uniform::HINT_SOURCE_COLOR: { - result = "hint_color"; + result = "source_color"; } break; case ShaderNode::Uniform::HINT_NORMAL: { result = "hint_normal"; @@ -1171,6 +1171,10 @@ void ShaderLanguage::clear() { last_type = IDENTIFIER_MAX; current_uniform_group_name = ""; current_uniform_subgroup_name = ""; + current_uniform_hint = ShaderNode::Uniform::HINT_NONE; + current_uniform_filter = FILTER_DEFAULT; + current_uniform_repeat = REPEAT_DEFAULT; + current_uniform_instance_index_defined = false; completion_type = COMPLETION_NONE; completion_block = nullptr; @@ -8617,6 +8621,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f } custom_instance_index = tk.constant; + current_uniform_instance_index_defined = true; if (custom_instance_index >= MAX_INSTANCE_UNIFORM_INDICES) { _set_error(vformat(RTR("Allowed instance uniform indices must be within [0..%d] range."), MAX_INSTANCE_UNIFORM_INDICES - 1)); @@ -8682,6 +8687,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f return ERR_PARSE_ERROR; } else { uniform.hint = new_hint; + current_uniform_hint = new_hint; } } @@ -8695,6 +8701,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f return ERR_PARSE_ERROR; } else { uniform.filter = new_filter; + current_uniform_filter = new_filter; } } @@ -8708,6 +8715,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f return ERR_PARSE_ERROR; } else { uniform.repeat = new_repeat; + current_uniform_repeat = new_repeat; } } @@ -8775,6 +8783,11 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f keyword_completion_context = CF_GLOBAL_SPACE; #endif // DEBUG_ENABLED completion_type = COMPLETION_NONE; + + current_uniform_hint = ShaderNode::Uniform::HINT_NONE; + current_uniform_filter = FILTER_DEFAULT; + current_uniform_repeat = REPEAT_DEFAULT; + current_uniform_instance_index_defined = false; } else { // varying ShaderNode::Varying varying; varying.type = type; @@ -10311,28 +10324,33 @@ Error ShaderLanguage::complete(const String &p_code, const ShaderCompileInfo &p_ } break; case COMPLETION_HINT: { if (completion_base == DataType::TYPE_VEC3 || completion_base == DataType::TYPE_VEC4) { - ScriptLanguage::CodeCompletionOption option("source_color", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); - r_options->push_back(option); + if (current_uniform_hint == ShaderNode::Uniform::HINT_NONE) { + ScriptLanguage::CodeCompletionOption option("source_color", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); + r_options->push_back(option); + } } else if ((completion_base == DataType::TYPE_INT || completion_base == DataType::TYPE_FLOAT) && !completion_base_array) { - ScriptLanguage::CodeCompletionOption option("hint_range", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); + if (current_uniform_hint == ShaderNode::Uniform::HINT_NONE) { + ScriptLanguage::CodeCompletionOption option("hint_range", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); - if (completion_base == DataType::TYPE_INT) { - option.insert_text = "hint_range(0, 100, 1)"; - } else { - option.insert_text = "hint_range(0.0, 1.0, 0.1)"; - } + if (completion_base == DataType::TYPE_INT) { + option.insert_text = "hint_range(0, 100, 1)"; + } else { + option.insert_text = "hint_range(0.0, 1.0, 0.1)"; + } - r_options->push_back(option); + r_options->push_back(option); + } } else if ((int(completion_base) > int(TYPE_MAT4) && int(completion_base) < int(TYPE_STRUCT)) && !completion_base_array) { - static Vector<String> options; - - if (options.is_empty()) { + Vector<String> options; + if (current_uniform_filter == FILTER_DEFAULT) { options.push_back("filter_linear"); options.push_back("filter_linear_mipmap"); options.push_back("filter_linear_mipmap_anisotropic"); options.push_back("filter_nearest"); options.push_back("filter_nearest_mipmap"); options.push_back("filter_nearest_mipmap_anisotropic"); + } + if (current_uniform_hint == ShaderNode::Uniform::HINT_NONE) { options.push_back("hint_anisotropy"); options.push_back("hint_default_black"); options.push_back("hint_default_white"); @@ -10348,6 +10366,8 @@ Error ShaderLanguage::complete(const String &p_code, const ShaderCompileInfo &p_ options.push_back("hint_normal_roughness_texture"); options.push_back("hint_depth_texture"); options.push_back("source_color"); + } + if (current_uniform_repeat == REPEAT_DEFAULT) { options.push_back("repeat_enable"); options.push_back("repeat_disable"); } @@ -10357,7 +10377,7 @@ Error ShaderLanguage::complete(const String &p_code, const ShaderCompileInfo &p_ r_options->push_back(option); } } - if (!completion_base_array) { + if (!completion_base_array && !current_uniform_instance_index_defined) { ScriptLanguage::CodeCompletionOption option("instance_index", ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT); option.insert_text = "instance_index(0)"; r_options->push_back(option); diff --git a/servers/rendering/shader_language.h b/servers/rendering/shader_language.h index 75b713d167..e9f8c3b289 100644 --- a/servers/rendering/shader_language.h +++ b/servers/rendering/shader_language.h @@ -1050,6 +1050,10 @@ private: }; CompletionType completion_type; + ShaderNode::Uniform::Hint current_uniform_hint = ShaderNode::Uniform::HINT_NONE; + TextureFilter current_uniform_filter = FILTER_DEFAULT; + TextureRepeat current_uniform_repeat = REPEAT_DEFAULT; + bool current_uniform_instance_index_defined = false; int completion_line = 0; BlockNode *completion_block = nullptr; DataType completion_base; diff --git a/servers/rendering/shader_types.cpp b/servers/rendering/shader_types.cpp index 43c483a00d..cd063f91ac 100644 --- a/servers/rendering/shader_types.cpp +++ b/servers/rendering/shader_types.cpp @@ -340,6 +340,11 @@ ShaderTypes::ShaderTypes() { shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["INDEX"] = constt(ShaderLanguage::TYPE_UINT); shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["EMISSION_TRANSFORM"] = constt(ShaderLanguage::TYPE_MAT4); shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["RANDOM_SEED"] = constt(ShaderLanguage::TYPE_UINT); + shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["FLAG_EMIT_POSITION"] = constt(ShaderLanguage::TYPE_UINT); + shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["FLAG_EMIT_ROT_SCALE"] = constt(ShaderLanguage::TYPE_UINT); + shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["FLAG_EMIT_VELOCITY"] = constt(ShaderLanguage::TYPE_UINT); + shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["FLAG_EMIT_COLOR"] = constt(ShaderLanguage::TYPE_UINT); + shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["FLAG_EMIT_CUSTOM"] = constt(ShaderLanguage::TYPE_UINT); shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["RESTART_POSITION"] = constt(ShaderLanguage::TYPE_BOOL); shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["RESTART_ROT_SCALE"] = constt(ShaderLanguage::TYPE_BOOL); shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["RESTART_VELOCITY"] = constt(ShaderLanguage::TYPE_BOOL); @@ -385,6 +390,7 @@ ShaderTypes::ShaderTypes() { emit_vertex_func.arguments.push_back(ShaderLanguage::StageFunctionInfo::Argument("custom", ShaderLanguage::TYPE_VEC4)); emit_vertex_func.arguments.push_back(ShaderLanguage::StageFunctionInfo::Argument("flags", ShaderLanguage::TYPE_UINT)); emit_vertex_func.return_type = ShaderLanguage::TYPE_BOOL; //whether it could emit + shader_modes[RS::SHADER_PARTICLES].functions["start"].stage_functions["emit_subparticle"] = emit_vertex_func; shader_modes[RS::SHADER_PARTICLES].functions["process"].stage_functions["emit_subparticle"] = emit_vertex_func; } @@ -444,6 +450,7 @@ ShaderTypes::ShaderTypes() { shader_modes[RS::SHADER_SKY].modes.push_back({ PNAME("use_half_res_pass") }); shader_modes[RS::SHADER_SKY].modes.push_back({ PNAME("use_quarter_res_pass") }); shader_modes[RS::SHADER_SKY].modes.push_back({ PNAME("disable_fog") }); + shader_modes[RS::SHADER_SKY].modes.push_back({ PNAME("use_debanding") }); } /************ FOG **************************/ diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index aa3351c815..b9df0ec8ac 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -1114,7 +1114,8 @@ Array RenderingServer::_get_array_from_surface(uint32_t p_format, Vector<uint8_t for (int j = 0; j < p_vertex_len; j++) { const uint32_t v = *(const uint32_t *)&r[j * vertex_elem_size + offsets[i]]; - w[j] = Vector3((v & 0x3FF) / 1023.0, ((v >> 10) & 0x3FF) / 1023.0, ((v >> 20) & 0x3FF) / 1023.0) * Vector3(2, 2, 2) - Vector3(1, 1, 1); + + w[j] = Vector3::octahedron_decode(Vector2((v & 0xFFFF) / 65535.0, ((v >> 16) & 0xFFFF) / 65535.0)); } ret[i] = arr; @@ -1129,11 +1130,12 @@ Array RenderingServer::_get_array_from_surface(uint32_t p_format, Vector<uint8_t for (int j = 0; j < p_vertex_len; j++) { const uint32_t v = *(const uint32_t *)&r[j * vertex_elem_size + offsets[i]]; - - w[j * 4 + 0] = ((v & 0x3FF) / 1023.0) * 2.0 - 1.0; - w[j * 4 + 1] = (((v >> 10) & 0x3FF) / 1023.0) * 2.0 - 1.0; - w[j * 4 + 2] = (((v >> 20) & 0x3FF) / 1023.0) * 2.0 - 1.0; - w[j * 4 + 3] = ((v >> 30) / 3.0) * 2.0 - 1.0; + float tangent_sign; + Vector3 res = Vector3::octahedron_tangent_decode(Vector2((v & 0xFFFF) / 65535.0, ((v >> 16) & 0xFFFF) / 65535.0), &tangent_sign); + w[j * 4 + 0] = res.x; + w[j * 4 + 1] = res.y; + w[j * 4 + 2] = res.z; + w[j * 4 + 3] = tangent_sign; } ret[i] = arr; @@ -2861,18 +2863,12 @@ void RenderingServer::init() { GLOBAL_DEF("rendering/2d/shadow_atlas/size", 2048); - GLOBAL_DEF_RST_BASIC("rendering/vulkan/rendering/back_end", 0); - GLOBAL_DEF_RST_BASIC("rendering/vulkan/rendering/back_end.mobile", 1); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/vulkan/rendering/back_end", - PropertyInfo(Variant::INT, - "rendering/vulkan/rendering/back_end", - PROPERTY_HINT_ENUM, "Forward Clustered (Supports Desktop Only),Forward Mobile (Supports Desktop and Mobile)")); // Already defined in RenderingDeviceVulkan::initialize which runs before this code. // We re-define them here just for doctool's sake. Make sure to keep default values in sync. - GLOBAL_DEF("rendering/vulkan/staging_buffer/block_size_kb", 256); - GLOBAL_DEF("rendering/vulkan/staging_buffer/max_size_mb", 128); - GLOBAL_DEF("rendering/vulkan/staging_buffer/texture_upload_region_size_px", 64); - GLOBAL_DEF("rendering/vulkan/descriptor_pools/max_descriptors_per_pool", 64); + GLOBAL_DEF("rendering/rendering_device/staging_buffer/block_size_kb", 256); + GLOBAL_DEF("rendering/rendering_device/staging_buffer/max_size_mb", 128); + GLOBAL_DEF("rendering/rendering_device/staging_buffer/texture_upload_region_size_px", 64); + GLOBAL_DEF("rendering/rendering_device/descriptor_pools/max_descriptors_per_pool", 64); GLOBAL_DEF("rendering/shader_compiler/shader_cache/enabled", true); GLOBAL_DEF("rendering/shader_compiler/shader_cache/compress", true); diff --git a/tests/core/input/test_input_event_key.h b/tests/core/input/test_input_event_key.h index 5d4ca55a35..4c9cd2002c 100644 --- a/tests/core/input/test_input_event_key.h +++ b/tests/core/input/test_input_event_key.h @@ -148,7 +148,7 @@ TEST_CASE("[InputEventKey] Key correctly converts its state to a string represen CHECK(none_key.to_string() == "InputEventKey: keycode=0 (), mods=none, physical=true, pressed=false, echo=false"); // Set physical key to Escape. none_key.set_physical_keycode(Key::ESCAPE); - CHECK(none_key.to_string() == "InputEventKey: keycode=16777217 (Escape), mods=none, physical=true, pressed=false, echo=false"); + CHECK(none_key.to_string() == "InputEventKey: keycode=4194305 (Escape), mods=none, physical=true, pressed=false, echo=false"); InputEventKey key; @@ -167,7 +167,11 @@ TEST_CASE("[InputEventKey] Key correctly converts its state to a string represen // Press Ctrl and Alt. key.set_ctrl_pressed(true); key.set_alt_pressed(true); +#ifdef MACOS_ENABLED + CHECK(key.to_string() == "InputEventKey: keycode=32 (Space), mods=Ctrl+Option, physical=false, pressed=true, echo=true"); +#else CHECK(key.to_string() == "InputEventKey: keycode=32 (Space), mods=Ctrl+Alt, physical=false, pressed=true, echo=true"); +#endif } TEST_CASE("[InputEventKey] Key is correctly converted to reference") { diff --git a/tests/core/io/test_xml_parser.h b/tests/core/io/test_xml_parser.h index 87592b56ce..35e86d8203 100644 --- a/tests/core/io/test_xml_parser.h +++ b/tests/core/io/test_xml_parser.h @@ -66,6 +66,170 @@ TEST_CASE("[XMLParser] End-to-end") { parser.close(); } + +TEST_CASE("[XMLParser] Comments") { + XMLParser parser; + + SUBCASE("Missing end of comment") { + const String input = "<first></first><!-- foo"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT_END); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_COMMENT); + CHECK_EQ(parser.get_node_name(), " foo"); + } + SUBCASE("Bad start of comment") { + const String input = "<first></first><!-"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT_END); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_COMMENT); + CHECK_EQ(parser.get_node_name(), "-"); + } + SUBCASE("Unblanced angle brackets in comment") { + const String input = "<!-- example << --><next-tag></next-tag>"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_COMMENT); + CHECK_EQ(parser.get_node_name(), " example << "); + } + SUBCASE("Doctype") { + const String input = "<!DOCTYPE greeting [<!ELEMENT greeting (#PCDATA)>]>"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_COMMENT); + CHECK_EQ(parser.get_node_name(), "DOCTYPE greeting [<!ELEMENT greeting (#PCDATA)>]"); + } +} + +TEST_CASE("[XMLParser] Premature endings") { + SUBCASE("Simple cases") { + String input; + String expected_name; + XMLParser::NodeType expected_type; + + SUBCASE("Incomplete Unknown") { + input = "<first></first><?xml"; + expected_type = XMLParser::NodeType::NODE_UNKNOWN; + expected_name = "?xml"; + } + SUBCASE("Incomplete CDStart") { + input = "<first></first><![CD"; + expected_type = XMLParser::NodeType::NODE_CDATA; + expected_name = ""; + } + SUBCASE("Incomplete CData") { + input = "<first></first><![CDATA[example"; + expected_type = XMLParser::NodeType::NODE_CDATA; + expected_name = "example"; + } + SUBCASE("Incomplete CDEnd") { + input = "<first></first><![CDATA[example]]"; + expected_type = XMLParser::NodeType::NODE_CDATA; + expected_name = "example]]"; + } + SUBCASE("Incomplete start-tag name") { + input = "<first></first><second"; + expected_type = XMLParser::NodeType::NODE_ELEMENT; + expected_name = "second"; + } + + XMLParser parser; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT_END); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), expected_type); + CHECK_EQ(parser.get_node_name(), expected_name); + } + + SUBCASE("With attributes and texts") { + XMLParser parser; + + SUBCASE("Incomplete start-tag attribute name") { + const String input = "<first></first><second attr1=\"foo\" attr2"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + CHECK_EQ(parser.get_node_name(), "second"); + CHECK_EQ(parser.get_attribute_count(), 1); + CHECK_EQ(parser.get_attribute_name(0), "attr1"); + CHECK_EQ(parser.get_attribute_value(0), "foo"); + } + + SUBCASE("Incomplete start-tag attribute unquoted value") { + const String input = "<first></first><second attr1=\"foo\" attr2=bar"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + CHECK_EQ(parser.get_node_name(), "second"); + CHECK_EQ(parser.get_attribute_count(), 1); + CHECK_EQ(parser.get_attribute_name(0), "attr1"); + CHECK_EQ(parser.get_attribute_value(0), "foo"); + } + + SUBCASE("Incomplete start-tag attribute quoted value") { + const String input = "<first></first><second attr1=\"foo\" attr2=\"bar"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + CHECK_EQ(parser.get_node_name(), "second"); + CHECK_EQ(parser.get_attribute_count(), 2); + CHECK_EQ(parser.get_attribute_name(0), "attr1"); + CHECK_EQ(parser.get_attribute_value(0), "foo"); + CHECK_EQ(parser.get_attribute_name(1), "attr2"); + CHECK_EQ(parser.get_attribute_value(1), "bar"); + } + + SUBCASE("Incomplete end-tag name") { + const String input = "<first></fir"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT_END); + CHECK_EQ(parser.get_node_name(), "fir"); + } + + SUBCASE("Trailing text") { + const String input = "<first></first>example"; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_TEXT); + CHECK_EQ(parser.get_node_data(), "example"); + } + } +} + +TEST_CASE("[XMLParser] CDATA") { + const String input = "<a><![CDATA[my cdata content goes here]]></a>"; + XMLParser parser; + REQUIRE_EQ(parser.open_buffer(input.to_utf8_buffer()), OK); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT); + CHECK_EQ(parser.get_node_name(), "a"); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_CDATA); + CHECK_EQ(parser.get_node_name(), "my cdata content goes here"); + REQUIRE_EQ(parser.read(), OK); + CHECK_EQ(parser.get_node_type(), XMLParser::NodeType::NODE_ELEMENT_END); + CHECK_EQ(parser.get_node_name(), "a"); +} } // namespace TestXMLParser #endif // TEST_XML_PARSER_H diff --git a/tests/core/math/test_basis.h b/tests/core/math/test_basis.h index ae8ca4acde..b6493c5726 100644 --- a/tests/core/math/test_basis.h +++ b/tests/core/math/test_basis.h @@ -47,7 +47,7 @@ enum RotOrder { EulerZYX }; -Vector3 deg2rad(const Vector3 &p_rotation) { +Vector3 deg_to_rad(const Vector3 &p_rotation) { return p_rotation / 180.0 * Math_PI; } @@ -155,7 +155,7 @@ void test_rotation(Vector3 deg_original_euler, RotOrder rot_order) { // are correct. // Euler to rotation - const Vector3 original_euler = deg2rad(deg_original_euler); + const Vector3 original_euler = deg_to_rad(deg_original_euler); const Basis to_rotation = EulerToBasis(rot_order, original_euler); // Euler from rotation @@ -281,6 +281,59 @@ TEST_CASE("[Stress][Basis] Euler conversions") { } } } + +TEST_CASE("[Basis] Set axis angle") { + Vector3 axis; + real_t angle; + real_t pi = (real_t)Math_PI; + + // Testing the singularity when the angle is 0°. + Basis identity(1, 0, 0, 0, 1, 0, 0, 0, 1); + identity.get_axis_angle(axis, angle); + CHECK(angle == 0); + + // Testing the singularity when the angle is 180°. + Basis singularityPi(-1, 0, 0, 0, 1, 0, 0, 0, -1); + singularityPi.get_axis_angle(axis, angle); + CHECK(Math::is_equal_approx(angle, pi)); + + // Testing reversing the an axis (of an 30° angle). + float cos30deg = Math::cos(Math::deg_to_rad((real_t)30.0)); + Basis z_positive(cos30deg, -0.5, 0, 0.5, cos30deg, 0, 0, 0, 1); + Basis z_negative(cos30deg, 0.5, 0, -0.5, cos30deg, 0, 0, 0, 1); + + z_positive.get_axis_angle(axis, angle); + CHECK(Math::is_equal_approx(angle, Math::deg_to_rad((real_t)30.0))); + CHECK(axis == Vector3(0, 0, 1)); + + z_negative.get_axis_angle(axis, angle); + CHECK(Math::is_equal_approx(angle, Math::deg_to_rad((real_t)30.0))); + CHECK(axis == Vector3(0, 0, -1)); + + // Testing a rotation of 90° on x-y-z. + Basis x90deg(1, 0, 0, 0, 0, -1, 0, 1, 0); + x90deg.get_axis_angle(axis, angle); + CHECK(Math::is_equal_approx(angle, pi / (real_t)2)); + CHECK(axis == Vector3(1, 0, 0)); + + Basis y90deg(0, 0, 1, 0, 1, 0, -1, 0, 0); + y90deg.get_axis_angle(axis, angle); + CHECK(axis == Vector3(0, 1, 0)); + + Basis z90deg(0, -1, 0, 1, 0, 0, 0, 0, 1); + z90deg.get_axis_angle(axis, angle); + CHECK(axis == Vector3(0, 0, 1)); + + // Regression test: checks that the method returns a small angle (not 0). + Basis tiny(1, 0, 0, 0, 0.9999995, -0.001, 0, 001, 0.9999995); // The min angle possible with float is 0.001rad. + tiny.get_axis_angle(axis, angle); + CHECK(Math::is_equal_approx(angle, (real_t)0.001, (real_t)0.0001)); + + // Regression test: checks that the method returns an angle which is a number (not NaN) + Basis bugNan(1.00000024, 0, 0.000100001693, 0, 1, 0, -0.000100009143, 0, 1.00000024); + bugNan.get_axis_angle(axis, angle); + CHECK(!Math::is_nan(angle)); +} } // namespace TestBasis #endif // TEST_BASIS_H diff --git a/tests/scene/test_text_edit.h b/tests/scene/test_text_edit.h index f0e6b98427..225316b293 100644 --- a/tests/scene/test_text_edit.h +++ b/tests/scene/test_text_edit.h @@ -727,7 +727,7 @@ TEST_CASE("[SceneTree][TextEdit] text entry") { #ifdef MACOS_ENABLED SEND_GUI_KEY_EVENT(text_edit, Key::RIGHT | KeyModifierMask::SHIFT | KeyModifierMask::ALT) #else - SEND_GUI_KEY_EVENT(text_edit, Key::RIGHT | KeyModifierMask::SHIFT | KeyModifierMask::CMD) + SEND_GUI_KEY_EVENT(text_edit, Key::RIGHT | KeyModifierMask::SHIFT | KeyModifierMask::CMD_OR_CTRL) #endif CHECK(text_edit->has_selection()); CHECK(text_edit->get_selected_text() == "test"); @@ -739,7 +739,7 @@ TEST_CASE("[SceneTree][TextEdit] text entry") { #ifdef MACOS_ENABLED SEND_GUI_KEY_EVENT(text_edit, Key::LEFT | KeyModifierMask::SHIFT | KeyModifierMask::ALT) #else - SEND_GUI_KEY_EVENT(text_edit, Key::LEFT | KeyModifierMask::SHIFT | KeyModifierMask::CMD) + SEND_GUI_KEY_EVENT(text_edit, Key::LEFT | KeyModifierMask::SHIFT | KeyModifierMask::CMD_OR_CTRL) #endif CHECK_FALSE(text_edit->has_selection()); CHECK(text_edit->get_selected_text() == ""); @@ -1387,7 +1387,7 @@ TEST_CASE("[SceneTree][TextEdit] text entry") { text_edit->set_caret_column(4); MessageQueue::get_singleton()->flush(); - Ref<InputEvent> tmpevent = InputEventKey::create_reference(Key::BACKSPACE | KeyModifierMask::ALT | KeyModifierMask::CMD); + Ref<InputEvent> tmpevent = InputEventKey::create_reference(Key::BACKSPACE | KeyModifierMask::ALT | KeyModifierMask::CMD_OR_CTRL); InputMap::get_singleton()->action_add_event("ui_text_backspace_all_to_left", tmpevent); SIGNAL_DISCARD("text_set"); @@ -1624,7 +1624,7 @@ TEST_CASE("[SceneTree][TextEdit] text entry") { } SUBCASE("[TextEdit] ui_text_delete_all_to_right") { - Ref<InputEvent> tmpevent = InputEventKey::create_reference(Key::BACKSPACE | KeyModifierMask::ALT | KeyModifierMask::CMD); + Ref<InputEvent> tmpevent = InputEventKey::create_reference(Key::BACKSPACE | KeyModifierMask::ALT | KeyModifierMask::CMD_OR_CTRL); InputMap::get_singleton()->action_add_event("ui_text_delete_all_to_right", tmpevent); text_edit->set_text("this is some test text.\n"); @@ -1905,7 +1905,7 @@ TEST_CASE("[SceneTree][TextEdit] text entry") { #ifdef MACOS_ENABLED SEND_GUI_KEY_EVENT(text_edit, Key::LEFT | KeyModifierMask::ALT | KeyModifierMask::SHIFT); #else - SEND_GUI_KEY_EVENT(text_edit, Key::LEFT | KeyModifierMask::CMD | KeyModifierMask::SHIFT); + SEND_GUI_KEY_EVENT(text_edit, Key::LEFT | KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT); #endif CHECK(text_edit->get_viewport()->is_input_handled()); CHECK(text_edit->get_text() == "\nthis is some test text."); @@ -2016,7 +2016,7 @@ TEST_CASE("[SceneTree][TextEdit] text entry") { #ifdef MACOS_ENABLED SEND_GUI_KEY_EVENT(text_edit, Key::RIGHT | KeyModifierMask::ALT | KeyModifierMask::SHIFT); #else - SEND_GUI_KEY_EVENT(text_edit, Key::RIGHT | KeyModifierMask::CMD | KeyModifierMask::SHIFT); + SEND_GUI_KEY_EVENT(text_edit, Key::RIGHT | KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT); #endif CHECK(text_edit->get_viewport()->is_input_handled()); CHECK(text_edit->get_text() == "this is some test text\n"); @@ -2245,9 +2245,9 @@ TEST_CASE("[SceneTree][TextEdit] text entry") { SIGNAL_DISCARD("caret_changed"); #ifdef MACOS_ENABLED - SEND_GUI_KEY_EVENT(text_edit, Key::UP | KeyModifierMask::CMD | KeyModifierMask::SHIFT); + SEND_GUI_KEY_EVENT(text_edit, Key::UP | KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT); #else - SEND_GUI_KEY_EVENT(text_edit, Key::HOME | KeyModifierMask::CMD | KeyModifierMask::SHIFT); + SEND_GUI_KEY_EVENT(text_edit, Key::HOME | KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT); #endif CHECK(text_edit->get_viewport()->is_input_handled()); CHECK(text_edit->get_text() == "this is some\nother test\nlines\ngo here"); @@ -2286,9 +2286,9 @@ TEST_CASE("[SceneTree][TextEdit] text entry") { SIGNAL_DISCARD("caret_changed"); #ifdef MACOS_ENABLED - SEND_GUI_KEY_EVENT(text_edit, Key::DOWN | KeyModifierMask::CMD | KeyModifierMask::SHIFT); + SEND_GUI_KEY_EVENT(text_edit, Key::DOWN | KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT); #else - SEND_GUI_KEY_EVENT(text_edit, Key::END | KeyModifierMask::CMD | KeyModifierMask::SHIFT); + SEND_GUI_KEY_EVENT(text_edit, Key::END | KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT); #endif CHECK(text_edit->get_viewport()->is_input_handled()); CHECK(text_edit->get_text() == "go here\nlines\nother test\nthis is some"); @@ -2327,7 +2327,7 @@ TEST_CASE("[SceneTree][TextEdit] text entry") { SIGNAL_DISCARD("caret_changed"); #ifdef MACOS_ENABLED - SEND_GUI_KEY_EVENT(text_edit, Key::LEFT | KeyModifierMask::CMD | KeyModifierMask::SHIFT); + SEND_GUI_KEY_EVENT(text_edit, Key::LEFT | KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT); #else SEND_GUI_KEY_EVENT(text_edit, Key::HOME | KeyModifierMask::SHIFT); #endif @@ -2384,7 +2384,7 @@ TEST_CASE("[SceneTree][TextEdit] text entry") { SIGNAL_DISCARD("caret_changed"); #ifdef MACOS_ENABLED - SEND_GUI_KEY_EVENT(text_edit, Key::RIGHT | KeyModifierMask::CMD | KeyModifierMask::SHIFT); + SEND_GUI_KEY_EVENT(text_edit, Key::RIGHT | KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT); #else SEND_GUI_KEY_EVENT(text_edit, Key::END | KeyModifierMask::SHIFT); #endif diff --git a/tests/test_macros.h b/tests/test_macros.h index 69ae0d3124..3b734b9699 100644 --- a/tests/test_macros.h +++ b/tests/test_macros.h @@ -133,11 +133,11 @@ int register_test_command(String p_command, TestFunc p_function); // Utility macros to send an event actions to a given object // Requires Message Queue and InputMap to be setup. // SEND_GUI_ACTION - takes an object and a input map key. e.g SEND_GUI_ACTION(code_edit, "ui_text_newline"). -// SEND_GUI_KEY_EVENT - takes an object and a keycode set. e.g SEND_GUI_KEY_EVENT(code_edit, Key::A | KeyModifierMask::CMD). +// SEND_GUI_KEY_EVENT - takes an object and a keycode set. e.g SEND_GUI_KEY_EVENT(code_edit, Key::A | KeyModifierMask::META). // SEND_GUI_MOUSE_BUTTON_EVENT - takes an object, position, mouse button, mouse mask and modifiers e.g SEND_GUI_MOUSE_BUTTON_EVENT(code_edit, Vector2(50, 50), MOUSE_BUTTON_NONE, MOUSE_BUTTON_NONE, Key::None); // SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT - takes an object, position, mouse button, mouse mask and modifiers e.g SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(code_edit, Vector2(50, 50), MOUSE_BUTTON_NONE, MOUSE_BUTTON_NONE, Key::None); -// SEND_GUI_MOUSE_MOTION_EVENT - takes an object, position, mouse mask and modifiers e.g SEND_GUI_MOUSE_MOTION_EVENT(code_edit, Vector2(50, 50), MouseButton::MASK_LEFT, KeyModifierMask::CMD); -// SEND_GUI_DOUBLE_CLICK - takes an object, position and modifiers. e.g SEND_GUI_DOUBLE_CLICK(code_edit, Vector2(50, 50), KeyModifierMask::CMD); +// SEND_GUI_MOUSE_MOTION_EVENT - takes an object, position, mouse mask and modifiers e.g SEND_GUI_MOUSE_MOTION_EVENT(code_edit, Vector2(50, 50), MouseButton::MASK_LEFT, KeyModifierMask::META); +// SEND_GUI_DOUBLE_CLICK - takes an object, position and modifiers. e.g SEND_GUI_DOUBLE_CLICK(code_edit, Vector2(50, 50), KeyModifierMask::META); #define SEND_GUI_ACTION(m_object, m_action) \ { \ @@ -161,7 +161,6 @@ int register_test_command(String p_command, TestFunc p_function); m_event->set_shift_pressed(((m_modifers)&KeyModifierMask::SHIFT) != Key::NONE); \ m_event->set_alt_pressed(((m_modifers)&KeyModifierMask::ALT) != Key::NONE); \ m_event->set_ctrl_pressed(((m_modifers)&KeyModifierMask::CTRL) != Key::NONE); \ - m_event->set_command_pressed(((m_modifers)&KeyModifierMask::CMD) != Key::NONE); \ m_event->set_meta_pressed(((m_modifers)&KeyModifierMask::META) != Key::NONE); #define _CREATE_GUI_MOUSE_EVENT(m_object, m_local_pos, m_input, m_mask, m_modifers) \ diff --git a/thirdparty/README.md b/thirdparty/README.md index ffc8137819..b5775db38a 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -214,7 +214,7 @@ Files extracted from upstream source: ## harfbuzz - Upstream: https://github.com/harfbuzz/harfbuzz -- Version: 5.1.0 (f1f2be776bcd994fa9262622e1a7098a066e5cf7, 2022) +- Version: 5.2.0 (4a1d891c6317d2c83e5f3c2607ec5f5ccedffcde, 2022) - License: MIT Files extracted from upstream source: @@ -276,7 +276,7 @@ Files extracted from upstream source: ## libpng - Upstream: http://libpng.org/pub/png/libpng.html -- Version: 1.6.37 (a40189cf881e9f0db80511c382292a5604c3c3d1, 2019) +- Version: 1.6.38 (0a158f3506502dfa23edfc42790dfaed82efba17, 2022) - License: libpng/zlib Files extracted from upstream source: @@ -535,7 +535,7 @@ Patch files are provided in `oidn/patches/`. ## openxr - Upstream: https://github.com/KhronosGroup/OpenXR-SDK -- Version: 1.0.23 (885a90f8934d84121344ba8e4aa5159d5b496e08, 2022) +- Version: 1.0.25 (c16a18c99740ea5dd251e3af117e0e5aea4ceaa9, 2022) - License: Apache 2.0 Files extracted from upstream source: diff --git a/thirdparty/harfbuzz/src/OT/Layout/Common/Coverage.hh b/thirdparty/harfbuzz/src/OT/Layout/Common/Coverage.hh index e52a617c86..eef89a2879 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/Common/Coverage.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/Common/Coverage.hh @@ -206,7 +206,7 @@ struct Coverage template <typename IterableOut, hb_requires (hb_is_sink_of (IterableOut, hb_codepoint_t))> - void intersect_set (const hb_set_t &glyphs, IterableOut &intersect_glyphs) const + void intersect_set (const hb_set_t &glyphs, IterableOut&& intersect_glyphs) const { switch (u.format) { diff --git a/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh index 886babd2d1..82fd48dc50 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh @@ -88,7 +88,7 @@ struct CoverageFormat1_3 template <typename IterableOut, hb_requires (hb_is_sink_of (IterableOut, hb_codepoint_t))> - void intersect_set (const hb_set_t &glyphs, IterableOut &intersect_glyphs) const + void intersect_set (const hb_set_t &glyphs, IterableOut&& intersect_glyphs) const { unsigned count = glyphArray.len; for (unsigned i = 0; i < count; i++) diff --git a/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh index 4ddb2a73e4..974d094633 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh @@ -140,7 +140,7 @@ struct CoverageFormat2_4 template <typename IterableOut, hb_requires (hb_is_sink_of (IterableOut, hb_codepoint_t))> - void intersect_set (const hb_set_t &glyphs, IterableOut &intersect_glyphs) const + void intersect_set (const hb_set_t &glyphs, IterableOut&& intersect_glyphs) const { for (const auto& range : rangeRecord) { diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/Anchor.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/Anchor.hh index bfe6b36afd..49e76e7750 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/Anchor.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/Anchor.hh @@ -58,8 +58,7 @@ struct Anchor return_trace (bool (reinterpret_cast<Anchor *> (u.format1.copy (c->serializer)))); } return_trace (bool (reinterpret_cast<Anchor *> (u.format2.copy (c->serializer)))); - case 3: return_trace (bool (reinterpret_cast<Anchor *> (u.format3.copy (c->serializer, - c->plan->layout_variation_idx_map)))); + case 3: return_trace (u.format3.subset (c)); default:return_trace (false); } } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/AnchorFormat3.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/AnchorFormat3.hh index d77b4699be..2e30ab33c3 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/AnchorFormat3.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/AnchorFormat3.hh @@ -41,24 +41,54 @@ struct AnchorFormat3 *y += (this+yDeviceTable).get_y_delta (font, c->var_store, c->var_store_cache); } - AnchorFormat3* copy (hb_serialize_context_t *c, - const hb_map_t *layout_variation_idx_map) const + bool subset (hb_subset_context_t *c) const { - TRACE_SERIALIZE (this); - if (!layout_variation_idx_map) return_trace (nullptr); + TRACE_SUBSET (this); + auto *out = c->serializer->start_embed (*this); + if (unlikely (!out)) return_trace (false); + if (unlikely (!c->serializer->embed (format))) return_trace (false); + if (unlikely (!c->serializer->embed (xCoordinate))) return_trace (false); + if (unlikely (!c->serializer->embed (yCoordinate))) return_trace (false); - auto *out = c->embed<AnchorFormat3> (this); - if (unlikely (!out)) return_trace (nullptr); + unsigned x_varidx = xDeviceTable ? (this+xDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX; + if (c->plan->layout_variation_idx_delta_map->has (x_varidx)) + { + int delta = hb_second (c->plan->layout_variation_idx_delta_map->get (x_varidx)); + if (delta != 0) + { + if (!c->serializer->check_assign (out->xCoordinate, xCoordinate + delta, + HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + } - out->xDeviceTable.serialize_copy (c, xDeviceTable, this, 0, hb_serialize_context_t::Head, layout_variation_idx_map); - out->yDeviceTable.serialize_copy (c, yDeviceTable, this, 0, hb_serialize_context_t::Head, layout_variation_idx_map); + unsigned y_varidx = yDeviceTable ? (this+yDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX; + if (c->plan->layout_variation_idx_delta_map->has (y_varidx)) + { + int delta = hb_second (c->plan->layout_variation_idx_delta_map->get (y_varidx)); + if (delta != 0) + { + if (!c->serializer->check_assign (out->yCoordinate, yCoordinate + delta, + HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + } + + if (c->plan->all_axes_pinned) + return_trace (c->serializer->check_assign (out->format, 1, HB_SERIALIZE_ERROR_INT_OVERFLOW)); + + if (!c->serializer->embed (xDeviceTable)) return_trace (false); + if (!c->serializer->embed (yDeviceTable)) return_trace (false); + + out->xDeviceTable.serialize_copy (c->serializer, xDeviceTable, this, 0, hb_serialize_context_t::Head, c->plan->layout_variation_idx_delta_map); + out->yDeviceTable.serialize_copy (c->serializer, yDeviceTable, this, 0, hb_serialize_context_t::Head, c->plan->layout_variation_idx_delta_map); return_trace (out); } void collect_variation_indices (hb_collect_variation_indices_context_t *c) const { - (this+xDeviceTable).collect_variation_indices (c->layout_variation_indices); - (this+yDeviceTable).collect_variation_indices (c->layout_variation_indices); + (this+xDeviceTable).collect_variation_indices (c); + (this+yDeviceTable).collect_variation_indices (c); } }; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/Common.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/Common.hh index e16c06729d..408197454f 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/Common.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/Common.hh @@ -22,7 +22,8 @@ template<typename Iterator, typename SrcLookup> static void SinglePos_serialize (hb_serialize_context_t *c, const SrcLookup *src, Iterator it, - const hb_map_t *layout_variation_idx_map); + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map, + bool all_axes_pinned); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkRecord.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkRecord.hh index 7a514453ae..a7d489d2a5 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkRecord.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkRecord.hh @@ -9,7 +9,7 @@ struct MarkRecord { friend struct MarkArray; - protected: + public: HBUINT16 klass; /* Class defined for this mark */ Offset16To<Anchor> markAnchor; /* Offset to Anchor table--from diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh index 3cb207281d..ddf7313f94 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh @@ -127,6 +127,12 @@ struct PairPosFormat1_3 out->valueFormat[1] = newFormats.second; } + if (c->plan->all_axes_pinned) + { + out->valueFormat[0] = out->valueFormat[0].drop_device_table_flags (); + out->valueFormat[1] = out->valueFormat[1].drop_device_table_flags (); + } + hb_sorted_vector_t<hb_codepoint_t> new_coverage; + hb_zip (this+coverage, pairSet) diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh index a80fe0c226..83b093b988 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh @@ -274,13 +274,19 @@ struct PairPosFormat2_4 out->valueFormat1 = newFormats.first; out->valueFormat2 = newFormats.second; + if (c->plan->all_axes_pinned) + { + out->valueFormat1 = out->valueFormat1.drop_device_table_flags (); + out->valueFormat2 = out->valueFormat2.drop_device_table_flags (); + } + for (unsigned class1_idx : + hb_range ((unsigned) class1Count) | hb_filter (klass1_map)) { for (unsigned class2_idx : + hb_range ((unsigned) class2Count) | hb_filter (klass2_map)) { unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2); - valueFormat1.copy_values (c->serializer, newFormats.first, this, &values[idx], c->plan->layout_variation_idx_map); - valueFormat2.copy_values (c->serializer, newFormats.second, this, &values[idx + len1], c->plan->layout_variation_idx_map); + valueFormat1.copy_values (c->serializer, out->valueFormat1, this, &values[idx], c->plan->layout_variation_idx_delta_map); + valueFormat2.copy_values (c->serializer, out->valueFormat2, this, &values[idx + len1], c->plan->layout_variation_idx_delta_map); } } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh index 4578fbd1d6..aa48d933c3 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh @@ -163,7 +163,7 @@ struct PairSet newFormats, len1, &glyph_map, - c->plan->layout_variation_idx_map + c->plan->layout_variation_idx_delta_map }; const PairValueRecord *record = &firstPairValueRecord; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh index bd95abde16..3222477764 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh @@ -34,7 +34,7 @@ struct PairValueRecord const ValueFormat *newFormats; unsigned len1; /* valueFormats[0].get_len() */ const hb_map_t *glyph_map; - const hb_map_t *layout_variation_idx_map; + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map; }; bool subset (hb_subset_context_t *c, @@ -50,12 +50,12 @@ struct PairValueRecord closure->valueFormats[0].copy_values (s, closure->newFormats[0], closure->base, &values[0], - closure->layout_variation_idx_map); + closure->layout_variation_idx_delta_map); closure->valueFormats[1].copy_values (s, closure->newFormats[1], closure->base, &values[closure->len1], - closure->layout_variation_idx_map); + closure->layout_variation_idx_delta_map); return_trace (true); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePos.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePos.hh index 702f578b3c..6dce3e6343 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePos.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePos.hh @@ -38,12 +38,16 @@ struct SinglePos void serialize (hb_serialize_context_t *c, const SrcLookup* src, Iterator glyph_val_iter_pairs, - const hb_map_t *layout_variation_idx_map) + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map, + bool all_axes_pinned) { if (unlikely (!c->extend_min (u.format))) return; unsigned format = 2; ValueFormat new_format = src->get_value_format (); + if (all_axes_pinned) + new_format = new_format.drop_device_table_flags (); + if (glyph_val_iter_pairs) format = get_format (glyph_val_iter_pairs); @@ -53,13 +57,13 @@ struct SinglePos src, glyph_val_iter_pairs, new_format, - layout_variation_idx_map); + layout_variation_idx_delta_map); return; case 2: u.format2.serialize (c, src, glyph_val_iter_pairs, new_format, - layout_variation_idx_map); + layout_variation_idx_delta_map); return; default:return; } @@ -84,8 +88,9 @@ static void SinglePos_serialize (hb_serialize_context_t *c, const SrcLookup *src, Iterator it, - const hb_map_t *layout_variation_idx_map) -{ c->start_embed<SinglePos> ()->serialize (c, src, it, layout_variation_idx_map); } + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map, + bool all_axes_pinned) +{ c->start_embed<SinglePos> ()->serialize (c, src, it, layout_variation_idx_delta_map, all_axes_pinned); } } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh index 7cbdf6dc6c..5a9dd58a63 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh @@ -87,7 +87,7 @@ struct SinglePosFormat1 const SrcLookup *src, Iterator it, ValueFormat newFormat, - const hb_map_t *layout_variation_idx_map) + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) { if (unlikely (!c->extend_min (this))) return; if (unlikely (!c->check_assign (valueFormat, @@ -96,7 +96,7 @@ struct SinglePosFormat1 for (const hb_array_t<const Value>& _ : + it | hb_map (hb_second)) { - src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_map); + src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_delta_map); // Only serialize the first entry in the iterator, the rest are assumed to // be the same. break; @@ -126,7 +126,7 @@ struct SinglePosFormat1 ; bool ret = bool (it); - SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_map); + SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_delta_map, c->plan->all_axes_pinned); return_trace (ret); } }; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh index 518fa9dcb0..8a6e8a42a6 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh @@ -99,7 +99,7 @@ struct SinglePosFormat2 const SrcLookup *src, Iterator it, ValueFormat newFormat, - const hb_map_t *layout_variation_idx_map) + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) { auto out = c->extend_min (this); if (unlikely (!out)) return; @@ -109,7 +109,7 @@ struct SinglePosFormat2 + it | hb_map (hb_second) | hb_apply ([&] (hb_array_t<const Value> _) - { src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_map); }) + { src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_delta_map); }) ; auto glyphs = @@ -141,7 +141,7 @@ struct SinglePosFormat2 ; bool ret = bool (it); - SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_map); + SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_delta_map, c->plan->all_axes_pinned); return_trace (ret); } }; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/ValueFormat.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/ValueFormat.hh index b29f287bce..26a40f01a3 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/ValueFormat.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/ValueFormat.hh @@ -59,6 +59,24 @@ struct ValueFormat : HBUINT16 unsigned int get_len () const { return hb_popcount ((unsigned int) *this); } unsigned int get_size () const { return get_len () * Value::static_size; } + hb_vector_t<unsigned> get_device_table_indices () const { + unsigned i = 0; + hb_vector_t<unsigned> result; + unsigned format = *this; + + if (format & xPlacement) i++; + if (format & yPlacement) i++; + if (format & xAdvance) i++; + if (format & yAdvance) i++; + + if (format & xPlaDevice) result.push (i++); + if (format & yPlaDevice) result.push (i++); + if (format & xAdvDevice) result.push (i++); + if (format & yAdvDevice) result.push (i++); + + return result; + } + bool apply_value (hb_ot_apply_context_t *c, const void *base, const Value *values, @@ -145,30 +163,50 @@ struct ValueFormat : HBUINT16 unsigned int new_format, const void *base, const Value *values, - const hb_map_t *layout_variation_idx_map) const + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) const { unsigned int format = *this; if (!format) return; - if (format & xPlacement) copy_value (c, new_format, xPlacement, *values++); - if (format & yPlacement) copy_value (c, new_format, yPlacement, *values++); - if (format & xAdvance) copy_value (c, new_format, xAdvance, *values++); - if (format & yAdvance) copy_value (c, new_format, yAdvance, *values++); + HBINT16 *x_placement = nullptr, *y_placement = nullptr, *x_adv = nullptr, *y_adv = nullptr; + if (format & xPlacement) x_placement = copy_value (c, new_format, xPlacement, *values++); + if (format & yPlacement) y_placement = copy_value (c, new_format, yPlacement, *values++); + if (format & xAdvance) x_adv = copy_value (c, new_format, xAdvance, *values++); + if (format & yAdvance) y_adv = copy_value (c, new_format, yAdvance, *values++); - if (format & xPlaDevice) copy_device (c, base, values++, layout_variation_idx_map); - if (format & yPlaDevice) copy_device (c, base, values++, layout_variation_idx_map); - if (format & xAdvDevice) copy_device (c, base, values++, layout_variation_idx_map); - if (format & yAdvDevice) copy_device (c, base, values++, layout_variation_idx_map); + if (format & xPlaDevice) + { + add_delta_to_value (x_placement, base, values, layout_variation_idx_delta_map); + copy_device (c, base, values++, layout_variation_idx_delta_map, new_format, xPlaDevice); + } + + if (format & yPlaDevice) + { + add_delta_to_value (y_placement, base, values, layout_variation_idx_delta_map); + copy_device (c, base, values++, layout_variation_idx_delta_map, new_format, yPlaDevice); + } + + if (format & xAdvDevice) + { + add_delta_to_value (x_adv, base, values, layout_variation_idx_delta_map); + copy_device (c, base, values++, layout_variation_idx_delta_map, new_format, xAdvDevice); + } + + if (format & yAdvDevice) + { + add_delta_to_value (y_adv, base, values, layout_variation_idx_delta_map); + copy_device (c, base, values++, layout_variation_idx_delta_map, new_format, yAdvDevice); + } } - void copy_value (hb_serialize_context_t *c, - unsigned int new_format, - Flags flag, - Value value) const + HBINT16* copy_value (hb_serialize_context_t *c, + unsigned int new_format, + Flags flag, + Value value) const { // Filter by new format. - if (!(new_format & flag)) return; - c->copy (value); + if (!(new_format & flag)) return nullptr; + return reinterpret_cast<HBINT16 *> (c->copy (value)); } void collect_variation_indices (hb_collect_variation_indices_context_t *c, @@ -183,31 +221,40 @@ struct ValueFormat : HBUINT16 if (format & yAdvance) i++; if (format & xPlaDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices); + (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } if (format & ValueFormat::yPlaDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices); + (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } if (format & ValueFormat::xAdvDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices); + (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } if (format & ValueFormat::yAdvDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices); + (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } } + unsigned drop_device_table_flags () const + { + unsigned format = *this; + for (unsigned flag = xPlaDevice; flag <= yAdvDevice; flag = flag << 1) + format = format & ~flag; + + return format; + } + private: bool sanitize_value_devices (hb_sanitize_context_t *c, const void *base, const Value *values) const { @@ -236,9 +283,27 @@ struct ValueFormat : HBUINT16 return *static_cast<const Offset16To<Device> *> (value); } + void add_delta_to_value (HBINT16 *value, + const void *base, + const Value *src_value, + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) const + { + if (!value) return; + unsigned varidx = (base + get_device (src_value)).get_variation_index (); + hb_pair_t<unsigned, int> *varidx_delta; + if (!layout_variation_idx_delta_map->has (varidx, &varidx_delta)) return; + + *value += hb_second (*varidx_delta); + } + bool copy_device (hb_serialize_context_t *c, const void *base, - const Value *src_value, const hb_map_t *layout_variation_idx_map) const + const Value *src_value, + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map, + unsigned int new_format, Flags flag) const { + // Filter by new format. + if (!(new_format & flag)) return true; + Value *dst_value = c->copy (*src_value); if (!dst_value) return false; @@ -246,7 +311,7 @@ struct ValueFormat : HBUINT16 *dst_value = 0; c->push (); - if ((base + get_device (src_value)).copy (c, layout_variation_idx_map)) + if ((base + get_device (src_value)).copy (c, layout_variation_idx_delta_map)) { c->add_link (*dst_value, c->pop_pack ()); return true; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh index 98f2f5fe7a..852ca3eac5 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh @@ -35,19 +35,17 @@ struct MultipleSubst } } - /* TODO This function is unused and not updated to 24bit GIDs. Should be done by using - * iterators. While at it perhaps using iterator of arrays of hb_codepoint_t instead. */ + template<typename Iterator, + hb_requires (hb_is_sorted_iterator (Iterator))> bool serialize (hb_serialize_context_t *c, - hb_sorted_array_t<const HBGlyphID16> glyphs, - hb_array_t<const unsigned int> substitute_len_list, - hb_array_t<const HBGlyphID16> substitute_glyphs_list) + Iterator it) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (u.format))) return_trace (false); unsigned int format = 1; u.format = format; switch (u.format) { - case 1: return_trace (u.format1.serialize (c, glyphs, substitute_len_list, substitute_glyphs_list)); + case 1: return_trace (u.format1.serialize (c, it)); default:return_trace (false); } } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubstFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubstFormat1.hh index 89a04ec3b1..3b4bd11694 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubstFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubstFormat1.hh @@ -71,22 +71,31 @@ struct MultipleSubstFormat1_2 return_trace ((this+sequence[index]).apply (c)); } + template<typename Iterator, + hb_requires (hb_is_sorted_iterator (Iterator))> bool serialize (hb_serialize_context_t *c, - hb_sorted_array_t<const HBGlyphID16> glyphs, - hb_array_t<const unsigned int> substitute_len_list, - hb_array_t<const HBGlyphID16> substitute_glyphs_list) + Iterator it) { TRACE_SERIALIZE (this); + auto sequences = + + it + | hb_map (hb_second) + ; + auto glyphs = + + it + | hb_map_retains_sorting (hb_first) + ; if (unlikely (!c->extend_min (this))) return_trace (false); - if (unlikely (!sequence.serialize (c, glyphs.length))) return_trace (false); - for (unsigned int i = 0; i < glyphs.length; i++) + + if (unlikely (!sequence.serialize (c, sequences.length))) return_trace (false); + + for (auto& pair : hb_zip (sequences, sequence)) { - unsigned int substitute_len = substitute_len_list[i]; - if (unlikely (!sequence[i] - .serialize_serialize (c, substitute_glyphs_list.sub_array (0, substitute_len)))) + if (unlikely (!pair.second + .serialize_serialize (c, pair.first))) return_trace (false); - substitute_glyphs_list += substitute_len; } + return_trace (coverage.serialize_serialize (c, glyphs)); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh index 4b17243d81..13665d7ba1 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh @@ -42,6 +42,11 @@ struct SingleSubstFormat1_3 hb_codepoint_t d = deltaGlyphID; hb_codepoint_t mask = get_mask (); + /* Help fuzzer avoid this function as much. */ + unsigned pop = (this+coverage).get_population (); + if (pop >= mask) + return; + hb_set_t intersection; (this+coverage).intersect_set (c->parent_active_glyphs (), intersection); @@ -52,7 +57,7 @@ struct SingleSubstFormat1_3 hb_codepoint_t max_before = intersection.get_max (); hb_codepoint_t min_after = (min_before + d) & mask; hb_codepoint_t max_after = (max_before + d) & mask; - if ((this+coverage).get_population () >= max_before - min_before && + if (pop >= max_before - min_before && ((min_before <= min_after && min_after <= max_before) || (min_before <= max_after && max_after <= max_before))) return; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh index fb1e90d03e..5416299754 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh @@ -41,7 +41,6 @@ struct SingleSubstFormat2_4 | hb_map (hb_second) | hb_sink (c->output) ; - } void closure_lookups (hb_closure_lookups_context_t *c) const {} diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SubstLookup.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SubstLookup.hh index 320685b868..d49dcc0e0f 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SubstLookup.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SubstLookup.hh @@ -119,19 +119,16 @@ struct SubstLookup : Lookup return_trace (false); } - bool serialize_multiple (hb_serialize_context_t *c, - uint32_t lookup_props, - hb_sorted_array_t<const HBGlyphID16> glyphs, - hb_array_t<const unsigned int> substitute_len_list, - hb_array_t<const HBGlyphID16> substitute_glyphs_list) + template<typename Iterator, + hb_requires (hb_is_sorted_iterator (Iterator))> + bool serialize (hb_serialize_context_t *c, + uint32_t lookup_props, + Iterator it) { TRACE_SERIALIZE (this); if (unlikely (!Lookup::serialize (c, SubTable::Multiple, lookup_props, 1))) return_trace (false); if (c->push<SubTable> ()->u.multiple. - serialize (c, - glyphs, - substitute_len_list, - substitute_glyphs_list)) + serialize (c, it)) { c->add_link (get_subtables<SubTable> ()[0], c->pop_pack ()); return_trace (true); diff --git a/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh b/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh index 98c2ee4e73..fc8e309bc9 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh @@ -105,6 +105,67 @@ struct CompositeGlyphRecord } } + unsigned compile_with_deltas (const contour_point_t &p_delta, + char *out) const + { + const HBINT8 *p = &StructAfter<const HBINT8> (flags); +#ifndef HB_NO_BEYOND_64K + if (flags & GID_IS_24BIT) + p += HBGlyphID24::static_size; + else +#endif + p += HBGlyphID16::static_size; + + unsigned len = get_size (); + unsigned len_before_val = (const char *)p - (const char *)this; + if (flags & ARG_1_AND_2_ARE_WORDS) + { + // no overflow, copy and update value with deltas + memcpy (out, this, len); + + const HBINT16 *px = reinterpret_cast<const HBINT16 *> (p); + HBINT16 *o = reinterpret_cast<HBINT16 *> (out + len_before_val); + o[0] = px[0] + roundf (p_delta.x); + o[1] = px[1] + roundf (p_delta.y); + } + else + { + int new_x = p[0] + roundf (p_delta.x); + int new_y = p[1] + roundf (p_delta.y); + if (new_x <= 127 && new_x >= -128 && + new_y <= 127 && new_y >= -128) + { + memcpy (out, this, len); + HBINT8 *o = reinterpret_cast<HBINT8 *> (out + len_before_val); + o[0] = new_x; + o[1] = new_y; + } + else + { + // int8 overflows after deltas applied + memcpy (out, this, len_before_val); + + //update flags + CompositeGlyphRecord *o = reinterpret_cast<CompositeGlyphRecord *> (out); + o->flags = flags | ARG_1_AND_2_ARE_WORDS; + out += len_before_val; + + HBINT16 new_value; + new_value = new_x; + memcpy (out, &new_value, HBINT16::static_size); + out += HBINT16::static_size; + + new_value = new_y; + memcpy (out, &new_value, HBINT16::static_size); + out += HBINT16::static_size; + + memcpy (out, p+2, len - len_before_val - 2); + len += 2; + } + } + return len; + } + protected: bool scaled_offsets () const { return (flags & (SCALED_COMPONENT_OFFSET | UNSCALED_COMPONENT_OFFSET)) == SCALED_COMPONENT_OFFSET; } @@ -288,6 +349,63 @@ struct CompositeGlyph return; glyph_chain.set_overlaps_flag (); } + + bool compile_bytes_with_deltas (const hb_bytes_t &source_bytes, + const contour_point_vector_t &deltas, + hb_bytes_t &dest_bytes /* OUT */) + { + if (source_bytes.length <= GlyphHeader::static_size || + header.numberOfContours != -1) + { + dest_bytes = hb_bytes_t (); + return true; + } + + unsigned source_len = source_bytes.length - GlyphHeader::static_size; + + /* try to allocate more memories than source glyph bytes + * in case that there might be an overflow for int8 value + * and we would need to use int16 instead */ + char *o = (char *) hb_calloc (source_len + source_len/2, sizeof (char)); + if (unlikely (!o)) return false; + + const CompositeGlyphRecord *c = reinterpret_cast<const CompositeGlyphRecord *> (source_bytes.arrayZ + GlyphHeader::static_size); + auto it = composite_iter_t (hb_bytes_t ((const char *)c, source_len), c); + + char *p = o; + unsigned i = 0, source_comp_len = 0; + for (const auto &component : it) + { + /* last 4 points in deltas are phantom points and should not be included */ + if (i >= deltas.length - 4) return false; + + unsigned comp_len = component.get_size (); + if (component.is_anchored ()) + { + memcpy (p, &component, comp_len); + p += comp_len; + } + else + { + unsigned new_len = component.compile_with_deltas (deltas[i], p); + p += new_len; + } + i++; + source_comp_len += comp_len; + } + + //copy instructions if any + if (source_len > source_comp_len) + { + unsigned instr_len = source_len - source_comp_len; + memcpy (p, (const char *)c + source_comp_len, instr_len); + p += instr_len; + } + + unsigned len = p - o; + dest_bytes = hb_bytes_t (o, len); + return true; + } }; diff --git a/thirdparty/harfbuzz/src/OT/glyf/Glyph.hh b/thirdparty/harfbuzz/src/OT/glyf/Glyph.hh index 3efe538f37..afcb5dc834 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/Glyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/Glyph.hh @@ -72,12 +72,117 @@ struct Glyph } } + void update_mtx (const hb_subset_plan_t *plan, + int xMin, int yMax, + const contour_point_vector_t &all_points) const + { + hb_codepoint_t new_gid = 0; + if (!plan->new_gid_for_old_gid (gid, &new_gid)) + return; + + unsigned len = all_points.length; + float leftSideX = all_points[len - 4].x; + float rightSideX = all_points[len - 3].x; + float topSideY = all_points[len - 2].y; + float bottomSideY = all_points[len - 1].y; + + int hori_aw = roundf (rightSideX - leftSideX); + if (hori_aw < 0) hori_aw = 0; + int lsb = roundf (xMin - leftSideX); + plan->hmtx_map->set (new_gid, hb_pair (hori_aw, lsb)); + + int vert_aw = roundf (topSideY - bottomSideY); + if (vert_aw < 0) vert_aw = 0; + int tsb = roundf (topSideY - yMax); + plan->vmtx_map->set (new_gid, hb_pair (vert_aw, tsb)); + } + + bool compile_header_bytes (const hb_subset_plan_t *plan, + const contour_point_vector_t &all_points, + hb_bytes_t &dest_bytes /* OUT */) const + { + GlyphHeader *glyph_header = nullptr; + if (all_points.length > 4) + { + glyph_header = (GlyphHeader *) hb_calloc (1, GlyphHeader::static_size); + if (unlikely (!glyph_header)) return false; + } + + int xMin, xMax; + xMin = xMax = roundf (all_points[0].x); + + int yMin, yMax; + yMin = yMax = roundf (all_points[0].y); + + for (unsigned i = 1; i < all_points.length - 4; i++) + { + float rounded_x = roundf (all_points[i].x); + float rounded_y = roundf (all_points[i].y); + xMin = hb_min (xMin, rounded_x); + xMax = hb_max (xMax, rounded_x); + yMin = hb_min (yMin, rounded_y); + yMax = hb_max (yMax, rounded_y); + } + + update_mtx (plan, xMin, yMax, all_points); + + /*for empty glyphs: all_points only include phantom points. + *just update metrics and then return */ + if (all_points.length == 4) + return true; + + glyph_header->numberOfContours = header->numberOfContours; + glyph_header->xMin = xMin; + glyph_header->yMin = yMin; + glyph_header->xMax = xMax; + glyph_header->yMax = yMax; + + dest_bytes = hb_bytes_t ((const char *)glyph_header, GlyphHeader::static_size); + return true; + } + + bool compile_bytes_with_deltas (const hb_subset_plan_t *plan, + hb_font_t *font, + const glyf_accelerator_t &glyf, + hb_bytes_t &dest_start, /* IN/OUT */ + hb_bytes_t &dest_end /* OUT */) const + { + contour_point_vector_t all_points, deltas; + get_points (font, glyf, all_points, &deltas, false); + + switch (type) { + case COMPOSITE: + if (!CompositeGlyph (*header, bytes).compile_bytes_with_deltas (dest_start, + deltas, + dest_end)) + return false; + break; + case SIMPLE: + if (!SimpleGlyph (*header, bytes).compile_bytes_with_deltas (all_points, + plan->flags & HB_SUBSET_FLAGS_NO_HINTING, + dest_end)) + return false; + break; + default: + /* set empty bytes for empty glyph + * do not use source glyph's pointers */ + dest_start = hb_bytes_t (); + dest_end = hb_bytes_t (); + break; + } + + return compile_header_bytes (plan, all_points, dest_start); + } + + /* Note: Recursively calls itself. * all_points includes phantom points */ template <typename accelerator_t> bool get_points (hb_font_t *font, const accelerator_t &glyf_accelerator, contour_point_vector_t &all_points /* OUT */, + contour_point_vector_t *deltas = nullptr, /* OUT */ + bool use_my_metrics = true, bool phantom_only = false, unsigned int depth = 0) const { @@ -130,10 +235,28 @@ struct Glyph phantoms[PHANTOM_BOTTOM].y = v_orig - (int) v_adv; } + if (deltas != nullptr && depth == 0 && type == COMPOSITE) + { + if (unlikely (!deltas->resize (points.length))) return false; + for (unsigned i = 0 ; i < points.length; i++) + deltas->arrayZ[i] = points.arrayZ[i]; + } + #ifndef HB_NO_VAR glyf_accelerator.gvar->apply_deltas_to_points (gid, font, points.as_array ()); #endif + // mainly used by CompositeGlyph calculating new X/Y offset value so no need to extend it + // with child glyphs' points + if (deltas != nullptr && depth == 0 && type == COMPOSITE) + { + for (unsigned i = 0 ; i < points.length; i++) + { + deltas->arrayZ[i].x = points.arrayZ[i].x - deltas->arrayZ[i].x; + deltas->arrayZ[i].y = points.arrayZ[i].y - deltas->arrayZ[i].y; + } + } + switch (type) { case SIMPLE: if (!inplace) @@ -148,11 +271,11 @@ struct Glyph comp_points.reset (); if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_gid ()) .get_points (font, glyf_accelerator, comp_points, - phantom_only, depth + 1))) + deltas, use_my_metrics, phantom_only, depth + 1))) return false; /* Copy phantom points from component if USE_MY_METRICS flag set */ - if (item.is_use_my_metrics ()) + if (use_my_metrics && item.is_use_my_metrics ()) for (unsigned int i = 0; i < PHANTOM_COUNT; i++) phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i]; diff --git a/thirdparty/harfbuzz/src/OT/glyf/SimpleGlyph.hh b/thirdparty/harfbuzz/src/OT/glyf/SimpleGlyph.hh index 6df978cf13..b99665d6a0 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/SimpleGlyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/SimpleGlyph.hh @@ -206,6 +206,132 @@ struct SimpleGlyph && read_points (p, points_, end, &contour_point_t::y, FLAG_Y_SHORT, FLAG_Y_SAME); } + + static void encode_coord (int value, + uint8_t &flag, + const simple_glyph_flag_t short_flag, + const simple_glyph_flag_t same_flag, + hb_vector_t<uint8_t> &coords /* OUT */) + { + if (value == 0) + { + flag |= same_flag; + } + else if (value >= -255 && value <= 255) + { + flag |= short_flag; + if (value > 0) flag |= same_flag; + else value = -value; + + coords.push ((uint8_t)value); + } + else + { + int16_t val = value; + coords.push (val >> 8); + coords.push (val & 0xff); + } + } + + static void encode_flag (uint8_t &flag, + uint8_t &repeat, + uint8_t &lastflag, + hb_vector_t<uint8_t> &flags /* OUT */) + { + if (flag == lastflag && repeat != 255) + { + repeat = repeat + 1; + if (repeat == 1) + { + flags.push(flag); + } + else + { + unsigned len = flags.length; + flags[len-2] = flag | FLAG_REPEAT; + flags[len-1] = repeat; + } + } + else + { + repeat = 0; + flags.push (flag); + } + lastflag = flag; + } + + bool compile_bytes_with_deltas (const contour_point_vector_t &all_points, + bool no_hinting, + hb_bytes_t &dest_bytes /* OUT */) + { + if (header.numberOfContours == 0 || all_points.length <= 4) + { + dest_bytes = hb_bytes_t (); + return true; + } + //convert absolute values to relative values + unsigned num_points = all_points.length - 4; + hb_vector_t<hb_pair_t<int, int>> deltas; + deltas.resize (num_points); + + for (unsigned i = 0; i < num_points; i++) + { + deltas[i].first = i == 0 ? roundf (all_points[i].x) : roundf (all_points[i].x) - roundf (all_points[i-1].x); + deltas[i].second = i == 0 ? roundf (all_points[i].y) : roundf (all_points[i].y) - roundf (all_points[i-1].y); + } + + hb_vector_t<uint8_t> flags, x_coords, y_coords; + flags.alloc (num_points); + x_coords.alloc (2*num_points); + y_coords.alloc (2*num_points); + + uint8_t lastflag = 0, repeat = 0; + + for (unsigned i = 0; i < num_points; i++) + { + uint8_t flag = all_points[i].flag; + flag &= FLAG_ON_CURVE + FLAG_OVERLAP_SIMPLE; + + encode_coord (deltas[i].first, flag, FLAG_X_SHORT, FLAG_X_SAME, x_coords); + encode_coord (deltas[i].second, flag, FLAG_Y_SHORT, FLAG_Y_SAME, y_coords); + if (i == 0) lastflag = flag + 1; //make lastflag != flag for the first point + encode_flag (flag, repeat, lastflag, flags); + } + + unsigned len_before_instrs = 2 * header.numberOfContours + 2; + unsigned len_instrs = instructions_length (); + unsigned total_len = len_before_instrs + flags.length + x_coords.length + y_coords.length; + + if (!no_hinting) + total_len += len_instrs; + + char *p = (char *) hb_calloc (total_len, sizeof (char)); + if (unlikely (!p)) return false; + + const char *src = bytes.arrayZ + GlyphHeader::static_size; + char *cur = p; + memcpy (p, src, len_before_instrs); + + cur += len_before_instrs; + src += len_before_instrs; + + if (!no_hinting) + { + memcpy (cur, src, len_instrs); + cur += len_instrs; + } + + memcpy (cur, flags.arrayZ, flags.length); + cur += flags.length; + + memcpy (cur, x_coords.arrayZ, x_coords.length); + cur += x_coords.length; + + memcpy (cur, y_coords.arrayZ, y_coords.length); + + dest_bytes = hb_bytes_t (p, total_len); + return true; + } }; diff --git a/thirdparty/harfbuzz/src/OT/glyf/SubsetGlyph.hh b/thirdparty/harfbuzz/src/OT/glyf/SubsetGlyph.hh index 7ae8fe3078..7ddefc5a91 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/SubsetGlyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/SubsetGlyph.hh @@ -6,6 +6,9 @@ namespace OT { + +struct glyf_accelerator_t; + namespace glyf_impl { @@ -55,6 +58,17 @@ struct SubsetGlyph return_trace (true); } + bool compile_bytes_with_deltas (const hb_subset_plan_t *plan, + hb_font_t *font, + const glyf_accelerator_t &glyf) + { return source_glyph.compile_bytes_with_deltas (plan, font, glyf, dest_start, dest_end); } + + void free_compiled_bytes () + { + dest_start.fini (); + dest_end.fini (); + } + void drop_hints_bytes () { source_glyph.drop_hints_bytes (dest_start, dest_end); } diff --git a/thirdparty/harfbuzz/src/OT/glyf/glyf-helpers.hh b/thirdparty/harfbuzz/src/OT/glyf/glyf-helpers.hh index f51f7a81fc..181c33d06d 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/glyf-helpers.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/glyf-helpers.hh @@ -16,7 +16,7 @@ template<typename IteratorIn, typename IteratorOut, hb_requires (hb_is_source_of (IteratorIn, unsigned int)), hb_requires (hb_is_sink_of (IteratorOut, unsigned))> static void -_write_loca (IteratorIn it, bool short_offsets, IteratorOut dest) +_write_loca (IteratorIn&& it, bool short_offsets, IteratorOut&& dest) { unsigned right_shift = short_offsets ? 1 : 0; unsigned int offset = 0; diff --git a/thirdparty/harfbuzz/src/OT/glyf/glyf.hh b/thirdparty/harfbuzz/src/OT/glyf/glyf.hh index bcaf44fc1e..be2cb1d0dc 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/glyf.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/glyf.hh @@ -24,7 +24,6 @@ namespace OT { */ #define HB_OT_TAG_glyf HB_TAG('g','l','y','f') - struct glyf { friend struct glyf_accelerator_t; @@ -75,6 +74,9 @@ struct glyf hb_vector_t<glyf_impl::SubsetGlyph> glyphs; _populate_subset_glyphs (c->plan, &glyphs); + if (!c->plan->pinned_at_default) + _compile_subset_glyphs_with_deltas (c->plan, &glyphs); + auto padded_offsets = + hb_iter (glyphs) | hb_map (&glyf_impl::SubsetGlyph::padded_size) @@ -93,6 +95,8 @@ struct glyf } + if (!c->plan->pinned_at_default) + _free_compiled_subset_glyphs (&glyphs); if (unlikely (c->serializer->in_error ())) return_trace (false); return_trace (c->serializer->check_success (glyf_impl::_add_loca_and_head (c->plan, padded_offsets, @@ -102,6 +106,16 @@ struct glyf void _populate_subset_glyphs (const hb_subset_plan_t *plan, hb_vector_t<glyf_impl::SubsetGlyph> *glyphs /* OUT */) const; + + void + _compile_subset_glyphs_with_deltas (const hb_subset_plan_t *plan, + hb_vector_t<glyf_impl::SubsetGlyph> *glyphs /* OUT */) const; + + void _free_compiled_subset_glyphs (hb_vector_t<glyf_impl::SubsetGlyph> *glyphs) const + { + for (auto _ : *glyphs) + _.free_compiled_bytes (); + } protected: UnsizedArrayOf<HBUINT8> @@ -166,7 +180,7 @@ struct glyf_accelerator_t contour_point_vector_t all_points; bool phantom_only = !consumer.is_consuming_contour_points (); - if (unlikely (!glyph_for_gid (gid).get_points (font, *this, all_points, phantom_only))) + if (unlikely (!glyph_for_gid (gid).get_points (font, *this, all_points, nullptr, true, phantom_only))) return false; if (consumer.is_consuming_contour_points ()) @@ -389,6 +403,30 @@ glyf::_populate_subset_glyphs (const hb_subset_plan_t *plan, ; } +inline void +glyf::_compile_subset_glyphs_with_deltas (const hb_subset_plan_t *plan, + hb_vector_t<glyf_impl::SubsetGlyph> *glyphs /* OUT */) const +{ + OT::glyf_accelerator_t glyf (plan->source); + hb_font_t *font = hb_font_create (plan->source); + + hb_vector_t<hb_variation_t> vars; + vars.alloc (plan->user_axes_location->get_population ()); + + for (auto _ : *plan->user_axes_location) + { + hb_variation_t var; + var.tag = _.first; + var.value = _.second; + vars.push (var); + } + + hb_font_set_variations (font, vars.arrayZ, plan->user_axes_location->get_population ()); + for (auto& subset_glyph : *glyphs) + const_cast<glyf_impl::SubsetGlyph &> (subset_glyph).compile_bytes_with_deltas (plan, font, glyf); + + hb_font_destroy (font); +} } /* namespace OT */ diff --git a/thirdparty/harfbuzz/src/graph/classdef-graph.hh b/thirdparty/harfbuzz/src/graph/classdef-graph.hh new file mode 100644 index 0000000000..0bda76ac2f --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/classdef-graph.hh @@ -0,0 +1,216 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#include "graph.hh" +#include "../hb-ot-layout-common.hh" + +#ifndef GRAPH_CLASSDEF_GRAPH_HH +#define GRAPH_CLASSDEF_GRAPH_HH + +namespace graph { + +struct ClassDefFormat1 : public OT::ClassDefFormat1_3<SmallTypes> +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + constexpr unsigned min_size = OT::ClassDefFormat1_3<SmallTypes>::min_size; + if (vertex_len < min_size) return false; + return vertex_len >= min_size + classValue.get_size () - classValue.len.get_size (); + } +}; + +struct ClassDefFormat2 : public OT::ClassDefFormat2_4<SmallTypes> +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + constexpr unsigned min_size = OT::ClassDefFormat2_4<SmallTypes>::min_size; + if (vertex_len < min_size) return false; + return vertex_len >= min_size + rangeRecord.get_size () - rangeRecord.len.get_size (); + } +}; + +struct ClassDef : public OT::ClassDef +{ + template<typename It> + static bool add_class_def (gsubgpos_graph_context_t& c, + unsigned parent_id, + unsigned link_position, + It glyph_and_class, + unsigned max_size) + { + unsigned class_def_prime_id = c.graph.new_node (nullptr, nullptr); + auto& class_def_prime_vertex = c.graph.vertices_[class_def_prime_id]; + if (!make_class_def (c, glyph_and_class, class_def_prime_id, max_size)) + return false; + + auto* class_def_link = c.graph.vertices_[parent_id].obj.real_links.push (); + class_def_link->width = SmallTypes::size; + class_def_link->objidx = class_def_prime_id; + class_def_link->position = link_position; + class_def_prime_vertex.parents.push (parent_id); + + return true; + } + + template<typename It> + static bool make_class_def (gsubgpos_graph_context_t& c, + It glyph_and_class, + unsigned dest_obj, + unsigned max_size) + { + char* buffer = (char*) hb_calloc (1, max_size); + hb_serialize_context_t serializer (buffer, max_size); + OT::ClassDef_serialize (&serializer, glyph_and_class); + serializer.end_serialize (); + if (serializer.in_error ()) + { + hb_free (buffer); + return false; + } + + hb_bytes_t class_def_copy = serializer.copy_bytes (); + c.add_buffer ((char *) class_def_copy.arrayZ); // Give ownership to the context, it will cleanup the buffer. + + auto& obj = c.graph.vertices_[dest_obj].obj; + obj.head = (char *) class_def_copy.arrayZ; + obj.tail = obj.head + class_def_copy.length; + + hb_free (buffer); + return true; + } + + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + if (vertex_len < OT::ClassDef::min_size) return false; + switch (u.format) + { + case 1: return ((ClassDefFormat1*)this)->sanitize (vertex); + case 2: return ((ClassDefFormat2*)this)->sanitize (vertex); +#ifndef HB_NO_BORING_EXPANSION + // Not currently supported + case 3: + case 4: +#endif + default: return false; + } + } +}; + + +struct class_def_size_estimator_t +{ + template<typename It> + class_def_size_estimator_t (It glyph_and_class) + : gids_consecutive (true), num_ranges_per_class (), glyphs_per_class () + { + unsigned last_gid = (unsigned) -1; + for (auto p : + glyph_and_class) + { + unsigned gid = p.first; + unsigned klass = p.second; + + if (last_gid != (unsigned) -1 && gid != last_gid + 1) + gids_consecutive = false; + last_gid = gid; + + hb_set_t* glyphs; + if (glyphs_per_class.has (klass, &glyphs) && glyphs) { + glyphs->add (gid); + continue; + } + + hb_set_t new_glyphs; + new_glyphs.add (gid); + glyphs_per_class.set (klass, std::move (new_glyphs)); + } + + if (in_error ()) return; + + for (unsigned klass : glyphs_per_class.keys ()) + { + if (!klass) continue; // class 0 doesn't get encoded. + + const hb_set_t& glyphs = glyphs_per_class.get (klass); + hb_codepoint_t start = HB_SET_VALUE_INVALID; + hb_codepoint_t end = HB_SET_VALUE_INVALID; + + unsigned count = 0; + while (glyphs.next_range (&start, &end)) + count++; + + num_ranges_per_class.set (klass, count); + } + } + + // Incremental increase in the Coverage and ClassDef table size + // (worst case) if all glyphs associated with 'klass' were added. + unsigned incremental_coverage_size (unsigned klass) const + { + // Coverage takes 2 bytes per glyph worst case, + return 2 * glyphs_per_class.get (klass).get_population (); + } + + // Incremental increase in the Coverage and ClassDef table size + // (worst case) if all glyphs associated with 'klass' were added. + unsigned incremental_class_def_size (unsigned klass) const + { + // ClassDef takes 6 bytes per range + unsigned class_def_2_size = 6 * num_ranges_per_class.get (klass); + if (gids_consecutive) + { + // ClassDef1 takes 2 bytes per glyph, but only can be used + // when gids are consecutive. + return hb_min (2 * glyphs_per_class.get (klass).get_population (), class_def_2_size); + } + + return class_def_2_size; + } + + bool in_error () + { + if (num_ranges_per_class.in_error ()) return true; + if (glyphs_per_class.in_error ()) return true; + + for (const hb_set_t& s : glyphs_per_class.values ()) + { + if (s.in_error ()) return true; + } + return false; + } + + private: + bool gids_consecutive; + hb_hashmap_t<unsigned, unsigned> num_ranges_per_class; + hb_hashmap_t<unsigned, hb_set_t> glyphs_per_class; +}; + + +} + +#endif // GRAPH_CLASSDEF_GRAPH_HH diff --git a/thirdparty/harfbuzz/src/graph/coverage-graph.hh b/thirdparty/harfbuzz/src/graph/coverage-graph.hh index 1d9fd0eb5b..3c1022f090 100644 --- a/thirdparty/harfbuzz/src/graph/coverage-graph.hh +++ b/thirdparty/harfbuzz/src/graph/coverage-graph.hh @@ -56,6 +56,78 @@ struct CoverageFormat2 : public OT::Layout::Common::CoverageFormat2_4<SmallTypes struct Coverage : public OT::Layout::Common::Coverage { + static Coverage* clone_coverage (gsubgpos_graph_context_t& c, + unsigned coverage_id, + unsigned new_parent_id, + unsigned link_position, + unsigned start, unsigned end) + + { + unsigned coverage_size = c.graph.vertices_[coverage_id].table_size (); + auto& coverage_v = c.graph.vertices_[coverage_id]; + Coverage* coverage_table = (Coverage*) coverage_v.obj.head; + if (!coverage_table || !coverage_table->sanitize (coverage_v)) + return nullptr; + + auto new_coverage = + + hb_zip (coverage_table->iter (), hb_range ()) + | hb_filter ([&] (hb_pair_t<unsigned, unsigned> p) { + return p.second >= start && p.second < end; + }) + | hb_map_retains_sorting (hb_first) + ; + + return add_coverage (c, new_parent_id, link_position, new_coverage, coverage_size); + } + + template<typename It> + static Coverage* add_coverage (gsubgpos_graph_context_t& c, + unsigned parent_id, + unsigned link_position, + It glyphs, + unsigned max_size) + { + unsigned coverage_prime_id = c.graph.new_node (nullptr, nullptr); + auto& coverage_prime_vertex = c.graph.vertices_[coverage_prime_id]; + if (!make_coverage (c, glyphs, coverage_prime_id, max_size)) + return nullptr; + + auto* coverage_link = c.graph.vertices_[parent_id].obj.real_links.push (); + coverage_link->width = SmallTypes::size; + coverage_link->objidx = coverage_prime_id; + coverage_link->position = link_position; + coverage_prime_vertex.parents.push (parent_id); + + return (Coverage*) coverage_prime_vertex.obj.head; + } + + template<typename It> + static bool make_coverage (gsubgpos_graph_context_t& c, + It glyphs, + unsigned dest_obj, + unsigned max_size) + { + char* buffer = (char*) hb_calloc (1, max_size); + hb_serialize_context_t serializer (buffer, max_size); + OT::Layout::Common::Coverage_serialize (&serializer, glyphs); + serializer.end_serialize (); + if (serializer.in_error ()) + { + hb_free (buffer); + return false; + } + + hb_bytes_t coverage_copy = serializer.copy_bytes (); + c.add_buffer ((char *) coverage_copy.arrayZ); // Give ownership to the context, it will cleanup the buffer. + + auto& obj = c.graph.vertices_[dest_obj].obj; + obj.head = (char *) coverage_copy.arrayZ; + obj.tail = obj.head + coverage_copy.length; + + hb_free (buffer); + return true; + } + bool sanitize (graph_t::vertex_t& vertex) const { int64_t vertex_len = vertex.obj.tail - vertex.obj.head; diff --git a/thirdparty/harfbuzz/src/graph/graph.hh b/thirdparty/harfbuzz/src/graph/graph.hh index b3aef558a2..64878a84a4 100644 --- a/thirdparty/harfbuzz/src/graph/graph.hh +++ b/thirdparty/harfbuzz/src/graph/graph.hh @@ -49,6 +49,51 @@ struct graph_t unsigned end = 0; unsigned priority = 0; + void normalize () + { + obj.real_links.qsort (); + for (auto& l : obj.real_links) + { + for (unsigned i = 0; i < l.width; i++) + { + obj.head[l.position + i] = 0; + } + } + } + + bool equals (const vertex_t& other, + const graph_t& graph, + const graph_t& other_graph, + unsigned depth) const + { + if (!(as_bytes () == other.as_bytes ())) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + "vertex [%lu] bytes != [%lu] bytes, depth = %u", + table_size (), + other.table_size (), + depth); + + auto a = as_bytes (); + auto b = other.as_bytes (); + while (a || b) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + " 0x%x %s 0x%x", *a, (*a == *b) ? "==" : "!=", *b); + a++; + b++; + } + return false; + } + + return links_equal (obj.real_links, other.obj.real_links, graph, other_graph, depth); + } + + hb_bytes_t as_bytes () const + { + return hb_bytes_t (obj.head, table_size ()); + } + friend void swap (vertex_t& a, vertex_t& b) { hb_swap (a.obj, b.obj); @@ -60,6 +105,18 @@ struct graph_t hb_swap (a.priority, b.priority); } + hb_hashmap_t<unsigned, unsigned> + position_to_index_map () const + { + hb_hashmap_t<unsigned, unsigned> result; + + for (const auto& l : obj.real_links) { + result.set (l.position, l.objidx); + } + + return result; + } + bool is_shared () const { return parents.length > 1; @@ -84,7 +141,7 @@ struct graph_t { for (unsigned i = 0; i < obj.real_links.length; i++) { - auto& link = obj.real_links[i]; + auto& link = obj.real_links.arrayZ[i]; if (link.objidx != child_index) continue; @@ -155,6 +212,57 @@ struct graph_t return -table_size; } + + private: + bool links_equal (const hb_vector_t<hb_serialize_context_t::object_t::link_t>& this_links, + const hb_vector_t<hb_serialize_context_t::object_t::link_t>& other_links, + const graph_t& graph, + const graph_t& other_graph, + unsigned depth) const + { + auto a = this_links.iter (); + auto b = other_links.iter (); + + while (a && b) + { + const auto& link_a = *a; + const auto& link_b = *b; + + if (link_a.width != link_b.width || + link_a.is_signed != link_b.is_signed || + link_a.whence != link_b.whence || + link_a.position != link_b.position || + link_a.bias != link_b.bias) + return false; + + if (!graph.vertices_[link_a.objidx].equals ( + other_graph.vertices_[link_b.objidx], graph, other_graph, depth + 1)) + return false; + + a++; + b++; + } + + if (bool (a) != bool (b)) + return false; + + return true; + } + }; + + template <typename T> + struct vertex_and_table_t + { + vertex_and_table_t () : index (0), vertex (nullptr), table (nullptr) + {} + + unsigned index; + vertex_t* vertex; + T* table; + + operator bool () { + return table && vertex; + } }; /* @@ -169,7 +277,8 @@ struct graph_t : parents_invalid (true), distance_invalid (true), positions_invalid (true), - successful (true) + successful (true), + buffers () { num_roots_for_space_.push (1); bool removed_nil = false; @@ -201,6 +310,20 @@ struct graph_t ~graph_t () { vertices_.fini (); + for (char* b : buffers) + hb_free (b); + } + + bool operator== (const graph_t& other) const + { + return root ().equals (other.root (), *this, other, 0); + } + + // Sorts links of all objects in a consistent manner and zeroes all offsets. + void normalize () + { + for (auto& v : vertices_.writer ()) + v.normalize (); } bool in_error () const @@ -228,6 +351,27 @@ struct graph_t return vertices_[i].obj; } + void add_buffer (char* buffer) + { + buffers.push (buffer); + } + + /* + * Adds a 16 bit link from parent_id to child_id + */ + template<typename T> + void add_link (T* offset, + unsigned parent_id, + unsigned child_id) + { + auto& v = vertices_[parent_id]; + auto* link = v.obj.real_links.push (); + link->width = 2; + link->objidx = child_id; + link->position = (char*) offset - (char*) v.obj.head; + vertices_[child_id].parents.push (parent_id); + } + /* * Generates a new topological sorting of graph ordered by the shortest * distance to each node if positions are marked as invalid. @@ -345,13 +489,43 @@ struct graph_t } } - unsigned index_for_offset(unsigned node_idx, const void* offset) const + template <typename T, typename ...Ts> + vertex_and_table_t<T> as_table (unsigned parent, const void* offset, Ts... ds) + { + return as_table_from_index<T> (index_for_offset (parent, offset), std::forward<Ts>(ds)...); + } + + template <typename T, typename ...Ts> + vertex_and_table_t<T> as_table_from_index (unsigned index, Ts... ds) + { + if (index >= vertices_.length) + return vertex_and_table_t<T> (); + + vertex_and_table_t<T> r; + r.vertex = &vertices_[index]; + r.table = (T*) r.vertex->obj.head; + r.index = index; + if (!r.table) + return vertex_and_table_t<T> (); + + if (!r.table->sanitize (*(r.vertex), std::forward<Ts>(ds)...)) + return vertex_and_table_t<T> (); + + return r; + } + + // Finds the object id of the object pointed to by the offset at 'offset' + // within object[node_idx]. + unsigned index_for_offset (unsigned node_idx, const void* offset) const { const auto& node = object (node_idx); if (offset < node.head || offset >= node.tail) return -1; - for (const auto& link : node.real_links) + unsigned length = node.real_links.length; + for (unsigned i = 0; i < length; i++) { + // Use direct access for increased performance, this is a hot method. + const auto& link = node.real_links.arrayZ[i]; if (offset != node.head + link.position) continue; return link.objidx; @@ -360,6 +534,24 @@ struct graph_t return -1; } + // Finds the object id of the object pointed to by the offset at 'offset' + // within object[node_idx]. Ensures that the returned object is safe to mutate. + // That is, if the original child object is shared by parents other than node_idx + // it will be duplicated and the duplicate will be returned instead. + unsigned mutable_index_for_offset (unsigned node_idx, const void* offset) + { + unsigned child_idx = index_for_offset (node_idx, offset); + auto& child = vertices_[child_idx]; + for (unsigned p : child.parents) + { + if (p != node_idx) { + return duplicate (node_idx, child_idx); + } + } + + return child_idx; + } + /* * Assign unique space numbers to each connected subgraph of 24 bit and/or 32 bit offset(s). @@ -1039,6 +1231,7 @@ struct graph_t bool positions_invalid; bool successful; hb_vector_t<unsigned> num_roots_for_space_; + hb_vector_t<char*> buffers; }; } diff --git a/thirdparty/harfbuzz/src/graph/gsubgpos-context.cc b/thirdparty/harfbuzz/src/graph/gsubgpos-context.cc index e0ff6ff85f..b2044426d4 100644 --- a/thirdparty/harfbuzz/src/graph/gsubgpos-context.cc +++ b/thirdparty/harfbuzz/src/graph/gsubgpos-context.cc @@ -33,8 +33,7 @@ gsubgpos_graph_context_t::gsubgpos_graph_context_t (hb_tag_t table_tag_, : table_tag (table_tag_), graph (graph_), lookup_list_index (0), - lookups (), - buffers () + lookups () { if (table_tag_ != HB_OT_TAG_GPOS && table_tag_ != HB_OT_TAG_GSUB) @@ -53,7 +52,7 @@ unsigned gsubgpos_graph_context_t::create_node (unsigned size) if (!buffer) return -1; - buffers.push (buffer); + add_buffer (buffer); return graph.new_node (buffer, buffer + size); } diff --git a/thirdparty/harfbuzz/src/graph/gsubgpos-context.hh b/thirdparty/harfbuzz/src/graph/gsubgpos-context.hh index 49b24198ff..9fe9662e64 100644 --- a/thirdparty/harfbuzz/src/graph/gsubgpos-context.hh +++ b/thirdparty/harfbuzz/src/graph/gsubgpos-context.hh @@ -40,22 +40,16 @@ struct gsubgpos_graph_context_t graph_t& graph; unsigned lookup_list_index; hb_hashmap_t<unsigned, graph::Lookup*> lookups; - hb_vector_t<char*> buffers; + HB_INTERNAL gsubgpos_graph_context_t (hb_tag_t table_tag_, graph_t& graph_); - ~gsubgpos_graph_context_t () - { - for (char* b : buffers) - hb_free (b); - } - HB_INTERNAL unsigned create_node (unsigned size); void add_buffer (char* buffer) { - buffers.push (buffer); + graph.add_buffer (buffer); } private: diff --git a/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh b/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh index afa1152c44..a93e7d1c73 100644 --- a/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh +++ b/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh @@ -29,6 +29,7 @@ #include "../OT/Layout/GSUB/ExtensionSubst.hh" #include "gsubgpos-context.hh" #include "pairpos-graph.hh" +#include "markbasepos-graph.hh" #ifndef GRAPH_GSUBGPOS_GRAPH_HH #define GRAPH_GSUBGPOS_GRAPH_HH @@ -121,10 +122,12 @@ struct Lookup : public OT::Lookup if (c.table_tag != HB_OT_TAG_GPOS) return true; - if (!is_ext && type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair) + if (!is_ext && + type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair && + type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::MarkBase) return true; - hb_vector_t<unsigned> all_new_subtables; + hb_vector_t<hb_pair_t<unsigned, hb_vector_t<unsigned>>> all_new_subtables; for (unsigned i = 0; i < subTable.len; i++) { unsigned subtable_index = c.graph.index_for_offset (this_index, &subTable[i]); @@ -133,39 +136,66 @@ struct Lookup : public OT::Lookup ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>* extension = (ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>*) c.graph.object (ext_subtable_index).head; - if (!extension->sanitize (c.graph.vertices_[ext_subtable_index])) + if (!extension || !extension->sanitize (c.graph.vertices_[ext_subtable_index])) continue; subtable_index = extension->get_subtable_index (c.graph, ext_subtable_index); type = extension->get_lookup_type (); - if (type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair) + if (type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair + && type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::MarkBase) continue; } - PairPos* pairPos = (PairPos*) c.graph.object (subtable_index).head; - if (!pairPos->sanitize (c.graph.vertices_[subtable_index])) continue; - - hb_vector_t<unsigned> new_sub_tables = pairPos->split_subtables (c, subtable_index); + hb_vector_t<unsigned> new_sub_tables; + switch (type) + { + case 2: + new_sub_tables = split_subtable<PairPos> (c, subtable_index); break; + case 4: + new_sub_tables = split_subtable<MarkBasePos> (c, subtable_index); break; + default: + break; + } if (new_sub_tables.in_error ()) return false; - + new_sub_tables.iter() | hb_sink (all_new_subtables); + if (!new_sub_tables) continue; + hb_pair_t<unsigned, hb_vector_t<unsigned>>* entry = all_new_subtables.push (); + entry->first = i; + entry->second = std::move (new_sub_tables); } - if (all_new_subtables) + if (all_new_subtables) { add_sub_tables (c, this_index, type, all_new_subtables); + } return true; } + template<typename T> + hb_vector_t<unsigned> split_subtable (gsubgpos_graph_context_t& c, + unsigned objidx) + { + T* sub_table = (T*) c.graph.object (objidx).head; + if (!sub_table || !sub_table->sanitize (c.graph.vertices_[objidx])) + return hb_vector_t<unsigned> (); + + return sub_table->split_subtables (c, objidx); + } + void add_sub_tables (gsubgpos_graph_context_t& c, unsigned this_index, unsigned type, - hb_vector_t<unsigned>& subtable_indices) + hb_vector_t<hb_pair_t<unsigned, hb_vector_t<unsigned>>>& subtable_ids) { bool is_ext = is_extension (c.table_tag); auto& v = c.graph.vertices_[this_index]; + fix_existing_subtable_links (c, this_index, subtable_ids); + + unsigned new_subtable_count = 0; + for (const auto& p : subtable_ids) + new_subtable_count += p.second.length; size_t new_size = v.table_size () - + subtable_indices.length * OT::Offset16::static_size; + + new_subtable_count * OT::Offset16::static_size; char* buffer = (char*) hb_calloc (1, new_size); c.add_buffer (buffer); memcpy (buffer, v.obj.head, v.table_size()); @@ -175,30 +205,61 @@ struct Lookup : public OT::Lookup Lookup* new_lookup = (Lookup*) buffer; - new_lookup->subTable.len = subTable.len + subtable_indices.length; - unsigned offset_index = subTable.len; - for (unsigned subtable_id : subtable_indices) + unsigned shift = 0; + new_lookup->subTable.len = subTable.len + new_subtable_count; + for (const auto& p : subtable_ids) { - if (is_ext) + unsigned offset_index = p.first + shift + 1; + shift += p.second.length; + + for (unsigned subtable_id : p.second) { - unsigned ext_id = create_extension_subtable (c, subtable_id, type); - c.graph.vertices_[subtable_id].parents.push (ext_id); - subtable_id = ext_id; + if (is_ext) + { + unsigned ext_id = create_extension_subtable (c, subtable_id, type); + c.graph.vertices_[subtable_id].parents.push (ext_id); + subtable_id = ext_id; + } + + auto* link = v.obj.real_links.push (); + link->width = 2; + link->objidx = subtable_id; + link->position = (char*) &new_lookup->subTable[offset_index++] - + (char*) new_lookup; + c.graph.vertices_[subtable_id].parents.push (this_index); } - - auto* link = v.obj.real_links.push (); - link->width = 2; - link->objidx = subtable_id; - link->position = (char*) &new_lookup->subTable[offset_index++] - - (char*) new_lookup; - c.graph.vertices_[subtable_id].parents.push (this_index); } + // Repacker sort order depends on link order, which we've messed up so resort it. + v.obj.real_links.qsort (); + // The head location of the lookup has changed, invalidating the lookups map entry // in the context. Update the map. c.lookups.set (this_index, new_lookup); } + void fix_existing_subtable_links (gsubgpos_graph_context_t& c, + unsigned this_index, + hb_vector_t<hb_pair_t<unsigned, hb_vector_t<unsigned>>>& subtable_ids) + { + auto& v = c.graph.vertices_[this_index]; + Lookup* lookup = (Lookup*) v.obj.head; + + unsigned shift = 0; + for (const auto& p : subtable_ids) + { + unsigned insert_index = p.first + shift; + unsigned pos_offset = p.second.length * OT::Offset16::static_size; + unsigned insert_offset = (char*) &lookup->subTable[insert_index] - (char*) lookup; + shift += p.second.length; + + for (auto& l : v.obj.all_links_writer ()) + { + if (l.position > insert_offset) l.position += pos_offset; + } + } + } + unsigned create_extension_subtable (gsubgpos_graph_context_t& c, unsigned subtable_index, unsigned type) @@ -281,7 +342,7 @@ struct GSTAR : public OT::GSUBGPOS const auto& r = graph.root (); GSTAR* gstar = (GSTAR*) r.obj.head; - if (!gstar->sanitize (r)) + if (!gstar || !gstar->sanitize (r)) return nullptr; return gstar; @@ -327,17 +388,16 @@ struct GSTAR : public OT::GSUBGPOS hb_hashmap_t<unsigned, Lookup*>& lookups /* OUT */) { unsigned lookup_list_idx = get_lookup_list_index (graph); - const LookupList<Types>* lookupList = (const LookupList<Types>*) graph.object (lookup_list_idx).head; - if (!lookupList->sanitize (graph.vertices_[lookup_list_idx])) + if (!lookupList || !lookupList->sanitize (graph.vertices_[lookup_list_idx])) return; for (unsigned i = 0; i < lookupList->len; i++) { unsigned lookup_idx = graph.index_for_offset (lookup_list_idx, &(lookupList->arrayZ[i])); Lookup* lookup = (Lookup*) graph.object (lookup_idx).head; - if (!lookup->sanitize (graph.vertices_[lookup_idx])) continue; + if (!lookup || !lookup->sanitize (graph.vertices_[lookup_idx])) continue; lookups.set (lookup_idx, lookup); } } diff --git a/thirdparty/harfbuzz/src/graph/markbasepos-graph.hh b/thirdparty/harfbuzz/src/graph/markbasepos-graph.hh new file mode 100644 index 0000000000..56fa812406 --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/markbasepos-graph.hh @@ -0,0 +1,507 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#ifndef GRAPH_MARKBASEPOS_GRAPH_HH +#define GRAPH_MARKBASEPOS_GRAPH_HH + +#include "split-helpers.hh" +#include "coverage-graph.hh" +#include "../OT/Layout/GPOS/MarkBasePos.hh" +#include "../OT/Layout/GPOS/PosLookupSubTable.hh" + +namespace graph { + +struct AnchorMatrix : public OT::Layout::GPOS_impl::AnchorMatrix +{ + bool sanitize (graph_t::vertex_t& vertex, unsigned class_count) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + if (vertex_len < AnchorMatrix::min_size) return false; + + return vertex_len >= AnchorMatrix::min_size + + OT::Offset16::static_size * class_count * this->rows; + } + + bool shrink (gsubgpos_graph_context_t& c, + unsigned this_index, + unsigned old_class_count, + unsigned new_class_count) + { + if (new_class_count >= old_class_count) return false; + auto& o = c.graph.vertices_[this_index].obj; + unsigned base_count = rows; + o.tail = o.head + + AnchorMatrix::min_size + + OT::Offset16::static_size * base_count * new_class_count; + + // Reposition links into the new indexing scheme. + for (auto& link : o.real_links.writer ()) + { + unsigned index = (link.position - 2) / 2; + unsigned base = index / old_class_count; + unsigned klass = index % old_class_count; + if (klass >= new_class_count) + // should have already been removed + return false; + + unsigned new_index = base * new_class_count + klass; + + link.position = (char*) &(this->matrixZ[new_index]) - (char*) this; + } + + return true; + } + + unsigned clone (gsubgpos_graph_context_t& c, + unsigned this_index, + unsigned start, + unsigned end, + unsigned class_count) + { + unsigned base_count = rows; + unsigned new_class_count = end - start; + unsigned size = AnchorMatrix::min_size + + OT::Offset16::static_size * new_class_count * rows; + unsigned prime_id = c.create_node (size); + if (prime_id == (unsigned) -1) return -1; + AnchorMatrix* prime = (AnchorMatrix*) c.graph.object (prime_id).head; + prime->rows = base_count; + + auto& o = c.graph.vertices_[this_index].obj; + int num_links = o.real_links.length; + for (int i = 0; i < num_links; i++) + { + const auto& link = o.real_links[i]; + unsigned old_index = (link.position - 2) / OT::Offset16::static_size; + unsigned klass = old_index % class_count; + if (klass < start || klass >= end) continue; + + unsigned base = old_index / class_count; + unsigned new_klass = klass - start; + unsigned new_index = base * new_class_count + new_klass; + + + unsigned child_idx = link.objidx; + c.graph.add_link (&(prime->matrixZ[new_index]), + prime_id, + child_idx); + + auto& child = c.graph.vertices_[child_idx]; + child.remove_parent (this_index); + + o.real_links.remove (i); + num_links--; + i--; + } + + return prime_id; + } +}; + +struct MarkArray : public OT::Layout::GPOS_impl::MarkArray +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + unsigned min_size = MarkArray::min_size; + if (vertex_len < min_size) return false; + + return vertex_len >= get_size (); + } + + bool shrink (gsubgpos_graph_context_t& c, + const hb_hashmap_t<unsigned, unsigned>& mark_array_links, + unsigned this_index, + unsigned new_class_count) + { + auto& o = c.graph.vertices_[this_index].obj; + for (const auto& link : o.real_links) + c.graph.vertices_[link.objidx].remove_parent (this_index); + o.real_links.reset (); + + unsigned new_index = 0; + for (const auto& record : this->iter ()) + { + unsigned klass = record.klass; + if (klass >= new_class_count) continue; + + (*this)[new_index].klass = klass; + unsigned position = (char*) &record.markAnchor - (char*) this; + unsigned* objidx; + if (!mark_array_links.has (position, &objidx)) + { + new_index++; + continue; + } + + c.graph.add_link (&(*this)[new_index].markAnchor, this_index, *objidx); + new_index++; + } + + this->len = new_index; + o.tail = o.head + MarkArray::min_size + + OT::Layout::GPOS_impl::MarkRecord::static_size * new_index; + return true; + } + + unsigned clone (gsubgpos_graph_context_t& c, + unsigned this_index, + const hb_hashmap_t<unsigned, unsigned>& pos_to_index, + hb_set_t& marks, + unsigned start_class) + { + unsigned size = MarkArray::min_size + + OT::Layout::GPOS_impl::MarkRecord::static_size * + marks.get_population (); + unsigned prime_id = c.create_node (size); + if (prime_id == (unsigned) -1) return -1; + MarkArray* prime = (MarkArray*) c.graph.object (prime_id).head; + prime->len = marks.get_population (); + + + unsigned i = 0; + for (hb_codepoint_t mark : marks) + { + (*prime)[i].klass = (*this)[mark].klass - start_class; + unsigned offset_pos = (char*) &((*this)[mark].markAnchor) - (char*) this; + unsigned* anchor_index; + if (pos_to_index.has (offset_pos, &anchor_index)) + c.graph.move_child (this_index, + &((*this)[mark].markAnchor), + prime_id, + &((*prime)[i].markAnchor)); + + i++; + } + + return prime_id; + } +}; + +struct MarkBasePosFormat1 : public OT::Layout::GPOS_impl::MarkBasePosFormat1_2<SmallTypes> +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + return vertex_len >= MarkBasePosFormat1::static_size; + } + + hb_vector_t<unsigned> split_subtables (gsubgpos_graph_context_t& c, unsigned this_index) + { + hb_set_t visited; + + const unsigned base_coverage_id = c.graph.index_for_offset (this_index, &baseCoverage); + const unsigned base_size = + OT::Layout::GPOS_impl::PairPosFormat1_3<SmallTypes>::min_size + + MarkArray::min_size + + AnchorMatrix::min_size + + c.graph.vertices_[base_coverage_id].table_size (); + + hb_vector_t<class_info_t> class_to_info = get_class_info (c, this_index); + + unsigned class_count = classCount; + auto base_array = c.graph.as_table<AnchorMatrix> (this_index, + &baseArray, + class_count); + if (!base_array) return hb_vector_t<unsigned> (); + unsigned base_count = base_array.table->rows; + + unsigned partial_coverage_size = 4; + unsigned accumulated = base_size; + hb_vector_t<unsigned> split_points; + + for (unsigned klass = 0; klass < class_count; klass++) + { + class_info_t& info = class_to_info[klass]; + partial_coverage_size += OT::HBUINT16::static_size * info.marks.get_population (); + unsigned accumulated_delta = + OT::Layout::GPOS_impl::MarkRecord::static_size * info.marks.get_population () + + OT::Offset16::static_size * base_count; + + for (unsigned objidx : info.child_indices) + accumulated_delta += c.graph.find_subgraph_size (objidx, visited); + + accumulated += accumulated_delta; + unsigned total = accumulated + partial_coverage_size; + + if (total >= (1 << 16)) + { + split_points.push (klass); + accumulated = base_size + accumulated_delta; + partial_coverage_size = 4 + OT::HBUINT16::static_size * info.marks.get_population (); + visited.clear (); // node sharing isn't allowed between splits. + } + } + + + const unsigned mark_array_id = c.graph.index_for_offset (this_index, &markArray); + split_context_t split_context { + c, + this, + this_index, + std::move (class_to_info), + c.graph.vertices_[mark_array_id].position_to_index_map (), + }; + + return actuate_subtable_split<split_context_t> (split_context, split_points); + } + + private: + + struct class_info_t { + hb_set_t marks; + hb_vector_t<unsigned> child_indices; + }; + + struct split_context_t { + gsubgpos_graph_context_t& c; + MarkBasePosFormat1* thiz; + unsigned this_index; + hb_vector_t<class_info_t> class_to_info; + hb_hashmap_t<unsigned, unsigned> mark_array_links; + + hb_set_t marks_for (unsigned start, unsigned end) + { + hb_set_t marks; + for (unsigned klass = start; klass < end; klass++) + { + + class_to_info[klass].marks.iter () + | hb_sink (marks) + ; + } + return marks; + } + + unsigned original_count () + { + return thiz->classCount; + } + + unsigned clone_range (unsigned start, unsigned end) + { + return thiz->clone_range (*this, this->this_index, start, end); + } + + bool shrink (unsigned count) + { + return thiz->shrink (*this, this->this_index, count); + } + }; + + hb_vector_t<class_info_t> get_class_info (gsubgpos_graph_context_t& c, + unsigned this_index) + { + hb_vector_t<class_info_t> class_to_info; + + unsigned class_count= classCount; + class_to_info.resize (class_count); + + auto mark_array = c.graph.as_table<MarkArray> (this_index, &markArray); + if (!mark_array) return hb_vector_t<class_info_t> (); + unsigned mark_count = mark_array.table->len; + for (unsigned mark = 0; mark < mark_count; mark++) + { + unsigned klass = (*mark_array.table)[mark].get_class (); + class_to_info[klass].marks.add (mark); + } + + for (const auto& link : mark_array.vertex->obj.real_links) + { + unsigned mark = (link.position - 2) / + OT::Layout::GPOS_impl::MarkRecord::static_size; + unsigned klass = (*mark_array.table)[mark].get_class (); + class_to_info[klass].child_indices.push (link.objidx); + } + + unsigned base_array_id = + c.graph.index_for_offset (this_index, &baseArray); + auto& base_array_v = c.graph.vertices_[base_array_id]; + + for (const auto& link : base_array_v.obj.real_links) + { + unsigned index = (link.position - 2) / OT::Offset16::static_size; + unsigned klass = index % class_count; + class_to_info[klass].child_indices.push (link.objidx); + } + + return class_to_info; + } + + bool shrink (split_context_t& sc, + unsigned this_index, + unsigned count) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + " Shrinking MarkBasePosFormat1 (%u) to [0, %u).", + this_index, + count); + + unsigned old_count = classCount; + if (count >= old_count) + return true; + + classCount = count; + + auto mark_coverage = sc.c.graph.as_table<Coverage> (this_index, + &markCoverage); + if (!mark_coverage) return false; + hb_set_t marks = sc.marks_for (0, count); + auto new_coverage = + + hb_zip (hb_range (), mark_coverage.table->iter ()) + | hb_filter (marks, hb_first) + | hb_map_retains_sorting (hb_second) + ; + if (!Coverage::make_coverage (sc.c, + new_coverage, + mark_coverage.index, + 4 + 2 * marks.get_population ())) + return false; + + + auto base_array = sc.c.graph.as_table<AnchorMatrix> (this_index, + &baseArray, + old_count); + if (!base_array || !base_array.table->shrink (sc.c, + base_array.index, + old_count, + count)) + return false; + + auto mark_array = sc.c.graph.as_table<MarkArray> (this_index, + &markArray); + if (!mark_array || !mark_array.table->shrink (sc.c, + sc.mark_array_links, + mark_array.index, + count)) + return false; + + return true; + } + + // Create a new MarkBasePos that has all of the data for classes from [start, end). + unsigned clone_range (split_context_t& sc, + unsigned this_index, + unsigned start, unsigned end) const + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + " Cloning MarkBasePosFormat1 (%u) range [%u, %u).", this_index, start, end); + + graph_t& graph = sc.c.graph; + unsigned prime_size = OT::Layout::GPOS_impl::MarkBasePosFormat1_2<SmallTypes>::static_size; + + unsigned prime_id = sc.c.create_node (prime_size); + if (prime_id == (unsigned) -1) return -1; + + MarkBasePosFormat1* prime = (MarkBasePosFormat1*) graph.object (prime_id).head; + prime->format = this->format; + unsigned new_class_count = end - start; + prime->classCount = new_class_count; + + unsigned base_coverage_id = + graph.index_for_offset (sc.this_index, &baseCoverage); + graph.add_link (&(prime->baseCoverage), prime_id, base_coverage_id); + graph.duplicate (prime_id, base_coverage_id); + + auto mark_coverage = sc.c.graph.as_table<Coverage> (this_index, + &markCoverage); + if (!mark_coverage) return false; + hb_set_t marks = sc.marks_for (start, end); + auto new_coverage = + + hb_zip (hb_range (), mark_coverage.table->iter ()) + | hb_filter (marks, hb_first) + | hb_map_retains_sorting (hb_second) + ; + if (!Coverage::add_coverage (sc.c, + prime_id, + 2, + + new_coverage, + marks.get_population () * 2 + 4)) + return -1; + + auto mark_array = + graph.as_table <MarkArray> (sc.this_index, &markArray); + if (!mark_array) return -1; + unsigned new_mark_array = + mark_array.table->clone (sc.c, + mark_array.index, + sc.mark_array_links, + marks, + start); + graph.add_link (&(prime->markArray), prime_id, new_mark_array); + + unsigned class_count = classCount; + auto base_array = + graph.as_table<AnchorMatrix> (sc.this_index, &baseArray, class_count); + if (!base_array) return -1; + unsigned new_base_array = + base_array.table->clone (sc.c, + base_array.index, + start, end, this->classCount); + graph.add_link (&(prime->baseArray), prime_id, new_base_array); + + return prime_id; + } +}; + + +struct MarkBasePos : public OT::Layout::GPOS_impl::MarkBasePos +{ + hb_vector_t<unsigned> split_subtables (gsubgpos_graph_context_t& c, + unsigned this_index) + { + switch (u.format) { + case 1: + return ((MarkBasePosFormat1*)(&u.format1))->split_subtables (c, this_index); +#ifndef HB_NO_BORING_EXPANSION + case 2: HB_FALLTHROUGH; + // Don't split 24bit PairPos's. +#endif + default: + return hb_vector_t<unsigned> (); + } + } + + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + if (vertex_len < u.format.get_size ()) return false; + + switch (u.format) { + case 1: + return ((MarkBasePosFormat1*)(&u.format1))->sanitize (vertex); +#ifndef HB_NO_BORING_EXPANSION + case 2: HB_FALLTHROUGH; +#endif + default: + // We don't handle format 3 and 4 here. + return false; + } + } +}; + + +} + +#endif // GRAPH_MARKBASEPOS_GRAPH_HH diff --git a/thirdparty/harfbuzz/src/graph/pairpos-graph.hh b/thirdparty/harfbuzz/src/graph/pairpos-graph.hh index 3ca4fc701c..976b872329 100644 --- a/thirdparty/harfbuzz/src/graph/pairpos-graph.hh +++ b/thirdparty/harfbuzz/src/graph/pairpos-graph.hh @@ -27,7 +27,9 @@ #ifndef GRAPH_PAIRPOS_GRAPH_HH #define GRAPH_PAIRPOS_GRAPH_HH +#include "split-helpers.hh" #include "coverage-graph.hh" +#include "classdef-graph.hh" #include "../OT/Layout/GPOS/PairPos.hh" #include "../OT/Layout/GPOS/PosLookupSubTable.hh" @@ -51,68 +53,62 @@ struct PairPosFormat1 : public OT::Layout::GPOS_impl::PairPosFormat1_3<SmallType const unsigned coverage_id = c.graph.index_for_offset (this_index, &coverage); const unsigned coverage_size = c.graph.vertices_[coverage_id].table_size (); - const unsigned base_size = OT::Layout::GPOS_impl::PairPosFormat1_3<SmallTypes>::min_size - + coverage_size; + const unsigned base_size = OT::Layout::GPOS_impl::PairPosFormat1_3<SmallTypes>::min_size; + unsigned partial_coverage_size = 4; unsigned accumulated = base_size; hb_vector_t<unsigned> split_points; for (unsigned i = 0; i < pairSet.len; i++) { unsigned pair_set_index = pair_set_graph_index (c, this_index, i); - accumulated += c.graph.find_subgraph_size (pair_set_index, visited); - accumulated += SmallTypes::size; // for PairSet offset. + unsigned accumulated_delta = + c.graph.find_subgraph_size (pair_set_index, visited) + + SmallTypes::size; // for PairSet offset. + partial_coverage_size += OT::HBUINT16::static_size; - // TODO(garretrieger): don't count the size of the largest pairset against the limit, since - // it will be packed last in the order and does not contribute to - // the 64kb limit. + accumulated += accumulated_delta; + unsigned total = accumulated + hb_min (partial_coverage_size, coverage_size); - if (accumulated > (1 << 16)) + if (total >= (1 << 16)) { split_points.push (i); - accumulated = base_size; - visited.clear (); // Pretend node sharing isn't allowed between splits. + accumulated = base_size + accumulated_delta; + partial_coverage_size = 6; + visited.clear (); // node sharing isn't allowed between splits. } } - return do_split (c, this_index, split_points); + split_context_t split_context { + c, + this, + this_index, + }; + + return actuate_subtable_split<split_context_t> (split_context, split_points); } private: - // Split this PairPos into two or more PairPos's. split_points defines - // the indices (first index to include in the new table) to split at. - // Returns the object id's of the newly created PairPos subtables. - hb_vector_t<unsigned> do_split (gsubgpos_graph_context_t& c, - unsigned this_index, - const hb_vector_t<unsigned> split_points) - { - hb_vector_t<unsigned> new_objects; - if (!split_points) - return new_objects; + struct split_context_t { + gsubgpos_graph_context_t& c; + PairPosFormat1* thiz; + unsigned this_index; - for (unsigned i = 0; i < split_points.length; i++) + unsigned original_count () { - unsigned start = split_points[i]; - unsigned end = (i < split_points.length - 1) ? split_points[i + 1] : pairSet.len; - unsigned id = clone_range (c, this_index, start, end); - - if (id == (unsigned) -1) - { - new_objects.reset (); - new_objects.allocated = -1; // mark error - return new_objects; - } - new_objects.push (id); + return thiz->pairSet.len; } - if (!shrink (c, this_index, split_points[0])) + unsigned clone_range (unsigned start, unsigned end) { - new_objects.reset (); - new_objects.allocated = -1; // mark error + return thiz->clone_range (this->c, this->this_index, start, end); } - return new_objects; - } + bool shrink (unsigned count) + { + return thiz->shrink (this->c, this->this_index, count); + } + }; bool shrink (gsubgpos_graph_context_t& c, unsigned this_index, @@ -129,11 +125,12 @@ struct PairPosFormat1 : public OT::Layout::GPOS_impl::PairPosFormat1_3<SmallType pairSet.len = count; c.graph.vertices_[this_index].obj.tail -= (old_count - count) * SmallTypes::size; - unsigned coverage_id = c.graph.index_for_offset (this_index, &coverage); + unsigned coverage_id = c.graph.mutable_index_for_offset (this_index, &coverage); unsigned coverage_size = c.graph.vertices_[coverage_id].table_size (); auto& coverage_v = c.graph.vertices_[coverage_id]; + Coverage* coverage_table = (Coverage*) coverage_v.obj.head; - if (!coverage_table->sanitize (coverage_v)) + if (!coverage_table || !coverage_table->sanitize (coverage_v)) return false; auto new_coverage = @@ -144,7 +141,7 @@ struct PairPosFormat1 : public OT::Layout::GPOS_impl::PairPosFormat1_3<SmallType | hb_map_retains_sorting (hb_first) ; - return make_coverage (c, new_coverage, coverage_id, coverage_size); + return Coverage::make_coverage (c, new_coverage, coverage_id, coverage_size); } // Create a new PairPos including PairSet's from start (inclusive) to end (exclusive). @@ -178,79 +175,431 @@ struct PairPosFormat1 : public OT::Layout::GPOS_impl::PairPosFormat1_3<SmallType } unsigned coverage_id = c.graph.index_for_offset (this_index, &coverage); - unsigned coverage_size = c.graph.vertices_[coverage_id].table_size (); - auto& coverage_v = c.graph.vertices_[coverage_id]; - Coverage* coverage_table = (Coverage*) coverage_v.obj.head; - if (!coverage_table->sanitize (coverage_v)) - return false; + if (!Coverage::clone_coverage (c, + coverage_id, + pair_pos_prime_id, + 2, + start, end)) + return -1; - auto new_coverage = - + hb_zip (coverage_table->iter (), hb_range ()) - | hb_filter ([&] (hb_pair_t<unsigned, unsigned> p) { - return p.second >= start && p.second < end; + return pair_pos_prime_id; + } + + + + unsigned pair_set_graph_index (gsubgpos_graph_context_t& c, unsigned this_index, unsigned i) const + { + return c.graph.index_for_offset (this_index, &pairSet[i]); + } +}; + +struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallTypes> +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + size_t vertex_len = vertex.table_size (); + unsigned min_size = OT::Layout::GPOS_impl::PairPosFormat2_4<SmallTypes>::min_size; + if (vertex_len < min_size) return false; + + const unsigned class1_count = class1Count; + return vertex_len >= + min_size + class1_count * get_class1_record_size (); + } + + hb_vector_t<unsigned> split_subtables (gsubgpos_graph_context_t& c, unsigned this_index) + { + const unsigned base_size = OT::Layout::GPOS_impl::PairPosFormat2_4<SmallTypes>::min_size; + const unsigned class_def_2_size = size_of (c, this_index, &classDef2); + const Coverage* coverage = get_coverage (c, this_index); + const ClassDef* class_def_1 = get_class_def_1 (c, this_index); + auto gid_and_class = + + coverage->iter () + | hb_map_retains_sorting ([&] (hb_codepoint_t gid) { + return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid, class_def_1->get_class (gid)); }) - | hb_map_retains_sorting (hb_first) ; + class_def_size_estimator_t estimator (gid_and_class); + + const unsigned class1_count = class1Count; + const unsigned class2_count = class2Count; + const unsigned class1_record_size = get_class1_record_size (); - unsigned coverage_prime_id = c.graph.new_node (nullptr, nullptr); - auto& coverage_prime_vertex = c.graph.vertices_[coverage_prime_id]; - if (!make_coverage (c, new_coverage, coverage_prime_id, coverage_size)) + const unsigned value_1_len = valueFormat1.get_len (); + const unsigned value_2_len = valueFormat2.get_len (); + const unsigned total_value_len = value_1_len + value_2_len; + + unsigned accumulated = base_size; + unsigned coverage_size = 4; + unsigned class_def_1_size = 4; + unsigned max_coverage_size = coverage_size; + unsigned max_class_def_1_size = class_def_1_size; + + hb_vector_t<unsigned> split_points; + + hb_hashmap_t<unsigned, unsigned> device_tables = get_all_device_tables (c, this_index); + hb_vector_t<unsigned> format1_device_table_indices = valueFormat1.get_device_table_indices (); + hb_vector_t<unsigned> format2_device_table_indices = valueFormat2.get_device_table_indices (); + bool has_device_tables = bool(format1_device_table_indices) || bool(format2_device_table_indices); + + hb_set_t visited; + for (unsigned i = 0; i < class1_count; i++) + { + unsigned accumulated_delta = class1_record_size; + coverage_size += estimator.incremental_coverage_size (i); + class_def_1_size += estimator.incremental_class_def_size (i); + max_coverage_size = hb_max (max_coverage_size, coverage_size); + max_class_def_1_size = hb_max (max_class_def_1_size, class_def_1_size); + + if (has_device_tables) { + for (unsigned j = 0; j < class2_count; j++) + { + unsigned value1_index = total_value_len * (class2_count * i + j); + unsigned value2_index = value1_index + value_1_len; + accumulated_delta += size_of_value_record_children (c, + device_tables, + format1_device_table_indices, + value1_index, + visited); + accumulated_delta += size_of_value_record_children (c, + device_tables, + format2_device_table_indices, + value2_index, + visited); + } + } + + accumulated += accumulated_delta; + unsigned total = accumulated + + coverage_size + class_def_1_size + class_def_2_size + // The largest object will pack last and can exceed the size limit. + - hb_max (hb_max (coverage_size, class_def_1_size), class_def_2_size); + if (total >= (1 << 16)) + { + split_points.push (i); + // split does not include i, so add the size for i when we reset the size counters. + accumulated = base_size + accumulated_delta; + coverage_size = 4 + estimator.incremental_coverage_size (i); + class_def_1_size = 4 + estimator.incremental_class_def_size (i); + visited.clear (); // node sharing isn't allowed between splits. + } + } + + split_context_t split_context { + c, + this, + this_index, + class1_record_size, + total_value_len, + value_1_len, + value_2_len, + max_coverage_size, + max_class_def_1_size, + device_tables, + format1_device_table_indices, + format2_device_table_indices + }; + + return actuate_subtable_split<split_context_t> (split_context, split_points); + } + private: + + struct split_context_t + { + gsubgpos_graph_context_t& c; + PairPosFormat2* thiz; + unsigned this_index; + unsigned class1_record_size; + unsigned value_record_len; + unsigned value1_record_len; + unsigned value2_record_len; + unsigned max_coverage_size; + unsigned max_class_def_size; + + const hb_hashmap_t<unsigned, unsigned>& device_tables; + const hb_vector_t<unsigned>& format1_device_table_indices; + const hb_vector_t<unsigned>& format2_device_table_indices; + + unsigned original_count () + { + return thiz->class1Count; + } + + unsigned clone_range (unsigned start, unsigned end) + { + return thiz->clone_range (*this, start, end); + } + + bool shrink (unsigned count) + { + return thiz->shrink (*this, count); + } + }; + + size_t get_class1_record_size () const + { + const size_t class2_count = class2Count; + return + class2_count * (valueFormat1.get_size () + valueFormat2.get_size ()); + } + + unsigned clone_range (split_context_t& split_context, + unsigned start, unsigned end) const + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + " Cloning PairPosFormat2 (%u) range [%u, %u).", split_context.this_index, start, end); + + graph_t& graph = split_context.c.graph; + + unsigned num_records = end - start; + unsigned prime_size = OT::Layout::GPOS_impl::PairPosFormat2_4<SmallTypes>::min_size + + num_records * split_context.class1_record_size; + + unsigned pair_pos_prime_id = split_context.c.create_node (prime_size); + if (pair_pos_prime_id == (unsigned) -1) return -1; + + PairPosFormat2* pair_pos_prime = + (PairPosFormat2*) graph.object (pair_pos_prime_id).head; + pair_pos_prime->format = this->format; + pair_pos_prime->valueFormat1 = this->valueFormat1; + pair_pos_prime->valueFormat2 = this->valueFormat2; + pair_pos_prime->class1Count = num_records; + pair_pos_prime->class2Count = this->class2Count; + clone_class1_records (split_context, + pair_pos_prime_id, + start, + end); + + unsigned coverage_id = + graph.index_for_offset (split_context.this_index, &coverage); + unsigned class_def_1_id = + graph.index_for_offset (split_context.this_index, &classDef1); + auto& coverage_v = graph.vertices_[coverage_id]; + auto& class_def_1_v = graph.vertices_[class_def_1_id]; + Coverage* coverage_table = (Coverage*) coverage_v.obj.head; + ClassDef* class_def_1_table = (ClassDef*) class_def_1_v.obj.head; + if (!coverage_table + || !coverage_table->sanitize (coverage_v) + || !class_def_1_table + || !class_def_1_table->sanitize (class_def_1_v)) return -1; - auto* coverage_link = c.graph.vertices_[pair_pos_prime_id].obj.real_links.push (); - coverage_link->width = SmallTypes::size; - coverage_link->objidx = coverage_prime_id; - coverage_link->position = 2; - coverage_prime_vertex.parents.push (pair_pos_prime_id); + auto klass_map = + + coverage_table->iter () + | hb_map_retains_sorting ([&] (hb_codepoint_t gid) { + return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid, class_def_1_table->get_class (gid)); + }) + | hb_filter ([&] (hb_codepoint_t klass) { + return klass >= start && klass < end; + }, hb_second) + | hb_map_retains_sorting ([&] (hb_pair_t<hb_codepoint_t, hb_codepoint_t> gid_and_class) { + // Classes must be from 0...N so subtract start + return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid_and_class.first, gid_and_class.second - start); + }) + ; + + if (!Coverage::add_coverage (split_context.c, + pair_pos_prime_id, + 2, + + klass_map | hb_map_retains_sorting (hb_first), + split_context.max_coverage_size)) + return -1; + + // classDef1 + if (!ClassDef::add_class_def (split_context.c, + pair_pos_prime_id, + 8, + + klass_map, + split_context.max_class_def_size)) + return -1; + + // classDef2 + unsigned class_def_2_id = + graph.index_for_offset (split_context.this_index, &classDef2); + auto* class_def_link = graph.vertices_[pair_pos_prime_id].obj.real_links.push (); + class_def_link->width = SmallTypes::size; + class_def_link->objidx = class_def_2_id; + class_def_link->position = 10; + graph.vertices_[class_def_2_id].parents.push (pair_pos_prime_id); + graph.duplicate (pair_pos_prime_id, class_def_2_id); return pair_pos_prime_id; } - template<typename It> - bool make_coverage (gsubgpos_graph_context_t& c, - It glyphs, - unsigned dest_obj, - unsigned max_size) const + void clone_class1_records (split_context_t& split_context, + unsigned pair_pos_prime_id, + unsigned start, unsigned end) const { - char* buffer = (char*) hb_calloc (1, max_size); - hb_serialize_context_t serializer (buffer, max_size); - Coverage_serialize (&serializer, glyphs); - serializer.end_serialize (); - if (serializer.in_error ()) + PairPosFormat2* pair_pos_prime = + (PairPosFormat2*) split_context.c.graph.object (pair_pos_prime_id).head; + + char* start_addr = ((char*)&values[0]) + start * split_context.class1_record_size; + unsigned num_records = end - start; + memcpy (&pair_pos_prime->values[0], + start_addr, + num_records * split_context.class1_record_size); + + if (!split_context.format1_device_table_indices + && !split_context.format2_device_table_indices) + // No device tables to move over. + return; + + unsigned class2_count = class2Count; + for (unsigned i = start; i < end; i++) { - hb_free (buffer); - return false; + for (unsigned j = 0; j < class2_count; j++) + { + unsigned value1_index = split_context.value_record_len * (class2_count * i + j); + unsigned value2_index = value1_index + split_context.value1_record_len; + + unsigned new_value1_index = split_context.value_record_len * (class2_count * (i - start) + j); + unsigned new_value2_index = new_value1_index + split_context.value1_record_len; + + transfer_device_tables (split_context, + pair_pos_prime_id, + split_context.format1_device_table_indices, + value1_index, + new_value1_index); + + transfer_device_tables (split_context, + pair_pos_prime_id, + split_context.format2_device_table_indices, + value2_index, + new_value2_index); + } } + } - hb_bytes_t coverage_copy = serializer.copy_bytes (); - c.add_buffer ((char *) coverage_copy.arrayZ); // Give ownership to the context, it will cleanup the buffer. + void transfer_device_tables (split_context_t& split_context, + unsigned pair_pos_prime_id, + const hb_vector_t<unsigned>& device_table_indices, + unsigned old_value_record_index, + unsigned new_value_record_index) const + { + PairPosFormat2* pair_pos_prime = + (PairPosFormat2*) split_context.c.graph.object (pair_pos_prime_id).head; - auto& obj = c.graph.vertices_[dest_obj].obj; - obj.head = (char *) coverage_copy.arrayZ; - obj.tail = obj.head + coverage_copy.length; + for (unsigned i : device_table_indices) + { + OT::Offset16* record = (OT::Offset16*) &values[old_value_record_index + i]; + unsigned record_position = ((char*) record) - ((char*) this); + if (!split_context.device_tables.has (record_position)) continue; + + split_context.c.graph.move_child ( + split_context.this_index, + record, + pair_pos_prime_id, + (OT::Offset16*) &pair_pos_prime->values[new_value_record_index + i]); + } + } - hb_free (buffer); - return true; + bool shrink (split_context_t& split_context, + unsigned count) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + " Shrinking PairPosFormat2 (%u) to [0, %u).", + split_context.this_index, + count); + unsigned old_count = class1Count; + if (count >= old_count) + return true; + + graph_t& graph = split_context.c.graph; + class1Count = count; + graph.vertices_[split_context.this_index].obj.tail -= + (old_count - count) * split_context.class1_record_size; + + unsigned coverage_id = + graph.mutable_index_for_offset (split_context.this_index, &coverage); + unsigned class_def_1_id = + graph.mutable_index_for_offset (split_context.this_index, &classDef1); + auto& coverage_v = graph.vertices_[coverage_id]; + auto& class_def_1_v = graph.vertices_[class_def_1_id]; + Coverage* coverage_table = (Coverage*) coverage_v.obj.head; + ClassDef* class_def_1_table = (ClassDef*) class_def_1_v.obj.head; + if (!coverage_table + || !coverage_table->sanitize (coverage_v) + || !class_def_1_table + || !class_def_1_table->sanitize (class_def_1_v)) + return false; + + auto klass_map = + + coverage_table->iter () + | hb_map_retains_sorting ([&] (hb_codepoint_t gid) { + return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (gid, class_def_1_table->get_class (gid)); + }) + | hb_filter ([&] (hb_codepoint_t klass) { + return klass < count; + }, hb_second) + ; + + if (!Coverage::make_coverage (split_context.c, + + klass_map | hb_map_retains_sorting (hb_first), + coverage_id, + coverage_v.table_size ())) + return false; + + return ClassDef::make_class_def (split_context.c, + + klass_map, + class_def_1_id, + class_def_1_v.table_size ()); } - unsigned pair_set_graph_index (gsubgpos_graph_context_t& c, unsigned this_index, unsigned i) const + hb_hashmap_t<unsigned, unsigned> + get_all_device_tables (gsubgpos_graph_context_t& c, + unsigned this_index) const { - return c.graph.index_for_offset (this_index, &pairSet[i]); + const auto& v = c.graph.vertices_[this_index]; + return v.position_to_index_map (); } -}; -struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallTypes> -{ - bool sanitize (graph_t::vertex_t& vertex) const + const Coverage* get_coverage (gsubgpos_graph_context_t& c, + unsigned this_index) const { - // TODO(garretrieger): implement me! - return true; + unsigned coverage_id = c.graph.index_for_offset (this_index, &coverage); + auto& coverage_v = c.graph.vertices_[coverage_id]; + + Coverage* coverage_table = (Coverage*) coverage_v.obj.head; + if (!coverage_table || !coverage_table->sanitize (coverage_v)) + return &Null(Coverage); + return coverage_table; } - hb_vector_t<unsigned> split_subtables (gsubgpos_graph_context_t& c, unsigned this_index) + const ClassDef* get_class_def_1 (gsubgpos_graph_context_t& c, + unsigned this_index) const + { + unsigned class_def_1_id = c.graph.index_for_offset (this_index, &classDef1); + auto& class_def_1_v = c.graph.vertices_[class_def_1_id]; + + ClassDef* class_def_1_table = (ClassDef*) class_def_1_v.obj.head; + if (!class_def_1_table || !class_def_1_table->sanitize (class_def_1_v)) + return &Null(ClassDef); + return class_def_1_table; + } + + unsigned size_of_value_record_children (gsubgpos_graph_context_t& c, + const hb_hashmap_t<unsigned, unsigned>& device_tables, + const hb_vector_t<unsigned> device_table_indices, + unsigned value_record_index, + hb_set_t& visited) + { + unsigned size = 0; + for (unsigned i : device_table_indices) + { + OT::Layout::GPOS_impl::Value* record = &values[value_record_index + i]; + unsigned record_position = ((char*) record) - ((char*) this); + unsigned* obj_idx; + if (!device_tables.has (record_position, &obj_idx)) continue; + size += c.graph.find_subgraph_size (*obj_idx, visited); + } + return size; + } + + unsigned size_of (gsubgpos_graph_context_t& c, + unsigned this_index, + const void* offset) const { - // TODO(garretrieger): implement me! - return hb_vector_t<unsigned> (); + const unsigned id = c.graph.index_for_offset (this_index, offset); + return c.graph.vertices_[id].table_size (); } }; diff --git a/thirdparty/harfbuzz/src/graph/split-helpers.hh b/thirdparty/harfbuzz/src/graph/split-helpers.hh new file mode 100644 index 0000000000..61fd7c2d2f --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/split-helpers.hh @@ -0,0 +1,69 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#ifndef GRAPH_SPLIT_HELPERS_HH +#define GRAPH_SPLIT_HELPERS_HH + +namespace graph { + +template<typename Context> +HB_INTERNAL +hb_vector_t<unsigned> actuate_subtable_split (Context& split_context, + const hb_vector_t<unsigned>& split_points) +{ + hb_vector_t<unsigned> new_objects; + if (!split_points) + return new_objects; + + for (unsigned i = 0; i < split_points.length; i++) + { + unsigned start = split_points[i]; + unsigned end = (i < split_points.length - 1) + ? split_points[i + 1] + : split_context.original_count (); + unsigned id = split_context.clone_range (start, end); + + if (id == (unsigned) -1) + { + new_objects.reset (); + new_objects.allocated = -1; // mark error + return new_objects; + } + new_objects.push (id); + } + + if (!split_context.shrink (split_points[0])) + { + new_objects.reset (); + new_objects.allocated = -1; // mark error + } + + return new_objects; +} + +} + +#endif // GRAPH_SPLIT_HELPERS_HH diff --git a/thirdparty/harfbuzz/src/graph/test-classdef-graph.cc b/thirdparty/harfbuzz/src/graph/test-classdef-graph.cc new file mode 100644 index 0000000000..55854ff5c2 --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/test-classdef-graph.cc @@ -0,0 +1,119 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#include "gsubgpos-context.hh" +#include "classdef-graph.hh" + +typedef hb_pair_t<hb_codepoint_t, hb_codepoint_t> gid_and_class_t; +typedef hb_vector_t<gid_and_class_t> gid_and_class_list_t; + + +static bool incremental_size_is (const gid_and_class_list_t& list, unsigned klass, + unsigned cov_expected, unsigned class_def_expected) +{ + graph::class_def_size_estimator_t estimator (list.iter ()); + + unsigned result = estimator.incremental_coverage_size (klass); + if (result != cov_expected) + { + printf ("FAIL: coverage expected size %u but was %u\n", cov_expected, result); + return false; + } + + result = estimator.incremental_class_def_size (klass); + if (result != class_def_expected) + { + printf ("FAIL: class def expected size %u but was %u\n", class_def_expected, result); + return false; + } + + return true; +} + +static void test_class_and_coverage_size_estimates () +{ + gid_and_class_list_t empty = { + }; + assert (incremental_size_is (empty, 0, 0, 0)); + assert (incremental_size_is (empty, 1, 0, 0)); + + gid_and_class_list_t class_zero = { + {5, 0}, + }; + assert (incremental_size_is (class_zero, 0, 2, 0)); + + gid_and_class_list_t consecutive = { + {4, 0}, + {5, 0}, + {6, 1}, + {7, 1}, + {8, 2}, + {9, 2}, + {10, 2}, + {11, 2}, + }; + assert (incremental_size_is (consecutive, 0, 4, 0)); + assert (incremental_size_is (consecutive, 1, 4, 4)); + assert (incremental_size_is (consecutive, 2, 8, 6)); + + gid_and_class_list_t non_consecutive = { + {4, 0}, + {5, 0}, + + {6, 1}, + {7, 1}, + + {9, 2}, + {10, 2}, + {11, 2}, + {12, 2}, + }; + assert (incremental_size_is (non_consecutive, 0, 4, 0)); + assert (incremental_size_is (non_consecutive, 1, 4, 6)); + assert (incremental_size_is (non_consecutive, 2, 8, 6)); + + gid_and_class_list_t multiple_ranges = { + {4, 0}, + {5, 0}, + + {6, 1}, + {7, 1}, + + {9, 1}, + + {11, 1}, + {12, 1}, + {13, 1}, + }; + assert (incremental_size_is (multiple_ranges, 0, 4, 0)); + assert (incremental_size_is (multiple_ranges, 1, 2 * 6, 3 * 6)); +} + +int +main (int argc, char **argv) +{ + test_class_and_coverage_size_estimates (); +} diff --git a/thirdparty/harfbuzz/src/hb-array.hh b/thirdparty/harfbuzz/src/hb-array.hh index 826a901819..5884007c19 100644 --- a/thirdparty/harfbuzz/src/hb-array.hh +++ b/thirdparty/harfbuzz/src/hb-array.hh @@ -342,7 +342,7 @@ struct hb_sorted_array_t : unsigned int i; return bfind (x, &i) ? &this->arrayZ[i] : not_found; } - template <typename T, typename ...Ts> + template <typename T> const Type *bsearch (const T &x, const Type *not_found = nullptr) const { unsigned int i; @@ -389,7 +389,7 @@ struct hb_sorted_array_t : this->length, sizeof (Type), _hb_cmp_method<T, Type, Ts...>, - ds...); + std::forward<Ts> (ds)...); } }; template <typename T> inline hb_sorted_array_t<T> diff --git a/thirdparty/harfbuzz/src/hb-atomic.hh b/thirdparty/harfbuzz/src/hb-atomic.hh index d6dfb0f57a..14c6fb3264 100644 --- a/thirdparty/harfbuzz/src/hb-atomic.hh +++ b/thirdparty/harfbuzz/src/hb-atomic.hh @@ -159,10 +159,13 @@ struct hb_atomic_int_t hb_atomic_int_t () = default; constexpr hb_atomic_int_t (int v) : v (v) {} + hb_atomic_int_t& operator = (int v_) { set_relaxed (v_); return *this; } + operator int () const { return get_relaxed (); } + void set_relaxed (int v_) { hb_atomic_int_impl_set_relaxed (&v, v_); } - void set (int v_) { hb_atomic_int_impl_set (&v, v_); } + void set_release (int v_) { hb_atomic_int_impl_set (&v, v_); } int get_relaxed () const { return hb_atomic_int_impl_get_relaxed (&v); } - int get () const { return hb_atomic_int_impl_get (&v); } + int get_acquire () const { return hb_atomic_int_impl_get (&v); } int inc () { return hb_atomic_int_impl_add (&v, 1); } int dec () { return hb_atomic_int_impl_add (&v, -1); } @@ -180,11 +183,11 @@ struct hb_atomic_ptr_t void init (T* v_ = nullptr) { set_relaxed (v_); } void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); } T *get_relaxed () const { return (T *) hb_atomic_ptr_impl_get_relaxed (&v); } - T *get () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); } + T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); } bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); } - T * operator -> () const { return get (); } - template <typename C> operator C * () const { return get (); } + T * operator -> () const { return get_acquire (); } + template <typename C> operator C * () const { return get_acquire (); } T *v = nullptr; }; diff --git a/thirdparty/harfbuzz/src/hb-bit-set.hh b/thirdparty/harfbuzz/src/hb-bit-set.hh index 4765af67ce..a63887efda 100644 --- a/thirdparty/harfbuzz/src/hb-bit-set.hh +++ b/thirdparty/harfbuzz/src/hb-bit-set.hh @@ -56,7 +56,7 @@ struct hb_bit_set_t { successful = true; population = 0; - last_page_lookup.set_relaxed (0); + last_page_lookup = 0; page_map.init (); pages.init (); } @@ -614,7 +614,7 @@ struct hb_bit_set_t const auto* page_map_array = page_map.arrayZ; unsigned int major = get_major (*codepoint); - unsigned int i = last_page_lookup.get_relaxed (); + unsigned int i = last_page_lookup; if (unlikely (i >= page_map.length || page_map_array[i].major != major)) { @@ -632,7 +632,7 @@ struct hb_bit_set_t if (pages_array[current.index].next (codepoint)) { *codepoint += current.major * page_t::PAGE_BITS; - last_page_lookup.set_relaxed (i); + last_page_lookup = i; return true; } i++; @@ -645,11 +645,11 @@ struct hb_bit_set_t if (m != INVALID) { *codepoint = current.major * page_t::PAGE_BITS + m; - last_page_lookup.set_relaxed (i); + last_page_lookup = i; return true; } } - last_page_lookup.set_relaxed (0); + last_page_lookup = 0; *codepoint = INVALID; return false; } @@ -732,7 +732,7 @@ struct hb_bit_set_t { const auto* page_map_array = page_map.arrayZ; unsigned int major = get_major (codepoint); - unsigned int i = last_page_lookup.get_relaxed (); + unsigned int i = last_page_lookup; if (unlikely (i >= page_map.length || page_map_array[i].major != major)) { page_map.bfind (major, &i, HB_NOT_FOUND_STORE_CLOSEST); @@ -773,7 +773,7 @@ struct hb_bit_set_t { const auto* page_map_array = page_map.arrayZ; unsigned int major = get_major (codepoint); - unsigned int i = last_page_lookup.get_relaxed (); + unsigned int i = last_page_lookup; if (unlikely (i >= page_map.length || page_map_array[i].major != major)) { page_map.bfind(major, &i, HB_NOT_FOUND_STORE_CLOSEST); @@ -900,7 +900,7 @@ struct hb_bit_set_t /* The extra page_map length is necessary; can't just rely on vector here, * since the next check would be tricked because a null page also has * major==0, which we can't distinguish from an actualy major==0 page... */ - unsigned i = last_page_lookup.get_relaxed (); + unsigned i = last_page_lookup; if (likely (i < page_map.length)) { auto &cached_page = page_map.arrayZ[i]; @@ -924,7 +924,7 @@ struct hb_bit_set_t page_map[i] = map; } - last_page_lookup.set_relaxed (i); + last_page_lookup = i; return &pages[page_map[i].index]; } const page_t *page_for (hb_codepoint_t g) const @@ -934,7 +934,7 @@ struct hb_bit_set_t /* The extra page_map length is necessary; can't just rely on vector here, * since the next check would be tricked because a null page also has * major==0, which we can't distinguish from an actualy major==0 page... */ - unsigned i = last_page_lookup.get_relaxed (); + unsigned i = last_page_lookup; if (likely (i < page_map.length)) { auto &cached_page = page_map.arrayZ[i]; @@ -946,7 +946,7 @@ struct hb_bit_set_t if (!page_map.bfind (key, &i)) return nullptr; - last_page_lookup.set_relaxed (i); + last_page_lookup = i; return &pages[page_map[i].index]; } page_t &page_at (unsigned int i) { return pages[page_map[i].index]; } diff --git a/thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh b/thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh index 44c802a00c..87095855d6 100644 --- a/thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh +++ b/thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh @@ -32,7 +32,7 @@ #include "hb.hh" -#line 33 "hb-buffer-deserialize-json.hh" +#line 36 "hb-buffer-deserialize-json.hh" static const unsigned char _deserialize_json_trans_keys[] = { 0u, 0u, 9u, 123u, 9u, 34u, 97u, 117u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, @@ -557,12 +557,12 @@ _hb_buffer_deserialize_json (hb_buffer_t *buffer, hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; -#line 554 "hb-buffer-deserialize-json.hh" +#line 561 "hb-buffer-deserialize-json.hh" { cs = deserialize_json_start; } -#line 557 "hb-buffer-deserialize-json.hh" +#line 566 "hb-buffer-deserialize-json.hh" { int _slen; int _trans; @@ -774,7 +774,7 @@ _resume: *end_ptr = p; } break; -#line 735 "hb-buffer-deserialize-json.hh" +#line 778 "hb-buffer-deserialize-json.hh" } _again: diff --git a/thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh b/thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh index 8fbcdcc18c..9062610de2 100644 --- a/thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh +++ b/thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh @@ -32,7 +32,7 @@ #include "hb.hh" -#line 33 "hb-buffer-deserialize-text.hh" +#line 36 "hb-buffer-deserialize-text.hh" static const unsigned char _deserialize_text_trans_keys[] = { 0u, 0u, 9u, 91u, 85u, 85u, 43u, 43u, 48u, 102u, 9u, 85u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, @@ -509,12 +509,12 @@ _hb_buffer_deserialize_text (hb_buffer_t *buffer, hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; -#line 506 "hb-buffer-deserialize-text.hh" +#line 513 "hb-buffer-deserialize-text.hh" { cs = deserialize_text_start; } -#line 509 "hb-buffer-deserialize-text.hh" +#line 518 "hb-buffer-deserialize-text.hh" { int _slen; int _trans; @@ -894,7 +894,7 @@ _resume: *end_ptr = p; } break; -#line 826 "hb-buffer-deserialize-text.hh" +#line 898 "hb-buffer-deserialize-text.hh" } _again: @@ -1043,7 +1043,7 @@ _again: *end_ptr = p; } break; -#line 953 "hb-buffer-deserialize-text.hh" +#line 1047 "hb-buffer-deserialize-text.hh" } } diff --git a/thirdparty/harfbuzz/src/hb-buffer.h b/thirdparty/harfbuzz/src/hb-buffer.h index c6af759fb9..8c17489835 100644 --- a/thirdparty/harfbuzz/src/hb-buffer.h +++ b/thirdparty/harfbuzz/src/hb-buffer.h @@ -145,7 +145,7 @@ typedef struct hb_glyph_info_t { * @HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL: In scripts that use elongation (Arabic, Mongolian, Syriac, etc.), this flag signifies that it is safe to insert a U+0640 TATWEEL - character *before* this cluster for elongation. + character before this cluster for elongation. This flag does not determine the script-specific elongation places, but only when it is safe to do the elongation without diff --git a/thirdparty/harfbuzz/src/hb-cache.hh b/thirdparty/harfbuzz/src/hb-cache.hh index d6b229ed65..897f313fbd 100644 --- a/thirdparty/harfbuzz/src/hb-cache.hh +++ b/thirdparty/harfbuzz/src/hb-cache.hh @@ -32,12 +32,21 @@ /* Implements a lockfree cache for int->int functions. */ -template <unsigned int key_bits=16, unsigned int value_bits=8 + 32 - key_bits, unsigned int cache_bits=8> +template <unsigned int key_bits=16, + unsigned int value_bits=8 + 32 - key_bits, + unsigned int cache_bits=8, + bool thread_safe=true> struct hb_cache_t { + using item_t = typename std::conditional<thread_safe, + hb_atomic_int_t, + typename std::conditional<key_bits + value_bits - cache_bits <= 16, + short, + int>::type + >::type; + static_assert ((key_bits >= cache_bits), ""); - static_assert ((key_bits + value_bits - cache_bits <= 8 * sizeof (hb_atomic_int_t)), ""); - static_assert (sizeof (hb_atomic_int_t) == sizeof (unsigned int), ""); + static_assert ((key_bits + value_bits - cache_bits <= 8 * sizeof (item_t)), ""); void init () { clear (); } void fini () {} @@ -45,14 +54,14 @@ struct hb_cache_t void clear () { for (unsigned i = 0; i < ARRAY_LENGTH (values); i++) - values[i].set_relaxed (-1); + values[i] = -1; } bool get (unsigned int key, unsigned int *value) const { unsigned int k = key & ((1u<<cache_bits)-1); - unsigned int v = values[k].get_relaxed (); - if ((key_bits + value_bits - cache_bits == 8 * sizeof (hb_atomic_int_t) && v == (unsigned int) -1) || + unsigned int v = values[k]; + if ((key_bits + value_bits - cache_bits == 8 * sizeof (item_t) && v == (unsigned int) -1) || (v >> value_bits) != (key >> cache_bits)) return false; *value = v & ((1u<<value_bits)-1); @@ -65,16 +74,13 @@ struct hb_cache_t return false; /* Overflows */ unsigned int k = key & ((1u<<cache_bits)-1); unsigned int v = ((key>>cache_bits)<<value_bits) | value; - values[k].set_relaxed (v); + values[k] = v; return true; } private: - hb_atomic_int_t values[1u<<cache_bits]; + item_t values[1u<<cache_bits]; }; -typedef hb_cache_t<21, 16, 8> hb_cmap_cache_t; -typedef hb_cache_t<16, 24, 8> hb_advance_cache_t; - #endif /* HB_CACHE_HH */ diff --git a/thirdparty/harfbuzz/src/hb-common.cc b/thirdparty/harfbuzz/src/hb-common.cc index e6512872e8..bbb6cd552b 100644 --- a/thirdparty/harfbuzz/src/hb-common.cc +++ b/thirdparty/harfbuzz/src/hb-common.cc @@ -99,7 +99,7 @@ _hb_options_init () } /* This is idempotent and threadsafe. */ - _hb_options.set_relaxed (u.i); + _hb_options = u.i; } diff --git a/thirdparty/harfbuzz/src/hb-common.h b/thirdparty/harfbuzz/src/hb-common.h index 7c7ad87c7c..e92feb9898 100644 --- a/thirdparty/harfbuzz/src/hb-common.h +++ b/thirdparty/harfbuzz/src/hb-common.h @@ -495,6 +495,8 @@ hb_language_matches (hb_language_t language, * @HB_SCRIPT_TOTO: `Toto`, Since: 3.0.0 * @HB_SCRIPT_VITHKUQI: `Vith`, Since: 3.0.0 * @HB_SCRIPT_MATH: `Zmth`, Since: 3.4.0 + * @HB_SCRIPT_KAWI: `Kawi`, Since: 5.2.0 + * @HB_SCRIPT_NAG_MUNDARI: `Nagm`, Since: 5.2.0 * @HB_SCRIPT_INVALID: No script set * * Data type for scripts. Each #hb_script_t's value is an #hb_tag_t corresponding @@ -716,6 +718,12 @@ typedef enum */ HB_SCRIPT_MATH = HB_TAG ('Z','m','t','h'), + /* + * Since 5.2.0 + */ + HB_SCRIPT_KAWI = HB_TAG ('K','a','w','i'), /*15.0*/ + HB_SCRIPT_NAG_MUNDARI = HB_TAG ('N','a','g','m'), /*15.0*/ + /* No script set. */ HB_SCRIPT_INVALID = HB_TAG_NONE, diff --git a/thirdparty/harfbuzz/src/hb-config.hh b/thirdparty/harfbuzz/src/hb-config.hh index db8ec0e908..5567ddaec3 100644 --- a/thirdparty/harfbuzz/src/hb-config.hh +++ b/thirdparty/harfbuzz/src/hb-config.hh @@ -35,6 +35,9 @@ #include "config.h" #endif +#ifndef HB_BORING_EXPANSION +#define HB_NO_BORING_EXPANSION +#endif #ifdef HB_TINY #define HB_LEAN diff --git a/thirdparty/harfbuzz/src/hb-debug.hh b/thirdparty/harfbuzz/src/hb-debug.hh index 905a46a087..cbe13e5214 100644 --- a/thirdparty/harfbuzz/src/hb-debug.hh +++ b/thirdparty/harfbuzz/src/hb-debug.hh @@ -67,12 +67,12 @@ hb_options () #endif /* Make a local copy, so we can access bitfield threadsafely. */ hb_options_union_t u; - u.i = _hb_options.get_relaxed (); + u.i = _hb_options; if (unlikely (!u.i)) { _hb_options_init (); - u.i = _hb_options.get_relaxed (); + u.i = _hb_options; } return u.opts; diff --git a/thirdparty/harfbuzz/src/hb-face.cc b/thirdparty/harfbuzz/src/hb-face.cc index 61adbdd503..2160d6a010 100644 --- a/thirdparty/harfbuzz/src/hb-face.cc +++ b/thirdparty/harfbuzz/src/hb-face.cc @@ -132,7 +132,7 @@ hb_face_create_for_tables (hb_reference_table_func_t reference_table_func, face->user_data = user_data; face->destroy = destroy; - face->num_glyphs.set_relaxed (-1); + face->num_glyphs = -1; face->data.init0 (face); face->table.init0 (face); @@ -479,7 +479,7 @@ hb_face_set_upem (hb_face_t *face, if (hb_object_is_immutable (face)) return; - face->upem.set_relaxed (upem); + face->upem = upem; } /** @@ -514,7 +514,7 @@ hb_face_set_glyph_count (hb_face_t *face, if (hb_object_is_immutable (face)) return; - face->num_glyphs.set_relaxed (glyph_count); + face->num_glyphs = glyph_count; } /** diff --git a/thirdparty/harfbuzz/src/hb-face.hh b/thirdparty/harfbuzz/src/hb-face.hh index 765f272858..12e10d01e0 100644 --- a/thirdparty/harfbuzz/src/hb-face.hh +++ b/thirdparty/harfbuzz/src/hb-face.hh @@ -83,7 +83,7 @@ struct hb_face_t unsigned int get_upem () const { - unsigned int ret = upem.get_relaxed (); + unsigned int ret = upem; if (unlikely (!ret)) { return load_upem (); @@ -93,7 +93,7 @@ struct hb_face_t unsigned int get_num_glyphs () const { - unsigned int ret = num_glyphs.get_relaxed (); + unsigned int ret = num_glyphs; if (unlikely (ret == UINT_MAX)) return load_num_glyphs (); return ret; diff --git a/thirdparty/harfbuzz/src/hb-ft.cc b/thirdparty/harfbuzz/src/hb-ft.cc index ef073475cb..bcc1dd080f 100644 --- a/thirdparty/harfbuzz/src/hb-ft.cc +++ b/thirdparty/harfbuzz/src/hb-ft.cc @@ -80,16 +80,19 @@ */ +using hb_ft_advance_cache_t = hb_cache_t<16, 24, 8, false>; + struct hb_ft_font_t { int load_flags; bool symbol; /* Whether selected cmap is symbol cmap. */ bool unref; /* Whether to destroy ft_face when done. */ + bool transform; /* Whether to apply FT_Face's transform. */ mutable hb_mutex_t lock; FT_Face ft_face; mutable unsigned cached_serial; - mutable hb_advance_cache_t advance_cache; + mutable hb_ft_advance_cache_t advance_cache; }; static hb_ft_font_t * @@ -136,6 +139,8 @@ _hb_ft_font_destroy (void *data) /* hb_font changed, update FT_Face. */ static void _hb_ft_hb_font_changed (hb_font_t *font, FT_Face ft_face) { + hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data; + float x_mult = 1.f, y_mult = 1.f; if (font->x_scale < 0) x_mult = -x_mult; @@ -173,6 +178,7 @@ static void _hb_ft_hb_font_changed (hb_font_t *font, FT_Face ft_face) FT_Matrix matrix = { (int) roundf (x_mult * (1<<16)), 0, 0, (int) roundf (y_mult * (1<<16))}; FT_Set_Transform (ft_face, &matrix, nullptr); + ft_font->transform = true; } #if defined(HAVE_FT_GET_VAR_BLEND_COORDINATES) && !defined(HB_NO_VAR) @@ -428,13 +434,19 @@ hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data, hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; int load_flags = ft_font->load_flags; + float x_mult; #ifdef HAVE_FT_GET_TRANSFORM - FT_Matrix matrix; - FT_Get_Transform (ft_face, &matrix, nullptr); - float mult = matrix.xx / 65536.f; -#else - float mult = font->x_scale < 0 ? -1 : +1; + if (ft_font->transform) + { + FT_Matrix matrix; + FT_Get_Transform (ft_face, &matrix, nullptr); + x_mult = sqrtf ((float)matrix.xx * matrix.xx + (float)matrix.xy * matrix.xy) / 65536.f; + } + else #endif + { + x_mult = font->x_scale < 0 ? -1 : +1; + } for (unsigned int i = 0; i < count; i++) { @@ -450,7 +462,7 @@ hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data, ft_font->advance_cache.set (glyph, v); } - *first_advance = (int) (v * mult + (1<<9)) >> 10; + *first_advance = (int) (v * x_mult + (1<<9)) >> 10; first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride); first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride); } @@ -466,13 +478,19 @@ hb_ft_get_glyph_v_advance (hb_font_t *font, const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; hb_lock_t lock (ft_font->lock); FT_Fixed v; + float y_mult; #ifdef HAVE_FT_GET_TRANSFORM - FT_Matrix matrix; - FT_Get_Transform (ft_font->ft_face, &matrix, nullptr); - float y_mult = matrix.yy / 65536.f; -#else - float y_mult = font->y_scale < 0 ? -1 : +1; + if (ft_font->transform) + { + FT_Matrix matrix; + FT_Get_Transform (ft_font->ft_face, &matrix, nullptr); + y_mult = sqrtf ((float)matrix.yx * matrix.yx + (float)matrix.yy * matrix.yy) / 65536.f; + } + else #endif + { + y_mult = font->y_scale < 0 ? -1 : +1; + } if (unlikely (FT_Get_Advance (ft_font->ft_face, glyph, ft_font->load_flags | FT_LOAD_VERTICAL_LAYOUT, &v))) return 0; @@ -498,15 +516,21 @@ hb_ft_get_glyph_v_origin (hb_font_t *font, const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; + float x_mult, y_mult; #ifdef HAVE_FT_GET_TRANSFORM - FT_Matrix matrix; - FT_Get_Transform (ft_face, &matrix, nullptr); - float x_mult = matrix.xx / 65536.f; - float y_mult = matrix.yy / 65536.f; -#else - float x_mult = font->x_scale < 0 ? -1 : +1; - float y_mult = font->y_scale < 0 ? -1 : +1; + if (ft_font->transform) + { + FT_Matrix matrix; + FT_Get_Transform (ft_face, &matrix, nullptr); + x_mult = sqrtf ((float)matrix.xx * matrix.xx + (float)matrix.xy * matrix.xy) / 65536.f; + y_mult = sqrtf ((float)matrix.yx * matrix.yx + (float)matrix.yy * matrix.yy) / 65536.f; + } + else #endif + { + x_mult = font->x_scale < 0 ? -1 : +1; + y_mult = font->y_scale < 0 ? -1 : +1; + } if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags))) return false; @@ -553,15 +577,21 @@ hb_ft_get_glyph_extents (hb_font_t *font, const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; + float x_mult, y_mult; #ifdef HAVE_FT_GET_TRANSFORM - FT_Matrix matrix; - FT_Get_Transform (ft_face, &matrix, nullptr); - float x_mult = matrix.xx / 65536.f; - float y_mult = matrix.yy / 65536.f; -#else - float x_mult = font->x_scale < 0 ? -1 : +1; - float y_mult = font->y_scale < 0 ? -1 : +1; + if (ft_font->transform) + { + FT_Matrix matrix; + FT_Get_Transform (ft_face, &matrix, nullptr); + x_mult = sqrtf ((float)matrix.xx * matrix.xx + (float)matrix.xy * matrix.xy) / 65536.f; + y_mult = sqrtf ((float)matrix.yx * matrix.yx + (float)matrix.yy * matrix.yy) / 65536.f; + } + else #endif + { + x_mult = font->x_scale < 0 ? -1 : +1; + y_mult = font->y_scale < 0 ? -1 : +1; + } if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags))) return false; @@ -663,13 +693,19 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED, const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; + float y_mult; #ifdef HAVE_FT_GET_TRANSFORM - FT_Matrix matrix; - FT_Get_Transform (ft_face, &matrix, nullptr); - float y_mult = matrix.yy / 65536.f; -#else - float y_mult = font->y_scale < 0 ? -1 : +1; + if (ft_font->transform) + { + FT_Matrix matrix; + FT_Get_Transform (ft_face, &matrix, nullptr); + y_mult = sqrtf ((float)matrix.yx * matrix.yx + (float)matrix.yy * matrix.yy) / 65536.f; + } + else #endif + { + y_mult = font->y_scale < 0 ? -1 : +1; + } if (ft_face->units_per_EM != 0) { @@ -1233,13 +1269,14 @@ hb_ft_font_set_funcs (hb_font_t *font) if (FT_Select_Charmap (ft_face, FT_ENCODING_MS_SYMBOL)) FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE); - _hb_ft_hb_font_changed (font, ft_face); ft_face->generic.data = blob; ft_face->generic.finalizer = (FT_Generic_Finalizer) _release_blob; _hb_ft_font_set_funcs (font, ft_face, true); hb_ft_font_set_load_flags (font, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING); + + _hb_ft_hb_font_changed (font, ft_face); } diff --git a/thirdparty/harfbuzz/src/hb-machinery.hh b/thirdparty/harfbuzz/src/hb-machinery.hh index ff2a99f5ed..2571f22e15 100644 --- a/thirdparty/harfbuzz/src/hb-machinery.hh +++ b/thirdparty/harfbuzz/src/hb-machinery.hh @@ -176,12 +176,12 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData> void init0 () {} /* Init, when memory is already set to 0. No-op for us. */ void init () { instance.set_relaxed (nullptr); } - void fini () { do_destroy (instance.get ()); init (); } + void fini () { do_destroy (instance.get_acquire ()); init (); } void free_instance () { retry: - Stored *p = instance.get (); + Stored *p = instance.get_acquire (); if (unlikely (p && !cmpexch (p, nullptr))) goto retry; do_destroy (p); @@ -203,7 +203,7 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData> Stored * get_stored () const { retry: - Stored *p = this->instance.get (); + Stored *p = this->instance.get_acquire (); if (unlikely (!p)) { if (unlikely (this->is_inert ())) diff --git a/thirdparty/harfbuzz/src/hb-object.hh b/thirdparty/harfbuzz/src/hb-object.hh index f6c7a56991..9876c2923c 100644 --- a/thirdparty/harfbuzz/src/hb-object.hh +++ b/thirdparty/harfbuzz/src/hb-object.hh @@ -144,14 +144,14 @@ struct hb_reference_count_t { mutable hb_atomic_int_t ref_count; - void init (int v = 1) { ref_count.set_relaxed (v); } - int get_relaxed () const { return ref_count.get_relaxed (); } + void init (int v = 1) { ref_count = v; } + int get_relaxed () const { return ref_count; } int inc () const { return ref_count.inc (); } int dec () const { return ref_count.dec (); } - void fini () { ref_count.set_relaxed (-0x0000DEAD); } + void fini () { ref_count = -0x0000DEAD; } - bool is_inert () const { return !ref_count.get_relaxed (); } - bool is_valid () const { return ref_count.get_relaxed () > 0; } + bool is_inert () const { return !ref_count; } + bool is_valid () const { return ref_count > 0; } }; @@ -214,15 +214,15 @@ static inline void hb_object_trace (const Type *obj, const char *function) obj ? obj->header.ref_count.get_relaxed () : 0); } -template <typename Type> -static inline Type *hb_object_create () +template <typename Type, typename ...Ts> +static inline Type *hb_object_create (Ts... ds) { Type *obj = (Type *) hb_calloc (1, sizeof (Type)); if (unlikely (!obj)) return obj; - new (obj) Type; + new (obj) Type (std::forward<Ts> (ds)...); hb_object_init (obj); hb_object_trace (obj, HB_FUNC); @@ -233,7 +233,7 @@ template <typename Type> static inline void hb_object_init (Type *obj) { obj->header.ref_count.init (); - obj->header.writable.set_relaxed (true); + obj->header.writable = true; obj->header.user_data.init (); } template <typename Type> @@ -244,12 +244,12 @@ static inline bool hb_object_is_valid (const Type *obj) template <typename Type> static inline bool hb_object_is_immutable (const Type *obj) { - return !obj->header.writable.get_relaxed (); + return !obj->header.writable; } template <typename Type> static inline void hb_object_make_immutable (const Type *obj) { - obj->header.writable.set_relaxed (false); + obj->header.writable = false; } template <typename Type> static inline Type *hb_object_reference (Type *obj) @@ -273,7 +273,8 @@ static inline bool hb_object_destroy (Type *obj) hb_object_fini (obj); - obj->~Type (); + if (!std::is_trivially_destructible<Type>::value) + obj->~Type (); return true; } @@ -281,7 +282,7 @@ template <typename Type> static inline void hb_object_fini (Type *obj) { obj->header.ref_count.fini (); /* Do this before user_data */ - hb_user_data_array_t *user_data = obj->header.user_data.get (); + hb_user_data_array_t *user_data = obj->header.user_data.get_acquire (); if (user_data) { user_data->fini (); @@ -301,7 +302,7 @@ static inline bool hb_object_set_user_data (Type *obj, assert (hb_object_is_valid (obj)); retry: - hb_user_data_array_t *user_data = obj->header.user_data.get (); + hb_user_data_array_t *user_data = obj->header.user_data.get_acquire (); if (unlikely (!user_data)) { user_data = (hb_user_data_array_t *) hb_calloc (sizeof (hb_user_data_array_t), 1); @@ -326,7 +327,7 @@ static inline void *hb_object_get_user_data (Type *obj, if (unlikely (!obj || obj->header.is_inert ())) return nullptr; assert (hb_object_is_valid (obj)); - hb_user_data_array_t *user_data = obj->header.user_data.get (); + hb_user_data_array_t *user_data = obj->header.user_data.get_acquire (); if (!user_data) return nullptr; return user_data->get (key); diff --git a/thirdparty/harfbuzz/src/hb-ot-cff1-table.hh b/thirdparty/harfbuzz/src/hb-ot-cff1-table.hh index 4aa337f78b..17b0296616 100644 --- a/thirdparty/harfbuzz/src/hb-ot-cff1-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-cff1-table.hh @@ -1379,7 +1379,7 @@ struct cff1 if (unlikely (!len)) return false; retry: - hb_sorted_vector_t<gname_t> *names = glyph_names.get (); + hb_sorted_vector_t<gname_t> *names = glyph_names.get_acquire (); if (unlikely (!names)) { names = (hb_sorted_vector_t<gname_t> *) hb_calloc (sizeof (hb_sorted_vector_t<gname_t>), 1); diff --git a/thirdparty/harfbuzz/src/hb-ot-font.cc b/thirdparty/harfbuzz/src/hb-ot-font.cc index 3f13b9994a..c90a65665c 100644 --- a/thirdparty/harfbuzz/src/hb-ot-font.cc +++ b/thirdparty/harfbuzz/src/hb-ot-font.cc @@ -59,13 +59,15 @@ * never need to call these functions directly. **/ +using hb_ot_font_advance_cache_t = hb_cache_t<24, 16, 8, true>; + struct hb_ot_font_t { const hb_ot_face_t *ot_face; /* h_advance caching */ mutable hb_atomic_int_t cached_coords_serial; - mutable hb_atomic_ptr_t<hb_advance_cache_t> advance_cache; + mutable hb_atomic_ptr_t<hb_ot_font_advance_cache_t> advance_cache; }; static hb_ot_font_t * @@ -161,14 +163,14 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, bool use_cache = false; #endif - hb_advance_cache_t *cache = nullptr; + hb_ot_font_advance_cache_t *cache = nullptr; if (use_cache) { retry: - cache = ot_font->advance_cache.get (); + cache = ot_font->advance_cache.get_acquire (); if (unlikely (!cache)) { - cache = (hb_advance_cache_t *) hb_malloc (sizeof (hb_advance_cache_t)); + cache = (hb_ot_font_advance_cache_t *) hb_malloc (sizeof (hb_ot_font_advance_cache_t)); if (unlikely (!cache)) { use_cache = false; @@ -181,7 +183,7 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, hb_free (cache); goto retry; } - ot_font->cached_coords_serial.set (font->serial_coords); + ot_font->cached_coords_serial.set_release (font->serial_coords); } } out: @@ -197,10 +199,10 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, } else { /* Use cache. */ - if (ot_font->cached_coords_serial.get () != (int) font->serial_coords) + if (ot_font->cached_coords_serial.get_acquire () != (int) font->serial_coords) { ot_font->advance_cache->init (); - ot_font->cached_coords_serial.set (font->serial_coords); + ot_font->cached_coords_serial.set_release (font->serial_coords); } for (unsigned int i = 0; i < count; i++) diff --git a/thirdparty/harfbuzz/src/hb-ot-hmtx-table.hh b/thirdparty/harfbuzz/src/hb-ot-hmtx-table.hh index 50e4b54fde..96a394ba42 100644 --- a/thirdparty/harfbuzz/src/hb-ot-hmtx-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-hmtx-table.hh @@ -73,6 +73,8 @@ struct hmtxvmtx return_trace (true); } + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>>* get_mtx_map (const hb_subset_plan_t *plan) const + { return T::is_horizontal ? plan->hmtx_map : plan->vmtx_map; } bool subset_update_header (hb_subset_plan_t *plan, unsigned int num_hmetrics) const @@ -130,14 +132,15 @@ struct hmtxvmtx accelerator_t _mtx (c->plan->source); unsigned num_long_metrics; + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *mtx_map = get_mtx_map (c->plan); { /* Determine num_long_metrics to encode. */ auto& plan = c->plan; + num_long_metrics = plan->num_output_glyphs (); - hb_codepoint_t old_gid = 0; - unsigned int last_advance = plan->old_gid_for_new_gid (num_long_metrics - 1, &old_gid) ? _mtx.get_advance_without_var_unscaled (old_gid) : 0; + unsigned int last_advance = get_new_gid_advance_unscaled (plan, mtx_map, num_long_metrics - 1, _mtx); while (num_long_metrics > 1 && - last_advance == (plan->old_gid_for_new_gid (num_long_metrics - 2, &old_gid) ? _mtx.get_advance_without_var_unscaled (old_gid) : 0)) + last_advance == get_new_gid_advance_unscaled (plan, mtx_map, num_long_metrics - 2, _mtx)) { num_long_metrics--; } @@ -145,14 +148,18 @@ struct hmtxvmtx auto it = + hb_range (c->plan->num_output_glyphs ()) - | hb_map ([c, &_mtx] (unsigned _) + | hb_map ([c, &_mtx, mtx_map] (unsigned _) { - hb_codepoint_t old_gid; - if (!c->plan->old_gid_for_new_gid (_, &old_gid)) - return hb_pair (0u, 0); - int lsb = 0; - (void) _mtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb); - return hb_pair (_mtx.get_advance_without_var_unscaled (old_gid), +lsb); + if (!mtx_map->has (_)) + { + hb_codepoint_t old_gid; + if (!c->plan->old_gid_for_new_gid (_, &old_gid)) + return hb_pair (0u, 0); + int lsb = 0; + (void) _mtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb); + return hb_pair (_mtx.get_advance_without_var_unscaled (old_gid), +lsb); + } + return mtx_map->get (_); }) ; @@ -330,6 +337,24 @@ struct hmtxvmtx hb_blob_ptr_t<V> var_table; }; + /* get advance: when no variations, call get_advance_without_var_unscaled. + * when there're variations, get advance value from mtx_map in subset_plan*/ + unsigned get_new_gid_advance_unscaled (const hb_subset_plan_t *plan, + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *mtx_map, + unsigned new_gid, + const accelerator_t &_mtx) const + { + if (mtx_map->is_empty () || + (new_gid == 0 && !mtx_map->has (new_gid))) + { + hb_codepoint_t old_gid = 0; + return plan->old_gid_for_new_gid (new_gid, &old_gid) ? + _mtx.get_advance_without_var_unscaled (old_gid) : 0; + } + else + { return mtx_map->get (new_gid).first; } + } + protected: UnsizedArrayOf<LongMetric> longMetricZ; /* Paired advance width and leading diff --git a/thirdparty/harfbuzz/src/hb-ot-layout-common.hh b/thirdparty/harfbuzz/src/hb-ot-layout-common.hh index 0532039aad..05916a252c 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout-common.hh +++ b/thirdparty/harfbuzz/src/hb-ot-layout-common.hh @@ -84,10 +84,10 @@ using OT::Layout::MediumTypes; namespace OT { template<typename Iterator> -static inline void ClassDef_serialize (hb_serialize_context_t *c, +static inline bool ClassDef_serialize (hb_serialize_context_t *c, Iterator it); -static void ClassDef_remap_and_serialize ( +static bool ClassDef_remap_and_serialize ( hb_serialize_context_t *c, const hb_set_t &klasses, bool use_class_zero, @@ -186,6 +186,7 @@ struct hb_subset_layout_context_t : unsigned lookup_index_count; }; +struct VariationStore; struct hb_collect_variation_indices_context_t : hb_dispatch_context_t<hb_collect_variation_indices_context_t> { @@ -194,15 +195,27 @@ struct hb_collect_variation_indices_context_t : static return_t default_return_value () { return hb_empty_t (); } hb_set_t *layout_variation_indices; + hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map; + hb_font_t *font; + const VariationStore *var_store; const hb_set_t *glyph_set; const hb_map_t *gpos_lookups; + float *store_cache; hb_collect_variation_indices_context_t (hb_set_t *layout_variation_indices_, + hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *varidx_delta_map_, + hb_font_t *font_, + const VariationStore *var_store_, const hb_set_t *glyph_set_, - const hb_map_t *gpos_lookups_) : + const hb_map_t *gpos_lookups_, + float *store_cache_) : layout_variation_indices (layout_variation_indices_), + varidx_delta_map (varidx_delta_map_), + font (font_), + var_store (var_store_), glyph_set (glyph_set_), - gpos_lookups (gpos_lookups_) {} + gpos_lookups (gpos_lookups_), + store_cache (store_cache_) {} }; template<typename OutputArray> @@ -1380,17 +1393,14 @@ struct LookupOffsetList : List16OfOffsetTo<TLookup, OffsetType> */ -static void ClassDef_remap_and_serialize (hb_serialize_context_t *c, +static bool ClassDef_remap_and_serialize (hb_serialize_context_t *c, const hb_set_t &klasses, bool use_class_zero, hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> &glyph_and_klass, /* IN/OUT */ hb_map_t *klass_map /*IN/OUT*/) { if (!klass_map) - { - ClassDef_serialize (c, glyph_and_klass.iter ()); - return; - } + return ClassDef_serialize (c, glyph_and_klass.iter ()); /* any glyph not assigned a class value falls into Class zero (0), * if any glyph assigned to class 0, remapping must start with 0->0*/ @@ -1413,7 +1423,7 @@ static void ClassDef_remap_and_serialize (hb_serialize_context_t *c, } c->propagate_error (glyph_and_klass, klasses); - ClassDef_serialize (c, glyph_and_klass.iter ()); + return ClassDef_serialize (c, glyph_and_klass.iter ()); } /* @@ -1495,11 +1505,12 @@ struct ClassDefFormat1_3 ? hb_len (hb_iter (glyph_map.keys()) | hb_filter (glyph_filter)) : glyph_map.get_population (); use_class_zero = use_class_zero && glyph_count <= glyph_and_klass.length; - ClassDef_remap_and_serialize (c->serializer, - orig_klasses, - use_class_zero, - glyph_and_klass, - klass_map); + if (!ClassDef_remap_and_serialize (c->serializer, + orig_klasses, + use_class_zero, + glyph_and_klass, + klass_map)) + return_trace (false); return_trace (keep_empty_table || (bool) glyph_and_klass); } @@ -1736,11 +1747,12 @@ struct ClassDefFormat2_4 ? hb_len (hb_iter (glyphset) | hb_filter (glyph_filter)) : glyph_map.get_population (); use_class_zero = use_class_zero && glyph_count <= glyph_and_klass.length; - ClassDef_remap_and_serialize (c->serializer, - orig_klasses, - use_class_zero, - glyph_and_klass, - klass_map); + if (!ClassDef_remap_and_serialize (c->serializer, + orig_klasses, + use_class_zero, + glyph_and_klass, + klass_map)) + return_trace (false); return_trace (keep_empty_table || (bool) glyph_and_klass); } @@ -2124,9 +2136,9 @@ struct ClassDef }; template<typename Iterator> -static inline void ClassDef_serialize (hb_serialize_context_t *c, +static inline bool ClassDef_serialize (hb_serialize_context_t *c, Iterator it) -{ c->start_embed<ClassDef> ()->serialize (c, it); } +{ return (c->start_embed<ClassDef> ()->serialize (c, it)); } /* @@ -2280,16 +2292,16 @@ struct VarData unsigned int count = regionIndices.len; bool is_long = longWords (); unsigned word_count = wordCount (); - unsigned int scount = is_long ? count - word_count : word_count; + unsigned int scount = is_long ? count : word_count; unsigned int lcount = is_long ? word_count : 0; const HBUINT8 *bytes = get_delta_bytes (); - const HBUINT8 *row = bytes + inner * (scount + count); + const HBUINT8 *row = bytes + inner * get_row_size (); float delta = 0.; unsigned int i = 0; - const HBINT16 *lcursor = reinterpret_cast<const HBINT16 *> (row); + const HBINT32 *lcursor = reinterpret_cast<const HBINT32 *> (row); for (; i < lcount; i++) { float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache); @@ -2563,7 +2575,7 @@ struct VariationStore bool serialize (hb_serialize_context_t *c, const VariationStore *src, - const hb_array_t <hb_inc_bimap_t> &inner_maps) + const hb_array_t <const hb_inc_bimap_t> &inner_maps) { TRACE_SERIALIZE (this); #ifdef HB_NO_VAR @@ -2618,7 +2630,7 @@ struct VariationStore return_trace (true); } - bool subset (hb_subset_context_t *c) const + bool subset (hb_subset_context_t *c, const hb_array_t<const hb_inc_bimap_t> &inner_maps) const { TRACE_SUBSET (this); #ifdef HB_NO_VAR @@ -2628,22 +2640,7 @@ struct VariationStore VariationStore *varstore_prime = c->serializer->start_embed<VariationStore> (); if (unlikely (!varstore_prime)) return_trace (false); - const hb_set_t *variation_indices = c->plan->layout_variation_indices; - if (variation_indices->is_empty ()) return_trace (false); - - hb_vector_t<hb_inc_bimap_t> inner_maps; - inner_maps.resize ((unsigned) dataSets.len); - - for (unsigned idx : c->plan->layout_variation_indices->iter ()) - { - uint16_t major = idx >> 16; - uint16_t minor = idx & 0xFFFF; - - if (major >= inner_maps.length) - return_trace (false); - inner_maps[major].add (minor); - } - varstore_prime->serialize (c->serializer, this, inner_maps.as_array ()); + varstore_prime->serialize (c->serializer, this, inner_maps); return_trace ( !c->serializer->in_error() @@ -3169,28 +3166,36 @@ struct VariationDevice VariationStore::cache_t *store_cache = nullptr) const { return font->em_scalef_y (get_delta (font, store, store_cache)); } - VariationDevice* copy (hb_serialize_context_t *c, const hb_map_t *layout_variation_idx_map) const + VariationDevice* copy (hb_serialize_context_t *c, + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) const { TRACE_SERIALIZE (this); + if (!layout_variation_idx_delta_map) return_trace (nullptr); auto snap = c->snapshot (); auto *out = c->embed (this); if (unlikely (!out)) return_trace (nullptr); - if (!layout_variation_idx_map || layout_variation_idx_map->is_empty ()) return_trace (out); /* TODO Just get() and bail if NO_VARIATION. Needs to setup the map to return that. */ - if (!layout_variation_idx_map->has (varIdx)) + if (!layout_variation_idx_delta_map->has (varIdx)) { c->revert (snap); return_trace (nullptr); } - unsigned new_idx = layout_variation_idx_map->get (varIdx); + unsigned new_idx = hb_first (layout_variation_idx_delta_map->get (varIdx)); out->varIdx = new_idx; return_trace (out); } - void record_variation_index (hb_set_t *layout_variation_indices) const + void collect_variation_index (hb_collect_variation_indices_context_t *c) const { - layout_variation_indices->add (varIdx); + c->layout_variation_indices->add (varIdx); + int delta = 0; + if (c->font && c->var_store) + delta = roundf (get_delta (c->font, *c->var_store, c->store_cache)); + + /* set new varidx to HB_OT_LAYOUT_NO_VARIATIONS_INDEX here, will remap + * varidx later*/ + c->varidx_delta_map->set (varIdx, hb_pair_t<unsigned, int> (HB_OT_LAYOUT_NO_VARIATIONS_INDEX, delta)); } bool sanitize (hb_sanitize_context_t *c) const @@ -3283,7 +3288,8 @@ struct Device } } - Device* copy (hb_serialize_context_t *c, const hb_map_t *layout_variation_idx_map=nullptr) const + Device* copy (hb_serialize_context_t *c, + const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map=nullptr) const { TRACE_SERIALIZE (this); switch (u.b.format) { @@ -3295,14 +3301,14 @@ struct Device #endif #ifndef HB_NO_VAR case 0x8000: - return_trace (reinterpret_cast<Device *> (u.variation.copy (c, layout_variation_idx_map))); + return_trace (reinterpret_cast<Device *> (u.variation.copy (c, layout_variation_idx_delta_map))); #endif default: return_trace (nullptr); } } - void collect_variation_indices (hb_set_t *layout_variation_indices) const + void collect_variation_indices (hb_collect_variation_indices_context_t *c) const { switch (u.b.format) { #ifndef HB_NO_HINTING @@ -3313,7 +3319,7 @@ struct Device #endif #ifndef HB_NO_VAR case 0x8000: - u.variation.record_variation_index (layout_variation_indices); + u.variation.collect_variation_index (c); return; #endif default: @@ -3321,6 +3327,18 @@ struct Device } } + unsigned get_variation_index () const + { + switch (u.b.format) { +#ifndef HB_NO_VAR + case 0x8000: + return u.variation.varIdx; +#endif + default: + return HB_OT_LAYOUT_NO_VARIATIONS_INDEX; + } + } + protected: union { DeviceHeader b; diff --git a/thirdparty/harfbuzz/src/hb-ot-layout-gdef-table.hh b/thirdparty/harfbuzz/src/hb-ot-layout-gdef-table.hh index 5bc26d9182..22925fdfa9 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout-gdef-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-layout-gdef-table.hh @@ -200,15 +200,34 @@ struct CaretValueFormat3 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - auto *out = c->serializer->embed (this); + auto *out = c->serializer->start_embed (*this); if (unlikely (!out)) return_trace (false); + if (!c->serializer->embed (caretValueFormat)) return_trace (false); + if (!c->serializer->embed (coordinate)) return_trace (false); + + unsigned varidx = (this+deviceTable).get_variation_index (); + if (c->plan->layout_variation_idx_delta_map->has (varidx)) + { + int delta = hb_second (c->plan->layout_variation_idx_delta_map->get (varidx)); + if (delta != 0) + { + if (!c->serializer->check_assign (out->coordinate, coordinate + delta, HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + } + + if (c->plan->all_axes_pinned) + return_trace (c->serializer->check_assign (out->caretValueFormat, 1, HB_SERIALIZE_ERROR_INT_OVERFLOW)); + + if (!c->serializer->embed (deviceTable)) + return_trace (false); return_trace (out->deviceTable.serialize_copy (c->serializer, deviceTable, this, c->serializer->to_bias (out), - hb_serialize_context_t::Head, c->plan->layout_variation_idx_map)); + hb_serialize_context_t::Head, c->plan->layout_variation_idx_delta_map)); } - void collect_variation_indices (hb_set_t *layout_variation_indices) const - { (this+deviceTable).collect_variation_indices (layout_variation_indices); } + void collect_variation_indices (hb_collect_variation_indices_context_t *c) const + { (this+deviceTable).collect_variation_indices (c); } bool sanitize (hb_sanitize_context_t *c) const { @@ -255,14 +274,14 @@ struct CaretValue } } - void collect_variation_indices (hb_set_t *layout_variation_indices) const + void collect_variation_indices (hb_collect_variation_indices_context_t *c) const { switch (u.format) { case 1: case 2: return; case 3: - u.format3.collect_variation_indices (layout_variation_indices); + u.format3.collect_variation_indices (c); return; default: return; } @@ -329,7 +348,7 @@ struct LigGlyph void collect_variation_indices (hb_collect_variation_indices_context_t *c) const { for (const Offset16To<CaretValue>& offset : carets.iter ()) - (this+offset).collect_variation_indices (c->layout_variation_indices); + (this+offset).collect_variation_indices (c); } bool sanitize (hb_sanitize_context_t *c) const @@ -586,7 +605,10 @@ struct GDEFVersion1_2 bool subset_varstore = false; if (version.to_int () >= 0x00010003u) { - subset_varstore = out->varStore.serialize_subset (c, varStore, this); + if (c->plan->all_axes_pinned) + out->varStore = 0; + else + subset_varstore = out->varStore.serialize_subset (c, varStore, this, c->plan->gdef_varstore_inner_maps.as_array ()); } if (subset_varstore) @@ -846,7 +868,7 @@ struct GDEF { get_lig_caret_list ().collect_variation_indices (c); } void remap_layout_variation_indices (const hb_set_t *layout_variation_indices, - hb_map_t *layout_variation_idx_map /* OUT */) const + hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map /* OUT */) const { if (!has_var_store ()) return; if (layout_variation_indices->is_empty ()) return; @@ -864,7 +886,11 @@ struct GDEF } unsigned new_idx = (new_major << 16) + new_minor; - layout_variation_idx_map->set (idx, new_idx); + if (!layout_variation_idx_delta_map->has (idx)) + continue; + int delta = hb_second (layout_variation_idx_delta_map->get (idx)); + + layout_variation_idx_delta_map->set (idx, hb_pair_t<unsigned, int> (new_idx, delta)); ++new_minor; last_major = major; } diff --git a/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh b/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh index c77ec12fbe..c15a42b0f1 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh +++ b/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh @@ -4261,6 +4261,7 @@ struct GSUBGPOS } void prune_langsys (const hb_map_t *duplicate_feature_map, + const hb_set_t *layout_scripts, hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> *script_langsys_map, hb_set_t *new_feature_indexes /* OUT */) const { @@ -4269,6 +4270,8 @@ struct GSUBGPOS unsigned count = get_script_count (); for (unsigned script_index = 0; script_index < count; script_index++) { + const Tag& tag = get_script_tag (script_index); + if (!layout_scripts->has (tag)) continue; const Script& s = get_script (script_index); s.prune_langsys (&c, script_index); } diff --git a/thirdparty/harfbuzz/src/hb-ot-layout.cc b/thirdparty/harfbuzz/src/hb-ot-layout.cc index f9c0daa486..44e57987b7 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout.cc +++ b/thirdparty/harfbuzz/src/hb-ot-layout.cc @@ -601,9 +601,13 @@ hb_ot_layout_table_select_script (hb_face_t *face, * @feature_tags: (out) (array length=feature_count): Array of feature tags found in the table * * Fetches a list of all feature tags in the given face's GSUB or GPOS table. + * Note that there might be duplicate feature tags, belonging to different + * script/language-system pairs of the table. * * Return value: Total number of feature tags. * + * Since: 0.6.0 + * **/ unsigned int hb_ot_layout_table_get_feature_tags (hb_face_t *face, @@ -629,6 +633,9 @@ hb_ot_layout_table_get_feature_tags (hb_face_t *face, * or GPOS table. * * Return value: `true` if the feature is found, `false` otherwise + * + * Since: 0.6.0 + * **/ bool hb_ot_layout_table_find_feature (hb_face_t *face, @@ -668,6 +675,8 @@ hb_ot_layout_table_find_feature (hb_face_t *face, * * Return value: Total number of language tags. * + * Since: 0.6.0 + * **/ unsigned int hb_ot_layout_script_get_language_tags (hb_face_t *face, @@ -778,6 +787,8 @@ hb_ot_layout_script_select_language (hb_face_t *face, * * Return value: `true` if the feature is found, `false` otherwise * + * Since: 0.6.0 + * **/ hb_bool_t hb_ot_layout_language_get_required_feature_index (hb_face_t *face, @@ -846,6 +857,9 @@ hb_ot_layout_language_get_required_feature (hb_face_t *face, * returned will begin at the offset provided. * * Return value: Total number of features. + * + * Since: 0.6.0 + * **/ unsigned int hb_ot_layout_language_get_feature_indexes (hb_face_t *face, @@ -879,6 +893,9 @@ hb_ot_layout_language_get_feature_indexes (hb_face_t *face, * returned will begin at the offset provided. * * Return value: Total number of feature tags. + * + * Since: 0.6.0 + * **/ unsigned int hb_ot_layout_language_get_feature_tags (hb_face_t *face, @@ -919,6 +936,8 @@ hb_ot_layout_language_get_feature_tags (hb_face_t *face, * * Return value: `true` if the feature is found, `false` otherwise * + * Since: 0.6.0 + * **/ hb_bool_t hb_ot_layout_language_find_feature (hb_face_t *face, @@ -1167,9 +1186,12 @@ script_collect_features (hb_collect_features_context_t *c, * hb_ot_layout_collect_features: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS - * @scripts: The array of scripts to collect features for - * @languages: The array of languages to collect features for - * @features: The array of features to collect + * @scripts: (nullable) (array zero-terminated=1): The array of scripts to collect features for, + * terminated by %HB_TAG_NONE + * @languages: (nullable) (array zero-terminated=1): The array of languages to collect features for, + * terminated by %HB_TAG_NONE + * @features: (nullable) (array zero-terminated=1): The array of features to collect, + * terminated by %HB_TAG_NONE * @feature_indexes: (out): The array of feature indexes found for the query * * Fetches a list of all feature indexes in the specified face's GSUB table @@ -1216,9 +1238,12 @@ hb_ot_layout_collect_features (hb_face_t *face, * hb_ot_layout_collect_lookups: * @face: #hb_face_t to work upon * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS - * @scripts: The array of scripts to collect lookups for - * @languages: The array of languages to collect lookups for - * @features: The array of features to collect lookups for + * @scripts: (nullable) (array zero-terminated=1): The array of scripts to collect lookups for, + * terminated by %HB_TAG_NONE + * @languages: (nullable) (array zero-terminated=1): The array of languages to collect lookups for, + * terminated by %HB_TAG_NONE + * @features: (nullable) (array zero-terminated=1): The array of features to collect lookups for, + * terminated by %HB_TAG_NONE * @lookup_indexes: (out): The array of lookup indexes found for the query * * Fetches a list of all feature-lookup indexes in the specified face's GSUB @@ -1316,6 +1341,8 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t *face, * * Return value: `true` if feature variations were found, `false` otherwise. * + * Since: 1.4.0 + * **/ hb_bool_t hb_ot_layout_table_find_feature_variations (hb_face_t *face, @@ -1347,6 +1374,8 @@ hb_ot_layout_table_find_feature_variations (hb_face_t *face, * * Return value: Total number of lookups. * + * Since: 1.4.0 + * **/ unsigned int hb_ot_layout_feature_with_variations_get_lookups (hb_face_t *face, @@ -1379,6 +1408,8 @@ hb_ot_layout_feature_with_variations_get_lookups (hb_face_t *face, * * Return value: `true` if data found, `false` otherwise * + * Since: 0.6.0 + * **/ hb_bool_t hb_ot_layout_has_substitution (hb_face_t *face) @@ -2297,11 +2328,6 @@ struct hb_get_glyph_alternates_dispatch_t : static return_t default_return_value () { return 0; } bool stop_sublookup_iteration (return_t r) const { return r; } - hb_face_t *face; - - hb_get_glyph_alternates_dispatch_t (hb_face_t *face) : - face (face) {} - private: template <typename T, typename ...Ts> auto _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN @@ -2340,7 +2366,7 @@ hb_ot_layout_lookup_get_glyph_alternates (hb_face_t *face, unsigned *alternate_count /* IN/OUT. May be NULL. */, hb_codepoint_t *alternate_glyphs /* OUT. May be NULL. */) { - hb_get_glyph_alternates_dispatch_t c (face); + hb_get_glyph_alternates_dispatch_t c; const OT::SubstLookup &lookup = face->table.GSUB->table->get_lookup (lookup_index); auto ret = lookup.dispatch (&c, glyph, start_offset, alternate_count, alternate_glyphs); if (!ret && alternate_count) *alternate_count = 0; diff --git a/thirdparty/harfbuzz/src/hb-ot-os2-table.hh b/thirdparty/harfbuzz/src/hb-ot-os2-table.hh index 3473afef54..c6e8fad6fc 100644 --- a/thirdparty/harfbuzz/src/hb-ot-os2-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-os2-table.hh @@ -166,6 +166,47 @@ struct OS2 } } + float map_wdth_to_widthclass(float width) const + { + if (width < 50) return 1.0f; + if (width > 200) return 9.0f; + + float ratio = (width - 50) / 12.5f; + int a = (int) floorf (ratio); + int b = (int) ceilf (ratio); + + /* follow this maping: + * https://docs.microsoft.com/en-us/typography/opentype/spec/os2#uswidthclass + */ + if (b <= 6) // 50-125 + { + if (a == b) return a + 1.0f; + } + else if (b == 7) // no mapping for 137.5 + { + a = 6; + b = 8; + } + else if (b == 8) + { + if (a == b) return 8.0f; // 150 + a = 6; + } + else + { + if (a == b && a == 12) return 9.0f; //200 + b = 12; + a = 8; + } + + float va = 50 + a * 12.5f; + float vb = 50 + b * 12.5f; + + float ret = a + (width - va) / (vb - va); + if (a <= 6) ret += 1.0f; + return ret; + } + bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); @@ -183,6 +224,26 @@ struct OS2 _update_unicode_ranges (c->plan->unicodes, os2_prime->ulUnicodeRange); + if (c->plan->user_axes_location->has (HB_TAG ('w','g','h','t')) && + !c->plan->pinned_at_default) + { + float weight_class = c->plan->user_axes_location->get (HB_TAG ('w','g','h','t')); + if (!c->serializer->check_assign (os2_prime->usWeightClass, + roundf (hb_clamp (weight_class, 1.0f, 1000.0f)), + HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + + if (c->plan->user_axes_location->has (HB_TAG ('w','d','t','h')) && + !c->plan->pinned_at_default) + { + float width = c->plan->user_axes_location->get (HB_TAG ('w','d','t','h')); + if (!c->serializer->check_assign (os2_prime->usWidthClass, + roundf (map_wdth_to_widthclass (width)), + HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + } + return_trace (true); } diff --git a/thirdparty/harfbuzz/src/hb-ot-post-table.hh b/thirdparty/harfbuzz/src/hb-ot-post-table.hh index a4c0c4aa17..80d02ffba7 100644 --- a/thirdparty/harfbuzz/src/hb-ot-post-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-post-table.hh @@ -102,6 +102,14 @@ struct post if (!serialize (c->serializer, glyph_names)) return_trace (false); + if (c->plan->user_axes_location->has (HB_TAG ('s','l','n','t')) && + !c->plan->pinned_at_default) + { + float italic_angle = c->plan->user_axes_location->get (HB_TAG ('s','l','n','t')); + italic_angle = hb_max (-90.f, hb_min (italic_angle, 90.f)); + post_prime->italicAngle.set_float (italic_angle); + } + if (glyph_names && version.major == 2) return_trace (v2X.subset (c)); @@ -133,7 +141,7 @@ struct post } ~accelerator_t () { - hb_free (gids_sorted_by_name.get ()); + hb_free (gids_sorted_by_name.get_acquire ()); table.destroy (); } @@ -160,7 +168,7 @@ struct post if (unlikely (!len)) return false; retry: - uint16_t *gids = gids_sorted_by_name.get (); + uint16_t *gids = gids_sorted_by_name.get_acquire (); if (unlikely (!gids)) { diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-joining-list.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-joining-list.hh index a5ce3a6c93..c7b57820af 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-joining-list.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-joining-list.hh @@ -6,10 +6,10 @@ * * on files with these headers: * - * # ArabicShaping-14.0.0.txt - * # Date: 2021-05-21, 01:54:00 GMT [KW, RP] - * # Scripts-14.0.0.txt - * # Date: 2021-07-10, 00:35:31 GMT + * # ArabicShaping-15.0.0.txt + * # Date: 2022-02-14, 18:50:00 GMT [KW, RP] + * # Scripts-15.0.0.txt + * # Date: 2022-04-26, 23:15:02 GMT */ #ifndef HB_OT_SHAPER_ARABIC_JOINING_LIST_HH diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-table.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-table.hh index fd3d8645d1..d7670f2f95 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-arabic-table.hh @@ -6,10 +6,10 @@ * * on files with these headers: * - * # ArabicShaping-14.0.0.txt - * # Date: 2021-05-21, 01:54:00 GMT [KW, RP] - * # Blocks-14.0.0.txt - * # Date: 2021-01-22, 23:29:00 GMT [KW] + * # ArabicShaping-15.0.0.txt + * # Date: 2022-02-14, 18:50:00 GMT [KW, RP] + * # Blocks-15.0.0.txt + * # Date: 2022-01-28, 20:58:00 GMT [KW] * UnicodeData.txt does not have a header. */ diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-indic-machine.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-indic-machine.hh index d3a7cce3de..d52b13f616 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-indic-machine.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-indic-machine.hh @@ -53,7 +53,7 @@ enum indic_syllable_type_t { }; -#line 54 "hb-ot-shaper-indic-machine.hh" +#line 57 "hb-ot-shaper-indic-machine.hh" #define indic_syllable_machine_ex_A 9u #define indic_syllable_machine_ex_C 1u #define indic_syllable_machine_ex_CM 16u @@ -75,7 +75,7 @@ enum indic_syllable_type_t { #define indic_syllable_machine_ex_ZWNJ 5u -#line 74 "hb-ot-shaper-indic-machine.hh" +#line 79 "hb-ot-shaper-indic-machine.hh" static const unsigned char _indic_syllable_machine_trans_keys[] = { 8u, 8u, 4u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 4u, 12u, 4u, 8u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 4u, 12u, 4u, 12u, 4u, 12u, 8u, 8u, 5u, 7u, @@ -422,7 +422,7 @@ find_syllables_indic (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 415 "hb-ot-shaper-indic-machine.hh" +#line 426 "hb-ot-shaper-indic-machine.hh" { cs = indic_syllable_machine_start; ts = 0; @@ -438,7 +438,7 @@ find_syllables_indic (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 427 "hb-ot-shaper-indic-machine.hh" +#line 442 "hb-ot-shaper-indic-machine.hh" { int _slen; int _trans; @@ -452,7 +452,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 439 "hb-ot-shaper-indic-machine.hh" +#line 456 "hb-ot-shaper-indic-machine.hh" } _keys = _indic_syllable_machine_trans_keys + (cs<<1); @@ -555,7 +555,7 @@ _eof_trans: #line 113 "hb-ot-shaper-indic-machine.rl" {act = 6;} break; -#line 521 "hb-ot-shaper-indic-machine.hh" +#line 559 "hb-ot-shaper-indic-machine.hh" } _again: @@ -564,7 +564,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 528 "hb-ot-shaper-indic-machine.hh" +#line 568 "hb-ot-shaper-indic-machine.hh" } if ( ++p != pe ) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-indic-table.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-indic-table.cc index 8994f3ca59..bf6a2757bb 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-indic-table.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-indic-table.cc @@ -6,12 +6,12 @@ * * on files with these headers: * - * # IndicSyllabicCategory-14.0.0.txt - * # Date: 2021-05-22, 01:01:00 GMT [KW, RP] - * # IndicPositionalCategory-14.0.0.txt - * # Date: 2021-05-22, 01:01:00 GMT [KW, RP] - * # Blocks-14.0.0.txt - * # Date: 2021-01-22, 23:29:00 GMT [KW] + * # IndicSyllabicCategory-15.0.0.txt + * # Date: 2022-05-26, 02:18:00 GMT [KW, RP] + * # IndicPositionalCategory-15.0.0.txt + * # Date: 2022-05-26, 02:18:00 GMT [KW, RP] + * # Blocks-15.0.0.txt + * # Date: 2022-01-28, 20:58:00 GMT [KW] */ #include "hb.hh" @@ -92,7 +92,7 @@ static_assert (OT_VPst == M_Cat(VPst), ""); #define _OT_R OT_Ra /* 14 chars; Ra */ #define _OT_Rf OT_Repha /* 1 chars; Repha */ #define _OT_Rt OT_Robatic /* 3 chars; Robatic */ -#define _OT_SM OT_SM /* 55 chars; SM */ +#define _OT_SM OT_SM /* 56 chars; SM */ #define _OT_S OT_Symbol /* 22 chars; Symbol */ #define _OT_V OT_V /* 172 chars; V */ #define _OT_VA OT_VAbv /* 18 chars; VAbv */ @@ -117,7 +117,7 @@ static_assert (OT_VPst == M_Cat(VPst), ""); #define _POS_R POS_POST_C /* 13 chars; POST_C */ #define _POS_L POS_PRE_C /* 5 chars; PRE_C */ #define _POS_LM POS_PRE_M /* 14 chars; PRE_M */ -#define _POS_SM POS_SMVD /* 129 chars; SMVD */ +#define _POS_SM POS_SMVD /* 130 chars; SMVD */ #pragma GCC diagnostic pop @@ -301,7 +301,7 @@ static const uint16_t indic_table[] = { /* 0CD8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(C,C), _(C,C), _(X,X), /* 0CE0 */ _(V,C), _(V,C), _(M,BS), _(M,BS), _(X,X), _(X,X), _(GB,C), _(GB,C), /* 0CE8 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), - /* 0CF0 */ _(X,X), _(CS,C), _(CS,C), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), + /* 0CF0 */ _(X,X), _(CS,C), _(CS,C),_(SM,SM), _(X,X), _(X,X), _(X,X), _(X,X), /* 0CF8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), /* Malayalam */ diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-indic.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-indic.cc index 6eb400ab16..55509c1101 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-indic.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-indic.cc @@ -276,7 +276,7 @@ struct indic_shape_plan_t { bool load_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const { - hb_codepoint_t glyph = virama_glyph.get_relaxed (); + hb_codepoint_t glyph = virama_glyph; if (unlikely (glyph == (hb_codepoint_t) -1)) { if (!config->virama || !font->get_nominal_glyph (config->virama, &glyph)) @@ -286,7 +286,7 @@ struct indic_shape_plan_t /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph * during shape planning... Instead, overwrite it here. */ - virama_glyph.set_relaxed ((int) glyph); + virama_glyph = (int) glyph; } *pglyph = glyph; @@ -330,7 +330,7 @@ data_create_indic (const hb_ot_shape_plan_t *plan) #ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE indic_plan->uniscribe_bug_compatible = hb_options ().uniscribe_bug_compatible; #endif - indic_plan->virama_glyph.set_relaxed (-1); + indic_plan->virama_glyph = -1; /* Use zero-context would_substitute() matching for new-spec of the main * Indic scripts, and scripts with one spec only, but not for old-specs. @@ -992,7 +992,7 @@ final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan, * class of I_Cat(H) is desired but has been lost. */ /* We don't call load_virama_glyph(), since we know it's already * loaded. */ - hb_codepoint_t virama_glyph = indic_plan->virama_glyph.get_relaxed (); + hb_codepoint_t virama_glyph = indic_plan->virama_glyph; if (virama_glyph) { for (unsigned int i = start; i < end; i++) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-khmer-machine.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-khmer-machine.hh index 2c40663bdd..e18bd75ef1 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-khmer-machine.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-khmer-machine.hh @@ -48,7 +48,7 @@ enum khmer_syllable_type_t { }; -#line 49 "hb-ot-shaper-khmer-machine.hh" +#line 52 "hb-ot-shaper-khmer-machine.hh" #define khmer_syllable_machine_ex_C 1u #define khmer_syllable_machine_ex_DOTTEDCIRCLE 11u #define khmer_syllable_machine_ex_H 4u @@ -66,7 +66,7 @@ enum khmer_syllable_type_t { #define khmer_syllable_machine_ex_ZWNJ 5u -#line 65 "hb-ot-shaper-khmer-machine.hh" +#line 70 "hb-ot-shaper-khmer-machine.hh" static const unsigned char _khmer_syllable_machine_trans_keys[] = { 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, @@ -294,7 +294,7 @@ find_syllables_khmer (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 287 "hb-ot-shaper-khmer-machine.hh" +#line 298 "hb-ot-shaper-khmer-machine.hh" { cs = khmer_syllable_machine_start; ts = 0; @@ -310,7 +310,7 @@ find_syllables_khmer (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 299 "hb-ot-shaper-khmer-machine.hh" +#line 314 "hb-ot-shaper-khmer-machine.hh" { int _slen; int _trans; @@ -324,7 +324,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 311 "hb-ot-shaper-khmer-machine.hh" +#line 328 "hb-ot-shaper-khmer-machine.hh" } _keys = _khmer_syllable_machine_trans_keys + (cs<<1); @@ -394,7 +394,7 @@ _eof_trans: #line 98 "hb-ot-shaper-khmer-machine.rl" {act = 3;} break; -#line 368 "hb-ot-shaper-khmer-machine.hh" +#line 398 "hb-ot-shaper-khmer-machine.hh" } _again: @@ -403,7 +403,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 375 "hb-ot-shaper-khmer-machine.hh" +#line 407 "hb-ot-shaper-khmer-machine.hh" } if ( ++p != pe ) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar-machine.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar-machine.hh index 464cf796d4..b109708937 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar-machine.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar-machine.hh @@ -50,7 +50,7 @@ enum myanmar_syllable_type_t { }; -#line 51 "hb-ot-shaper-myanmar-machine.hh" +#line 54 "hb-ot-shaper-myanmar-machine.hh" #define myanmar_syllable_machine_ex_A 9u #define myanmar_syllable_machine_ex_As 32u #define myanmar_syllable_machine_ex_C 1u @@ -77,7 +77,7 @@ enum myanmar_syllable_type_t { #define myanmar_syllable_machine_ex_ZWNJ 5u -#line 76 "hb-ot-shaper-myanmar-machine.hh" +#line 81 "hb-ot-shaper-myanmar-machine.hh" static const unsigned char _myanmar_syllable_machine_trans_keys[] = { 1u, 41u, 3u, 41u, 5u, 39u, 5u, 8u, 3u, 41u, 3u, 39u, 3u, 39u, 5u, 39u, 5u, 39u, 3u, 39u, 3u, 39u, 3u, 41u, 5u, 39u, 1u, 15u, 3u, 39u, 3u, 39u, @@ -443,7 +443,7 @@ find_syllables_myanmar (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 436 "hb-ot-shaper-myanmar-machine.hh" +#line 447 "hb-ot-shaper-myanmar-machine.hh" { cs = myanmar_syllable_machine_start; ts = 0; @@ -459,7 +459,7 @@ find_syllables_myanmar (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 448 "hb-ot-shaper-myanmar-machine.hh" +#line 463 "hb-ot-shaper-myanmar-machine.hh" { int _slen; int _trans; @@ -473,7 +473,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 460 "hb-ot-shaper-myanmar-machine.hh" +#line 477 "hb-ot-shaper-myanmar-machine.hh" } _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); @@ -519,7 +519,7 @@ _eof_trans: #line 113 "hb-ot-shaper-myanmar-machine.rl" {te = p;p--;{ found_syllable (myanmar_non_myanmar_cluster); }} break; -#line 498 "hb-ot-shaper-myanmar-machine.hh" +#line 523 "hb-ot-shaper-myanmar-machine.hh" } _again: @@ -528,7 +528,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 505 "hb-ot-shaper-myanmar-machine.hh" +#line 532 "hb-ot-shaper-myanmar-machine.hh" } if ( ++p != pe ) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh index 5b3ec05616..41e8a34f3b 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh @@ -53,7 +53,7 @@ enum use_syllable_type_t { }; -#line 54 "hb-ot-shaper-use-machine.hh" +#line 57 "hb-ot-shaper-use-machine.hh" #define use_syllable_machine_ex_B 1u #define use_syllable_machine_ex_CGJ 6u #define use_syllable_machine_ex_CMAbv 31u @@ -97,523 +97,669 @@ enum use_syllable_type_t { #define use_syllable_machine_ex_ZWNJ 14u -#line 96 "hb-ot-shaper-use-machine.hh" +#line 101 "hb-ot-shaper-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 0u, 53u, 11u, 53u, 11u, 53u, 1u, 53u, 23u, 48u, 24u, 47u, 25u, 47u, 26u, 47u, - 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 1u, 1u, 24u, 48u, 22u, 53u, - 23u, 53u, 23u, 53u, 23u, 53u, 12u, 53u, 23u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, - 11u, 53u, 1u, 1u, 1u, 48u, 11u, 53u, 41u, 42u, 42u, 42u, 11u, 53u, 11u, 53u, - 1u, 53u, 23u, 48u, 24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, - 24u, 48u, 24u, 48u, 1u, 1u, 24u, 48u, 22u, 53u, 23u, 53u, 23u, 53u, 23u, 53u, - 12u, 53u, 23u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 1u, 1u, 48u, - 13u, 13u, 4u, 4u, 11u, 53u, 11u, 53u, 1u, 53u, 23u, 48u, 24u, 47u, 25u, 47u, - 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 1u, 1u, 24u, 48u, - 22u, 53u, 23u, 53u, 23u, 53u, 23u, 53u, 12u, 53u, 23u, 53u, 12u, 53u, 12u, 53u, - 12u, 53u, 11u, 53u, 1u, 1u, 1u, 48u, 11u, 53u, 11u, 53u, 1u, 53u, 23u, 48u, - 24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, - 1u, 1u, 24u, 48u, 22u, 53u, 23u, 53u, 23u, 53u, 23u, 53u, 12u, 53u, 23u, 53u, - 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 1u, 1u, 48u, 4u, 4u, 13u, 13u, - 1u, 53u, 11u, 53u, 41u, 42u, 42u, 42u, 1u, 5u, 50u, 52u, 49u, 52u, 49u, 51u, - 0 + 0u, 53u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, + 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, + 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, + 12u, 53u, 11u, 53u, 1u, 14u, 1u, 48u, 11u, 53u, 14u, 42u, 14u, 42u, 11u, 53u, + 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, + 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, + 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, + 1u, 14u, 1u, 14u, 1u, 48u, 13u, 14u, 4u, 14u, 11u, 53u, 11u, 53u, 1u, 53u, + 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, + 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, + 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 1u, 14u, + 1u, 48u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, + 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, + 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, + 12u, 53u, 11u, 53u, 1u, 14u, 1u, 48u, 4u, 14u, 13u, 14u, 1u, 53u, 11u, 53u, + 14u, 42u, 14u, 42u, 1u, 5u, 14u, 52u, 14u, 52u, 14u, 51u, 0 }; static const char _use_syllable_machine_key_spans[] = { - 54, 43, 43, 53, 26, 24, 23, 22, - 2, 1, 25, 25, 25, 1, 25, 32, - 31, 31, 31, 42, 31, 42, 42, 42, - 43, 1, 48, 43, 2, 1, 43, 43, - 53, 26, 24, 23, 22, 2, 1, 25, - 25, 25, 1, 25, 32, 31, 31, 31, - 42, 31, 42, 42, 42, 43, 1, 48, - 1, 1, 43, 43, 53, 26, 24, 23, - 22, 2, 1, 25, 25, 25, 1, 25, - 32, 31, 31, 31, 42, 31, 42, 42, - 42, 43, 1, 48, 43, 43, 53, 26, - 24, 23, 22, 2, 1, 25, 25, 25, - 1, 25, 32, 31, 31, 31, 42, 31, - 42, 42, 42, 43, 1, 48, 1, 1, - 53, 43, 2, 1, 5, 3, 4, 3 + 54, 43, 43, 53, 35, 34, 34, 34, + 33, 33, 1, 35, 35, 35, 14, 35, + 40, 40, 40, 40, 42, 40, 42, 42, + 42, 43, 14, 48, 43, 29, 29, 43, + 43, 53, 35, 34, 34, 34, 33, 33, + 1, 35, 35, 35, 14, 35, 40, 40, + 40, 40, 42, 40, 42, 42, 42, 43, + 14, 14, 48, 2, 11, 43, 43, 53, + 35, 34, 34, 34, 33, 33, 1, 35, + 35, 35, 14, 35, 40, 40, 40, 40, + 42, 40, 42, 42, 42, 43, 14, 14, + 48, 43, 43, 53, 35, 34, 34, 34, + 33, 33, 1, 35, 35, 35, 14, 35, + 40, 40, 40, 40, 42, 40, 42, 42, + 42, 43, 14, 48, 11, 2, 53, 43, + 29, 29, 5, 39, 39, 38 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 55, 99, 143, 197, 224, 249, 273, - 296, 299, 301, 327, 353, 379, 381, 407, - 440, 472, 504, 536, 579, 611, 654, 697, - 740, 784, 786, 835, 879, 882, 884, 928, - 972, 1026, 1053, 1078, 1102, 1125, 1128, 1130, - 1156, 1182, 1208, 1210, 1236, 1269, 1301, 1333, - 1365, 1408, 1440, 1483, 1526, 1569, 1613, 1615, - 1664, 1666, 1668, 1712, 1756, 1810, 1837, 1862, - 1886, 1909, 1912, 1914, 1940, 1966, 1992, 1994, - 2020, 2053, 2085, 2117, 2149, 2192, 2224, 2267, - 2310, 2353, 2397, 2399, 2448, 2492, 2536, 2590, - 2617, 2642, 2666, 2689, 2692, 2694, 2720, 2746, - 2772, 2774, 2800, 2833, 2865, 2897, 2929, 2972, - 3004, 3047, 3090, 3133, 3177, 3179, 3228, 3230, - 3232, 3286, 3330, 3333, 3335, 3341, 3345, 3350 + 0, 55, 99, 143, 197, 233, 268, 303, + 338, 372, 406, 408, 444, 480, 516, 531, + 567, 608, 649, 690, 731, 774, 815, 858, + 901, 944, 988, 1003, 1052, 1096, 1126, 1156, + 1200, 1244, 1298, 1334, 1369, 1404, 1439, 1473, + 1507, 1509, 1545, 1581, 1617, 1632, 1668, 1709, + 1750, 1791, 1832, 1875, 1916, 1959, 2002, 2045, + 2089, 2104, 2119, 2168, 2171, 2183, 2227, 2271, + 2325, 2361, 2396, 2431, 2466, 2500, 2534, 2536, + 2572, 2608, 2644, 2659, 2695, 2736, 2777, 2818, + 2859, 2902, 2943, 2986, 3029, 3072, 3116, 3131, + 3146, 3195, 3239, 3283, 3337, 3373, 3408, 3443, + 3478, 3512, 3546, 3548, 3584, 3620, 3656, 3671, + 3707, 3748, 3789, 3830, 3871, 3914, 3955, 3998, + 4041, 4084, 4128, 4143, 4192, 4204, 4207, 4261, + 4305, 4335, 4365, 4371, 4411, 4451 }; static const unsigned char _use_syllable_machine_indicies[] = { 0, 1, 2, 2, 3, 4, 2, 2, - 2, 2, 2, 5, 6, 7, 2, 2, - 2, 2, 8, 2, 2, 2, 9, 10, + 2, 2, 2, 5, 6, 7, 8, 2, + 2, 2, 9, 2, 2, 2, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 2, 24, 25, 26, + 2, 27, 28, 29, 30, 31, 32, 33, + 30, 34, 2, 35, 2, 36, 2, 38, + 39, 37, 40, 37, 37, 37, 37, 37, + 37, 37, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, + 37, 55, 56, 57, 37, 58, 59, 37, + 60, 61, 62, 63, 60, 37, 37, 37, + 37, 64, 37, 38, 39, 37, 40, 37, + 37, 37, 37, 37, 37, 37, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 51, + 51, 52, 53, 54, 37, 55, 56, 57, + 37, 37, 37, 37, 60, 61, 62, 63, + 60, 37, 37, 37, 37, 64, 37, 38, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 40, 37, 37, 37, + 37, 37, 37, 37, 37, 42, 43, 44, + 45, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 55, 56, 57, 37, 37, + 37, 37, 37, 61, 62, 63, 65, 37, + 37, 37, 37, 42, 37, 40, 37, 37, + 37, 37, 37, 37, 37, 37, 42, 43, + 44, 45, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 55, 56, 57, 37, + 37, 37, 37, 37, 61, 62, 63, 65, + 37, 40, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 43, 44, 45, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 61, 62, 63, 37, 40, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 44, + 45, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 61, 62, 63, 37, 40, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 45, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 61, 62, + 63, 37, 40, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 61, 62, 37, 40, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 62, 37, 40, 37, + 40, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 43, 44, 45, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 55, + 56, 57, 37, 37, 37, 37, 37, 61, + 62, 63, 65, 37, 40, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 43, 44, + 45, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 56, 57, 37, 37, + 37, 37, 37, 61, 62, 63, 65, 37, + 40, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 43, 44, 45, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 57, 37, 37, 37, 37, 37, 61, + 62, 63, 65, 37, 66, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 40, 37, 40, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 43, 44, 45, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 61, 62, 63, 65, 37, 40, + 37, 37, 37, 37, 37, 37, 37, 41, + 42, 43, 44, 45, 37, 37, 37, 37, + 37, 37, 52, 53, 54, 37, 55, 56, + 57, 37, 37, 37, 37, 37, 61, 62, + 63, 65, 37, 37, 37, 37, 42, 37, + 40, 37, 37, 37, 37, 37, 37, 37, + 37, 42, 43, 44, 45, 37, 37, 37, + 37, 37, 37, 52, 53, 54, 37, 55, + 56, 57, 37, 37, 37, 37, 37, 61, + 62, 63, 65, 37, 37, 37, 37, 42, + 37, 40, 37, 37, 37, 37, 37, 37, + 37, 37, 42, 43, 44, 45, 37, 37, + 37, 37, 37, 37, 37, 53, 54, 37, + 55, 56, 57, 37, 37, 37, 37, 37, + 61, 62, 63, 65, 37, 37, 37, 37, + 42, 37, 40, 37, 37, 37, 37, 37, + 37, 37, 37, 42, 43, 44, 45, 37, + 37, 37, 37, 37, 37, 37, 37, 54, + 37, 55, 56, 57, 37, 37, 37, 37, + 37, 61, 62, 63, 65, 37, 37, 37, + 37, 42, 37, 67, 37, 40, 37, 37, + 37, 37, 37, 37, 37, 41, 42, 43, + 44, 45, 37, 47, 48, 37, 37, 37, + 52, 53, 54, 37, 55, 56, 57, 37, + 37, 37, 37, 37, 61, 62, 63, 65, + 37, 37, 37, 37, 42, 37, 40, 37, + 37, 37, 37, 37, 37, 37, 37, 42, + 43, 44, 45, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 55, 56, 57, + 37, 37, 37, 37, 37, 61, 62, 63, + 65, 37, 37, 37, 37, 42, 37, 67, + 37, 40, 37, 37, 37, 37, 37, 37, + 37, 41, 42, 43, 44, 45, 37, 37, + 48, 37, 37, 37, 52, 53, 54, 37, + 55, 56, 57, 37, 37, 37, 37, 37, + 61, 62, 63, 65, 37, 37, 37, 37, + 42, 37, 67, 37, 40, 37, 37, 37, + 37, 37, 37, 37, 41, 42, 43, 44, + 45, 37, 37, 37, 37, 37, 37, 52, + 53, 54, 37, 55, 56, 57, 37, 37, + 37, 37, 37, 61, 62, 63, 65, 37, + 37, 37, 37, 42, 37, 67, 37, 40, + 37, 37, 37, 37, 37, 37, 37, 41, + 42, 43, 44, 45, 46, 47, 48, 37, + 37, 37, 52, 53, 54, 37, 55, 56, + 57, 37, 37, 37, 37, 37, 61, 62, + 63, 65, 37, 37, 37, 37, 42, 37, + 38, 39, 37, 40, 37, 37, 37, 37, + 37, 37, 37, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 37, 51, 52, 53, + 54, 37, 55, 56, 57, 37, 37, 37, + 37, 60, 61, 62, 63, 60, 37, 37, + 37, 37, 64, 37, 38, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 40, 37, 38, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 40, 37, 37, 37, 37, 37, 37, 37, + 37, 42, 43, 44, 45, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 55, + 56, 57, 37, 37, 37, 37, 37, 61, + 62, 63, 65, 37, 38, 39, 37, 40, + 37, 37, 37, 37, 37, 37, 37, 41, + 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 37, 55, 56, + 57, 37, 37, 37, 37, 60, 61, 62, + 63, 60, 37, 37, 37, 37, 64, 37, + 40, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 58, 59, 37, 40, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 59, 37, 69, 70, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 72, + 73, 74, 75, 76, 77, 78, 79, 80, + 1, 81, 82, 83, 84, 68, 85, 86, + 87, 68, 68, 68, 68, 88, 89, 90, + 91, 92, 68, 68, 68, 68, 93, 68, + 69, 70, 68, 71, 68, 68, 68, 68, + 68, 68, 68, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 81, 82, 83, + 84, 68, 85, 86, 87, 68, 68, 68, + 68, 88, 89, 90, 91, 92, 68, 68, + 68, 68, 93, 68, 69, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 68, 73, 74, 75, 76, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 85, 86, 87, 68, 68, 68, 68, 68, + 89, 90, 91, 94, 68, 68, 68, 68, + 73, 68, 71, 68, 68, 68, 68, 68, + 68, 68, 68, 73, 74, 75, 76, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 85, 86, 87, 68, 68, 68, 68, + 68, 89, 90, 91, 94, 68, 71, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 74, 75, 76, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 89, 90, 91, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 75, 76, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 89, 90, 91, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 76, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 89, 90, 91, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 89, 90, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 90, 68, 71, 68, 71, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 74, + 75, 76, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 85, 86, 87, 68, + 68, 68, 68, 68, 89, 90, 91, 94, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 74, 75, 76, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 86, 87, 68, 68, 68, 68, 68, + 89, 90, 91, 94, 68, 71, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 74, + 75, 76, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 87, 68, + 68, 68, 68, 68, 89, 90, 91, 94, + 68, 96, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 97, 95, + 71, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 74, 75, 76, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 89, + 90, 91, 94, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 72, 73, 74, 75, + 76, 68, 68, 68, 68, 68, 68, 82, + 83, 84, 68, 85, 86, 87, 68, 68, + 68, 68, 68, 89, 90, 91, 94, 68, + 68, 68, 68, 73, 68, 71, 68, 68, + 68, 68, 68, 68, 68, 68, 73, 74, + 75, 76, 68, 68, 68, 68, 68, 68, + 82, 83, 84, 68, 85, 86, 87, 68, + 68, 68, 68, 68, 89, 90, 91, 94, + 68, 68, 68, 68, 73, 68, 71, 68, + 68, 68, 68, 68, 68, 68, 68, 73, + 74, 75, 76, 68, 68, 68, 68, 68, + 68, 68, 83, 84, 68, 85, 86, 87, + 68, 68, 68, 68, 68, 89, 90, 91, + 94, 68, 68, 68, 68, 73, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 68, + 73, 74, 75, 76, 68, 68, 68, 68, + 68, 68, 68, 68, 84, 68, 85, 86, + 87, 68, 68, 68, 68, 68, 89, 90, + 91, 94, 68, 68, 68, 68, 73, 68, + 98, 68, 71, 68, 68, 68, 68, 68, + 68, 68, 72, 73, 74, 75, 76, 68, + 78, 79, 68, 68, 68, 82, 83, 84, + 68, 85, 86, 87, 68, 68, 68, 68, + 68, 89, 90, 91, 94, 68, 68, 68, + 68, 73, 68, 71, 68, 68, 68, 68, + 68, 68, 68, 68, 73, 74, 75, 76, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 85, 86, 87, 68, 68, 68, + 68, 68, 89, 90, 91, 94, 68, 68, + 68, 68, 73, 68, 98, 68, 71, 68, + 68, 68, 68, 68, 68, 68, 72, 73, + 74, 75, 76, 68, 68, 79, 68, 68, + 68, 82, 83, 84, 68, 85, 86, 87, + 68, 68, 68, 68, 68, 89, 90, 91, + 94, 68, 68, 68, 68, 73, 68, 98, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 72, 73, 74, 75, 76, 68, 68, + 68, 68, 68, 68, 82, 83, 84, 68, + 85, 86, 87, 68, 68, 68, 68, 68, + 89, 90, 91, 94, 68, 68, 68, 68, + 73, 68, 98, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 72, 73, 74, 75, + 76, 77, 78, 79, 68, 68, 68, 82, + 83, 84, 68, 85, 86, 87, 68, 68, + 68, 68, 68, 89, 90, 91, 94, 68, + 68, 68, 68, 73, 68, 69, 70, 68, + 71, 68, 68, 68, 68, 68, 68, 68, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 68, 81, 82, 83, 84, 68, 85, + 86, 87, 68, 68, 68, 68, 88, 89, + 90, 91, 92, 68, 68, 68, 68, 93, + 68, 69, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 100, 99, + 69, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 97, 95, 69, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 68, 73, 74, 75, + 76, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 85, 86, 87, 68, 68, + 68, 68, 68, 89, 90, 91, 94, 68, + 102, 103, 101, 3, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 105, 104, 106, + 107, 68, 71, 68, 68, 68, 68, 68, + 68, 68, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, + 68, 122, 123, 124, 68, 58, 59, 68, + 125, 126, 127, 128, 129, 68, 68, 68, + 68, 130, 68, 106, 107, 68, 71, 68, + 68, 68, 68, 68, 68, 68, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 118, + 118, 119, 120, 121, 68, 122, 123, 124, + 68, 68, 68, 68, 125, 126, 127, 128, + 129, 68, 68, 68, 68, 130, 68, 106, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 68, 109, 110, 111, + 112, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 122, 123, 124, 68, 68, + 68, 68, 68, 126, 127, 128, 131, 68, + 68, 68, 68, 109, 68, 71, 68, 68, + 68, 68, 68, 68, 68, 68, 109, 110, + 111, 112, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 122, 123, 124, 68, + 68, 68, 68, 68, 126, 127, 128, 131, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 110, 111, 112, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 126, 127, 128, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 111, + 112, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 126, 127, 128, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 112, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 126, 127, + 128, 68, 71, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 126, 127, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 127, 68, 71, 68, + 71, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 110, 111, 112, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 122, + 123, 124, 68, 68, 68, 68, 68, 126, + 127, 128, 131, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 110, 111, + 112, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 123, 124, 68, 68, + 68, 68, 68, 126, 127, 128, 131, 68, + 71, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 110, 111, 112, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 124, 68, 68, 68, 68, 68, 126, + 127, 128, 131, 68, 132, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, + 95, 97, 95, 71, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 110, 111, 112, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 126, 127, 128, 131, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 108, + 109, 110, 111, 112, 68, 68, 68, 68, + 68, 68, 119, 120, 121, 68, 122, 123, + 124, 68, 68, 68, 68, 68, 126, 127, + 128, 131, 68, 68, 68, 68, 109, 68, + 71, 68, 68, 68, 68, 68, 68, 68, + 68, 109, 110, 111, 112, 68, 68, 68, + 68, 68, 68, 119, 120, 121, 68, 122, + 123, 124, 68, 68, 68, 68, 68, 126, + 127, 128, 131, 68, 68, 68, 68, 109, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 68, 109, 110, 111, 112, 68, 68, + 68, 68, 68, 68, 68, 120, 121, 68, + 122, 123, 124, 68, 68, 68, 68, 68, + 126, 127, 128, 131, 68, 68, 68, 68, + 109, 68, 71, 68, 68, 68, 68, 68, + 68, 68, 68, 109, 110, 111, 112, 68, + 68, 68, 68, 68, 68, 68, 68, 121, + 68, 122, 123, 124, 68, 68, 68, 68, + 68, 126, 127, 128, 131, 68, 68, 68, + 68, 109, 68, 133, 68, 71, 68, 68, + 68, 68, 68, 68, 68, 108, 109, 110, + 111, 112, 68, 114, 115, 68, 68, 68, + 119, 120, 121, 68, 122, 123, 124, 68, + 68, 68, 68, 68, 126, 127, 128, 131, + 68, 68, 68, 68, 109, 68, 71, 68, + 68, 68, 68, 68, 68, 68, 68, 109, + 110, 111, 112, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 122, 123, 124, + 68, 68, 68, 68, 68, 126, 127, 128, + 131, 68, 68, 68, 68, 109, 68, 133, + 68, 71, 68, 68, 68, 68, 68, 68, + 68, 108, 109, 110, 111, 112, 68, 68, + 115, 68, 68, 68, 119, 120, 121, 68, + 122, 123, 124, 68, 68, 68, 68, 68, + 126, 127, 128, 131, 68, 68, 68, 68, + 109, 68, 133, 68, 71, 68, 68, 68, + 68, 68, 68, 68, 108, 109, 110, 111, + 112, 68, 68, 68, 68, 68, 68, 119, + 120, 121, 68, 122, 123, 124, 68, 68, + 68, 68, 68, 126, 127, 128, 131, 68, + 68, 68, 68, 109, 68, 133, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 108, + 109, 110, 111, 112, 113, 114, 115, 68, + 68, 68, 119, 120, 121, 68, 122, 123, + 124, 68, 68, 68, 68, 68, 126, 127, + 128, 131, 68, 68, 68, 68, 109, 68, + 106, 107, 68, 71, 68, 68, 68, 68, + 68, 68, 68, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 68, 118, 119, 120, + 121, 68, 122, 123, 124, 68, 68, 68, + 68, 125, 126, 127, 128, 129, 68, 68, + 68, 68, 130, 68, 106, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 100, 99, 106, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, + 97, 95, 106, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 71, + 68, 68, 68, 68, 68, 68, 68, 68, + 109, 110, 111, 112, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 122, 123, + 124, 68, 68, 68, 68, 68, 126, 127, + 128, 131, 68, 106, 107, 68, 71, 68, + 68, 68, 68, 68, 68, 68, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 68, 122, 123, 124, + 68, 68, 68, 68, 125, 126, 127, 128, + 129, 68, 68, 68, 68, 130, 68, 5, + 6, 134, 8, 134, 134, 134, 134, 134, + 134, 134, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 20, 20, 21, 22, 23, + 134, 24, 25, 26, 134, 134, 134, 134, + 30, 31, 32, 33, 30, 134, 134, 134, + 134, 36, 134, 5, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 8, 134, 134, 134, 134, 134, 134, 134, + 134, 11, 12, 13, 14, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 24, + 25, 26, 134, 134, 134, 134, 134, 31, + 32, 33, 135, 134, 134, 134, 134, 11, + 134, 8, 134, 134, 134, 134, 134, 134, + 134, 134, 11, 12, 13, 14, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 24, 25, 26, 134, 134, 134, 134, 134, + 31, 32, 33, 135, 134, 8, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 12, + 13, 14, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 31, 32, 33, 134, + 8, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 13, 14, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 31, + 32, 33, 134, 8, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 14, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 31, 32, 33, 134, 8, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 31, 32, 134, + 8, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 32, 134, 8, 134, 8, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 12, 13, + 14, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 24, 25, 26, 134, 134, + 134, 134, 134, 31, 32, 33, 135, 134, + 8, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 12, 13, 14, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 25, 26, 134, 134, 134, 134, 134, 31, + 32, 33, 135, 134, 8, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 12, 13, + 14, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 26, 134, 134, + 134, 134, 134, 31, 32, 33, 135, 134, + 136, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 8, 134, 8, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 12, 13, 14, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 31, 32, + 33, 135, 134, 8, 134, 134, 134, 134, + 134, 134, 134, 10, 11, 12, 13, 14, + 134, 134, 134, 134, 134, 134, 21, 22, + 23, 134, 24, 25, 26, 134, 134, 134, + 134, 134, 31, 32, 33, 135, 134, 134, + 134, 134, 11, 134, 8, 134, 134, 134, + 134, 134, 134, 134, 134, 11, 12, 13, + 14, 134, 134, 134, 134, 134, 134, 21, + 22, 23, 134, 24, 25, 26, 134, 134, + 134, 134, 134, 31, 32, 33, 135, 134, + 134, 134, 134, 11, 134, 8, 134, 134, + 134, 134, 134, 134, 134, 134, 11, 12, + 13, 14, 134, 134, 134, 134, 134, 134, + 134, 22, 23, 134, 24, 25, 26, 134, + 134, 134, 134, 134, 31, 32, 33, 135, + 134, 134, 134, 134, 11, 134, 8, 134, + 134, 134, 134, 134, 134, 134, 134, 11, + 12, 13, 14, 134, 134, 134, 134, 134, + 134, 134, 134, 23, 134, 24, 25, 26, + 134, 134, 134, 134, 134, 31, 32, 33, + 135, 134, 134, 134, 134, 11, 134, 137, + 134, 8, 134, 134, 134, 134, 134, 134, + 134, 10, 11, 12, 13, 14, 134, 16, + 17, 134, 134, 134, 21, 22, 23, 134, + 24, 25, 26, 134, 134, 134, 134, 134, + 31, 32, 33, 135, 134, 134, 134, 134, + 11, 134, 8, 134, 134, 134, 134, 134, + 134, 134, 134, 11, 12, 13, 14, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 24, 25, 26, 134, 134, 134, 134, + 134, 31, 32, 33, 135, 134, 134, 134, + 134, 11, 134, 137, 134, 8, 134, 134, + 134, 134, 134, 134, 134, 10, 11, 12, + 13, 14, 134, 134, 17, 134, 134, 134, + 21, 22, 23, 134, 24, 25, 26, 134, + 134, 134, 134, 134, 31, 32, 33, 135, + 134, 134, 134, 134, 11, 134, 137, 134, + 8, 134, 134, 134, 134, 134, 134, 134, + 10, 11, 12, 13, 14, 134, 134, 134, + 134, 134, 134, 21, 22, 23, 134, 24, + 25, 26, 134, 134, 134, 134, 134, 31, + 32, 33, 135, 134, 134, 134, 134, 11, + 134, 137, 134, 8, 134, 134, 134, 134, + 134, 134, 134, 10, 11, 12, 13, 14, + 15, 16, 17, 134, 134, 134, 21, 22, + 23, 134, 24, 25, 26, 134, 134, 134, + 134, 134, 31, 32, 33, 135, 134, 134, + 134, 134, 11, 134, 5, 6, 134, 8, + 134, 134, 134, 134, 134, 134, 134, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 2, 23, 24, 25, - 2, 26, 27, 28, 29, 30, 31, 32, - 29, 33, 2, 34, 2, 35, 2, 37, - 38, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, - 36, 53, 54, 55, 36, 56, 57, 36, - 58, 59, 60, 61, 58, 36, 36, 36, - 36, 62, 36, 37, 38, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 49, - 49, 50, 51, 52, 36, 53, 54, 55, - 36, 36, 36, 36, 58, 59, 60, 61, - 58, 36, 36, 36, 36, 62, 36, 37, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 40, 41, 42, - 43, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 53, 54, 55, 36, 36, - 36, 36, 36, 59, 60, 61, 63, 36, - 36, 36, 36, 40, 36, 40, 41, 42, - 43, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 53, 54, 55, 36, 36, - 36, 36, 36, 59, 60, 61, 63, 36, - 41, 42, 43, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 59, 60, 61, - 36, 42, 43, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 59, 60, 61, - 36, 43, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 59, 60, 61, 36, - 59, 60, 36, 60, 36, 41, 42, 43, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 53, 54, 55, 36, 36, 36, - 36, 36, 59, 60, 61, 63, 36, 41, - 42, 43, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 54, 55, 36, - 36, 36, 36, 36, 59, 60, 61, 63, - 36, 41, 42, 43, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 64, 36, 41, 42, 43, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 59, 60, 61, 63, 36, 39, - 40, 41, 42, 43, 36, 36, 36, 36, - 36, 36, 50, 51, 52, 36, 53, 54, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 36, 36, 36, 40, 36, - 40, 41, 42, 43, 36, 36, 36, 36, - 36, 36, 50, 51, 52, 36, 53, 54, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 36, 36, 36, 40, 36, - 40, 41, 42, 43, 36, 36, 36, 36, - 36, 36, 36, 51, 52, 36, 53, 54, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 36, 36, 36, 40, 36, - 40, 41, 42, 43, 36, 36, 36, 36, - 36, 36, 36, 36, 52, 36, 53, 54, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 36, 36, 36, 40, 36, - 65, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 39, 40, 41, 42, 43, 36, - 45, 46, 36, 36, 36, 50, 51, 52, - 36, 53, 54, 55, 36, 36, 36, 36, - 36, 59, 60, 61, 63, 36, 36, 36, - 36, 40, 36, 40, 41, 42, 43, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 53, 54, 55, 36, 36, 36, 36, - 36, 59, 60, 61, 63, 36, 36, 36, - 36, 40, 36, 65, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 39, 40, 41, - 42, 43, 36, 36, 46, 36, 36, 36, - 50, 51, 52, 36, 53, 54, 55, 36, - 36, 36, 36, 36, 59, 60, 61, 63, - 36, 36, 36, 36, 40, 36, 65, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 39, 40, 41, 42, 43, 36, 36, 36, - 36, 36, 36, 50, 51, 52, 36, 53, - 54, 55, 36, 36, 36, 36, 36, 59, - 60, 61, 63, 36, 36, 36, 36, 40, - 36, 65, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 39, 40, 41, 42, 43, - 44, 45, 46, 36, 36, 36, 50, 51, - 52, 36, 53, 54, 55, 36, 36, 36, - 36, 36, 59, 60, 61, 63, 36, 36, - 36, 36, 40, 36, 37, 38, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 36, 49, 50, 51, 52, 36, 53, 54, - 55, 36, 36, 36, 36, 58, 59, 60, - 61, 58, 36, 36, 36, 36, 62, 36, - 37, 36, 37, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 40, 41, 42, 43, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 53, 54, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 37, 38, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 36, 53, 54, 55, - 36, 36, 36, 36, 58, 59, 60, 61, - 58, 36, 36, 36, 36, 62, 36, 56, - 57, 36, 57, 36, 67, 68, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 69, - 70, 71, 72, 73, 74, 75, 76, 77, - 1, 78, 79, 80, 81, 66, 82, 83, - 84, 66, 66, 66, 66, 85, 86, 87, - 88, 89, 66, 66, 66, 66, 90, 66, - 67, 68, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 78, 79, 80, - 81, 66, 82, 83, 84, 66, 66, 66, - 66, 85, 86, 87, 88, 89, 66, 66, - 66, 66, 90, 66, 67, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 70, 71, 72, 73, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 82, 83, 84, 66, 66, 66, 66, 66, - 86, 87, 88, 91, 66, 66, 66, 66, - 70, 66, 70, 71, 72, 73, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 82, 83, 84, 66, 66, 66, 66, 66, - 86, 87, 88, 91, 66, 71, 72, 73, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 86, 87, 88, 66, 72, 73, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 86, 87, 88, 66, 73, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 86, 87, 88, 66, 86, 87, 66, - 87, 66, 71, 72, 73, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 82, - 83, 84, 66, 66, 66, 66, 66, 86, - 87, 88, 91, 66, 71, 72, 73, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 83, 84, 66, 66, 66, 66, - 66, 86, 87, 88, 91, 66, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 93, 92, 71, 72, 73, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 86, - 87, 88, 91, 66, 69, 70, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 79, - 80, 81, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 66, 66, 66, 70, 66, 70, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 79, - 80, 81, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 66, 66, 66, 70, 66, 70, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 66, - 80, 81, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 66, 66, 66, 70, 66, 70, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 66, - 66, 81, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 66, 66, 66, 70, 66, 94, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 69, - 70, 71, 72, 73, 66, 75, 76, 66, - 66, 66, 79, 80, 81, 66, 82, 83, - 84, 66, 66, 66, 66, 66, 86, 87, - 88, 91, 66, 66, 66, 66, 70, 66, - 70, 71, 72, 73, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 82, 83, - 84, 66, 66, 66, 66, 66, 86, 87, - 88, 91, 66, 66, 66, 66, 70, 66, - 94, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 69, 70, 71, 72, 73, 66, - 66, 76, 66, 66, 66, 79, 80, 81, - 66, 82, 83, 84, 66, 66, 66, 66, - 66, 86, 87, 88, 91, 66, 66, 66, - 66, 70, 66, 94, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 69, 70, 71, - 72, 73, 66, 66, 66, 66, 66, 66, - 79, 80, 81, 66, 82, 83, 84, 66, - 66, 66, 66, 66, 86, 87, 88, 91, - 66, 66, 66, 66, 70, 66, 94, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 69, 70, 71, 72, 73, 74, 75, 76, - 66, 66, 66, 79, 80, 81, 66, 82, - 83, 84, 66, 66, 66, 66, 66, 86, - 87, 88, 91, 66, 66, 66, 66, 70, - 66, 67, 68, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 66, 78, 79, - 80, 81, 66, 82, 83, 84, 66, 66, - 66, 66, 85, 86, 87, 88, 89, 66, - 66, 66, 66, 90, 66, 67, 95, 67, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 70, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 97, 96, 3, 98, 99, 100, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 101, - 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 66, 115, 116, - 117, 66, 56, 57, 66, 118, 119, 120, - 88, 121, 66, 66, 66, 66, 122, 66, - 99, 100, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 111, 111, 112, 113, - 114, 66, 115, 116, 117, 66, 66, 66, - 66, 118, 119, 120, 88, 121, 66, 66, - 66, 66, 122, 66, 99, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 102, 103, 104, 105, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 115, 116, 117, 66, 66, 66, 66, 66, - 119, 120, 88, 123, 66, 66, 66, 66, - 102, 66, 102, 103, 104, 105, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 115, 116, 117, 66, 66, 66, 66, 66, - 119, 120, 88, 123, 66, 103, 104, 105, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 119, 120, 88, 66, 104, 105, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 119, 120, 88, 66, 105, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 119, 120, 88, 66, 119, 120, 66, - 120, 66, 103, 104, 105, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 115, - 116, 117, 66, 66, 66, 66, 66, 119, - 120, 88, 123, 66, 103, 104, 105, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 116, 117, 66, 66, 66, 66, - 66, 119, 120, 88, 123, 66, 103, 104, - 105, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 117, 66, 66, - 66, 66, 66, 119, 120, 88, 123, 66, - 124, 92, 103, 104, 105, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 119, - 120, 88, 123, 66, 101, 102, 103, 104, - 105, 66, 66, 66, 66, 66, 66, 112, - 113, 114, 66, 115, 116, 117, 66, 66, - 66, 66, 66, 119, 120, 88, 123, 66, - 66, 66, 66, 102, 66, 102, 103, 104, - 105, 66, 66, 66, 66, 66, 66, 112, - 113, 114, 66, 115, 116, 117, 66, 66, - 66, 66, 66, 119, 120, 88, 123, 66, - 66, 66, 66, 102, 66, 102, 103, 104, - 105, 66, 66, 66, 66, 66, 66, 66, - 113, 114, 66, 115, 116, 117, 66, 66, - 66, 66, 66, 119, 120, 88, 123, 66, - 66, 66, 66, 102, 66, 102, 103, 104, - 105, 66, 66, 66, 66, 66, 66, 66, - 66, 114, 66, 115, 116, 117, 66, 66, - 66, 66, 66, 119, 120, 88, 123, 66, - 66, 66, 66, 102, 66, 125, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 101, - 102, 103, 104, 105, 66, 107, 108, 66, - 66, 66, 112, 113, 114, 66, 115, 116, - 117, 66, 66, 66, 66, 66, 119, 120, - 88, 123, 66, 66, 66, 66, 102, 66, - 102, 103, 104, 105, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 115, 116, - 117, 66, 66, 66, 66, 66, 119, 120, - 88, 123, 66, 66, 66, 66, 102, 66, - 125, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 101, 102, 103, 104, 105, 66, - 66, 108, 66, 66, 66, 112, 113, 114, - 66, 115, 116, 117, 66, 66, 66, 66, - 66, 119, 120, 88, 123, 66, 66, 66, - 66, 102, 66, 125, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 101, 102, 103, - 104, 105, 66, 66, 66, 66, 66, 66, - 112, 113, 114, 66, 115, 116, 117, 66, - 66, 66, 66, 66, 119, 120, 88, 123, - 66, 66, 66, 66, 102, 66, 125, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 101, 102, 103, 104, 105, 106, 107, 108, - 66, 66, 66, 112, 113, 114, 66, 115, - 116, 117, 66, 66, 66, 66, 66, 119, - 120, 88, 123, 66, 66, 66, 66, 102, - 66, 99, 100, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 66, 111, 112, - 113, 114, 66, 115, 116, 117, 66, 66, - 66, 66, 118, 119, 120, 88, 121, 66, - 66, 66, 66, 122, 66, 99, 95, 99, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 102, 103, 104, - 105, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 115, 116, 117, 66, 66, - 66, 66, 66, 119, 120, 88, 123, 66, - 99, 100, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, - 114, 66, 115, 116, 117, 66, 66, 66, - 66, 118, 119, 120, 88, 121, 66, 66, - 66, 66, 122, 66, 5, 6, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 9, + 134, 20, 21, 22, 23, 134, 24, 25, + 26, 134, 134, 134, 134, 30, 31, 32, + 33, 30, 134, 134, 134, 134, 36, 134, + 5, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 8, 134, 5, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 8, 134, 134, 134, + 134, 134, 134, 134, 134, 11, 12, 13, + 14, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 24, 25, 26, 134, 134, + 134, 134, 134, 31, 32, 33, 135, 134, + 138, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 8, 134, 7, 8, 134, 1, + 134, 134, 134, 1, 134, 134, 134, 134, + 134, 5, 6, 7, 8, 134, 134, 134, + 134, 134, 134, 134, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 134, 24, 25, 26, 134, 27, + 28, 134, 30, 31, 32, 33, 30, 134, + 134, 134, 134, 36, 134, 5, 6, 134, + 8, 134, 134, 134, 134, 134, 134, 134, 10, 11, 12, 13, 14, 15, 16, 17, - 19, 19, 20, 21, 22, 126, 23, 24, - 25, 126, 126, 126, 126, 29, 30, 31, - 32, 29, 126, 126, 126, 126, 35, 126, - 5, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 10, 11, - 12, 13, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 23, 24, 25, 126, - 126, 126, 126, 126, 30, 31, 32, 127, - 126, 126, 126, 126, 10, 126, 10, 11, - 12, 13, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 23, 24, 25, 126, - 126, 126, 126, 126, 30, 31, 32, 127, - 126, 11, 12, 13, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 30, 31, - 32, 126, 12, 13, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 30, 31, - 32, 126, 13, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 30, 31, 32, - 126, 30, 31, 126, 31, 126, 11, 12, - 13, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 23, 24, 25, 126, 126, - 126, 126, 126, 30, 31, 32, 127, 126, - 11, 12, 13, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 24, 25, - 126, 126, 126, 126, 126, 30, 31, 32, - 127, 126, 11, 12, 13, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 25, 126, 126, 126, 126, 126, 30, - 31, 32, 127, 126, 128, 126, 11, 12, - 13, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 30, 31, 32, 127, 126, - 9, 10, 11, 12, 13, 126, 126, 126, - 126, 126, 126, 20, 21, 22, 126, 23, - 24, 25, 126, 126, 126, 126, 126, 30, - 31, 32, 127, 126, 126, 126, 126, 10, - 126, 10, 11, 12, 13, 126, 126, 126, - 126, 126, 126, 20, 21, 22, 126, 23, - 24, 25, 126, 126, 126, 126, 126, 30, - 31, 32, 127, 126, 126, 126, 126, 10, - 126, 10, 11, 12, 13, 126, 126, 126, - 126, 126, 126, 126, 21, 22, 126, 23, - 24, 25, 126, 126, 126, 126, 126, 30, - 31, 32, 127, 126, 126, 126, 126, 10, - 126, 10, 11, 12, 13, 126, 126, 126, - 126, 126, 126, 126, 126, 22, 126, 23, - 24, 25, 126, 126, 126, 126, 126, 30, - 31, 32, 127, 126, 126, 126, 126, 10, - 126, 129, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 9, 10, 11, 12, 13, - 126, 15, 16, 126, 126, 126, 20, 21, - 22, 126, 23, 24, 25, 126, 126, 126, - 126, 126, 30, 31, 32, 127, 126, 126, - 126, 126, 10, 126, 10, 11, 12, 13, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 23, 24, 25, 126, 126, 126, - 126, 126, 30, 31, 32, 127, 126, 126, - 126, 126, 10, 126, 129, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 9, 10, - 11, 12, 13, 126, 126, 16, 126, 126, - 126, 20, 21, 22, 126, 23, 24, 25, - 126, 126, 126, 126, 126, 30, 31, 32, - 127, 126, 126, 126, 126, 10, 126, 129, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 9, 10, 11, 12, 13, 126, 126, - 126, 126, 126, 126, 20, 21, 22, 126, - 23, 24, 25, 126, 126, 126, 126, 126, - 30, 31, 32, 127, 126, 126, 126, 126, - 10, 126, 129, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 9, 10, 11, 12, - 13, 14, 15, 16, 126, 126, 126, 20, - 21, 22, 126, 23, 24, 25, 126, 126, - 126, 126, 126, 30, 31, 32, 127, 126, - 126, 126, 126, 10, 126, 5, 6, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 9, 10, 11, 12, 13, 14, 15, 16, - 17, 126, 19, 20, 21, 22, 126, 23, - 24, 25, 126, 126, 126, 126, 29, 30, - 31, 32, 29, 126, 126, 126, 126, 35, - 126, 5, 126, 5, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 10, 11, 12, 13, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 23, - 24, 25, 126, 126, 126, 126, 126, 30, - 31, 32, 127, 126, 130, 126, 7, 126, - 1, 126, 126, 126, 1, 126, 126, 126, - 126, 126, 5, 6, 7, 126, 126, 126, - 126, 126, 126, 126, 126, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 126, 23, 24, 25, 126, - 26, 27, 126, 29, 30, 31, 32, 29, - 126, 126, 126, 126, 35, 126, 5, 6, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 126, - 23, 24, 25, 126, 126, 126, 126, 29, - 30, 31, 32, 29, 126, 126, 126, 126, - 35, 126, 26, 27, 126, 27, 126, 1, - 131, 131, 131, 1, 131, 133, 132, 33, - 132, 33, 133, 132, 133, 132, 33, 132, - 34, 132, 0 + 18, 19, 20, 21, 22, 23, 134, 24, + 25, 26, 134, 134, 134, 134, 30, 31, + 32, 33, 30, 134, 134, 134, 134, 36, + 134, 8, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 27, 28, 134, 8, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 28, 134, 1, 139, 139, + 139, 1, 139, 141, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 142, + 140, 34, 140, 141, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 34, 142, + 140, 142, 140, 141, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 34, 140, + 35, 140, 0 }; static const char _use_syllable_machine_trans_targs[] = { - 1, 30, 0, 56, 58, 85, 86, 110, - 112, 98, 87, 88, 89, 90, 102, 104, - 105, 106, 113, 107, 99, 100, 101, 93, - 94, 95, 114, 115, 116, 108, 91, 92, - 0, 117, 119, 109, 0, 2, 3, 15, - 4, 5, 6, 7, 19, 21, 22, 23, - 27, 24, 16, 17, 18, 10, 11, 12, - 28, 29, 25, 8, 9, 0, 26, 13, - 14, 20, 0, 31, 32, 44, 33, 34, - 35, 36, 48, 50, 51, 52, 53, 45, - 46, 47, 39, 40, 41, 54, 37, 38, - 0, 54, 55, 42, 0, 43, 49, 0, - 0, 57, 0, 59, 60, 72, 61, 62, - 63, 64, 76, 78, 79, 80, 84, 81, - 73, 74, 75, 67, 68, 69, 82, 65, - 66, 82, 83, 70, 71, 77, 0, 96, - 97, 103, 111, 0, 0, 118 + 1, 31, 0, 59, 61, 90, 91, 116, + 0, 118, 104, 92, 93, 94, 95, 108, + 110, 111, 112, 119, 113, 105, 106, 107, + 99, 100, 101, 120, 121, 122, 114, 96, + 97, 98, 123, 125, 115, 0, 2, 3, + 0, 16, 4, 5, 6, 7, 20, 22, + 23, 24, 28, 25, 17, 18, 19, 11, + 12, 13, 29, 30, 26, 8, 9, 10, + 27, 14, 15, 21, 0, 32, 33, 0, + 46, 34, 35, 36, 37, 50, 52, 53, + 54, 55, 47, 48, 49, 41, 42, 43, + 56, 38, 39, 40, 57, 58, 44, 0, + 45, 0, 51, 0, 0, 0, 60, 0, + 0, 0, 62, 63, 76, 64, 65, 66, + 67, 80, 82, 83, 84, 89, 85, 77, + 78, 79, 71, 72, 73, 86, 68, 69, + 70, 87, 88, 74, 75, 81, 0, 102, + 103, 109, 117, 0, 0, 0, 124 }; static const char _use_syllable_machine_trans_actions[] = { 0, 0, 3, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 0, 0, - 9, 10, 0, 0, 11, 0, 0, 12, - 13, 0, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 0, 10, 0, 11, 12, 13, 0, 14, + 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 0, - 0, 10, 0, 0, 0, 0, 15, 0, - 0, 0, 0, 16, 17, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 0, + 0, 0, 0, 18, 19, 20, 0 }; static const char _use_syllable_machine_to_state_actions[] = { @@ -631,7 +777,8 @@ static const char _use_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 }; static const char _use_syllable_machine_from_state_actions[] = { @@ -649,25 +796,27 @@ static const char _use_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 }; static const short _use_syllable_machine_eof_trans[] = { - 0, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 93, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 96, 67, - 97, 99, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 93, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 96, 67, 67, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 132, 133, 133, 133 + 0, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 96, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 100, 96, 69, 102, 105, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 96, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 100, 96, + 69, 69, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 140, 141, 141, 141 }; static const int use_syllable_machine_start = 0; @@ -780,7 +929,7 @@ find_syllables_use (hb_buffer_t *buffer) unsigned int act HB_UNUSED; int cs; -#line 773 "hb-ot-shaper-use-machine.hh" +#line 933 "hb-ot-shaper-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -793,7 +942,7 @@ find_syllables_use (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 782 "hb-ot-shaper-use-machine.hh" +#line 946 "hb-ot-shaper-use-machine.hh" { int _slen; int _trans; @@ -807,7 +956,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 794 "hb-ot-shaper-use-machine.hh" +#line 960 "hb-ot-shaper-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -825,14 +974,34 @@ _eof_trans: goto _again; switch ( _use_syllable_machine_trans_actions[_trans] ) { - case 9: + case 12: +#line 170 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_virama_terminated_cluster); }} + break; + case 10: +#line 171 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_sakot_terminated_cluster); }} + break; + case 8: #line 172 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_standard_cluster); }} break; + case 16: +#line 173 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_number_joiner_terminated_cluster); }} + break; + case 14: +#line 174 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_numeral_cluster); }} + break; case 6: #line 175 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_symbol_cluster); }} break; + case 20: +#line 176 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_hieroglyph_cluster); }} + break; case 4: #line 177 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} @@ -842,6 +1011,10 @@ _eof_trans: {te = p+1;{ found_syllable (use_non_cluster); }} break; case 11: +#line 170 "hb-ot-shaper-use-machine.rl" + {te = p;p--;{ found_syllable (use_virama_terminated_cluster); }} + break; + case 9: #line 171 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_sakot_terminated_cluster); }} break; @@ -849,7 +1022,7 @@ _eof_trans: #line 172 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_standard_cluster); }} break; - case 14: + case 15: #line 173 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_number_joiner_terminated_cluster); }} break; @@ -861,43 +1034,19 @@ _eof_trans: #line 175 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_symbol_cluster); }} break; - case 17: + case 19: #line 176 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_hieroglyph_cluster); }} break; - case 15: + case 17: #line 177 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; - case 16: + case 18: #line 178 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_non_cluster); }} break; - case 12: -#line 1 "NONE" - { switch( act ) { - case 1: - {{p = ((te))-1;} found_syllable (use_virama_terminated_cluster); } - break; - case 2: - {{p = ((te))-1;} found_syllable (use_sakot_terminated_cluster); } - break; - } - } - break; - case 8: -#line 1 "NONE" - {te = p+1;} -#line 170 "hb-ot-shaper-use-machine.rl" - {act = 1;} - break; - case 10: -#line 1 "NONE" - {te = p+1;} -#line 171 "hb-ot-shaper-use-machine.rl" - {act = 2;} - break; -#line 866 "hb-ot-shaper-use-machine.hh" +#line 1050 "hb-ot-shaper-use-machine.hh" } _again: @@ -906,7 +1055,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 873 "hb-ot-shaper-use-machine.hh" +#line 1059 "hb-ot-shaper-use-machine.hh" } if ( ++p != pe ) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh index e45ea30e60..6395d689ae 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh @@ -6,18 +6,18 @@ * * on files with these headers: * - * # IndicSyllabicCategory-14.0.0.txt - * # Date: 2021-05-22, 01:01:00 GMT [KW, RP] - * # IndicPositionalCategory-14.0.0.txt - * # Date: 2021-05-22, 01:01:00 GMT [KW, RP] - * # ArabicShaping-14.0.0.txt - * # Date: 2021-05-21, 01:54:00 GMT [KW, RP] - * # DerivedCoreProperties-14.0.0.txt - * # Date: 2021-08-12, 23:12:53 GMT - * # Blocks-14.0.0.txt - * # Date: 2021-01-22, 23:29:00 GMT [KW] - * # Scripts-14.0.0.txt - * # Date: 2021-07-10, 00:35:31 GMT + * # IndicSyllabicCategory-15.0.0.txt + * # Date: 2022-05-26, 02:18:00 GMT [KW, RP] + * # IndicPositionalCategory-15.0.0.txt + * # Date: 2022-05-26, 02:18:00 GMT [KW, RP] + * # ArabicShaping-15.0.0.txt + * # Date: 2022-02-14, 18:50:00 GMT [KW, RP] + * # DerivedCoreProperties-15.0.0.txt + * # Date: 2022-08-05, 22:17:05 GMT + * # Blocks-15.0.0.txt + * # Date: 2022-01-28, 20:58:00 GMT [KW] + * # Scripts-15.0.0.txt + * # Date: 2022-04-26, 23:15:02 GMT * # Override values For Indic_Syllabic_Category * # Not derivable * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17 @@ -90,7 +90,7 @@ #pragma GCC diagnostic pop static const uint8_t -hb_use_u8[3083] = +hb_use_u8[3115] = { 16, 50, 51, 51, 51, 52, 51, 83, 118, 131, 51, 57, 58, 179, 195, 61, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, @@ -114,22 +114,22 @@ hb_use_u8[3083] = 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 49, 2, 2, 2, 2, 2, 2, 2, 2, 50, 51, 2, 52, 2, 2, 53, 2, 2, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 2, 64, 65, 2, 66, 67, 68, 69, - 2, 70, 2, 71, 72, 73, 74, 2, 2, 75, 76, 77, 78, 2, 79, 2, - 2, 80, 80, 80, 80, 80, 80, 80, 80, 81, 2, 2, 2, 2, 2, 2, + 2, 70, 2, 71, 72, 73, 74, 2, 2, 75, 76, 77, 78, 2, 79, 80, + 2, 81, 81, 81, 81, 81, 81, 81, 81, 82, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 82, 83, 2, 2, 2, 2, 2, 2, 2, 84, - 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 80, 80, 80, 86, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 83, 84, 2, 2, 2, 2, 2, 2, 2, 85, + 86, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 81, 81, 81, 87, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 87, 88, 2, 2, 2, 2, 2, - 2, 2, 2, 89, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 88, 89, 2, 2, 2, 2, 2, + 2, 2, 2, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 90, 2, 2, 91, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 92, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 93, 93, 94, 95, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 2, 2, 2, 91, 2, 2, 92, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 93, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 94, 94, 95, 96, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 2, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, @@ -147,7 +147,7 @@ hb_use_u8[3083] = 7, 0, 0, 0, 2, 2, 2, 2, 2, 39, 40, 41, 0, 0, 0, 0, 0, 10, 13, 28, 2, 2, 2, 2, 28, 2, 28, 2, 2, 2, 2, 2, 2, 7, 2, 28, 2, 2, 0, 15, 16, 17, 18, 19, 25, 20, 33, 22, - 0, 0, 0, 0, 0, 28, 9, 39, 42, 10, 27, 28, 2, 2, 2, 7, + 0, 0, 0, 0, 0, 28, 39, 39, 42, 10, 27, 28, 2, 2, 2, 7, 28, 7, 2, 28, 2, 2, 0, 15, 43, 0, 0, 25, 20, 0, 0, 2, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 44, 28, 2, 2, 7, 0, 2, 7, 2, 2, 0, 28, 7, 7, 2, 0, 28, 7, 0, 2, 7, 0, @@ -191,75 +191,77 @@ hb_use_u8[3083] = 43, 100, 12, 0, 0, 0, 0, 0, 0, 2, 2, 59, 16, 46, 21, 111, 100, 100, 100, 112, 113, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 28, 2, 9, 44, 114, 114, 114, 9, 114, 114, 13, 114, 114, 114, 24, 0, 38, - 0, 0, 0, 115, 116, 9, 3, 0, 0, 0, 0, 0, 0, 0, 117, 0, - 0, 0, 0, 0, 0, 0, 4, 118, 119, 40, 40, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 119, 120, 119, 119, 119, 119, 119, 119, 119, - 119, 0, 0, 121, 0, 0, 0, 0, 0, 0, 5, 121, 0, 0, 0, 0, + 0, 0, 0, 115, 49, 9, 3, 0, 0, 0, 0, 0, 0, 0, 116, 0, + 0, 0, 0, 0, 0, 0, 4, 117, 118, 40, 40, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 118, 118, 119, 118, 118, 118, 118, 118, 118, 118, + 118, 0, 0, 120, 0, 0, 0, 0, 0, 0, 5, 120, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 2, 2, 2, 2, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, - 122, 2, 51, 2, 106, 2, 8, 2, 2, 2, 63, 17, 14, 0, 0, 29, + 121, 2, 51, 2, 106, 2, 8, 2, 2, 2, 63, 17, 14, 0, 0, 29, 0, 2, 2, 0, 0, 0, 0, 0, 0, 27, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 123, 21, 21, 21, 21, 21, 21, 21, 124, 0, 0, 0, 0, + 2, 2, 2, 122, 21, 21, 21, 21, 21, 21, 21, 123, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 0, - 50, 2, 2, 2, 20, 20, 125, 114, 0, 2, 2, 2, 126, 18, 57, 18, - 111, 100, 127, 0, 0, 0, 0, 0, 0, 9, 128, 2, 2, 2, 2, 2, - 2, 2, 129, 21, 20, 18, 46, 130, 131, 132, 0, 0, 0, 0, 0, 0, + 50, 2, 2, 2, 20, 20, 124, 114, 0, 2, 2, 2, 125, 18, 57, 18, + 111, 100, 126, 0, 0, 0, 0, 0, 0, 9, 127, 2, 2, 2, 2, 2, + 2, 2, 128, 21, 20, 18, 46, 129, 130, 131, 0, 0, 0, 0, 0, 0, 0, 2, 2, 50, 28, 2, 2, 2, 2, 2, 2, 2, 2, 8, 20, 57, - 97, 74, 133, 134, 135, 0, 0, 0, 0, 2, 136, 2, 2, 2, 2, 137, - 0, 28, 2, 40, 3, 0, 77, 13, 2, 51, 20, 138, 50, 51, 2, 2, - 103, 8, 7, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 139, 19, - 23, 0, 0, 140, 141, 0, 0, 0, 0, 2, 63, 43, 21, 78, 45, 142, + 97, 74, 132, 133, 134, 0, 0, 0, 0, 2, 135, 2, 2, 2, 2, 136, + 0, 28, 2, 40, 3, 0, 77, 13, 2, 51, 20, 137, 50, 51, 2, 2, + 103, 8, 7, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 138, 19, + 23, 0, 0, 139, 140, 0, 0, 0, 0, 2, 63, 43, 21, 78, 45, 141, 0, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, - 4, 119, 119, 119, 119, 120, 0, 0, 0, 2, 2, 2, 2, 2, 7, 2, + 4, 118, 118, 118, 118, 119, 0, 0, 0, 2, 2, 2, 2, 2, 7, 2, 2, 2, 7, 2, 28, 2, 2, 2, 2, 2, 28, 2, 2, 2, 28, 7, - 0, 126, 18, 25, 29, 0, 0, 143, 144, 2, 2, 28, 2, 28, 2, 2, - 2, 2, 2, 2, 0, 12, 35, 0, 145, 2, 2, 11, 35, 0, 28, 2, + 0, 125, 18, 25, 29, 0, 0, 142, 143, 2, 2, 28, 2, 28, 2, 2, + 2, 2, 2, 2, 0, 12, 35, 0, 144, 2, 2, 11, 35, 0, 28, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 2, 2, 7, 2, 2, 9, 39, 0, 0, 0, 0, 2, 2, 2, 2, 2, 25, 36, - 0, 2, 2, 2, 114, 114, 114, 114, 114, 146, 2, 7, 0, 0, 0, 0, + 0, 2, 2, 2, 114, 114, 114, 114, 114, 145, 2, 7, 0, 0, 0, 0, 0, 2, 12, 12, 0, 0, 0, 0, 0, 7, 2, 2, 7, 2, 2, 2, - 2, 28, 2, 7, 0, 28, 2, 0, 0, 147, 148, 149, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 20, 20, 18, 18, 18, 20, 20, 132, 0, 0, 0, - 0, 0, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 2, 2, 2, 2, - 2, 51, 50, 51, 0, 0, 0, 0, 151, 9, 72, 2, 2, 2, 2, 2, + 2, 28, 2, 7, 0, 28, 2, 0, 0, 146, 147, 148, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 20, 20, 18, 18, 18, 20, 20, 131, 0, 0, 0, + 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 2, 2, 2, 2, + 2, 51, 50, 51, 0, 0, 0, 0, 150, 9, 72, 2, 2, 2, 2, 2, 2, 16, 17, 19, 14, 22, 35, 0, 0, 0, 29, 0, 0, 0, 0, 0, - 0, 9, 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 126, 18, 20, 152, - 20, 19, 153, 154, 2, 2, 2, 2, 2, 0, 0, 63, 155, 0, 0, 0, + 0, 9, 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 125, 18, 20, 151, + 20, 19, 152, 153, 2, 2, 2, 2, 2, 0, 0, 63, 154, 0, 0, 0, 0, 2, 11, 0, 0, 0, 0, 0, 0, 2, 63, 23, 18, 18, 18, 20, - 20, 106, 156, 0, 0, 157, 158, 29, 159, 28, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 21, 17, 20, 20, 160, 42, 0, 0, 0, - 44, 2, 2, 2, 7, 7, 2, 2, 28, 2, 2, 2, 2, 2, 2, 2, - 28, 2, 2, 2, 2, 2, 2, 2, 8, 16, 17, 19, 20, 161, 29, 0, - 0, 9, 9, 28, 2, 2, 2, 7, 28, 7, 2, 28, 2, 2, 56, 15, - 21, 14, 21, 45, 30, 31, 30, 32, 0, 0, 0, 0, 33, 0, 0, 0, - 2, 2, 21, 0, 9, 9, 9, 44, 0, 9, 9, 44, 0, 0, 0, 0, - 0, 2, 2, 63, 23, 18, 18, 18, 20, 21, 124, 13, 15, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 0, 0, 162, 163, 0, 0, 0, 0, 0, 0, - 0, 16, 17, 18, 18, 64, 97, 23, 159, 9, 164, 7, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 2, 63, 23, 18, 18, 0, 46, 46, 9, - 165, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 18, - 0, 21, 17, 18, 18, 19, 14, 80, 165, 36, 0, 0, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 8, 166, 23, 18, 20, 20, 164, 7, 0, 0, - 0, 2, 2, 2, 2, 2, 7, 41, 134, 21, 20, 18, 74, 19, 20, 0, - 0, 2, 2, 2, 7, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 16, - 17, 18, 19, 20, 103, 165, 35, 0, 0, 2, 2, 2, 7, 28, 0, 2, - 2, 2, 2, 28, 7, 2, 2, 2, 2, 21, 21, 16, 30, 31, 10, 167, - 168, 169, 170, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, - 2, 63, 23, 18, 18, 0, 20, 21, 27, 106, 0, 31, 0, 0, 0, 0, - 0, 50, 18, 20, 20, 20, 138, 2, 2, 2, 171, 172, 9, 13, 173, 70, - 174, 0, 0, 1, 145, 0, 0, 0, 0, 50, 18, 20, 14, 17, 18, 2, - 2, 2, 2, 156, 156, 156, 175, 175, 175, 175, 175, 175, 13, 176, 0, 28, - 0, 20, 18, 18, 29, 20, 20, 9, 165, 0, 59, 59, 59, 59, 59, 59, - 59, 64, 19, 80, 44, 0, 0, 0, 0, 2, 2, 2, 7, 2, 28, 2, - 2, 50, 20, 20, 29, 0, 36, 20, 25, 9, 158, 177, 173, 0, 0, 0, - 0, 2, 2, 2, 28, 7, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21, - 45, 20, 33, 80, 66, 0, 0, 0, 0, 2, 178, 64, 45, 0, 0, 0, + 20, 106, 155, 0, 0, 156, 157, 29, 158, 28, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 21, 17, 20, 20, 159, 42, 0, 0, 0, + 47, 125, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 7, 7, 2, 2, + 28, 2, 2, 2, 2, 2, 2, 2, 28, 2, 2, 2, 2, 2, 2, 2, + 8, 16, 17, 19, 20, 160, 29, 0, 0, 9, 9, 28, 2, 2, 2, 7, + 28, 7, 2, 28, 2, 2, 56, 15, 21, 14, 21, 45, 30, 31, 30, 32, + 0, 0, 0, 0, 33, 0, 0, 0, 2, 2, 21, 0, 9, 9, 9, 44, + 0, 9, 9, 44, 0, 0, 0, 0, 0, 2, 2, 63, 23, 18, 18, 18, + 20, 21, 123, 13, 15, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, + 161, 162, 0, 0, 0, 0, 0, 0, 0, 16, 17, 18, 18, 64, 97, 23, + 158, 9, 163, 7, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 63, 23, 18, 18, 0, 46, 46, 9, 164, 35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 18, 0, 21, 17, 18, 18, 19, 14, 80, + 164, 36, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 8, 165, + 23, 18, 20, 20, 163, 7, 0, 0, 0, 2, 2, 2, 2, 2, 7, 41, + 133, 21, 20, 18, 74, 19, 20, 0, 0, 2, 2, 2, 7, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 16, 17, 18, 19, 20, 103, 164, 35, 0, + 0, 2, 2, 2, 7, 28, 0, 2, 2, 2, 2, 28, 7, 2, 2, 2, + 2, 21, 21, 16, 30, 31, 10, 166, 167, 168, 169, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 0, 2, 2, 2, 63, 23, 18, 18, 0, 20, 21, + 27, 106, 0, 31, 0, 0, 0, 0, 0, 50, 18, 20, 20, 20, 137, 2, + 2, 2, 170, 171, 9, 13, 172, 70, 173, 0, 0, 1, 144, 0, 0, 0, + 0, 50, 18, 20, 14, 17, 18, 2, 2, 2, 2, 155, 155, 155, 174, 174, + 174, 174, 174, 174, 13, 175, 0, 28, 0, 20, 18, 18, 29, 20, 20, 9, + 164, 0, 59, 59, 59, 59, 59, 59, 59, 64, 19, 80, 44, 0, 0, 0, + 0, 2, 2, 2, 7, 2, 28, 2, 2, 50, 20, 20, 29, 0, 36, 20, + 25, 9, 157, 176, 172, 0, 0, 0, 0, 2, 2, 2, 28, 7, 2, 2, + 2, 2, 2, 2, 2, 2, 21, 21, 45, 20, 33, 80, 66, 0, 0, 0, + 0, 2, 177, 64, 45, 0, 0, 0, 0, 9, 178, 2, 2, 2, 2, 2, + 2, 2, 2, 21, 20, 18, 29, 0, 46, 14, 140, 0, 0, 0, 0, 0, 0, 179, 179, 179, 106, 7, 0, 0, 0, 9, 9, 9, 44, 0, 0, 0, 0, 2, 2, 2, 2, 2, 7, 0, 56, 180, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 38, 114, 24, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 56, - 35, 0, 4, 119, 119, 119, 120, 0, 0, 9, 9, 9, 47, 2, 2, 2, + 35, 0, 4, 118, 118, 118, 119, 0, 0, 9, 9, 9, 47, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 44, 2, 2, 2, 2, 2, 2, 9, 9, 2, 2, 42, 42, 42, 90, 0, 0, O, O, O, GB, B, B, GB, O, O, WJ,FMPst,FMPst, O, CGJ, B, @@ -268,7 +270,7 @@ hb_use_u8[3083] = VPst,VMBlw, O, O, VAbv, GB,VMAbv,VMPst,VMPst, O, B, VBlw, O, O, VPre, VPre, O, VPre, H, O, VPst,FMAbv, O,CMBlw, O, VAbv, O, VAbv, H, O,VMBlw,VMAbv, CMAbv, GB, GB, O, MBlw,CMAbv,CMAbv, VPst, VAbv,VMAbv, O, VPst, O, VPre, VPre,VMAbv, - B, O, CS, CS, O, B, VAbv, VAbv, B, R, O, HVM, O, O, FBlw, O, + B, O, CS, CS,VMPst, B, VAbv, VAbv, B, R, O, HVM, O, O, FBlw, O, CMAbv, O,CMBlw, VAbv, VBlw, B, SUB, SUB, SUB, O, SUB, SUB, O, FBlw, O, B, VPst, VBlw, VPre,VMAbv,VMBlw,VMPst, IS, VAbv, MPst, MPre, MBlw, MBlw, B, MBlw, MBlw, VPst, VMPst,VMPst, B, MBlw, VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMBlw, B,VMPst, VBlw, VPst, CGJ, @@ -276,18 +278,18 @@ hb_use_u8[3083] = CGJ, WJ, CGJ, GB,CMAbv,CMAbv, B, GB, B, VAbv, SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre, B, MPre, MBlw, SUB, FAbv, FAbv, MAbv, SUB, Sk, VPst, VAbv, VMAbv,VMAbv, FAbv,CMAbv, VPst, H, B, O,SMAbv,SMBlw,SMAbv,SMAbv,SMAbv, VPst, IS, VBlw, - FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv, CS, CS,VMPst, O,FMAbv, ZWNJ, CGJ, WJ, - WJ, WJ, O,FMPst, O, O, H, MPst, VPst, H,VMAbv, VAbv,VMBlw, B, VBlw, FPst, - VPst, FAbv,VMPst, B,CMAbv, VAbv, MBlw, MPst, MBlw, H, O, VBlw, MPst, MPre, MAbv, MBlw, - O, B, FAbv, FAbv, FPst, VBlw, B, B, VPre, O,VMPst, IS, O,VMPst, VBlw, VPst, - VMBlw,VMBlw,VMAbv, O, IS,VMBlw, B,VMPst,VMAbv,VMPst, CS, CS, B, N, N, O, - HN, VPre, VBlw, VAbv, IS,CMAbv, O, VPst, B, R, R, O,FMBlw,CMBlw, VAbv, VPre, - VMAbv,VMAbv, H, VAbv,CMBlw,FMAbv, B, CS, CS, H,CMBlw,VMPst, H,VMPst, VAbv,VMAbv, - VPst, IS, R, MPst, R, MPst,CMBlw, B,FMBlw, VBlw,VMAbv, R, MBlw, MBlw, GB, FBlw, - FBlw,CMAbv, IS, VBlw, IS, GB, VAbv, H, H, O, VBlw, + FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv, CS, O,FMAbv, ZWNJ, CGJ, WJ, WJ, WJ, + O,FMPst, O, O, H, MPst, VPst, H,VMAbv, VAbv,VMBlw, B, VBlw, FPst, VPst, FAbv, + VMPst, B,CMAbv, VAbv, MBlw, MPst, MBlw, H, O, VBlw, MPst, MPre, MAbv, MBlw, O, B, + FAbv, FAbv, FPst, VBlw, B, B, VPre, O,VMPst, IS, O,VMPst, VBlw, VPst,VMBlw,VMBlw, + VMAbv, O, IS,VMBlw, B,VMPst,VMAbv,VMPst, CS, CS, B, N, N, O, HN, VPre, + VBlw, VAbv, IS,CMAbv, O, VPst, B, R, R, O,FMBlw,CMBlw, VAbv, VPre,VMAbv,VMAbv, + H, VAbv,CMBlw,FMAbv, B, CS, CS, H,CMBlw,VMPst, H,VMPst, VAbv,VMAbv, VPst, IS, + R, MPst, R, MPst,CMBlw, B,FMBlw, VBlw,VMAbv, R, MBlw, MBlw, GB, FBlw, FBlw,CMAbv, + IS, VBlw, IS, GB, VAbv, R,VMPst, H, H, O, VBlw, }; static const uint16_t -hb_use_u16[768] = +hb_use_u16[776] = { 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, @@ -319,24 +321,25 @@ hb_use_u16[768] = 9, 9,173,170, 0, 0, 0, 0, 0, 0, 0, 9,174,175, 0, 9, 176, 0, 0,177,178, 0, 0, 0,179, 9, 9,180,181,182,183,184, 185, 9, 9,186,187, 0, 0, 0,188, 9,189,190,191, 9, 9,192, - 185, 9, 9,193,194,105,195,102, 9, 33,196,197, 0, 0, 0, 0, - 198,199, 94, 9, 9,200,201, 2,202, 20, 21,203,204,205,206,207, - 9, 9, 9,208,209,210,211, 0,195, 9, 9,212,213, 2, 0, 0, - 9, 9,214,215,216,217, 0, 0, 9, 9, 9,218,219, 2, 0, 0, - 9, 9,220,221, 2, 0, 0, 0, 9,222,223,103,224, 0, 0, 0, - 9, 9,225,226, 0, 0, 0, 0,227,228, 9,229,230, 2, 0, 0, - 0, 0,231, 9, 9,232,233, 0,234, 9, 9,235,236,237, 9, 9, - 238,239, 0, 0, 0, 0, 0, 0, 21, 9,214,240, 7, 9, 70, 18, - 9,241, 73,242, 0, 0, 0, 0,243, 9, 9,244,245, 2,246, 9, - 247,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,249, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 98,250, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 9, 9, 9,251, 0, 0, 0, 0, - 9, 9, 9, 9,252,253,254,254,255,256, 0, 0, 0, 0,257, 0, - 9, 9, 9, 9, 9,258, 0, 0, 9, 9, 9, 9, 9, 9,105, 70, - 94,259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,260, - 9, 9, 70,261,262, 0, 0, 0, 0, 9,263, 0, 9, 9,264, 2, - 9, 9, 9, 9,265, 2, 0, 0,129,129,129,129,129,129,129,129, - 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,129, + 185, 9, 9,193,194,105,195,102, 9, 33,196,197,198, 0, 0, 0, + 199,200, 94, 9, 9,201,202, 2,203, 20, 21,204,205,206,207,208, + 9, 9, 9,209,210,211,212, 0,195, 9, 9,213,214, 2, 0, 0, + 9, 9,215,216,217,218, 0, 0, 9, 9, 9,219,220, 2, 0, 0, + 9, 9,221,222, 2, 0, 0, 0, 9,223,224,103,225, 0, 0, 0, + 9, 9,226,227, 0, 0, 0, 0,228,229, 9,230,231, 2, 0, 0, + 0, 0,232, 9, 9,233,234, 0,235, 9, 9,236,237,238, 9, 9, + 239,240, 0, 0, 0, 0, 0, 0, 21, 9,215,241, 7, 9, 70, 18, + 9,242, 73,243, 0, 0, 0, 0,244, 9, 9,245,246, 2,247, 9, + 248,249, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,250, + 251, 48, 9,252,253, 2, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 98,254, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 9, 9, 9,255, 0, 0, 0, 0, 9, 9, 9, 9,256,257,258,258, + 259,260, 0, 0, 0, 0,261, 0, 9, 9, 9, 9, 9,262, 0, 0, + 9, 9, 9, 9, 9, 9,105, 70, 94,263, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,264, 9, 9, 70,265,266, 0, 0, 0, + 0, 9,267, 0, 9, 9,268, 2, 9, 9, 9, 9,269, 2, 0, 0, + 129,129,129,129,129,129,129,129,160,160,160,160,160,160,160,160, + 160,160,160,160,160,160,160,129, }; static inline unsigned @@ -347,7 +350,7 @@ hb_use_b4 (const uint8_t* a, unsigned i) static inline uint_fast8_t hb_use_get_category (unsigned u) { - return u<921600u?hb_use_u8[2721+(((hb_use_u8[593+(((hb_use_u16[((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O; + return u<921600u?hb_use_u8[2753+(((hb_use_u8[593+(((hb_use_u16[((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O; } #undef B @@ -393,26 +396,5 @@ hb_use_get_category (unsigned u) #undef VMPre -#ifdef HB_USE_TABLE_MAIN -int main (int argc, char **argv) -{ - if (argc != 2) - { - for (unsigned u = 0; u < 0x10FFFFu; u++) - printf ("U+%04X %d\n", u, hb_use_get_category (u)); - return 0; - } - - hb_codepoint_t u; - sscanf (argv[1], "%x", &u); - - printf ("%d\n", hb_use_get_category (u)); - - return 0; -} - -#endif - - #endif /* HB_OT_SHAPER_USE_TABLE_HH */ /* == End of generated table == */ diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-vowel-constraints.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-vowel-constraints.cc index be4ac813b1..cb4db4a8b2 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-vowel-constraints.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-vowel-constraints.cc @@ -10,8 +10,8 @@ * # Date: 2015-03-12, 21:17:00 GMT [AG] * # Date: 2019-11-08, 23:22:00 GMT [AG] * - * # Scripts-14.0.0.txt - * # Date: 2021-07-10, 00:35:31 GMT + * # Scripts-15.0.0.txt + * # Date: 2022-04-26, 23:15:02 GMT */ #include "hb.hh" diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper.hh b/thirdparty/harfbuzz/src/hb-ot-shaper.hh index e160987f83..b2d1acb39b 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper.hh @@ -380,6 +380,10 @@ hb_ot_shaper_categorize (const hb_ot_shape_planner_t *planner) case HB_SCRIPT_TOTO: case HB_SCRIPT_VITHKUQI: + /* Unicode-15.0 additions */ + case HB_SCRIPT_KAWI: + case HB_SCRIPT_NAG_MUNDARI: + /* If the designer designed the font for the 'DFLT' script, * (or we ended up arbitrarily pick 'latn'), use the default shaper. * Otherwise, use the specific shaper. diff --git a/thirdparty/harfbuzz/src/hb-ot-tag.cc b/thirdparty/harfbuzz/src/hb-ot-tag.cc index ceb3bf6df5..1b18270cca 100644 --- a/thirdparty/harfbuzz/src/hb-ot-tag.cc +++ b/thirdparty/harfbuzz/src/hb-ot-tag.cc @@ -307,12 +307,12 @@ hb_ot_tags_from_language (const char *lang_str, hb_tag_t lang_tag = hb_tag_from_string (lang_str, first_len); static hb_atomic_int_t last_tag_idx; /* Poor man's cache. */ - unsigned tag_idx = last_tag_idx.get_relaxed (); + unsigned tag_idx = last_tag_idx; if (likely (tag_idx < ot_languages_len && ot_languages[tag_idx].language == lang_tag) || hb_sorted_array (ot_languages, ot_languages_len).bfind (lang_tag, &tag_idx)) { - last_tag_idx.set_relaxed (tag_idx); + last_tag_idx = tag_idx; unsigned int i; while (tag_idx != 0 && ot_languages[tag_idx].language == ot_languages[tag_idx - 1].language) diff --git a/thirdparty/harfbuzz/src/hb-ot-var-avar-table.hh b/thirdparty/harfbuzz/src/hb-ot-var-avar-table.hh index 5946aef635..f60bc4a3ce 100644 --- a/thirdparty/harfbuzz/src/hb-ot-var-avar-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-var-avar-table.hh @@ -206,11 +206,10 @@ struct avar v = hb_clamp (v, -(1<<14), +(1<<14)); out.push (v); } - - OT::VariationStore::destroy_cache (var_store_cache); - for (unsigned i = 0; i < coords_length; i++) coords[i] = out[i]; + + OT::VariationStore::destroy_cache (var_store_cache); #endif } diff --git a/thirdparty/harfbuzz/src/hb-ot-var-mvar-table.hh b/thirdparty/harfbuzz/src/hb-ot-var-mvar-table.hh index 208db46741..420366fbb3 100644 --- a/thirdparty/harfbuzz/src/hb-ot-var-mvar-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-var-mvar-table.hh @@ -43,7 +43,7 @@ struct VariationValueRecord public: Tag valueTag; /* Four-byte tag identifying a font-wide measure. */ - HBUINT32 varIdx; /* Outer/inner index into VariationStore item. */ + VarIdx varIdx; /* Outer/inner index into VariationStore item. */ public: DEFINE_SIZE_STATIC (8); diff --git a/thirdparty/harfbuzz/src/hb-repacker.hh b/thirdparty/harfbuzz/src/hb-repacker.hh index 61b142238e..40a5326118 100644 --- a/thirdparty/harfbuzz/src/hb-repacker.hh +++ b/thirdparty/harfbuzz/src/hb-repacker.hh @@ -276,33 +276,17 @@ bool _process_overflows (const hb_vector_t<graph::overflow_record_t>& overflows, return resolution_attempted; } -/* - * Attempts to modify the topological sorting of the provided object graph to - * eliminate offset overflows in the links between objects of the graph. If a - * non-overflowing ordering is found the updated graph is serialized it into the - * provided serialization context. - * - * If necessary the structure of the graph may be modified in ways that do not - * affect the functionality of the graph. For example shared objects may be - * duplicated. - * - * For a detailed writeup describing how the algorithm operates see: - * docs/repacker.md - */ -template<typename T> -inline hb_blob_t* -hb_resolve_overflows (const T& packed, - hb_tag_t table_tag, - unsigned max_rounds = 20, - bool recalculate_extensions = false) { - graph_t sorted_graph (packed); +inline bool +hb_resolve_graph_overflows (hb_tag_t table_tag, + unsigned max_rounds , + bool recalculate_extensions, + graph_t& sorted_graph /* IN/OUT */) +{ sorted_graph.sort_shortest_distance (); bool will_overflow = graph::will_overflow (sorted_graph); if (!will_overflow) - { - return graph::serialize (sorted_graph); - } + return true; graph::gsubgpos_graph_context_t ext_context (table_tag, sorted_graph); if ((table_tag == HB_OT_TAG_GPOS @@ -314,13 +298,13 @@ hb_resolve_overflows (const T& packed, DEBUG_MSG (SUBSET_REPACK, nullptr, "Splitting subtables if needed."); if (!_presplit_subtables_if_needed (ext_context)) { DEBUG_MSG (SUBSET_REPACK, nullptr, "Subtable splitting failed."); - return nullptr; + return false; } DEBUG_MSG (SUBSET_REPACK, nullptr, "Promoting lookups to extensions if needed."); if (!_promote_extensions_if_needed (ext_context)) { DEBUG_MSG (SUBSET_REPACK, nullptr, "Extensions promotion failed."); - return nullptr; + return false; } } @@ -360,15 +344,41 @@ hb_resolve_overflows (const T& packed, if (sorted_graph.in_error ()) { DEBUG_MSG (SUBSET_REPACK, nullptr, "Sorted graph in error state."); - return nullptr; + return false; } if (graph::will_overflow (sorted_graph)) { DEBUG_MSG (SUBSET_REPACK, nullptr, "Offset overflow resolution failed."); - return nullptr; + return false; } + return true; +} + +/* + * Attempts to modify the topological sorting of the provided object graph to + * eliminate offset overflows in the links between objects of the graph. If a + * non-overflowing ordering is found the updated graph is serialized it into the + * provided serialization context. + * + * If necessary the structure of the graph may be modified in ways that do not + * affect the functionality of the graph. For example shared objects may be + * duplicated. + * + * For a detailed writeup describing how the algorithm operates see: + * docs/repacker.md + */ +template<typename T> +inline hb_blob_t* +hb_resolve_overflows (const T& packed, + hb_tag_t table_tag, + unsigned max_rounds = 20, + bool recalculate_extensions = false) { + graph_t sorted_graph (packed); + if (!hb_resolve_graph_overflows (table_tag, max_rounds, recalculate_extensions, sorted_graph)) + return nullptr; + return graph::serialize (sorted_graph); } diff --git a/thirdparty/harfbuzz/src/hb-serialize.hh b/thirdparty/harfbuzz/src/hb-serialize.hh index cecdcdeb74..f47cde5eb5 100644 --- a/thirdparty/harfbuzz/src/hb-serialize.hh +++ b/thirdparty/harfbuzz/src/hb-serialize.hh @@ -139,6 +139,14 @@ struct hb_serialize_context_t objidx = o.objidx; } #endif + + HB_INTERNAL static int cmp (const void* a, const void* b) + { + int cmp = ((const link_t*)a)->position - ((const link_t*)b)->position; + if (cmp) return cmp; + + return ((const link_t*)a)->objidx - ((const link_t*)b)->objidx; + } }; char *head; @@ -315,7 +323,7 @@ struct hb_serialize_context_t { object_t *obj = current; if (unlikely (!obj)) return; - if (unlikely (in_error())) return; + if (unlikely (in_error() && !only_overflow ())) return; current = current->next; revert (obj->head, obj->tail); diff --git a/thirdparty/harfbuzz/src/hb-static.cc b/thirdparty/harfbuzz/src/hb-static.cc index af95615c16..5d4c7cda1b 100644 --- a/thirdparty/harfbuzz/src/hb-static.cc +++ b/thirdparty/harfbuzz/src/hb-static.cc @@ -94,7 +94,7 @@ hb_face_t::load_num_glyphs () const ret = hb_max (ret, load_num_glyphs_from_maxp (this)); - num_glyphs.set_relaxed (ret); + num_glyphs = ret; return ret; } @@ -102,7 +102,7 @@ unsigned int hb_face_t::load_upem () const { unsigned int ret = table.head->get_upem (); - upem.set_relaxed (ret); + upem = ret; return ret; } diff --git a/thirdparty/harfbuzz/src/hb-subset-input.cc b/thirdparty/harfbuzz/src/hb-subset-input.cc index 7d19496275..14ae210d49 100644 --- a/thirdparty/harfbuzz/src/hb-subset-input.cc +++ b/thirdparty/harfbuzz/src/hb-subset-input.cc @@ -391,7 +391,7 @@ hb_subset_input_get_user_data (const hb_subset_input_t *input, * * Return value: `true` if success, `false` otherwise * - * Since: REPLACEME + * Since: EXPERIMENTAL **/ hb_bool_t hb_subset_input_pin_axis_to_default (hb_subset_input_t *input, @@ -415,7 +415,7 @@ hb_subset_input_pin_axis_to_default (hb_subset_input_t *input, * * Return value: `true` if success, `false` otherwise * - * Since: REPLACEME + * Since: EXPERIMENTAL **/ hb_bool_t hb_subset_input_pin_axis_location (hb_subset_input_t *input, diff --git a/thirdparty/harfbuzz/src/hb-subset-plan.cc b/thirdparty/harfbuzz/src/hb-subset-plan.cc index 7ff66333a8..079ab8bf99 100644 --- a/thirdparty/harfbuzz/src/hb-subset-plan.cc +++ b/thirdparty/harfbuzz/src/hb-subset-plan.cc @@ -89,8 +89,6 @@ _remap_indexes (const hb_set_t *indexes, } #ifndef HB_NO_SUBSET_LAYOUT -typedef void (*layout_collect_func_t) (hb_face_t *face, hb_tag_t table_tag, const hb_tag_t *scripts, const hb_tag_t *languages, const hb_tag_t *features, hb_set_t *lookup_indexes /* OUT */); - /* * Removes all tags from 'tags' that are not in filter. Additionally eliminates any duplicates. @@ -130,8 +128,8 @@ static bool _filter_tag_list(hb_vector_t<hb_tag_t>* tags, /* IN/OUT */ template <typename T> static void _collect_layout_indices (hb_subset_plan_t *plan, const T& table, - layout_collect_func_t layout_collect_func, - hb_set_t *indices /* OUT */) + hb_set_t *lookup_indices, /* OUT */ + hb_set_t *feature_indices /* OUT */) { unsigned num_features = table.get_feature_count (); hb_vector_t<hb_tag_t> features; @@ -149,12 +147,23 @@ static void _collect_layout_indices (hb_subset_plan_t *plan, || !plan->check_success (!scripts.in_error ()) || !scripts) return; - layout_collect_func (plan->source, - T::tableTag, - retain_all_scripts ? nullptr : scripts.arrayZ, - nullptr, - retain_all_features ? nullptr : features.arrayZ, - indices); + hb_ot_layout_collect_features (plan->source, + T::tableTag, + retain_all_scripts ? nullptr : scripts.arrayZ, + nullptr, + retain_all_features ? nullptr : features.arrayZ, + feature_indices); + + for (unsigned feature_index : *feature_indices) + { + //TODO: replace HB_OT_LAYOUT_NO_VARIATIONS_INDEX with variation_index for + //instancing + const OT::Feature &f = table.get_feature_variation (feature_index, HB_OT_LAYOUT_NO_VARIATIONS_INDEX); + f.add_lookup_indexes_to (lookup_indices); + } + + //TODO: update for instancing: only collect lookups from feature_indexes that have no variations + table.feature_variation_collect_lookups (feature_indices, lookup_indices); } @@ -232,11 +241,11 @@ _closure_glyphs_lookups_features (hb_subset_plan_t *plan, { hb_blob_ptr_t<T> table = plan->source_table<T> (); hb_tag_t table_tag = table->tableTag; - hb_set_t lookup_indices; + hb_set_t lookup_indices, feature_indices; _collect_layout_indices<T> (plan, *table, - hb_ot_layout_collect_lookups, - &lookup_indices); + &lookup_indices, + &feature_indices); if (table_tag == HB_OT_TAG_GSUB) hb_ot_layout_lookups_substitute_closure (plan->source, @@ -247,19 +256,13 @@ _closure_glyphs_lookups_features (hb_subset_plan_t *plan, &lookup_indices); _remap_indexes (&lookup_indices, lookups); - // Collect and prune features - hb_set_t feature_indices; - _collect_layout_indices<T> (plan, - *table, - hb_ot_layout_collect_features, - &feature_indices); - + // prune features table->prune_features (lookups, &feature_indices); hb_map_t duplicate_feature_map; _GSUBGPOS_find_duplicate_features (*table, lookups, &feature_indices, &duplicate_feature_map); feature_indices.clear (); - table->prune_langsys (&duplicate_feature_map, langsys_map, &feature_indices); + table->prune_langsys (&duplicate_feature_map, plan->layout_scripts, langsys_map, &feature_indices); _remap_indexes (&feature_indices, features); table.destroy (); @@ -269,11 +272,46 @@ _closure_glyphs_lookups_features (hb_subset_plan_t *plan, #ifndef HB_NO_VAR static inline void -_collect_layout_variation_indices (hb_subset_plan_t* plan, - const hb_set_t *glyphset, - const hb_map_t *gpos_lookups, - hb_set_t *layout_variation_indices, - hb_map_t *layout_variation_idx_map) +_generate_varstore_inner_maps (const hb_set_t& varidx_set, + unsigned subtable_count, + hb_vector_t<hb_inc_bimap_t> &inner_maps /* OUT */) +{ + if (varidx_set.is_empty () || subtable_count == 0) return; + + inner_maps.resize (subtable_count); + for (unsigned idx : varidx_set) + { + uint16_t major = idx >> 16; + uint16_t minor = idx & 0xFFFF; + + if (major >= subtable_count) + continue; + inner_maps[major].add (minor); + } +} + +static inline hb_font_t* +_get_hb_font_with_variations (const hb_subset_plan_t *plan) +{ + hb_font_t *font = hb_font_create (plan->source); + + hb_vector_t<hb_variation_t> vars; + vars.alloc (plan->user_axes_location->get_population ()); + + for (auto _ : *plan->user_axes_location) + { + hb_variation_t var; + var.tag = _.first; + var.value = _.second; + vars.push (var); + } + + hb_font_set_variations (font, vars.arrayZ, plan->user_axes_location->get_population ()); + return font; +} + +static inline void +_collect_layout_variation_indices (hb_subset_plan_t* plan) { hb_blob_ptr_t<OT::GDEF> gdef = plan->source_table<OT::GDEF> (); hb_blob_ptr_t<GPOS> gpos = plan->source_table<GPOS> (); @@ -284,13 +322,40 @@ _collect_layout_variation_indices (hb_subset_plan_t* plan, gpos.destroy (); return; } - OT::hb_collect_variation_indices_context_t c (layout_variation_indices, glyphset, gpos_lookups); + + const OT::VariationStore *var_store = nullptr; + hb_set_t varidx_set; + hb_font_t *font = nullptr; + float *store_cache = nullptr; + bool collect_delta = plan->pinned_at_default ? false : true; + if (collect_delta) + { + font = _get_hb_font_with_variations (plan); + if (gdef->has_var_store ()) + { + var_store = &(gdef->get_var_store ()); + store_cache = var_store->create_cache (); + } + } + + OT::hb_collect_variation_indices_context_t c (&varidx_set, + plan->layout_variation_idx_delta_map, + font, var_store, + plan->_glyphset_gsub, + plan->gpos_lookups, + store_cache); gdef->collect_variation_indices (&c); if (hb_ot_layout_has_positioning (plan->source)) gpos->collect_variation_indices (&c); - gdef->remap_layout_variation_indices (layout_variation_indices, layout_variation_idx_map); + hb_font_destroy (font); + var_store->destroy_cache (store_cache); + + gdef->remap_layout_variation_indices (&varidx_set, plan->layout_variation_idx_delta_map); + + unsigned subtable_count = gdef->has_var_store () ? gdef->get_var_store ().get_sub_table_count () : 0; + _generate_varstore_inner_maps (varidx_set, subtable_count, plan->gdef_varstore_inner_maps); gdef.destroy (); gpos.destroy (); @@ -506,11 +571,7 @@ _populate_gids_to_retain (hb_subset_plan_t* plan, #ifndef HB_NO_VAR if (close_over_gdef) - _collect_layout_variation_indices (plan, - plan->_glyphset_gsub, - plan->gpos_lookups, - plan->layout_variation_indices, - plan->layout_variation_idx_map); + _collect_layout_variation_indices (plan); #endif } @@ -585,12 +646,9 @@ _nameid_closure (hb_face_t *face, #ifndef HB_NO_VAR static void -_normalize_axes_location (hb_face_t *face, - const hb_hashmap_t<hb_tag_t, float> *user_axes_location, - hb_hashmap_t<hb_tag_t, int> *normalized_axes_location, /* OUT */ - bool &all_axes_pinned) +_normalize_axes_location (hb_face_t *face, hb_subset_plan_t *plan) { - if (user_axes_location->is_empty ()) + if (plan->user_axes_location->is_empty ()) return; hb_array_t<const OT::AxisRecord> axes = face->table.fvar->get_axes (); @@ -605,25 +663,27 @@ _normalize_axes_location (hb_face_t *face, for (const auto& axis : axes) { hb_tag_t axis_tag = axis.get_axis_tag (); - if (!user_axes_location->has (axis_tag)) + if (!plan->user_axes_location->has (axis_tag)) { axis_not_pinned = true; } else { - int normalized_v = axis.normalize_axis_value (user_axes_location->get (axis_tag)); + int normalized_v = axis.normalize_axis_value (plan->user_axes_location->get (axis_tag)); if (has_avar && axis_count < face->table.avar->get_axis_count ()) { normalized_v = seg_maps->map (normalized_v); } - normalized_axes_location->set (axis_tag, normalized_v); + plan->axes_location->set (axis_tag, normalized_v); + if (normalized_v != 0) + plan->pinned_at_default = false; } if (has_avar) seg_maps = &StructAfter<OT::SegmentMaps> (*seg_maps); - + axis_count++; } - all_axes_pinned = !axis_not_pinned; + plan->all_axes_pinned = !axis_not_pinned; } #endif /** @@ -683,8 +743,8 @@ hb_subset_plan_create_or_fail (hb_face_t *face, plan->gpos_features = hb_map_create (); plan->colrv1_layers = hb_map_create (); plan->colr_palettes = hb_map_create (); - plan->layout_variation_indices = hb_set_create (); - plan->layout_variation_idx_map = hb_map_create (); + plan->check_success (plan->layout_variation_idx_delta_map = hb_hashmap_create<unsigned, hb_pair_t<unsigned, int>> ()); + plan->gdef_varstore_inner_maps.init (); plan->check_success (plan->sanitized_table_cache = hb_hashmap_create<hb_tag_t, hb::unique_ptr<hb_blob_t>> ()); plan->check_success (plan->axes_location = hb_hashmap_create<hb_tag_t, int> ()); @@ -692,12 +752,20 @@ hb_subset_plan_create_or_fail (hb_face_t *face, if (plan->user_axes_location && input->axes_location) *plan->user_axes_location = *input->axes_location; plan->all_axes_pinned = false; + plan->pinned_at_default = true; + + plan->check_success (plan->vmtx_map = hb_hashmap_create<unsigned, hb_pair_t<unsigned, int>> ()); + plan->check_success (plan->hmtx_map = hb_hashmap_create<unsigned, hb_pair_t<unsigned, int>> ()); if (unlikely (plan->in_error ())) { hb_subset_plan_destroy (plan); return nullptr; } +#ifndef HB_NO_VAR + _normalize_axes_location (face, plan); +#endif + _populate_unicodes_to_retain (input->sets.unicodes, input->sets.glyphs, plan); _populate_gids_to_retain (plan, @@ -725,13 +793,6 @@ hb_subset_plan_create_or_fail (hb_face_t *face, plan->glyph_map->get(plan->unicode_to_new_gid_list.arrayZ[i].second); } -#ifndef HB_NO_VAR - _normalize_axes_location (face, - input->axes_location, - plan->axes_location, - plan->all_axes_pinned); -#endif - _nameid_closure (face, plan->name_ids, plan->all_axes_pinned, plan->user_axes_location); if (unlikely (plan->in_error ())) { hb_subset_plan_destroy (plan); @@ -754,44 +815,6 @@ hb_subset_plan_destroy (hb_subset_plan_t *plan) { if (!hb_object_destroy (plan)) return; - hb_set_destroy (plan->unicodes); - hb_set_destroy (plan->name_ids); - hb_set_destroy (plan->name_languages); - hb_set_destroy (plan->layout_features); - hb_set_destroy (plan->layout_scripts); - hb_set_destroy (plan->glyphs_requested); - hb_set_destroy (plan->drop_tables); - hb_set_destroy (plan->no_subset_tables); - hb_face_destroy (plan->source); - hb_face_destroy (plan->dest); - hb_map_destroy (plan->codepoint_to_glyph); - hb_map_destroy (plan->glyph_map); - hb_map_destroy (plan->reverse_glyph_map); - hb_map_destroy (plan->glyph_map_gsub); - hb_set_destroy (plan->_glyphset); - hb_set_destroy (plan->_glyphset_gsub); - hb_set_destroy (plan->_glyphset_mathed); - hb_set_destroy (plan->_glyphset_colred); - hb_map_destroy (plan->gsub_lookups); - hb_map_destroy (plan->gpos_lookups); - hb_map_destroy (plan->gsub_features); - hb_map_destroy (plan->gpos_features); - hb_map_destroy (plan->colrv1_layers); - hb_map_destroy (plan->colr_palettes); - hb_set_destroy (plan->layout_variation_indices); - hb_map_destroy (plan->layout_variation_idx_map); - - hb_hashmap_destroy (plan->gsub_langsys); - hb_hashmap_destroy (plan->gpos_langsys); - hb_hashmap_destroy (plan->axes_location); - hb_hashmap_destroy (plan->sanitized_table_cache); - - if (plan->user_axes_location) - { - hb_object_destroy (plan->user_axes_location); - hb_free (plan->user_axes_location); - } - hb_free (plan); } diff --git a/thirdparty/harfbuzz/src/hb-subset-plan.hh b/thirdparty/harfbuzz/src/hb-subset-plan.hh index 8912ae70d5..98a45e5f6d 100644 --- a/thirdparty/harfbuzz/src/hb-subset-plan.hh +++ b/thirdparty/harfbuzz/src/hb-subset-plan.hh @@ -33,10 +33,56 @@ #include "hb-subset-input.hh" #include "hb-map.hh" +#include "hb-bimap.hh" #include "hb-set.hh" struct hb_subset_plan_t { + hb_subset_plan_t () + {} + + ~hb_subset_plan_t() + { + hb_set_destroy (unicodes); + hb_set_destroy (name_ids); + hb_set_destroy (name_languages); + hb_set_destroy (layout_features); + hb_set_destroy (layout_scripts); + hb_set_destroy (glyphs_requested); + hb_set_destroy (drop_tables); + hb_set_destroy (no_subset_tables); + hb_face_destroy (source); + hb_face_destroy (dest); + hb_map_destroy (codepoint_to_glyph); + hb_map_destroy (glyph_map); + hb_map_destroy (reverse_glyph_map); + hb_map_destroy (glyph_map_gsub); + hb_set_destroy (_glyphset); + hb_set_destroy (_glyphset_gsub); + hb_set_destroy (_glyphset_mathed); + hb_set_destroy (_glyphset_colred); + hb_map_destroy (gsub_lookups); + hb_map_destroy (gpos_lookups); + hb_map_destroy (gsub_features); + hb_map_destroy (gpos_features); + hb_map_destroy (colrv1_layers); + hb_map_destroy (colr_palettes); + + hb_hashmap_destroy (gsub_langsys); + hb_hashmap_destroy (gpos_langsys); + hb_hashmap_destroy (axes_location); + hb_hashmap_destroy (sanitized_table_cache); + hb_hashmap_destroy (hmtx_map); + hb_hashmap_destroy (vmtx_map); + hb_hashmap_destroy (layout_variation_idx_delta_map); + + if (user_axes_location) + { + hb_object_destroy (user_axes_location); + hb_free (user_axes_location); + } + } + hb_object_header_t header; bool successful; @@ -101,10 +147,11 @@ struct hb_subset_plan_t hb_map_t *colrv1_layers; hb_map_t *colr_palettes; - //The set of layout item variation store delta set indices to be retained - hb_set_t *layout_variation_indices; - //Old -> New layout item variation store delta set index mapping - hb_map_t *layout_variation_idx_map; + //Old layout item variation index -> (New varidx, delta) mapping + hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map; + + //gdef varstore retained varidx mapping + hb_vector_t<hb_inc_bimap_t> gdef_varstore_inner_maps; hb_hashmap_t<hb_tag_t, hb::unique_ptr<hb_blob_t>>* sanitized_table_cache; //normalized axes location map @@ -112,6 +159,12 @@ struct hb_subset_plan_t //user specified axes location map hb_hashmap_t<hb_tag_t, float> *user_axes_location; bool all_axes_pinned; + bool pinned_at_default; + + //hmtx metrics map: new gid->(advance, lsb) + hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *hmtx_map; + //vmtx metrics map: new gid->(advance, lsb) + hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *vmtx_map; public: diff --git a/thirdparty/harfbuzz/src/hb-subset.cc b/thirdparty/harfbuzz/src/hb-subset.cc index f62e7e895b..1a0bcbd1fe 100644 --- a/thirdparty/harfbuzz/src/hb-subset.cc +++ b/thirdparty/harfbuzz/src/hb-subset.cc @@ -406,6 +406,27 @@ _passthrough (hb_subset_plan_t *plan, hb_tag_t tag) } static bool +_dependencies_satisfied (hb_subset_plan_t *plan, hb_tag_t tag, + hb_set_t &visited_set, hb_set_t &revisit_set) +{ + switch (tag) + { + case HB_OT_TAG_hmtx: + case HB_OT_TAG_vmtx: + if (!plan->pinned_at_default && + !visited_set.has (HB_OT_TAG_glyf)) + { + revisit_set.add (tag); + return false; + } + return true; + + default: + return true; + } +} + +static bool _subset_table (hb_subset_plan_t *plan, hb_vector_t<char> &buf, hb_tag_t tag) @@ -514,7 +535,7 @@ hb_subset_plan_execute_or_fail (hb_subset_plan_t *plan) return nullptr; } - hb_set_t tags_set; + hb_set_t tags_set, revisit_set; bool success = true; hb_tag_t table_tags[32]; unsigned offset = 0, num_tables = ARRAY_LENGTH (table_tags); @@ -527,10 +548,27 @@ hb_subset_plan_execute_or_fail (hb_subset_plan_t *plan) { hb_tag_t tag = table_tags[i]; if (_should_drop_table (plan, tag) && !tags_set.has (tag)) continue; + if (!_dependencies_satisfied (plan, tag, tags_set, revisit_set)) continue; tags_set.add (tag); success = _subset_table (plan, buf, tag); if (unlikely (!success)) goto end; } + + /*delayed subsetting for some tables since they might have dependency on other tables in some cases: + e.g: during instantiating glyf tables, hmetrics/vmetrics are updated and saved in subset plan, + hmtx/vmtx subsetting need to use these updated metrics values*/ + while (!revisit_set.is_empty ()) + { + hb_set_t revisit_temp; + for (hb_tag_t tag : revisit_set) + { + if (!_dependencies_satisfied (plan, tag, tags_set, revisit_temp)) continue; + tags_set.add (tag); + success = _subset_table (plan, buf, tag); + if (unlikely (!success)) goto end; + } + revisit_set = revisit_temp; + } offset += num_tables; } diff --git a/thirdparty/harfbuzz/src/hb-ucd-table.hh b/thirdparty/harfbuzz/src/hb-ucd-table.hh index 14734c91ea..a372a4afce 100644 --- a/thirdparty/harfbuzz/src/hb-ucd-table.hh +++ b/thirdparty/harfbuzz/src/hb-ucd-table.hh @@ -4,7 +4,7 @@ * * ./gen-ucd-table.py ucd.nounihan.grouped.xml * - * on file with this description: Unicode 14.0.0 + * on file with this description: Unicode 15.0.0 */ #ifndef HB_UCD_TABLE_HH @@ -13,7 +13,7 @@ #include "hb.hh" static const hb_script_t -_hb_ucd_sc_map[163] = +_hb_ucd_sc_map[165] = { HB_SCRIPT_COMMON, HB_SCRIPT_INHERITED, HB_SCRIPT_UNKNOWN, HB_SCRIPT_ARABIC, @@ -96,7 +96,8 @@ _hb_ucd_sc_map[163] = HB_SCRIPT_YEZIDI, HB_SCRIPT_CYPRO_MINOAN, HB_SCRIPT_OLD_UYGHUR, HB_SCRIPT_TANGSA, HB_SCRIPT_TOTO, HB_SCRIPT_VITHKUQI, - HB_SCRIPT_MATH, + HB_SCRIPT_MATH, HB_SCRIPT_KAWI, + HB_SCRIPT_NAG_MUNDARI, }; static const uint16_t _hb_ucd_dm1_p0_map[825] = @@ -1068,7 +1069,7 @@ _hb_ucd_dm2_u64_map[388] = #ifndef HB_OPTIMIZE_SIZE static const uint8_t -_hb_ucd_u8[17936] = +_hb_ucd_u8[18260] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 11, 12, 13, 13, 13, 14, @@ -1076,7 +1077,7 @@ _hb_ucd_u8[17936] = 25, 26, 22, 22, 22, 27, 28, 29, 22, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 22, 42, - 7, 7, 43, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 7, 7, 43, 7, 44, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, @@ -1098,12 +1099,12 @@ _hb_ucd_u8[17936] = 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 44, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 45, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 46, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 47, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43, @@ -1122,35 +1123,36 @@ _hb_ucd_u8[17936] = 118,119,120,121,122,123,124,125,126,127,128,129, 34, 34,130,131, 132,133,134,135,136,137,138,139,140,141,142,122,143,144,145,146, 147,148,149,150,151,152,153,122,154,155,122,156,157,158,159,122, - 160,161,162,163,164,165,122,122,166,167,168,169,122,170,122,171, - 34, 34, 34, 34, 34, 34, 34,172,173, 34,174,122,122,122,122,122, - 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,175, - 34, 34, 34, 34, 34, 34, 34, 34,176,122,122,122,122,122,122,122, + 160,161,162,163,164,165,166,122,167,168,169,170,122,171,172,173, + 34, 34, 34, 34, 34, 34, 34,174,175, 34,176,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,177, + 34, 34, 34, 34, 34, 34, 34, 34,178,122,122,122,122,122,122,122, 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122, 34, 34, 34, 34,177,122,122,122, - 34, 34, 34, 34,178,179,180,181,122,122,122,122,182,183,184,185, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,186, - 34, 34, 34, 34, 34, 34, 34, 34, 34,187,188,122,122,122,122,122, - 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,189, - 34, 34,190, 34, 34,191,122,122,122,122,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122,192,193,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122,122,122,122,122,122,122,194,195, - 69,196,197,198,199,200,201,122,202,203,204,205,206,207,208,209, - 69, 69, 69, 69,210,211,122,122,122,122,122,122,122,122,212,122, - 213,122,214,122,122,215,122,122,122,122,122,122,122,122,122,216, - 34,217,218,122,122,122,122,122,219,220,221,122,222,223,122,122, - 224,225,226,227,228,122, 69,229, 69, 69, 69, 69, 69,230,231,232, - 233,234, 69, 69,235,236, 69,237,122,122,122,122,122,122,122,122, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,238, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,239, 34, - 240, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,241, 34, 34, - 34, 34, 34, 34, 34, 34, 34,242,122,122,122,122,122,122,122,122, - 34, 34, 34, 34,243,122,122,122,122,122,122,122,122,122,122,122, - 34, 34, 34, 34, 34, 34,244,122,122,122,122,122,122,122,122,122, - 245,122,246,247,122,122,122,122,122,122,122,122,122,122,122,122, - 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,248, - 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,249, + 122,122,122,122,122,122,122,122, 34, 34, 34, 34,179,122,122,122, + 34, 34, 34, 34,180,181,182,183,122,122,122,122,184,185,186,187, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,188, + 34, 34, 34, 34, 34, 34, 34, 34, 34,189,190,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,191, + 34, 34,192, 34, 34,193,122,122,122,122,122,122,122,122,122,122, + 122,122,122,122,122,122,122,122,194,195,122,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,196,197, + 69,198,199,200,201,202,203,122,204,205,206,207,208,209,210,211, + 69, 69, 69, 69,212,213,122,122,122,122,122,122,122,122,214,122, + 215,216,217,122,122,218,122,122,122,219,122,122,122,122,122,220, + 34,221,222,122,122,122,122,122,223,224,225,122,226,227,122,122, + 228,229,230,231,232,122, 69,233, 69, 69, 69, 69, 69,234,235,236, + 237,238, 69, 69,239,240, 69,241,122,122,122,122,122,122,122,122, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,242, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,243, 34, + 244, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,245, 34, 34, + 34, 34, 34, 34, 34, 34, 34,246,122,122,122,122,122,122,122,122, + 34, 34, 34, 34,247,122,122,122,122,122,122,122,122,122,122,122, + 34, 34, 34, 34, 34, 34,248, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34,249,122,122,122,122,122,122,122,122, + 250,122,251,252,122,122,122,122,122,122,122,122,122,122,122,122, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,253, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,254, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, @@ -1213,7 +1215,7 @@ _hb_ucd_u8[17936] = 44, 44, 57, 80, 36, 61, 62, 44, 44, 44, 44, 93, 27, 27, 27, 91, 70, 86, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 87, 86, 86, 90, 85, 90, 86, 43, 44, 44, 44, 89, 90, 44, 44, 62, 61, - 62, 61, 44, 44, 44, 44, 44, 44, 43, 86, 36, 36, 36, 36, 61, 36, + 62, 94, 44, 44, 44, 44, 44, 44, 43, 86, 36, 36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 70, 71, 86, 87, 43, 80, 86, 90, 86, 87, 77, 44, 44, 36, 94, 27, 27, 27, 95, 27, 27, 27, 27, 91, 36, 36, 36, 57, 86, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36, @@ -1223,7 +1225,7 @@ _hb_ucd_u8[17936] = 36, 36, 36, 75, 43, 43, 43, 60, 7, 7, 7, 7, 7, 2, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 62, 61, 61, 36, 36, 61, 36, 36, 36, 36, 62, 62, 36, 36, 36, 36, 70, 36, 43, 43, 43, 43, 71, 44, - 36, 36, 61, 81, 43, 43, 43, 44, 7, 7, 7, 7, 7, 44, 36, 36, + 36, 36, 61, 81, 43, 43, 43, 80, 7, 7, 7, 7, 7, 44, 36, 36, 77, 67, 2, 2, 2, 2, 2, 2, 2, 97, 97, 67, 43, 67, 67, 67, 7, 7, 7, 7, 7, 27, 27, 27, 27, 27, 50, 50, 50, 4, 4, 86, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, @@ -1390,18 +1392,19 @@ _hb_ucd_u8[17936] = 44, 44, 44, 44,179, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44, 16,110, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27,100, 36, 36, 36, 36, 36, 57,184, 44, - 36, 44, 44, 44, 44, 44, 44, 44, 27, 27, 27, 95, 44, 44, 44, 44, - 180, 27, 30, 2, 2, 44, 44, 44, 36, 43, 43, 2, 2, 44, 44, 44, - 36, 36,183, 27, 27, 27, 44, 44, 87, 98, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 60, 2, 2, 2, 44, - 27, 27, 27, 7, 7, 7, 7, 7, 71, 70, 71, 44, 44, 44, 44, 57, - 86, 87, 43, 85, 87, 60,185, 2, 2, 80, 44, 44, 44, 44, 79, 44, - 43, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, 87, 43, - 43, 43, 80, 7, 7, 7, 7, 7, 2, 2, 94, 98, 44, 44, 44, 44, - 36, 70, 2, 61, 44, 44, 44, 44, 36, 94, 86, 43, 43, 43, 43, 85, - 98, 36, 63, 2, 59, 43, 60, 87, 7, 7, 7, 7, 7, 63, 63, 2, - 179, 27, 27, 27, 27, 27, 27, 27, 27, 27,100, 44, 44, 44, 44, 44, - 36, 36, 36, 36, 36, 36, 86, 87, 43, 86, 85, 43, 2, 2, 2, 80, + 36, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 57, 43, + 27, 27, 27, 95, 44, 44, 44, 44,180, 27, 30, 2, 2, 44, 44, 44, + 36, 43, 43, 2, 2, 44, 44, 44, 36, 36,183, 27, 27, 27, 44, 44, + 87, 98, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, + 43, 43, 43, 60, 2, 2, 2, 44, 27, 27, 27, 7, 7, 7, 7, 7, + 71, 70, 71, 44, 44, 44, 44, 57, 86, 87, 43, 85, 87, 60,185, 2, + 2, 80, 44, 44, 44, 44, 79, 44, 43, 71, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 70, 43, 43, 87, 43, 43, 43, 80, 7, 7, 7, 7, 7, + 2, 2, 94, 98, 44, 44, 44, 44, 36, 70, 2, 61, 44, 44, 44, 44, + 36, 94, 86, 43, 43, 43, 43, 85, 98, 36, 63, 2, 59, 43, 60, 87, + 7, 7, 7, 7, 7, 63, 63, 2,179, 27, 27, 27, 27, 27, 27, 27, + 27, 27,100, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 86, 87, + 43, 86, 85, 43, 2, 2, 2, 71, 70, 44, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70, 86, 87, 43, 43, 43, 80, 44, 44, 43, 86, 62, 36, 36, 36, 61, 62, @@ -1423,17 +1426,20 @@ _hb_ucd_u8[17936] = 70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 85, 70, 43, 60, 2, 2, 2, 59, 44, 44, 44, 44, 70, 43, 43, 85, 87, 43, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 85, 43, 2, 72, 2, - 2, 64, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 87, - 63, 2, 2, 44, 44, 44, 44, 44, 2, 36, 36, 36, 36, 36, 36, 36, - 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 89, 43, 43, 43, - 85, 43, 87, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36, - 70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44, - 36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 86, 86, 90, - 43, 89, 87, 87, 61, 44, 44, 44, 36, 70, 85,107, 64, 44, 44, 44, + 2, 64, 44, 44, 44, 44, 44, 44, 2, 2, 2, 2, 2, 44, 44, 44, + 43, 43, 43, 80, 43, 43, 43, 87, 63, 2, 2, 44, 44, 44, 44, 44, + 2, 36, 36, 36, 36, 36, 36, 36, 44, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 89, 43, 43, 43, 85, 43, 87, 80, 44, 44, 44, 44, + 36, 36, 36, 61, 36, 62, 36, 36, 70, 43, 43, 80, 44, 80, 43, 57, + 43, 43, 43, 70, 44, 44, 44, 44, 36, 36, 36, 62, 61, 36, 36, 36, + 36, 36, 36, 36, 36, 86, 86, 90, 43, 89, 87, 87, 61, 44, 44, 44, + 36, 70, 85,107, 64, 44, 44, 44, 43, 94, 36, 36, 36, 36, 36, 36, + 36, 36, 86, 43, 43, 80, 44, 86, 85, 60, 2, 2, 2, 2, 2, 2, 27, 27, 91, 67, 67, 67, 56, 20,168, 67, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44, 93,105,105,105,105,105,105,105,181, 2, 2, 64, 44, 44, 44, 44, 44, 63, 64, 44, 44, 44, 44, 44, 44, - 65, 65, 65, 65,132, 44, 44, 44, 43, 43, 60, 44, 44, 44, 44, 44, + 65, 65, 65, 65, 65, 65, 65, 65, 71, 36, 36, 70, 43, 43, 43, 43, + 43, 43, 43, 44, 44, 44, 44, 44, 43, 43, 60, 44, 44, 44, 44, 44, 43, 43, 43, 60, 2, 2, 67, 67, 40, 40, 97, 44, 44, 44, 44, 44, 7, 7, 7, 7, 7,179, 27, 27, 27, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 62, 36, 27, 27, 27, 30, 2, 64, 44, 44, @@ -1441,7 +1447,8 @@ _hb_ucd_u8[17936] = 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 44, 44, 44, 57, 43, 74, 40, 40, 40, 40, 40, 40, 40, 88, 80, 44, 44, 44, 44, 44, 86, 44, 44, 44, 44, 44, 44, 44, 40, 40, 52, 40, 40, 40, 52, 81, - 36, 61, 44, 44, 44, 44, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, + 36, 61, 44, 44, 44, 44, 44, 44, 44, 61, 44, 44, 44, 44, 44, 44, + 36, 61, 62, 44, 44, 44, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 44, 50, 60, 65, 65, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43, 44, 43, 43, 43, 80, 44, 44, 44, 44, 67, 67, 67, 92, 55, 67, 67, 67, 67, 67,186, 87, 43, 67,186, 86, @@ -1466,10 +1473,12 @@ _hb_ucd_u8[17936] = 43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67, 67, 67, 76, 21, 2, 2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43, 16, 16, 16, 16, 16, 39, 16, 16, 16, 16, 16, 16, 16, 16, 16,110, - 43, 43, 43, 80, 43, 43, 43, 43, 43, 43, 43, 43, 80, 57, 43, 43, - 43, 57, 80, 43, 43, 80, 44, 44, 43, 43, 43, 74, 40, 40, 40, 44, - 7, 7, 7, 7, 7, 44, 44, 77, 36, 36, 36, 36, 36, 36, 36, 80, - 36, 36, 36, 36, 36, 36, 43, 43, 7, 7, 7, 7, 7, 44, 44, 96, + 44, 44,150, 16, 16,110, 44, 44, 43, 43, 43, 80, 43, 43, 43, 43, + 43, 43, 43, 43, 80, 57, 43, 43, 43, 57, 80, 43, 43, 80, 44, 44, + 40, 40, 40, 40, 40, 40, 40, 44, 44, 44, 44, 44, 44, 44, 44, 57, + 43, 43, 43, 74, 40, 40, 40, 44, 7, 7, 7, 7, 7, 44, 44, 77, + 36, 36, 36, 36, 36, 36, 36, 80, 36, 36, 36, 36, 36, 36, 43, 43, + 7, 7, 7, 7, 7, 44, 44, 96, 36, 36, 36, 36, 36, 83, 43, 43, 36, 36, 36, 61, 36, 36, 62, 61, 36, 36, 61,179, 27, 27, 27, 27, 16, 16, 43, 43, 43, 74, 44, 44, 27, 27, 27, 27, 27, 27,163, 27, 188, 27,100, 44, 44, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27,163, @@ -1482,138 +1491,141 @@ _hb_ucd_u8[17936] = 27, 27, 27, 27, 27, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 92, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44, - 67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 55, 67, - 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 44, 67, 67, 92, 44, + 67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 67, 67, + 67, 67, 67, 92, 44, 55, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, + 67, 67, 67, 67, 67, 67, 67, 55, 67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 67, 67, 67, 67, 67, 67, 79, 44, 44, 44, 44, 44, 44, 44, - 65, 65, 65, 65, 65, 65, 65, 65,171,171,171,171,171,171,171, 44, - 171,171,171,171,171,171,171, 0, 0, 0, 29, 21, 21, 21, 23, 21, - 22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21, 9, 9, 9, - 9, 22, 21, 18, 24, 16, 24, 5, 5, 5, 5, 22, 25, 18, 25, 0, - 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, 26, 25, 15, 15, - 24, 15, 7, 19, 15, 21, 9, 25, 9, 5, 5, 25, 5, 9, 5, 7, - 7, 7, 9, 8, 8, 5, 7, 5, 6, 6, 24, 24, 6, 24, 12, 12, - 2, 2, 6, 5, 9, 21, 9, 2, 2, 9, 25, 9, 26, 12, 11, 11, - 2, 6, 5, 21, 17, 2, 2, 26, 26, 23, 2, 12, 17, 12, 21, 12, - 12, 21, 7, 2, 2, 7, 7, 21, 21, 2, 1, 1, 21, 23, 26, 26, - 1, 21, 6, 7, 7, 12, 12, 7, 21, 7, 12, 1, 12, 6, 6, 12, - 12, 26, 7, 26, 26, 7, 2, 1, 12, 2, 6, 2, 24, 7, 7, 6, - 1, 12, 12, 10, 10, 10, 10, 12, 21, 6, 2, 10, 10, 2, 15, 26, - 26, 2, 2, 21, 7, 10, 15, 7, 2, 23, 21, 26, 10, 7, 21, 15, - 15, 2, 17, 7, 29, 7, 7, 22, 18, 2, 14, 14, 14, 7, 10, 21, - 17, 21, 11, 12, 5, 2, 5, 6, 8, 8, 8, 24, 5, 24, 2, 24, - 9, 24, 24, 2, 29, 29, 29, 1, 17, 17, 20, 19, 22, 20, 27, 28, - 1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, - 1, 2, 15, 6, 18, 6, 23, 2, 12, 11, 9, 26, 26, 9, 26, 5, - 5, 26, 14, 9, 5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25, - 18, 22, 5, 12, 2, 5, 22, 21, 21, 22, 18, 17, 26, 6, 7, 14, - 17, 22, 18, 18, 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, 26, 15, - 6, 21, 11, 21, 24, 9, 6, 9, 23, 26, 6, 10, 4, 4, 3, 3, - 7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 25, 2, 25, 24, 2, 15, - 12, 15, 14, 2, 21, 14, 7, 15, 12, 17, 21, 1, 26, 10, 10, 1, - 23, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, - 13, 0, 14, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, - 0, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0, 0, 0, 0, + 171,171,171,171,171,171,171, 44,171,171,171,171,171,171,171, 0, + 0, 0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13, + 25, 25, 25, 21, 21, 9, 9, 9, 9, 22, 21, 18, 24, 16, 24, 5, + 5, 5, 5, 22, 25, 18, 25, 0, 23, 23, 26, 21, 24, 26, 7, 20, + 25, 1, 26, 24, 26, 25, 15, 15, 24, 15, 7, 19, 15, 21, 9, 25, + 9, 5, 5, 25, 5, 9, 5, 7, 7, 7, 9, 8, 8, 5, 7, 5, + 6, 6, 24, 24, 6, 24, 12, 12, 2, 2, 6, 5, 9, 21, 9, 2, + 2, 9, 25, 9, 26, 12, 11, 11, 2, 6, 5, 21, 17, 2, 2, 26, + 26, 23, 2, 12, 17, 12, 21, 12, 12, 21, 7, 2, 2, 7, 7, 21, + 21, 2, 1, 1, 21, 23, 26, 26, 1, 21, 6, 7, 7, 12, 12, 7, + 21, 7, 12, 1, 12, 6, 6, 12, 12, 26, 7, 26, 26, 7, 2, 1, + 12, 2, 6, 2, 24, 7, 7, 6, 1, 12, 12, 10, 10, 10, 10, 12, + 21, 6, 2, 10, 10, 2, 15, 26, 26, 2, 2, 21, 7, 10, 15, 7, + 2, 23, 21, 26, 10, 7, 21, 15, 15, 2, 17, 7, 29, 7, 7, 22, + 18, 2, 14, 14, 14, 7, 10, 21, 17, 21, 11, 12, 5, 2, 5, 6, + 8, 8, 8, 24, 5, 24, 2, 24, 9, 24, 24, 2, 29, 29, 29, 1, + 17, 17, 20, 19, 22, 20, 27, 28, 1, 29, 21, 20, 19, 21, 21, 16, + 16, 21, 25, 22, 18, 21, 21, 29, 1, 2, 15, 6, 18, 6, 23, 2, + 12, 11, 9, 26, 26, 9, 26, 5, 5, 26, 14, 9, 5, 14, 14, 15, + 25, 26, 26, 22, 18, 26, 18, 25, 18, 22, 5, 12, 2, 5, 22, 21, + 21, 22, 18, 17, 26, 6, 7, 14, 17, 22, 18, 18, 26, 14, 17, 6, + 14, 6, 12, 24, 24, 6, 26, 15, 6, 21, 11, 21, 24, 9, 6, 9, + 23, 26, 6, 10, 4, 4, 3, 3, 7, 25, 17, 16, 16, 22, 16, 16, + 25, 17, 25, 2, 25, 24, 2, 15, 12, 15, 14, 2, 21, 14, 7, 15, + 12, 17, 21, 1, 26, 10, 10, 1, 23, 15, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 0, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 0, + 15, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, - 0, 0, 39, 40, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, - 0, 0, 0, 0, 6, 7, 8, 0, 9, 0, 10, 11, 0, 0, 12, 13, - 14, 15, 16, 0, 0, 0, 0, 17, 18, 19, 20, 0, 21, 0, 22, 23, - 0, 24, 25, 0, 0, 24, 26, 27, 0, 24, 26, 0, 0, 24, 26, 0, - 0, 24, 26, 0, 0, 0, 26, 0, 0, 24, 28, 0, 0, 24, 26, 0, - 0, 29, 26, 0, 0, 0, 30, 0, 0, 31, 32, 0, 0, 33, 34, 0, - 35, 36, 0, 37, 38, 0, 39, 0, 0, 40, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 43, 44, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, - 0, 47, 0, 0, 0, 0, 0, 0, 48, 0, 0, 49, 0, 50, 51, 0, - 0, 52, 53, 54, 0, 55, 0, 56, 0, 57, 0, 0, 0, 0, 58, 59, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 62, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, - 0, 0, 0, 65, 0, 0, 0, 66, 0, 67, 0, 0, 68, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 0, 0, 71, - 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 53, 74, - 0, 75, 76, 0, 0, 77, 78, 0, 0, 0, 0, 0, 0, 79, 80, 81, - 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 21, 22, 23, 0, 0, 0, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 85, - 0, 0, 0, 86, 0, 0, 0, 0, 87, 88, 0, 0, 0, 0, 0, 89, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, + 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, - 0, 0, 92, 0, 93, 0, 0, 0, 0, 0, 72, 94, 0, 95, 0, 0, - 96, 97, 0, 77, 0, 0, 98, 0, 0, 99, 0, 0, 0, 0, 0,100, - 0,101, 26,102, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,104, 0, - 0, 0, 0, 0, 0, 65,105, 0, 0, 65, 0, 0, 0,106, 0, 0, - 0,107, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, - 0,108,109, 0, 0, 0, 0, 78, 0, 44,110, 0,111, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, - 0, 0,112, 0,113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, - 0,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0, 0,117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 39, 0, 0, 0, 0, 0, 0, 40, 41, 42, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,118,119,120, 0, 0, 0, 0,121, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,122,123, 0, 0, 0, 0, 0, 0, - 0,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 0,125, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 0, - 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, - 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 0, 0, 0, 0, - 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 1, - 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, - 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 38, 1, 39, - 14, 39, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 0, 0, - 0, 0, 19, 1, 21, 0, 0, 47, 0, 0, 0, 0, 0, 38, 48, 1, - 1, 49, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, - 0, 0, 0, 0, 0, 0, 52, 1, 0, 0, 38, 14, 4, 1, 1, 1, - 53, 21, 43, 52, 54, 21, 35, 1, 0, 0, 0, 0, 0, 0, 0, 55, - 0, 0, 0, 56, 57, 58, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 56, 0, 60, 0, 0, - 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 63, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 69, 70, 0, - 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 0, 0, 0, 0, 0, 0, - 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 0, - 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, - 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, - 0, 0, 0, 0, 63, 0, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 19, 84, 0, - 62, 0, 0, 0, 0, 49, 1, 85, 0, 0, 0, 0, 1, 52, 15, 86, - 36, 10, 21, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, - 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 19, 10, 1, 0, 0, 0, - 0, 0, 88, 0, 0, 0, 0, 0, 0, 89, 0, 0, 88, 0, 0, 0, - 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 87, 9, 12, 4, - 90, 8, 91, 47, 0, 58, 50, 0, 21, 1, 21, 92, 93, 1, 1, 1, - 1, 1, 1, 1, 1, 94, 95, 96, 0, 0, 0, 0, 97, 1, 98, 58, - 81, 99,100, 4, 58, 0, 0, 0, 0, 0, 0, 19, 50, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 61, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0,101,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103, 0, - 0, 0, 0, 19, 0, 1, 1, 50, 0, 0, 0, 0, 0, 0, 0, 38, - 0, 0, 0, 0, 50, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 62, 0, 0, 0, 0, 1, 1, 1, 1, 50, 0, 0, 0, - 0, 0,104, 68, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, - 0, 0, 0, 0, 78, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,105,106, 58, 38, 81, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0,107, - 1, 14, 4, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, - 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 87, 0, - 0, 0, 0,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,109, 61, - 0,110, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 58, 0, 0, 0, 0, 0,111, 14, 52, 84, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, + 9, 0, 10, 11, 0, 0, 12, 13, 14, 15, 16, 0, 0, 0, 0, 17, + 18, 19, 20, 0, 21, 0, 22, 23, 0, 24, 25, 0, 0, 24, 26, 27, + 0, 24, 26, 0, 0, 24, 26, 0, 0, 24, 26, 0, 0, 0, 26, 0, + 0, 24, 28, 0, 0, 24, 26, 0, 0, 29, 26, 0, 0, 0, 30, 0, + 0, 31, 32, 0, 0, 33, 34, 0, 35, 36, 0, 37, 38, 0, 39, 0, + 0, 40, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 0, 0, 0, 45, 0, + 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, + 48, 0, 0, 49, 0, 50, 51, 0, 0, 52, 53, 54, 0, 55, 0, 56, + 0, 57, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 60, 61, + 0, 0, 0, 0, 0, 0, 62, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 66, + 0, 67, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 69, 70, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 73, 0, 0, 0, 0, 53, 74, 0, 75, 76, 0, 0, 77, 78, 0, + 0, 0, 0, 0, 0, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, + 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, + 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 86, 0, 0, 0, 0, + 87, 88, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 91, 0, 92, 0, 0, 93, 0, 94, 0, 0, 0, + 0, 0, 72, 95, 0, 96, 0, 0, 97, 98, 0, 77, 0, 0, 99, 0, + 0,100, 0, 0, 0, 0, 0,101, 0,102, 26,103, 0, 0, 0, 0, + 0, 0,104, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 65,106, 0, + 0, 65, 0, 0, 0,107, 0, 0, 0,108, 0, 0, 0, 0, 0, 0, + 0, 96, 0, 0, 0, 0, 0, 0, 0,109,110, 0, 0, 0, 0, 78, + 0, 44,111, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 65, 0, 0, 0, 0, 0, 0, 0, 0,113, 0,114, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,116, 0,117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, + 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,121,122, 0, 0, + 0, 0,123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 124,125, 0, 0,126, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,127, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,129, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,130, 0, 0, 0,131, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, + 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, + 18, 1, 1, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, + 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 31, 0, + 0, 0, 32, 33, 34, 35, 1, 36, 0, 0, 0, 0, 37, 0, 0, 0, + 0, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, 0, 0, 0, 0, + 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 43, 36, 44, 45, + 21, 45, 46, 0, 0, 0, 0, 0, 0, 0, 19, 1, 21, 0, 0, 47, + 0, 0, 0, 0, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 52, 1, + 0, 0, 38, 14, 4, 1, 1, 1, 53, 21, 43, 52, 54, 21, 35, 1, + 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, 0, 0, + 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, + 0, 0, 0, 56, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, + 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, + 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, + 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, + 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 71, 72, 73, 74, + 75, 76, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 78, 79, 0, 0, 0, 0, 47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 80, 0, 0, + 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 63, 0, 0, 81, + 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, + 0, 0, 0, 0, 0, 19, 84, 0, 62, 0, 0, 0, 0, 49, 1, 85, + 0, 0, 0, 0, 1, 52, 15, 86, 36, 10, 21, 87, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, + 0, 89, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, + 0, 0, 0, 0, 87, 9, 12, 4, 90, 8, 91, 47, 0, 58, 50, 0, + 21, 1, 21, 92, 93, 1, 1, 1, 1, 1, 1, 1, 1, 94, 95, 96, + 0, 0, 0, 0, 97, 1, 98, 58, 81, 99,100, 4, 58, 0, 0, 0, + 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,101,102, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,103, 0, 0, 0, 0, 19, 0, 1, 1, 50, + 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 50, 0, 0, 0, + 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, + 1, 1, 1, 1, 50, 0, 0, 0, 0, 0,104, 68, 0, 0, 0, 0, + 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, + 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,106, 58, 38, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, + 0, 0, 0, 0, 0, 0, 0,107, 1, 14, 4, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 47, 84, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 38, 87, 0, 0, 0, 0,108, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,109, 61, 0,110, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 19, 58, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 51, 0,111, 14, 52, 84, 0, 0, 0, 112, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 61, 0, 0, 0, 0, 0, 0,113, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, 0, 0, 0, 0, @@ -1624,89 +1636,90 @@ _hb_ucd_u8[17936] = 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 78, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 89, 80, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 8, 91, 0, 0, - 0, 0, 0, 0, 1, 87, 0, 0, 0, 0, 0, 0,116, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,117, 0,118,119,120,121, 0,104, 4, - 122, 49, 23, 0, 0, 0, 0, 0, 0, 0, 38, 50, 0, 0, 0, 0, - 38, 58, 0, 0, 0, 0, 0, 0, 1, 87, 1, 1, 1, 1, 39, 1, - 48,105, 87, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4,122, 0, 0, - 0, 1,123, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230, - 230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220, - 220,220,220,202,202,220,220,220, 1, 1, 1, 1, 1,220,220,220, - 220,230,230,230,230,240,230,220,220,220,230,230,230,220,220, 0, - 230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233, - 234,234,233,230, 0, 0, 0,230, 0,220,230,230,230,230,220,230, - 230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0, - 230,220, 0, 18, 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, 30, 31, - 32, 33, 34,230,230,220,220,230,220,230,230,220, 35, 0, 0, 0, - 0, 0,230,230,230, 0, 0,230,230, 0,220,230,230,220, 0, 0, - 0, 36, 0, 0,230,220,230,230,220,220,230,220,220,230,220,230, - 220,230,230, 0, 0,220, 0, 0,230,230, 0,230, 0,230,230,230, - 230,230, 0, 0, 0,220,220,220,230,220,220,220,230,230, 0,220, - 27, 28, 29,230, 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230, - 230, 0, 0, 0, 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 9, 0,103,103, 9, 0,107,107,107,107, - 118,118, 9, 0,122,122,122,122,220,220, 0, 0, 0,220, 0,220, - 0,216, 0, 0, 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130, - 130,130, 0, 0,130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, - 0, 0, 0, 7, 0, 9, 9, 0, 9, 9, 0, 0, 0,230, 0, 0, - 0,228, 0, 0, 0,222,230,220,220, 0, 0, 0,230, 0, 0,220, - 230,220, 0,220,230,230,230, 0, 0, 0, 9, 9, 0, 0, 7, 0, - 230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,202,230,230,230, - 230,230,232,228,228,220,218,230,233,220,230,220,230,230, 1, 1, - 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, 0, 0,218,228, - 232,222,224,224, 0, 8, 8, 0, 0, 0, 0,220,230, 0,230,230, - 220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, - 0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0, - 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0, - 0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0, - 220,220,220, 0,230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, - 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, - 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 0, 0, 0, 0, 61, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 91, 0, 0, 0, 0, 0, 0, 1, 87, 0, 0, + 0, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, + 0,118,119,120,121, 0,104, 4,122, 49, 23, 0, 0, 0, 0, 0, + 0, 0, 38, 50, 0, 0, 0, 0, 38, 58, 0, 0, 0, 0, 0, 0, + 1, 87, 1, 1, 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,123, 0, 0, 0, 0, + 0, 0, 0, 0, 4,122, 0, 0, 0, 1,124, 0, 0, 0, 0, 0, + 0, 0, 0, 0,230,230,230,230,230,232,220,220,220,220,232,216, + 220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220, + 1, 1, 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220, + 220,220,230,230,230,220,220, 0,230,230,230,220,220,220,220,230, + 232,220,220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230, + 0,220,230,230,230,230,220,230,230,230,222,220,230,230,220,220, + 230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, + 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0, + 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230, + 220,230,230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230, + 230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230, + 220,220,230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0, + 230,230, 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220, + 230,220,220,220,230,230, 0,220, 27, 28, 29,230, 7, 0, 0, 0, + 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, 0, 0,230, 0, + 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 9, 0, + 103,103, 9, 0,107,107,107,107,118,118, 9, 0,122,122,122,122, + 220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, 0,129,130, 0, + 132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0,230,230, + 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, 0, 9, 9, 0, + 9, 9, 0, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220, + 220, 0, 0, 0,230, 0, 0,220,230,220, 0,220,230,230,230, 0, + 0, 0, 9, 9, 0, 0, 7, 0,230, 0, 1, 1, 1, 0, 0, 0, + 230,234,214,220,202,230,230,230,230,230,232,228,228,220,218,230, + 233,220,230,220,230,230, 1, 1, 1, 1, 1,230, 0, 1, 1,230, + 220,230, 1, 1, 0, 0,218,228,232,222,224,224, 0, 8, 8, 0, + 0, 0, 0,220,230, 0,230,230,220, 0, 0,230, 0, 0, 26, 0, + 0,220, 0,230,230, 1,220, 0, 0,230,220, 0, 0, 0,220,220, + 0, 0,230,220, 0, 9, 7, 0, 0, 7, 9, 0, 0, 0, 9, 7, + 6, 6, 0, 0, 0, 0, 1, 0, 0,216,216, 1, 1, 1, 0, 0, + 0,226,216,216,216,216,216, 0,220,220,220, 0,232,232,220,230, + 230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19, + 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 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, 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, 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, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 20, 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, - 0, 27, 0, 28, 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, - 34, 35, 36, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 38, 39, 0, 0, 0, 0, 1, 2, 40, 41, 0, 1, 2, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, - 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, - 0, 0, 11, 12, 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, - 17, 18, 0, 19, 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, - 20, 20, 20, 8, 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, - 0, 0, 26, 27, 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, - 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, - 0, 0, 20, 20, 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, - 7, 20, 20, 20, 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, - 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, - 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, - 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, - 43, 44, 0, 45, 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, - 7, 1, 10, 1, 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 34, 9, 0, 0, 20, 20, 1, 20, 20, 0, - 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, - 25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, 0, 27, 0, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 36, 0, + 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, + 0, 0, 0, 0, 1, 2, 40, 41, 0, 1, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 11, 12, + 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19, + 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8, + 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27, + 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 20, 20, + 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, 7, 20, 20, 20, + 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, 38, 1, 20, 20, + 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, 0, 0, 1, 0, + 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, 0, 1, 0, 0, + 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 7, 20, 41, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, 43, 44, 0, 45, + 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1, + 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 26, 34, 9, 0, 0, 20, 20, 1, 20, 20, 0, 0, 0, 0, 0, + 0, 0, 26, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, + 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13, + 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, - 7, 7, 43, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, 7, 7, 43, 7, + 44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, @@ -1727,411 +1740,419 @@ _hb_ucd_u8[17936] = 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 44, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, - 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, - 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, 0, 0, 1, + 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56, + 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61, + 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, - 70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101,102,103,104,105, - 106,107,108,109,110,111, 96,112,113,114,115,116,117,118,119,119, - 120,121,122,123,124,125,126,127,128,129,130,131,132, 96,133,134, - 135,136,137,138,139,140,141,142,143, 96,144,145, 96,146,147,148, - 149, 96,150,151,152,153,154,155, 96, 96,156,157,158,159, 96,160, - 96,161,162,162,162,162,162,162,162,163,164,162,165, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96,166,167,167,167,167,167,167,167,167,168, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,169,169,169,169,170, 96, - 96, 96,171,171,171,171,172,173,174,175, 96, 96, 96, 96,176,177, - 178,179,180,180,180,180,180,180,180,180,180,180,180,180,180,180, - 180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180, - 180,181,180,180,180,180,180,180,182,182,182,183,184, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96,185,186,187,188,189,189,190, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,191,192, 96, 96, 96, 96, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 193,194, 59,195,196,197,198,199,200, 96,201,202,203, 59, 59,204, - 59,205,206,206,206,206,206,207, 96, 96, 96, 96, 96, 96, 96, 96, - 208, 96,209, 96,210, 96, 96,211, 96, 96, 96, 96, 96, 96, 96, 96, - 96,212,213,214,215, 96, 96, 96, 96, 96,216,217,218, 96,219,220, - 96, 96,221,222, 59,223,224, 96, 59, 59, 59, 59, 59, 59, 59,225, - 226,227,228,229, 59, 59,230,231, 59,232, 96, 96, 96, 96, 96, 96, - 96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,233, + 70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109, + 110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123, + 124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138, + 139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151, + 152,153,154,155,156, 96,157,158,159,160, 96,161,162,163,164,164, + 164,164,164,164,164,165,166,164,167, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,168,169,169, + 169,169,169,169,169,169,170, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96,171,171,171,171,172, 96, 96, 96,173,173, + 173,173,174,175,176,177, 96, 96, 96, 96,178,179,180,181,182,182, + 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, + 182,182,182,182,182,182,182,182,182,182,182,182,182,183,182,182, + 182,182,182,182,184,184,184,185,186, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,187,188,189, + 190,191,191,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96,193,194, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,195,196, 59,197, + 198,199,200,201,202, 96,203,204,205, 59, 59,206, 59,207,208,208, + 208,208,208,209, 96, 96, 96, 96, 96, 96, 96, 96,210, 96,211,212, + 213, 96, 96,214, 96, 96, 96,215, 96, 96, 96, 96, 96,216,217,218, + 219, 96, 96, 96, 96, 96,220,221,222, 96,223,224, 96, 96,225,226, + 59,227,228, 96, 59, 59, 59, 59, 59, 59, 59,229,230,231,232,233, + 59, 59,234,235, 59,236, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,237, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 234, 70,235, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,236, - 70, 70, 70, 70, 70, 70, 70, 70, 70,237, 96, 96, 96, 96, 96, 96, - 96, 96, 70, 70, 70, 70,238, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 70, 70, 70, 70, 70, 70,239, 96, 96, 96, 96, 96, 96, 96, - 96, 96,240, 96,241,242, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, - 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, - 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 0, - 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, - 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, - 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, - 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 2, 2, 4, - 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14, 14, 2, 2, 2, - 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 3, 3, 3, 3, 3, 0, - 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, - 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, 2, 2, - 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, - 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 2, 2, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37, 37, 2, 2, 2, - 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 2, 2, 2, 2, - 2, 2, 3, 3, 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, - 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, - 2, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, - 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, - 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, - 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 2, 2, 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, - 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, - 11, 2, 11, 11, 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, - 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, - 11, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 2, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, - 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, - 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, - 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, - 10, 10, 2, 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, - 2, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, - 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, - 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 2, 2, 2, 2, 21, 21, - 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, - 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, - 2, 2, 2, 22, 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, - 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, - 22, 22, 22, 2, 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, - 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, - 23, 23, 23, 23, 2, 2, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, - 2, 2, 2, 2, 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 23, - 2, 2, 23, 23, 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, - 2, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, - 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, - 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, - 2, 2, 2, 2, 2, 2, 2, 16, 16, 2, 16, 16, 16, 16, 2, 2, - 16, 16, 2, 16, 16, 2, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, - 20, 20, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, - 20, 20, 2, 36, 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, - 36, 36, 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, - 2, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, - 36, 2, 2, 2, 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, - 2, 2, 2, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, - 2, 2, 2, 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, - 2, 18, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, - 18, 2, 18, 18, 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, - 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, - 2, 2, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, - 0, 0, 0, 25, 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, 33, 33, - 33, 33, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 2, 8, 2, 2, 2, 2, 2, 8, 2, 2, 8, 8, 8, 0, 8, 8, - 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, - 30, 2, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 2, - 2, 2, 30, 30, 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 28, 28, - 28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, - 2, 2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, - 35, 35, 35, 2, 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, - 0, 2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 2, 2, - 2, 2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, - 46, 46, 46, 2, 46, 46, 2, 2, 2, 2, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 2, 2, 31, 31, 2, 2, 2, 2, - 2, 2, 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 2, 2, 2, 2, 2, - 2, 2, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28, 28, 28, 28, 28, - 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 2, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2, 2, 2, 48, 48, - 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 2, 2, 52, 52, 52, 52, 52, 2, 2, 2, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58, 2, 2, 2, 2, - 2, 2, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91, 91, 91, 91, 2, - 2, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91, 91, 91, 91, 91, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 62, 62, 62, 62, 62, 62, - 62, 2, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 2, 2, 2, 2, 2, 2, 2, 2, 93, 93, - 93, 93, 70, 70, 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, - 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73, 73, 73, 73, 73, - 73, 73, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 8, - 8, 8, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, - 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, - 9, 9, 9, 9, 19, 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, - 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, - 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 2, 2, - 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, 9, 2, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, - 0, 2, 19, 19, 19, 19, 19, 2, 2, 2, 0, 2, 2, 2, 2, 2, - 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, - 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 0, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, - 2, 2, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 2, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 56, 56, 56, 56, 56, 56, - 56, 56, 55, 55, 55, 55, 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, - 55, 55, 61, 61, 61, 61, 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, - 2, 61, 61, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, - 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, - 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 13, - 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, - 12, 12, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, 15, 15, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,240, 70, 70, 70, 70, + 70, 70, 70, 70, 70,241, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70,242, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70, 70, 70,243, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70,244, 96, 96, 96, 96, 96, 96, 96, 96,245, 96, + 246,247, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, + 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, + 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2, + 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 6, 2, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 2, 4, 4, 4, 2, 2, 4, 4, 4, 2, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 2, + 2, 2, 2, 2, 2, 2, 14, 14, 14, 2, 2, 2, 2, 14, 14, 14, + 14, 14, 14, 2, 2, 2, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 3, + 3, 3, 3, 3, 3, 3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, 2, 2, 2, 2, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, 64, 64, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, + 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 2, 2, 95, 2, 37, 37, 37, 2, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 3, 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, + 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, + 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 5, 5, + 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, + 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, + 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2, + 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5, + 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11, + 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, + 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, + 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11, + 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11, + 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2, + 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 10, + 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, + 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, + 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, 10, + 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2, + 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, + 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21, + 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, + 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, + 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, 21, 21, 21, 21, + 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2, + 2, 2, 2, 21, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21, + 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22, + 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22, + 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 2, + 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, + 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, + 2, 2, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2, + 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 23, 2, 2, 23, 23, + 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, + 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2, + 2, 2, 2, 16, 16, 2, 16, 16, 16, 16, 2, 2, 16, 16, 2, 16, + 16, 16, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 2, 2, + 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 20, 20, 2, 36, + 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, + 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, 2, + 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, + 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, 2, 2, 2, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18, + 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18, + 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, + 18, 18, 18, 18, 18, 2, 18, 18, 2, 2, 18, 18, 18, 18, 25, 25, + 25, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 2, 2, 2, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, + 25, 25, 25, 0, 0, 0, 0, 25, 25, 2, 2, 2, 2, 2, 33, 33, + 33, 33, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 2, 8, 2, 2, 2, 2, 2, 8, 2, 2, 8, 8, + 8, 0, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30, + 30, 30, 30, 30, 30, 2, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, + 30, 30, 30, 2, 2, 2, 30, 30, 2, 2, 2, 2, 2, 2, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28, + 28, 28, 28, 28, 28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 2, 2, 2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 0, 0, 0, 35, 35, 35, 2, 2, 2, 2, 2, 2, 2, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 0, 0, 2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 2, 2, 2, 2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 2, 46, 46, 46, 2, 46, 46, 2, 2, 2, 2, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 2, 2, 31, 31, + 2, 2, 2, 2, 2, 2, 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 2, + 2, 2, 2, 2, 2, 2, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28, + 28, 28, 28, 28, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 2, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2, + 2, 2, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 2, 2, 52, 52, 52, 52, 52, 2, 2, 2, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58, + 2, 2, 2, 2, 2, 2, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91, + 91, 91, 91, 2, 2, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91, + 91, 91, 91, 91, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 62, 62, + 62, 62, 62, 62, 62, 2, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 2, 2, 2, 2, 2, 2, + 2, 2, 93, 93, 93, 93, 70, 70, 70, 70, 70, 70, 70, 70, 2, 2, + 2, 70, 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73, + 73, 73, 73, 73, 73, 73, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8, + 8, 2, 2, 8, 8, 8, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19, + 19, 19, 19, 19, 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 9, 9, 9, 9, + 9, 19, 19, 19, 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 9, + 2, 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, + 9, 9, 2, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 2, 2, + 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 19, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 2, 19, 19, 19, 19, 19, 2, 2, 2, 0, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0, + 0, 2, 2, 2, 2, 2, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 56, 56, + 56, 56, 56, 56, 56, 56, 55, 55, 55, 55, 2, 2, 2, 2, 2, 55, + 55, 55, 55, 55, 55, 55, 61, 61, 61, 61, 61, 61, 61, 61, 2, 2, + 2, 2, 2, 2, 2, 61, 61, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13, + 13, 13, 13, 13, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 1, 1, 1, 12, 12, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, - 17, 17, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 2, 12, 12, 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, 17, 17, - 17, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, - 2, 2, 39, 39, 39, 39, 39, 39, 39, 2, 86, 86, 86, 86, 86, 86, - 86, 86, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 2, 2, - 2, 2, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 19, 19, 19, 19, - 19, 19, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, - 2, 2, 19, 19, 2, 19, 2, 19, 19, 19, 19, 19, 2, 2, 2, 2, - 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 2, 2, 2, 0, 0, 2, 2, 2, 2, - 2, 2, 65, 65, 65, 65, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, - 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 74, 12, 12, 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2, - 84, 84, 33, 33, 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 2, 68, 68, 68, 68, 68, 68, - 2, 2, 68, 68, 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 2, 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, - 92, 92, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 2, 2, 30, 30, 30, 30, 30, 30, 2, 19, 19, 19, 0, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 9, 19, 19, 19, 19, 0, 0, 2, 2, - 2, 2, 87, 87, 87, 87, 87, 87, 2, 2, 87, 87, 2, 2, 2, 2, - 2, 2, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, - 12, 12, 13, 13, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, - 19, 2, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 14, 14, 14, 14, 14, 2, - 14, 2, 14, 14, 2, 14, 14, 2, 14, 14, 3, 3, 3, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 0, 0, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, - 2, 3, 1, 1, 1, 1, 1, 1, 6, 6, 0, 0, 0, 2, 0, 0, - 0, 0, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, - 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 12, 12, - 12, 12, 2, 2, 12, 12, 12, 2, 2, 2, 2, 0, 0, 0, 0, 0, - 2, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 2, 49, 49, - 2, 49, 49, 49, 49, 49, 49, 49, 2, 2, 49, 49, 49, 2, 2, 2, - 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, - 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 9, 2, 2, 2, 2, 2, - 2, 2, 0, 0, 0, 0, 0, 1, 2, 2, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, - 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 42, 42, 42, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 2, 2, 2, 2, 2,118,118,118,118,118,118, - 118,118,118,118,118, 2, 2, 2, 2, 2, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 2, 2, 2, 2, 59, 59, 59, 59, 59, 59, - 2, 2, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51, 51, 51, 51, 51, - 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 2, 2, 50, 50, 2, 2, 2, 2, 2, 2,135,135,135,135,135,135, - 135,135,135,135,135,135, 2, 2, 2, 2,106,106,106,106,106,106, - 106,106,104,104,104,104,104,104,104,104,104,104,104,104, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2,104,161,161,161,161,161,161, - 161,161,161,161,161, 2,161,161,161,161,161,161,161, 2,161,161, - 2,161,161,161, 2,161,161,161,161,161,161,161, 2,161,161, 2, - 2, 2,110,110,110,110,110,110,110,110,110,110,110,110,110,110, - 110, 2,110,110,110,110,110,110, 2, 2, 19, 19, 19, 19, 19, 19, - 2, 19, 19, 2, 19, 19, 19, 19, 19, 19, 47, 47, 47, 47, 47, 47, - 2, 2, 47, 2, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, - 2, 47, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 2, 81,120,120,120,120,120,120,120,120,116,116,116,116,116,116, - 116,116,116,116,116,116,116,116,116, 2, 2, 2, 2, 2, 2, 2, - 2,116,128,128,128,128,128,128,128,128,128,128,128, 2,128,128, - 2, 2, 2, 2, 2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 98, 98, - 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, - 97, 97, 2, 2, 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, 2, 57, - 57, 2, 2, 2, 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, - 57, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, - 2, 57, 57, 2, 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, 88, 88, - 88, 88,117,117,117,117,117,117,117,117,112,112,112,112,112,112, - 112,112,112,112,112,112,112,112,112, 2, 2, 2, 2,112,112,112, - 112,112, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 2, 2, 2, 78, 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 2, 2, 2, 2, 2,122,122,122,122,122,122, - 122,122,122,122, 2, 2, 2, 2, 2, 2, 2,122,122,122,122, 2, - 2, 2, 2,122,122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, - 89, 89, 89, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130, - 130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130, - 130,130,144,144,144,144,144,144,144,144,144,144, 2, 2, 2, 2, - 2, 2,156,156,156,156,156,156,156,156,156,156, 2,156,156,156, - 2, 2,156,156, 2, 2, 2, 2, 2, 2,147,147,147,147,147,147, - 147,147,148,148,148,148,148,148,148,148,148,148, 2, 2, 2, 2, - 2, 2,158,158,158,158,158,158,158,158,158,158, 2, 2, 2, 2, - 2, 2,153,153,153,153,153,153,153,153,153,153,153,153, 2, 2, - 2, 2,149,149,149,149,149,149,149,149,149,149,149,149,149,149, - 149, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 2, 2, - 2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101,101,101,101,101, - 101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101, 2, 2, 2, 2, - 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, - 96, 96,111,111,111,111,111,111,111,111,111,111,111,111,111,111, - 111, 2,100,100,100,100,100,100,100,100, 2, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,108,108,108,108,108,108, - 108,108,108,108, 2,108,108,108,108,108,108,108,108,108,108,108, - 108, 2,129,129,129,129,129,129,129, 2,129, 2,129,129,129,129, - 2,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, - 2,129,129,129, 2, 2, 2, 2, 2, 2,109,109,109,109,109,109, - 109,109,109,109,109, 2, 2, 2, 2, 2,109,109, 2, 2, 2, 2, - 2, 2,107,107,107,107, 2,107,107,107,107,107,107,107,107, 2, - 2,107,107, 2, 2,107,107,107,107,107,107,107,107,107,107,107, - 107,107,107, 2,107,107,107,107,107,107,107, 2,107,107, 2,107, - 107,107,107,107, 2, 1,107,107,107,107,107, 2, 2,107,107,107, - 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2, 2, 2, 2,107, - 107,107,107,107,107,107, 2, 2,107,107,107,107,107,107,107, 2, - 2, 2,137,137,137,137,137,137,137,137,137,137,137,137, 2,137, - 137,137,137,137, 2, 2, 2, 2, 2, 2,124,124,124,124,124,124, - 124,124,124,124, 2, 2, 2, 2, 2, 2,123,123,123,123,123,123, - 123,123,123,123,123,123,123,123, 2, 2,114,114,114,114,114,114, - 114,114,114,114,114,114,114, 2, 2, 2,114,114, 2, 2, 2, 2, - 2, 2, 32, 32, 32, 32, 32, 2, 2, 2,102,102,102,102,102,102, - 102,102,102,102, 2, 2, 2, 2, 2, 2,126,126,126,126,126,126, - 126,126,126,126,126, 2, 2,126,126,126,126,126,126,126, 2, 2, - 2, 2,126,126,126,126,126,126,126, 2,142,142,142,142,142,142, - 142,142,142,142,142,142, 2, 2, 2, 2,125,125,125,125,125,125, - 125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2,125,154,154,154,154,154,154,154, 2, 2,154, 2, 2,154,154, - 154,154,154,154,154,154, 2,154,154, 2,154,154,154,154,154,154, - 154,154,154,154,154,154,154,154, 2,154,154, 2, 2,154,154,154, - 154,154,154,154, 2, 2, 2, 2, 2, 2,150,150,150,150,150,150, - 150,150, 2, 2,150,150,150,150,150,150,150,150,150,150,150, 2, - 2, 2,141,141,141,141,141,141,141,141,140,140,140,140,140,140, - 140,140,140,140,140, 2, 2, 2, 2, 2,121,121,121,121,121,121, - 121,121,121, 2, 2, 2, 2, 2, 2, 2,133,133,133,133,133,133, - 133,133,133, 2,133,133,133,133,133,133,133,133,133,133,133,133, - 133, 2,133,133,133,133,133,133, 2, 2,133,133,133,133,133, 2, - 2, 2,134,134,134,134,134,134,134,134, 2, 2,134,134,134,134, - 134,134, 2,134,134,134,134,134,134,134,134,134,134,134,134,134, - 134, 2,138,138,138,138,138,138,138, 2,138,138, 2,138,138,138, - 138,138,138,138,138,138,138,138,138,138, 2, 2,138, 2,138,138, - 2,138,138,138, 2, 2, 2, 2, 2, 2,143,143,143,143,143,143, - 2,143,143, 2,143,143,143,143,143,143,143,143,143,143,143,143, - 143,143,143,143,143,143,143,143,143, 2,143,143, 2,143,143,143, - 143,143,143, 2, 2, 2, 2, 2, 2, 2,143,143, 2, 2, 2, 2, - 2, 2,145,145,145,145,145,145,145,145,145, 2, 2, 2, 2, 2, - 2, 2, 86, 2, 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 63, 63, - 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 63, 63, 63, 63, 2, 2, - 2, 2,157,157,157,157,157,157,157,157,157,157,157, 2, 2, 2, - 2, 2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 2, 80, 2, 2, 2, 2, 2, 2, 2,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127, 2, 79, 2, 2, 2, 2, 2, - 2, 2,115,115,115,115,115,115,115,115,115,115,115,115,115,115, - 115, 2,115,115, 2, 2, 2, 2,115,115,159,159,159,159,159,159, - 159,159,159,159,159,159,159,159,159, 2,159,159, 2, 2, 2, 2, - 2, 2,103,103,103,103,103,103,103,103,103,103,103,103,103,103, - 2, 2,119,119,119,119,119,119,119,119,119,119,119,119,119,119, - 2, 2,119,119, 2,119,119,119,119,119, 2, 2, 2, 2, 2,119, - 119,119,146,146,146,146,146,146,146,146,146,146,146, 2, 2, 2, - 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, - 2, 99, 2, 2, 2, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, - 2, 2,136,136,136,136,136,136,136,136,155,155,155,155,155,155, - 155,155,155,155,155,155,155,155, 2, 2,136, 2, 2, 2, 2, 2, - 2, 2, 17, 17, 17, 17, 2, 17, 17, 17, 17, 17, 17, 17, 2, 17, - 17, 2, 17, 15, 15, 15, 15, 15, 15, 15, 17, 17, 17, 2, 2, 2, - 2, 2, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 17, - 17, 17,139,139,139,139,139,139,139,139,139,139,139,139, 2, 2, - 2, 2,105,105,105,105,105,105,105,105,105,105,105, 2, 2, 2, - 2, 2,105,105,105,105,105, 2, 2, 2,105, 2, 2, 2, 2, 2, - 2, 2,105,105, 2, 2,105,105,105,105, 1, 1, 1, 1, 1, 1, - 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, - 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,131,131,131,131,131,131, - 131,131,131,131,131,131, 2, 2, 2, 2, 2, 2, 2,131,131,131, - 131,131, 2,131,131,131,131,131,131,131, 56, 56, 56, 56, 56, 56, - 56, 2, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, - 56, 56, 56, 56, 56, 2, 2, 2, 2, 2,151,151,151,151,151,151, - 151,151,151,151,151,151,151, 2, 2, 2,151,151,151,151,151,151, - 2, 2,151,151, 2, 2, 2, 2,151,151,160,160,160,160,160,160, - 160,160,160,160,160,160,160,160,160, 2,152,152,152,152,152,152, - 152,152,152,152, 2, 2, 2, 2, 2,152, 30, 30, 30, 30, 2, 30, - 30, 2,113,113,113,113,113,113,113,113,113,113,113,113,113, 2, - 2,113,113,113,113,113,113,113,113, 2,132,132,132,132,132,132, - 132,132,132,132,132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2, - 132,132, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 2, 3, 2, - 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, - 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, - 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 3, - 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 3, - 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 15, 0, 0, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 13, 2, 2, 2, 2, 2, - 2, 2, 13, 13, 13, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, - 2, 2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, - 9, 11, 12, 13, 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, + 15, 15, 15, 15, 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 0, 0, 17, 17, 17, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 12, 0, 17, 17, + 17, 17, 17, 17, 17, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 2, 2, 2, 39, 39, 39, 39, 39, 39, 39, 2, 86, 86, + 86, 86, 86, 86, 86, 86, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 2, 2, 2, 2, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, + 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, + 19, 2, 2, 2, 2, 2, 19, 19, 2, 19, 2, 19, 19, 19, 19, 19, + 2, 2, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 65, 65, 65, 65, 65, 65, 65, 65, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 2, 2, 2, 2, + 2, 2, 2, 2, 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 74, 12, 12, 12, 12, 12, 2, 2, 2, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 2, 0, 84, 84, + 2, 2, 2, 2, 84, 84, 33, 33, 33, 33, 33, 33, 33, 2, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 2, 68, 68, + 68, 68, 68, 68, 2, 2, 68, 68, 2, 2, 68, 68, 68, 68, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 2, 2, 2, 2, 2, 2, 2, + 2, 92, 92, 92, 92, 92, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 2, 2, 30, 30, 30, 30, 30, 30, 2, 19, 19, + 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 19, 19, 19, 19, + 0, 0, 2, 2, 2, 2, 87, 87, 87, 87, 87, 87, 2, 2, 87, 87, + 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, + 2, 12, 12, 12, 12, 12, 13, 13, 2, 2, 2, 2, 2, 2, 19, 19, + 19, 19, 19, 19, 19, 2, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2, + 2, 2, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 14, 14, + 14, 14, 14, 2, 14, 2, 14, 14, 2, 14, 14, 2, 14, 14, 3, 3, + 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, + 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 6, 6, 0, 0, + 0, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, + 3, 3, 3, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 2, 2, + 12, 12, 12, 12, 12, 12, 2, 2, 12, 12, 12, 2, 2, 2, 2, 0, + 0, 0, 0, 0, 2, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, + 49, 2, 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 2, 2, 49, 49, + 49, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, + 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 9, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 1, 2, 2, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 2, 2, 2, 2, 2, 2, 2, 1, 0, + 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 42, 42, 42, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 2, 2, 2, 2, 2,118,118, + 118,118,118,118,118,118,118,118,118, 2, 2, 2, 2, 2, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 2, 2, 2, 2, 59, 59, + 59, 59, 59, 59, 2, 2, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51, + 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 2, 2, 50, 50, 2, 2, 2, 2, 2, 2,135,135, + 135,135,135,135,135,135,135,135,135,135, 2, 2, 2, 2,106,106, + 106,106,106,106,106,106,104,104,104,104,104,104,104,104,104,104, + 104,104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,104,161,161, + 161,161,161,161,161,161,161,161,161, 2,161,161,161,161,161,161, + 161, 2,161,161, 2,161,161,161, 2,161,161,161,161,161,161,161, + 2,161,161, 2, 2, 2,110,110,110,110,110,110,110,110,110,110, + 110,110,110,110,110, 2,110,110,110,110,110,110, 2, 2, 19, 19, + 19, 19, 19, 19, 2, 19, 19, 2, 19, 19, 19, 19, 19, 19, 47, 47, + 47, 47, 47, 47, 2, 2, 47, 2, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 2, 47, 47, 2, + 2, 2, 47, 2, 2, 47, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 2, 81,120,120,120,120,120,120,120,120,116,116, + 116,116,116,116,116,116,116,116,116,116,116,116,116, 2, 2, 2, + 2, 2, 2, 2, 2,116,128,128,128,128,128,128,128,128,128,128, + 128, 2,128,128, 2, 2, 2, 2, 2,128,128,128,128,128, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 2, 2, 2, 66, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 2, 72, 98, 98, + 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, 2, 2, + 2, 2, 97, 97, 97, 97, 2, 2, 97, 97, 97, 97, 97, 97, 57, 57, + 57, 57, 2, 57, 57, 2, 2, 2, 2, 2, 57, 57, 57, 57, 57, 57, + 57, 57, 2, 57, 57, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 57, 57, + 57, 2, 2, 2, 2, 57, 57, 2, 2, 2, 2, 2, 2, 2, 88, 88, + 88, 88, 88, 88, 88, 88,117,117,117,117,117,117,117,117,112,112, + 112,112,112,112,112,112,112,112,112,112,112,112,112, 2, 2, 2, + 2,112,112,112,112,112, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 2, 2, 2, 78, 78, 78, 78, 78, 78, 78, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 2, 2, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 2, 2, 2, 2, 2,122,122, + 122,122,122,122,122,122,122,122, 2, 2, 2, 2, 2, 2, 2,122, + 122,122,122, 2, 2, 2, 2,122,122,122,122,122,122,122, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 2, 2, 2, 2, 2, 2, 2,130,130, + 130,130,130,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, + 130,130,130,130,130,130,144,144,144,144,144,144,144,144,144,144, + 2, 2, 2, 2, 2, 2,156,156,156,156,156,156,156,156,156,156, + 2,156,156,156, 2, 2,156,156, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 3, 3, 3,147,147,147,147,147,147,147,147,148,148, + 148,148,148,148,148,148,148,148, 2, 2, 2, 2, 2, 2,158,158, + 158,158,158,158,158,158,158,158, 2, 2, 2, 2, 2, 2,153,153, + 153,153,153,153,153,153,153,153,153,153, 2, 2, 2, 2,149,149, + 149,149,149,149,149,149,149,149,149,149,149,149,149, 2, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, + 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 2, 2, 2, 94, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 85, 2, 2,101,101,101,101,101,101,101,101,101, 2, + 2, 2, 2, 2, 2, 2,101,101, 2, 2, 2, 2, 2, 2, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, 96, 96,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111, 2,100,100, + 100,100,100,100,100,100, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 2, 2, 2,108,108,108,108,108,108,108,108,108,108, + 2,108,108,108,108,108,108,108, 2, 2, 2, 2, 2, 2,129,129, + 129,129,129,129,129, 2,129, 2,129,129,129,129, 2,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129, 2,129,129,129, + 2, 2, 2, 2, 2, 2,109,109,109,109,109,109,109,109,109,109, + 109, 2, 2, 2, 2, 2,109,109, 2, 2, 2, 2, 2, 2,107,107, + 107,107, 2,107,107,107,107,107,107,107,107, 2, 2,107,107, 2, + 2,107,107,107,107,107,107,107,107,107,107,107,107,107,107, 2, + 107,107,107,107,107,107,107, 2,107,107, 2,107,107,107,107,107, + 2, 1,107,107,107,107,107, 2, 2,107,107,107, 2, 2,107, 2, + 2, 2, 2, 2, 2,107, 2, 2, 2, 2, 2,107,107,107,107,107, + 107,107, 2, 2,107,107,107,107,107,107,107, 2, 2, 2,137,137, + 137,137,137,137,137,137,137,137,137,137, 2,137,137,137,137,137, + 2, 2, 2, 2, 2, 2,124,124,124,124,124,124,124,124,124,124, + 2, 2, 2, 2, 2, 2,123,123,123,123,123,123,123,123,123,123, + 123,123,123,123, 2, 2,114,114,114,114,114,114,114,114,114,114, + 114,114,114, 2, 2, 2,114,114, 2, 2, 2, 2, 2, 2, 32, 32, + 32, 32, 32, 2, 2, 2,102,102,102,102,102,102,102,102,102,102, + 2, 2, 2, 2, 2, 2,126,126,126,126,126,126,126,126,126,126, + 126, 2, 2,126,126,126,126,126,126,126, 2, 2, 2, 2,126,126, + 126,126,126,126,126, 2,142,142,142,142,142,142,142,142,142,142, + 142,142, 2, 2, 2, 2,125,125,125,125,125,125,125,125,125,125, + 125, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,125,154,154, + 154,154,154,154,154, 2, 2,154, 2, 2,154,154,154,154,154,154, + 154,154, 2,154,154, 2,154,154,154,154,154,154,154,154,154,154, + 154,154,154,154, 2,154,154, 2, 2,154,154,154,154,154,154,154, + 2, 2, 2, 2, 2, 2,150,150,150,150,150,150,150,150, 2, 2, + 150,150,150,150,150,150,150,150,150,150,150, 2, 2, 2,141,141, + 141,141,141,141,141,141,140,140,140,140,140,140,140,140,140,140, + 140, 2, 2, 2, 2, 2,121,121,121,121,121,121,121,121,121, 2, + 2, 2, 2, 2, 2, 2, 7, 7, 2, 2, 2, 2, 2, 2,133,133, + 133,133,133,133,133,133,133, 2,133,133,133,133,133,133,133,133, + 133,133,133,133,133, 2,133,133,133,133,133,133, 2, 2,133,133, + 133,133,133, 2, 2, 2,134,134,134,134,134,134,134,134, 2, 2, + 134,134,134,134,134,134, 2,134,134,134,134,134,134,134,134,134, + 134,134,134,134,134, 2,138,138,138,138,138,138,138, 2,138,138, + 2,138,138,138,138,138,138,138,138,138,138,138,138,138, 2, 2, + 138, 2,138,138, 2,138,138,138, 2, 2, 2, 2, 2, 2,143,143, + 143,143,143,143, 2,143,143, 2,143,143,143,143,143,143,143,143, + 143,143,143,143,143,143,143,143,143,143,143,143,143, 2,143,143, + 2,143,143,143,143,143,143, 2, 2, 2, 2, 2, 2, 2,143,143, + 2, 2, 2, 2, 2, 2,145,145,145,145,145,145,145,145,145, 2, + 2, 2, 2, 2, 2, 2,163,163,163,163,163,163,163,163,163, 2, + 163,163,163,163,163,163,163,163,163, 2, 2, 2,163,163,163,163, + 2, 2, 2, 2, 2, 2, 86, 2, 2, 2, 2, 2, 2, 2, 22, 22, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, + 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 63, 63, + 63, 63, 2, 2, 2, 2,157,157,157,157,157,157,157,157,157,157, + 157, 2, 2, 2, 2, 2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 2, 2,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127, 2, 79, 2, 2, 2, 2, 2, 2, 2,115,115, + 115,115,115,115,115,115,115,115,115,115,115,115,115, 2,115,115, + 2, 2, 2, 2,115,115,159,159,159,159,159,159,159,159,159,159, + 159,159,159,159,159, 2,159,159, 2, 2, 2, 2, 2, 2,103,103, + 103,103,103,103,103,103,103,103,103,103,103,103, 2, 2,119,119, + 119,119,119,119,119,119,119,119,119,119,119,119, 2, 2,119,119, + 2,119,119,119,119,119, 2, 2, 2, 2, 2,119,119,119,146,146, + 146,146,146,146,146,146,146,146,146, 2, 2, 2, 2, 2, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99, 2, 2, + 2, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, 2, 2,136,136, + 136,136,136,136,136,136,155,155,155,155,155,155,155,155,155,155, + 155,155,155,155, 2, 2,136, 2, 2, 2, 2, 2, 2, 2, 17, 17, + 17, 17, 2, 17, 17, 17, 17, 17, 17, 17, 2, 17, 17, 2, 17, 15, + 15, 15, 15, 15, 15, 15, 17, 17, 17, 2, 2, 2, 2, 2, 2, 2, + 15, 2, 2, 2, 2, 2, 15, 15, 15, 2, 2, 17, 2, 2, 2, 2, + 2, 2, 17, 17, 17, 17,139,139,139,139,139,139,139,139,139,139, + 139,139, 2, 2, 2, 2,105,105,105,105,105,105,105,105,105,105, + 105, 2, 2, 2, 2, 2,105,105,105,105,105, 2, 2, 2,105, 2, + 2, 2, 2, 2, 2, 2,105,105, 2, 2,105,105,105,105, 1, 1, + 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,131,131, + 131,131,131,131,131,131,131,131,131,131, 2, 2, 2, 2, 2, 2, + 2,131,131,131,131,131, 2,131,131,131,131,131,131,131, 2, 2, + 2, 2, 2, 19, 19, 19, 56, 56, 56, 56, 56, 56, 56, 2, 56, 2, + 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, 56, 56, 56, 56, + 56, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 6,151,151,151,151,151,151,151,151,151,151, + 151,151,151, 2, 2, 2,151,151,151,151,151,151, 2, 2,151,151, + 2, 2, 2, 2,151,151,160,160,160,160,160,160,160,160,160,160, + 160,160,160,160,160, 2,152,152,152,152,152,152,152,152,152,152, + 2, 2, 2, 2, 2,152,164,164,164,164,164,164,164,164,164,164, + 2, 2, 2, 2, 2, 2, 30, 30, 30, 30, 2, 30, 30, 2,113,113, + 113,113,113,113,113,113,113,113,113,113,113, 2, 2,113,113,113, + 113,113,113,113,113, 2,132,132,132,132,132,132,132,132,132,132, + 132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2,132,132, 3, 3, + 3, 3, 2, 3, 3, 3, 2, 3, 3, 2, 3, 2, 2, 3, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, + 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 2, 3, + 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, + 2, 2, 2, 2, 0, 0, 15, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 13, 2, + 2, 2, 2, 2, 2, 2, 13, 13, 13, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 9, 9, 9, 10, 9, 11, 12, 13, 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 16, 17, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, + 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -2140,60 +2161,61 @@ _hb_ucd_u8[17936] = 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, - 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, - 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, - 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, - 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, + 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, + 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, - 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, + 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, + 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, + 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, + 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, + 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 67, 68, 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102, - 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,104, 0, 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0, - 108, 0,109, 0,110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, - 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0, + 0, 0, 0, 0, 67, 68, 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0,105,106, 0, + 107, 0, 0, 0,108, 0,109, 0,110, 0,111,112,113, 0,114, 0, + 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,118,119,120,121, 0,122,123,124,125,126, 0,127, + 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,118,119,120,121, 0,122,123,124, + 125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,128,129,130,131,132,133,134,135,136,137,138,139, + 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155, + 156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,162,163, 0, + 0, 0, 0, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151,152,153,154,155,156,157, 0, 0, - 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, - 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,169,170, 0, 0, 0, 0,171, + 172, 0, 0, 0,173,174,175,176,177,178,179,180,181,182,183,184, + 185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200, + 201,202,203,204,205,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,169,170, 0, 0, 0, 0,171,172, 0, 0, 0, - 173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188, - 189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204, - 205,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, + 1, 2, 3, 4, }; static const uint16_t -_hb_ucd_u16[9200] = +_hb_ucd_u16[9320] = { 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, @@ -2267,509 +2289,517 @@ _hb_ucd_u16[9200] = 48, 48, 48, 468, 48, 469, 48, 470, 48, 471, 472, 140, 140, 140, 140, 140, 48, 48, 48, 48, 196, 140, 140, 140, 9, 9, 9, 473, 11, 11, 11, 474, 48, 48, 475, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 271, 476, - 48, 48, 477, 478, 140, 140, 140, 140, 48, 464, 479, 48, 62, 480, 140, 48, - 481, 140, 140, 48, 482, 140, 48, 314, 483, 48, 48, 484, 485, 457, 486, 487, - 222, 48, 48, 488, 489, 48, 196, 192, 490, 48, 491, 492, 493, 48, 48, 494, - 222, 48, 48, 495, 496, 497, 498, 499, 48, 97, 500, 501, 140, 140, 140, 140, - 502, 503, 504, 48, 48, 505, 506, 192, 507, 83, 84, 508, 509, 510, 511, 512, - 48, 48, 48, 513, 514, 515, 478, 140, 48, 48, 48, 516, 517, 192, 140, 140, - 48, 48, 518, 519, 520, 521, 140, 140, 48, 48, 48, 522, 523, 192, 524, 140, - 48, 48, 525, 526, 192, 140, 140, 140, 48, 173, 527, 528, 314, 140, 140, 140, - 48, 48, 500, 529, 140, 140, 140, 140, 140, 140, 9, 9, 11, 11, 148, 530, - 531, 532, 48, 533, 534, 192, 140, 140, 140, 140, 535, 48, 48, 536, 537, 140, - 538, 48, 48, 539, 540, 541, 48, 48, 542, 543, 544, 48, 48, 48, 48, 196, - 84, 48, 518, 545, 546, 148, 175, 547, 48, 548, 549, 550, 140, 140, 140, 140, - 551, 48, 48, 552, 553, 192, 554, 48, 555, 556, 192, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 48, 557, 140, 140, 140, 100, 271, 558, 559, 560, - 48, 207, 140, 140, 140, 140, 140, 140, 272, 272, 272, 272, 272, 272, 561, 562, - 48, 48, 48, 48, 388, 140, 140, 140, 140, 48, 48, 48, 48, 48, 48, 563, - 48, 48, 200, 564, 140, 140, 140, 140, 48, 48, 48, 48, 314, 140, 140, 140, - 48, 48, 48, 196, 48, 200, 370, 48, 48, 48, 48, 200, 192, 48, 204, 565, - 48, 48, 48, 566, 567, 568, 569, 570, 48, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 9, 9, 11, 11, 271, 571, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 572, 573, 574, 574, 575, 576, 140, 140, 140, 140, 577, 578, + 48, 48, 477, 478, 140, 140, 140, 479, 48, 464, 480, 48, 62, 481, 140, 48, + 482, 140, 140, 48, 483, 140, 48, 314, 484, 48, 48, 485, 486, 457, 487, 488, + 222, 48, 48, 489, 490, 48, 196, 192, 491, 48, 492, 493, 494, 48, 48, 495, + 222, 48, 48, 496, 497, 498, 499, 500, 48, 97, 501, 502, 503, 140, 140, 140, + 504, 505, 506, 48, 48, 507, 508, 192, 509, 83, 84, 510, 511, 512, 513, 514, + 48, 48, 48, 515, 516, 517, 478, 140, 48, 48, 48, 518, 519, 192, 140, 140, + 48, 48, 520, 521, 522, 523, 140, 140, 48, 48, 48, 524, 525, 192, 526, 140, + 48, 48, 527, 528, 192, 140, 140, 140, 48, 173, 529, 530, 314, 140, 140, 140, + 48, 48, 501, 531, 140, 140, 140, 140, 140, 140, 9, 9, 11, 11, 148, 532, + 533, 534, 48, 535, 536, 192, 140, 140, 140, 140, 537, 48, 48, 538, 539, 140, + 540, 48, 48, 541, 542, 543, 48, 48, 544, 545, 546, 48, 48, 48, 48, 196, + 547, 140, 140, 140, 140, 140, 140, 140, 84, 48, 520, 548, 549, 148, 175, 550, + 48, 551, 552, 553, 140, 140, 140, 140, 554, 48, 48, 555, 556, 192, 557, 48, + 558, 559, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 48, 560, + 561, 115, 48, 562, 563, 192, 140, 140, 140, 140, 140, 100, 271, 564, 565, 566, + 48, 207, 140, 140, 140, 140, 140, 140, 272, 272, 272, 272, 272, 272, 567, 568, + 48, 48, 48, 48, 388, 140, 140, 140, 140, 48, 48, 48, 48, 48, 48, 569, + 48, 48, 48, 570, 571, 572, 140, 140, 48, 48, 48, 48, 314, 140, 140, 140, + 48, 48, 48, 196, 48, 200, 370, 48, 48, 48, 48, 200, 192, 48, 204, 573, + 48, 48, 48, 574, 575, 576, 577, 578, 48, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 9, 9, 11, 11, 271, 579, 140, 140, 140, 140, 140, 140, + 48, 48, 48, 48, 580, 581, 582, 582, 583, 584, 140, 140, 140, 140, 585, 586, 48, 48, 48, 48, 48, 48, 48, 440, 48, 48, 48, 48, 48, 199, 140, 140, - 196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 579, - 48, 48, 580, 140, 140, 580, 581, 48, 48, 48, 48, 48, 48, 48, 48, 206, - 48, 48, 48, 48, 48, 48, 71, 151, 196, 582, 583, 140, 140, 140, 140, 140, - 32, 32, 584, 32, 585, 209, 209, 209, 209, 209, 209, 209, 323, 140, 140, 140, - 209, 209, 209, 209, 209, 209, 209, 324, 209, 209, 586, 209, 209, 209, 587, 588, - 589, 209, 590, 209, 209, 209, 288, 140, 209, 209, 209, 209, 591, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 271, 592, 209, 209, 209, 209, 209, 287, 271, 461, - 9, 593, 11, 594, 595, 596, 241, 9, 597, 598, 599, 600, 601, 9, 593, 11, - 602, 603, 11, 604, 605, 606, 607, 9, 608, 11, 9, 593, 11, 594, 595, 11, - 241, 9, 597, 607, 9, 608, 11, 9, 593, 11, 609, 9, 610, 611, 612, 613, - 11, 614, 9, 615, 616, 617, 618, 11, 619, 9, 620, 11, 621, 622, 622, 622, - 32, 32, 32, 623, 32, 32, 624, 625, 626, 627, 45, 140, 140, 140, 140, 140, - 628, 629, 140, 140, 140, 140, 140, 140, 630, 631, 632, 140, 140, 140, 140, 140, - 48, 48, 151, 633, 634, 140, 140, 140, 140, 48, 635, 140, 48, 48, 636, 637, - 140, 140, 140, 140, 140, 140, 638, 200, 48, 48, 48, 48, 639, 585, 140, 140, - 9, 9, 597, 11, 640, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 498, - 271, 271, 641, 642, 140, 140, 140, 140, 498, 271, 643, 644, 140, 140, 140, 140, - 645, 48, 646, 647, 648, 649, 650, 651, 652, 206, 653, 206, 140, 140, 140, 654, - 209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 655, 655, 655, 209, 324, - 656, 209, 209, 209, 209, 209, 209, 209, 209, 209, 657, 140, 140, 140, 658, 209, - 659, 209, 209, 325, 660, 661, 324, 140, 209, 209, 209, 209, 209, 209, 209, 662, - 209, 209, 209, 209, 209, 663, 426, 426, 209, 209, 209, 209, 209, 209, 209, 323, - 209, 209, 209, 209, 209, 660, 325, 427, 325, 209, 209, 209, 664, 176, 209, 209, - 664, 209, 657, 661, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 657, 665, - 287, 209, 426, 288, 324, 176, 664, 287, 209, 666, 209, 209, 288, 140, 140, 192, - 48, 48, 48, 48, 48, 48, 140, 140, 48, 48, 48, 196, 48, 48, 48, 48, + 196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 587, + 48, 48, 588, 589, 140, 590, 591, 48, 48, 48, 48, 48, 48, 48, 48, 206, + 48, 48, 48, 48, 48, 48, 71, 151, 196, 592, 593, 140, 140, 140, 140, 140, + 32, 32, 594, 32, 595, 209, 209, 209, 209, 209, 209, 209, 323, 140, 140, 140, + 209, 209, 209, 209, 209, 209, 209, 324, 209, 209, 596, 209, 209, 209, 597, 598, + 599, 209, 600, 209, 209, 209, 288, 140, 209, 209, 209, 209, 601, 140, 140, 140, + 140, 140, 140, 140, 271, 602, 271, 602, 209, 209, 209, 209, 209, 287, 271, 461, + 9, 603, 11, 604, 605, 606, 241, 9, 607, 608, 609, 610, 611, 9, 603, 11, + 612, 613, 11, 614, 615, 616, 617, 9, 618, 11, 9, 603, 11, 604, 605, 11, + 241, 9, 607, 617, 9, 618, 11, 9, 603, 11, 619, 9, 620, 621, 622, 623, + 11, 624, 9, 625, 626, 627, 628, 11, 629, 9, 630, 11, 631, 632, 632, 632, + 32, 32, 32, 633, 32, 32, 634, 635, 636, 637, 45, 140, 140, 140, 140, 140, + 638, 639, 640, 140, 140, 140, 140, 140, 641, 642, 643, 27, 27, 27, 644, 140, + 645, 140, 140, 140, 140, 140, 140, 140, 48, 48, 151, 646, 647, 140, 140, 140, + 140, 48, 648, 140, 48, 48, 649, 650, 140, 140, 140, 140, 140, 48, 651, 192, + 140, 140, 140, 140, 140, 140, 652, 200, 48, 48, 48, 48, 653, 595, 140, 140, + 9, 9, 607, 11, 654, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 499, + 271, 271, 655, 656, 140, 140, 140, 140, 499, 271, 657, 658, 140, 140, 140, 140, + 659, 48, 660, 661, 662, 663, 664, 665, 666, 206, 667, 206, 140, 140, 140, 668, + 209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 669, 669, 669, 209, 324, + 670, 209, 209, 209, 209, 209, 209, 209, 209, 209, 671, 140, 140, 140, 672, 209, + 673, 209, 209, 325, 674, 675, 324, 140, 209, 209, 209, 209, 209, 209, 209, 676, + 209, 209, 209, 209, 209, 677, 426, 426, 209, 209, 209, 209, 209, 209, 209, 678, + 209, 209, 209, 209, 209, 176, 325, 427, 325, 209, 209, 209, 679, 176, 209, 209, + 679, 209, 671, 675, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 671, 426, + 674, 209, 209, 680, 681, 325, 674, 674, 209, 682, 209, 209, 288, 140, 140, 192, + 48, 48, 48, 48, 48, 48, 140, 140, 48, 48, 48, 207, 48, 48, 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 478, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 140, 48, 204, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 71, 140, 140, 140, 667, 140, 668, 668, 668, 668, 668, 668, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 140, - 391, 391, 391, 391, 391, 391, 391, 669, 391, 391, 391, 391, 391, 391, 391, 670, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, - 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, - 12, 13, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 20, 21, 21, 21, 22, 20, 21, 21, 21, 21, - 21, 23, 24, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 27, 28, 26, - 29, 30, 31, 32, 31, 31, 31, 31, 33, 34, 35, 31, 31, 31, 36, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 31, 31, 31, 31, - 37, 38, 37, 37, 37, 37, 37, 37, 37, 39, 31, 31, 31, 31, 31, 31, - 40, 40, 40, 40, 40, 40, 41, 26, 42, 42, 42, 42, 42, 42, 42, 43, - 44, 44, 44, 44, 44, 45, 44, 46, 47, 47, 47, 48, 37, 49, 31, 31, - 31, 50, 51, 31, 31, 31, 31, 31, 31, 31, 31, 31, 52, 31, 31, 31, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 53, 55, 53, 53, 53, - 56, 57, 58, 59, 59, 60, 61, 62, 57, 63, 64, 65, 66, 59, 59, 67, - 68, 69, 70, 71, 71, 72, 73, 74, 69, 75, 76, 77, 78, 71, 79, 26, - 80, 81, 82, 83, 83, 84, 85, 86, 81, 87, 88, 26, 89, 83, 90, 91, - 92, 93, 94, 95, 95, 96, 97, 98, 93, 99, 100, 101, 102, 95, 95, 26, - 103, 104, 105, 106, 107, 104, 108, 109, 104, 105, 110, 26, 111, 108, 108, 112, - 113, 114, 115, 113, 113, 115, 113, 116, 114, 117, 118, 119, 120, 113, 121, 113, - 122, 123, 124, 122, 122, 124, 125, 126, 123, 127, 128, 128, 129, 122, 130, 26, - 131, 132, 133, 131, 131, 131, 131, 131, 132, 133, 134, 131, 135, 131, 131, 131, - 136, 137, 138, 139, 137, 137, 140, 141, 138, 142, 143, 137, 144, 137, 145, 26, - 146, 147, 147, 147, 147, 147, 147, 148, 147, 147, 147, 149, 26, 26, 26, 26, - 150, 151, 152, 152, 153, 152, 152, 154, 155, 154, 152, 156, 26, 26, 26, 26, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 158, 157, 157, 157, 159, 158, 157, - 157, 157, 157, 158, 157, 157, 157, 160, 157, 160, 161, 162, 26, 26, 26, 26, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 164, 164, 164, 164, 165, 166, 164, 164, 164, 164, 164, 167, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 170, 171, 170, 169, 169, 169, 169, - 169, 170, 169, 169, 169, 169, 170, 171, 170, 169, 171, 169, 169, 169, 169, 169, - 169, 169, 170, 169, 169, 169, 169, 169, 169, 169, 169, 172, 169, 169, 169, 173, - 169, 169, 169, 174, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 178, 178, 178, 179, 180, 180, 180, 180, 180, 180, 180, 180, 180, 181, 180, 182, - 183, 183, 184, 185, 186, 186, 187, 26, 188, 188, 189, 26, 190, 191, 192, 26, - 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, 193, 195, 193, 195, - 196, 197, 197, 198, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 199, - 197, 197, 197, 197, 197, 200, 177, 177, 177, 177, 177, 177, 177, 177, 201, 26, - 202, 202, 202, 203, 202, 204, 202, 204, 205, 202, 206, 206, 206, 207, 208, 26, - 209, 209, 209, 209, 209, 210, 209, 209, 209, 211, 209, 212, 193, 193, 193, 193, - 213, 213, 213, 214, 215, 215, 215, 215, 215, 215, 215, 216, 215, 215, 215, 217, - 215, 218, 215, 218, 215, 219, 9, 9, 9, 220, 26, 26, 26, 26, 26, 26, - 221, 221, 221, 221, 221, 221, 221, 221, 221, 222, 221, 221, 221, 221, 221, 223, - 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 226, 227, - 228, 228, 228, 228, 228, 228, 228, 229, 228, 230, 231, 231, 231, 231, 231, 231, - 18, 232, 164, 164, 164, 164, 164, 233, 224, 26, 234, 9, 235, 236, 237, 238, - 2, 2, 2, 2, 239, 240, 2, 2, 2, 2, 2, 241, 242, 243, 2, 244, - 2, 2, 2, 2, 2, 2, 2, 245, 9, 9, 9, 9, 9, 9, 9, 9, - 14, 14, 246, 246, 14, 14, 14, 14, 246, 246, 14, 247, 14, 14, 14, 246, - 14, 14, 14, 14, 14, 14, 248, 14, 248, 14, 249, 250, 14, 14, 251, 252, - 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 255, 256, - 0, 257, 2, 258, 0, 0, 0, 0, 259, 26, 9, 9, 9, 9, 260, 26, - 0, 0, 0, 0, 261, 262, 4, 0, 0, 263, 0, 0, 2, 2, 2, 2, - 2, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 71, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140, + 683, 140, 570, 570, 570, 570, 570, 570, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 140, 391, 391, 391, 391, 391, 391, 391, 684, + 391, 391, 391, 391, 391, 391, 391, 685, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 2, 3, 1, 2, 2, 3, 0, 0, 0, 0, 0, 4, 0, 4, + 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, + 0, 0, 0, 0, 7, 8, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 10, 11, 12, 13, 14, 14, 15, 14, 14, 14, + 14, 14, 14, 14, 16, 17, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 19, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 20, 21, + 21, 21, 22, 20, 21, 21, 21, 21, 21, 23, 24, 25, 25, 25, 25, 25, + 25, 26, 25, 25, 25, 27, 28, 26, 29, 30, 31, 32, 31, 31, 31, 31, + 33, 34, 35, 31, 31, 31, 36, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 29, 31, 31, 31, 31, 37, 38, 37, 37, 37, 37, 37, 37, + 37, 39, 31, 31, 31, 31, 31, 31, 40, 40, 40, 40, 40, 40, 41, 26, + 42, 42, 42, 42, 42, 42, 42, 43, 44, 44, 44, 44, 44, 45, 44, 46, + 47, 47, 47, 48, 37, 49, 31, 31, 31, 50, 51, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 52, 31, 31, 31, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 54, 53, 55, 53, 53, 53, 56, 57, 58, 59, 59, 60, 61, 62, + 57, 63, 64, 65, 66, 59, 59, 67, 68, 69, 70, 71, 71, 72, 73, 74, + 69, 75, 76, 77, 78, 71, 79, 26, 80, 81, 82, 83, 83, 84, 85, 86, + 81, 87, 88, 26, 89, 83, 90, 91, 92, 93, 94, 95, 95, 96, 97, 98, + 93, 99, 100, 101, 102, 95, 95, 26, 103, 104, 105, 106, 107, 104, 108, 109, + 104, 105, 110, 26, 111, 108, 108, 112, 113, 114, 115, 113, 113, 115, 113, 116, + 114, 117, 118, 119, 120, 113, 121, 113, 122, 123, 124, 122, 122, 124, 125, 126, + 123, 127, 128, 128, 129, 122, 130, 26, 131, 132, 133, 131, 131, 131, 131, 131, + 132, 133, 134, 131, 135, 131, 131, 131, 136, 137, 138, 139, 137, 137, 140, 141, + 138, 142, 143, 137, 144, 137, 145, 26, 146, 147, 147, 147, 147, 147, 147, 148, + 147, 147, 147, 149, 26, 26, 26, 26, 150, 151, 152, 152, 153, 152, 152, 154, + 155, 156, 152, 157, 26, 26, 26, 26, 158, 158, 158, 158, 158, 158, 158, 158, + 158, 159, 158, 158, 158, 160, 159, 158, 158, 158, 158, 159, 158, 158, 158, 161, + 158, 161, 162, 163, 26, 26, 26, 26, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, + 166, 167, 165, 165, 165, 165, 165, 168, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 171, 172, 171, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 171, 172, + 171, 170, 172, 170, 170, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 170, + 170, 170, 170, 173, 170, 170, 170, 174, 170, 170, 170, 175, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 180, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 182, 181, 183, 184, 184, 185, 186, 187, 187, 188, 26, + 189, 189, 190, 26, 191, 192, 193, 26, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 195, 194, 196, 194, 196, 197, 198, 198, 199, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 200, 198, 198, 198, 198, 198, 201, 178, 178, + 178, 178, 178, 178, 178, 178, 202, 26, 203, 203, 203, 204, 203, 205, 203, 205, + 206, 203, 207, 207, 207, 208, 209, 26, 210, 210, 210, 210, 210, 211, 210, 210, + 210, 212, 210, 213, 194, 194, 194, 194, 214, 214, 214, 215, 216, 216, 216, 216, + 216, 216, 216, 217, 216, 216, 216, 218, 216, 219, 216, 219, 216, 220, 9, 9, + 9, 221, 26, 26, 26, 26, 26, 26, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 223, 222, 222, 222, 222, 222, 224, 225, 225, 225, 225, 225, 225, 225, 225, + 226, 226, 226, 226, 226, 226, 227, 228, 229, 229, 229, 229, 229, 229, 229, 230, + 229, 231, 232, 232, 232, 232, 232, 232, 18, 233, 165, 165, 165, 165, 165, 234, + 225, 26, 235, 9, 236, 237, 238, 239, 2, 2, 2, 2, 240, 241, 2, 2, + 2, 2, 2, 242, 243, 244, 2, 245, 2, 2, 2, 2, 2, 2, 2, 246, + 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 247, 247, 14, 14, 14, 14, + 247, 247, 14, 248, 14, 14, 14, 247, 14, 14, 14, 14, 14, 14, 249, 14, + 249, 14, 250, 251, 14, 14, 252, 253, 0, 254, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 256, 257, 0, 258, 2, 259, 0, 0, 0, 0, + 260, 26, 9, 9, 9, 9, 261, 26, 0, 0, 0, 0, 262, 263, 4, 0, + 0, 264, 0, 0, 2, 2, 2, 2, 2, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 257, 26, 26, 26, 0, 265, 26, 26, 0, 0, 0, 0, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, - 0, 0, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 2, 2, 2, 2, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 270, 271, - 164, 164, 164, 164, 165, 166, 272, 272, 272, 272, 272, 272, 272, 273, 274, 273, - 169, 169, 171, 26, 171, 171, 171, 171, 171, 171, 171, 171, 18, 18, 18, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, - 276, 276, 276, 277, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 278, 26, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, 26, 26, 26, 0, 280, - 281, 0, 0, 0, 282, 283, 0, 284, 285, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 287, 288, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 291, - 292, 293, 293, 293, 293, 293, 294, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 295, 0, 0, 293, 293, 293, 293, 0, 0, 0, 0, 280, 26, 290, 290, - 168, 168, 168, 295, 0, 0, 0, 0, 0, 0, 0, 0, 168, 168, 168, 296, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 290, 290, 290, 290, 297, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 0, 0, 0, 0, 0, - 276, 276, 276, 276, 276, 276, 276, 276, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 299, 298, 298, 298, 298, 298, 298, 300, 26, 301, 301, 301, 301, 301, 301, - 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, - 302, 302, 302, 302, 302, 303, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 26, - 0, 0, 0, 0, 305, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 306, 2, 2, 2, 2, 2, 2, 2, 307, 308, 309, 26, 26, 310, 2, - 311, 311, 311, 311, 311, 312, 0, 313, 314, 314, 314, 314, 314, 314, 314, 26, - 315, 315, 315, 315, 315, 315, 315, 315, 316, 317, 315, 318, 53, 53, 53, 53, - 319, 319, 319, 319, 319, 320, 321, 321, 321, 321, 322, 323, 168, 168, 168, 324, - 325, 325, 325, 325, 325, 325, 325, 325, 325, 326, 325, 327, 163, 163, 163, 328, - 329, 329, 329, 329, 329, 329, 330, 26, 329, 331, 329, 332, 163, 163, 163, 163, - 333, 333, 333, 333, 333, 333, 333, 333, 334, 26, 26, 335, 336, 336, 337, 26, - 338, 338, 338, 26, 171, 171, 2, 2, 2, 2, 2, 339, 340, 341, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 336, 336, 336, 336, 336, 342, 336, 343, - 168, 168, 168, 168, 344, 26, 168, 168, 295, 345, 168, 168, 168, 168, 168, 344, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 26, 26, 26, + 0, 266, 26, 26, 0, 0, 0, 0, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 269, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 2, 2, 2, 2, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 271, 272, 165, 165, 165, 165, 166, 167, 273, 273, + 273, 273, 273, 273, 273, 274, 275, 274, 170, 170, 172, 26, 172, 172, 172, 172, + 172, 172, 172, 172, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 276, 26, 26, 26, 26, 277, 277, 277, 278, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 279, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 280, 26, 26, 26, 0, 281, 282, 0, 0, 0, 283, 284, 0, 285, + 286, 287, 287, 287, 287, 287, 287, 287, 287, 287, 288, 289, 290, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 292, 293, 294, 294, 294, 294, 294, 295, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 296, 0, 0, 294, 294, 294, 294, + 0, 0, 0, 0, 281, 26, 291, 291, 169, 169, 169, 296, 0, 0, 0, 0, + 0, 0, 0, 0, 169, 169, 169, 297, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 291, 291, 291, 291, 291, 298, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 0, 0, 0, 0, 0, 277, 277, 277, 277, 277, 277, 277, 277, + 0, 0, 0, 0, 0, 0, 0, 0, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 299, 299, 299, 299, 299, 299, + 301, 26, 302, 302, 302, 302, 302, 302, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 304, 26, 26, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 26, 0, 0, 0, 0, 306, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 307, 2, 2, 2, 2, 2, 2, + 2, 308, 309, 310, 26, 26, 311, 2, 312, 312, 312, 312, 312, 313, 0, 314, + 315, 315, 315, 315, 315, 315, 315, 26, 316, 316, 316, 316, 316, 316, 316, 316, + 317, 318, 316, 319, 53, 53, 53, 53, 320, 320, 320, 320, 320, 321, 322, 322, + 322, 322, 323, 324, 169, 169, 169, 325, 326, 326, 326, 326, 326, 326, 326, 326, + 326, 327, 326, 328, 164, 164, 164, 329, 330, 330, 330, 330, 330, 330, 331, 26, + 330, 332, 330, 333, 164, 164, 164, 164, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 26, 26, 336, 337, 337, 338, 26, 339, 339, 339, 26, 172, 172, 2, 2, + 2, 2, 2, 340, 341, 342, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 337, 337, 337, 337, 337, 343, 337, 344, 169, 169, 169, 169, 345, 26, 169, 169, + 296, 346, 169, 169, 169, 169, 169, 345, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 347, 26, 26, 26, 26, 348, 26, 349, 350, 25, 25, 351, 352, + 353, 25, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 354, 26, 355, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 356, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 357, 31, 31, 31, 31, 31, + 31, 358, 26, 26, 26, 26, 31, 31, 9, 9, 0, 314, 9, 359, 0, 0, + 0, 0, 360, 0, 258, 281, 361, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 362, 363, 0, 0, 0, 1, 2, 2, 3, + 1, 2, 2, 3, 364, 291, 290, 291, 291, 291, 291, 365, 169, 169, 169, 296, + 366, 366, 366, 367, 258, 258, 26, 368, 369, 370, 369, 369, 371, 369, 369, 372, + 369, 373, 369, 373, 26, 26, 26, 26, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 374, 375, 0, 0, 0, 0, 0, 376, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 253, 0, 377, 378, 26, 26, 26, + 26, 26, 0, 0, 0, 0, 0, 379, 380, 380, 380, 381, 382, 382, 382, 382, + 382, 382, 383, 26, 384, 0, 0, 281, 385, 385, 385, 385, 386, 387, 388, 388, + 388, 389, 390, 390, 390, 390, 390, 391, 392, 392, 392, 393, 394, 394, 394, 394, + 395, 394, 396, 26, 26, 26, 26, 26, 397, 397, 397, 397, 397, 397, 397, 397, + 397, 397, 398, 398, 398, 398, 398, 398, 399, 399, 399, 400, 399, 401, 402, 402, + 402, 402, 403, 402, 402, 402, 402, 403, 404, 404, 404, 404, 404, 26, 405, 405, + 405, 405, 405, 405, 406, 407, 408, 409, 408, 409, 410, 408, 411, 408, 411, 412, + 26, 26, 26, 26, 26, 26, 26, 26, 413, 413, 413, 413, 413, 413, 413, 413, + 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 414, 26, + 413, 413, 415, 26, 413, 26, 26, 26, 416, 2, 2, 2, 2, 2, 417, 308, + 26, 26, 26, 26, 26, 26, 26, 26, 418, 419, 420, 420, 420, 420, 421, 422, + 423, 423, 424, 423, 425, 425, 425, 425, 426, 426, 426, 427, 428, 426, 26, 26, + 26, 26, 26, 26, 429, 429, 430, 431, 432, 432, 432, 433, 434, 434, 434, 435, + 26, 26, 26, 26, 26, 26, 26, 26, 436, 436, 436, 436, 437, 437, 437, 438, + 437, 437, 439, 437, 437, 437, 437, 437, 440, 441, 442, 443, 444, 444, 445, 446, + 444, 447, 444, 447, 448, 448, 448, 448, 449, 449, 449, 449, 26, 26, 26, 26, + 450, 450, 450, 450, 451, 452, 451, 26, 453, 453, 453, 453, 453, 453, 454, 455, + 456, 456, 457, 456, 458, 458, 459, 458, 460, 460, 461, 462, 26, 463, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 464, 464, 464, 464, 464, 464, 464, 464, + 464, 465, 26, 26, 26, 26, 26, 26, 466, 466, 466, 466, 466, 466, 467, 26, + 466, 466, 466, 466, 466, 466, 467, 468, 469, 469, 469, 469, 469, 26, 469, 470, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 31, 31, 31, 50, 471, 471, 471, 471, 471, 472, 473, 26, + 26, 26, 26, 26, 26, 26, 26, 474, 475, 475, 475, 475, 475, 26, 476, 476, + 476, 476, 476, 477, 26, 26, 478, 478, 478, 479, 26, 26, 26, 26, 480, 480, + 480, 481, 26, 26, 482, 482, 483, 26, 484, 484, 484, 484, 484, 484, 484, 484, + 484, 485, 486, 484, 484, 484, 485, 487, 488, 488, 488, 488, 488, 488, 488, 488, + 489, 490, 491, 491, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 495, 494, + 494, 26, 496, 496, 496, 496, 497, 26, 498, 498, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 498, 499, 137, 500, 26, 501, 501, 502, 501, 501, 501, 501, 501, + 503, 26, 26, 26, 26, 26, 26, 26, 504, 505, 506, 507, 506, 508, 509, 509, + 509, 509, 509, 509, 509, 510, 509, 511, 512, 513, 514, 515, 515, 516, 517, 518, + 513, 519, 520, 521, 522, 523, 523, 26, 524, 524, 524, 524, 524, 524, 524, 524, + 524, 524, 524, 525, 526, 26, 26, 26, 527, 527, 527, 527, 527, 527, 527, 527, + 527, 26, 527, 528, 26, 26, 26, 26, 529, 529, 529, 529, 529, 529, 530, 529, + 529, 529, 529, 530, 26, 26, 26, 26, 531, 531, 531, 531, 531, 531, 531, 531, + 532, 26, 531, 533, 198, 534, 26, 26, 535, 535, 535, 535, 535, 535, 535, 536, + 535, 536, 26, 26, 26, 26, 26, 26, 537, 537, 537, 538, 537, 539, 537, 537, + 540, 26, 26, 26, 26, 26, 26, 26, 541, 541, 541, 541, 541, 541, 541, 542, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 543, 543, 543, 543, + 543, 543, 543, 543, 543, 543, 544, 545, 546, 547, 548, 549, 549, 549, 550, 551, + 546, 26, 549, 552, 26, 26, 26, 26, 26, 26, 26, 26, 553, 554, 553, 553, + 553, 553, 553, 554, 555, 26, 26, 26, 556, 556, 556, 556, 556, 556, 556, 556, + 556, 26, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 558, 26, 178, 178, + 559, 559, 559, 559, 559, 559, 559, 560, 53, 561, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 562, 563, 562, 562, 562, 562, 564, 562, + 565, 26, 562, 562, 562, 566, 567, 567, 567, 567, 568, 567, 567, 569, 570, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 571, 572, 573, 573, 573, 573, 571, 574, + 573, 26, 573, 575, 576, 577, 578, 578, 578, 579, 580, 581, 578, 582, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 583, 583, 583, 584, 585, 585, 586, 585, 585, 585, 585, 587, + 585, 585, 585, 588, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 589, 26, + 108, 108, 108, 108, 108, 108, 590, 591, 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 593, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 594, 595, 26, 592, 592, 592, 592, 592, 592, 592, 592, + 596, 26, 26, 26, 26, 26, 26, 26, 26, 26, 597, 597, 597, 597, 597, 597, + 597, 597, 597, 597, 597, 597, 598, 26, 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 600, 26, 26, 26, 26, 26, 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, 26, 26, 26, 26, 26, 26, 26, 305, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 603, + 604, 604, 604, 605, 604, 606, 607, 607, 607, 607, 607, 607, 607, 607, 607, 608, + 607, 609, 610, 610, 610, 611, 611, 26, 612, 612, 612, 612, 612, 612, 612, 612, + 613, 26, 612, 614, 614, 612, 612, 615, 612, 612, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 346, 26, 26, 26, 26, - 347, 26, 348, 349, 25, 25, 350, 351, 352, 25, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 353, 26, 354, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 355, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 356, 31, 31, 31, 31, 31, 31, 357, 26, 26, 26, 26, 31, 31, - 9, 9, 0, 313, 9, 358, 0, 0, 0, 0, 359, 0, 257, 280, 360, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 361, - 362, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 363, 290, 289, 290, - 290, 290, 290, 364, 168, 168, 168, 295, 365, 365, 365, 366, 257, 257, 26, 367, - 368, 369, 368, 368, 370, 368, 368, 371, 368, 372, 368, 372, 26, 26, 26, 26, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 373, - 374, 0, 0, 0, 0, 0, 375, 0, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 252, 0, 376, 377, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 378, - 379, 379, 379, 380, 381, 381, 381, 381, 381, 381, 382, 26, 383, 0, 0, 280, - 384, 384, 384, 384, 385, 386, 387, 387, 387, 388, 389, 389, 389, 389, 389, 390, - 391, 391, 391, 392, 393, 393, 393, 393, 394, 393, 395, 26, 26, 26, 26, 26, - 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, 397, - 398, 398, 398, 399, 398, 400, 401, 401, 401, 401, 402, 401, 401, 401, 401, 402, - 403, 403, 403, 403, 403, 26, 404, 404, 404, 404, 404, 404, 405, 406, 407, 408, - 407, 408, 409, 407, 410, 407, 410, 411, 26, 26, 26, 26, 26, 26, 26, 26, - 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, - 412, 412, 412, 412, 412, 412, 413, 26, 412, 412, 414, 26, 412, 26, 26, 26, - 415, 2, 2, 2, 2, 2, 416, 307, 26, 26, 26, 26, 26, 26, 26, 26, - 417, 418, 419, 419, 419, 419, 420, 421, 422, 422, 423, 422, 424, 424, 424, 424, - 425, 425, 425, 426, 427, 425, 26, 26, 26, 26, 26, 26, 428, 428, 429, 430, - 431, 431, 431, 432, 433, 433, 433, 434, 26, 26, 26, 26, 26, 26, 26, 26, - 435, 435, 435, 435, 436, 436, 436, 437, 436, 436, 438, 436, 436, 436, 436, 436, - 439, 440, 441, 442, 443, 443, 444, 445, 443, 446, 443, 446, 447, 447, 447, 447, - 448, 448, 448, 448, 26, 26, 26, 26, 449, 449, 449, 449, 450, 451, 450, 26, - 452, 452, 452, 452, 452, 452, 453, 454, 455, 455, 456, 455, 457, 457, 458, 457, - 459, 459, 460, 461, 26, 462, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 463, 463, 463, 463, 463, 463, 463, 463, 463, 464, 26, 26, 26, 26, 26, 26, - 465, 465, 465, 465, 465, 465, 466, 26, 465, 465, 465, 465, 465, 465, 466, 467, - 468, 468, 468, 468, 468, 26, 468, 469, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 50, - 470, 470, 470, 470, 470, 471, 472, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 473, 473, 473, 473, 473, 26, 474, 474, 474, 474, 474, 475, 26, 26, 476, 476, - 476, 477, 26, 26, 26, 26, 478, 478, 478, 479, 26, 26, 480, 480, 481, 26, - 482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 484, 482, 482, 482, 483, 485, - 486, 486, 486, 486, 486, 486, 486, 486, 487, 488, 489, 489, 489, 490, 489, 491, - 492, 492, 492, 492, 492, 492, 493, 492, 492, 26, 494, 494, 494, 494, 495, 26, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 497, 137, 498, 26, - 499, 499, 500, 499, 499, 499, 499, 501, 26, 26, 26, 26, 26, 26, 26, 26, - 502, 503, 504, 505, 504, 506, 507, 507, 507, 507, 507, 507, 507, 508, 507, 509, - 510, 511, 512, 513, 513, 514, 515, 516, 511, 517, 518, 519, 520, 521, 521, 26, - 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 524, 26, 26, 26, - 525, 525, 525, 525, 525, 525, 525, 525, 525, 26, 525, 526, 26, 26, 26, 26, - 527, 527, 527, 527, 527, 527, 528, 527, 527, 527, 527, 528, 26, 26, 26, 26, - 529, 529, 529, 529, 529, 529, 529, 529, 530, 26, 529, 531, 197, 532, 26, 26, - 533, 533, 533, 533, 533, 533, 533, 534, 533, 534, 26, 26, 26, 26, 26, 26, - 535, 535, 535, 536, 535, 537, 535, 535, 538, 26, 26, 26, 26, 26, 26, 26, - 539, 539, 539, 539, 539, 539, 539, 540, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 542, 543, - 544, 545, 546, 547, 547, 547, 548, 549, 544, 26, 547, 550, 26, 26, 26, 26, - 26, 26, 26, 26, 551, 552, 551, 551, 551, 551, 551, 552, 553, 26, 26, 26, - 554, 554, 554, 554, 554, 554, 554, 554, 554, 26, 555, 555, 555, 555, 555, 555, - 555, 555, 555, 555, 556, 26, 177, 177, 557, 557, 557, 557, 557, 557, 557, 558, - 559, 560, 559, 559, 559, 559, 561, 559, 562, 26, 559, 559, 559, 563, 564, 564, - 564, 564, 565, 564, 564, 566, 567, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 568, 569, 570, 570, 570, 570, 568, 571, 570, 26, 570, 572, 573, 574, 575, 575, - 575, 576, 577, 578, 575, 579, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 580, 580, 580, 581, - 26, 26, 26, 26, 26, 26, 582, 26, 108, 108, 108, 108, 108, 108, 583, 584, - 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, - 585, 585, 585, 586, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 587, 588, 26, - 585, 585, 585, 585, 585, 585, 585, 585, 589, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 591, 26, - 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, - 592, 592, 592, 592, 592, 593, 592, 594, 26, 26, 26, 26, 26, 26, 26, 26, - 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, - 595, 595, 595, 595, 595, 595, 595, 595, 596, 26, 26, 26, 26, 26, 26, 26, - 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, - 304, 304, 304, 304, 304, 304, 304, 597, 598, 598, 598, 599, 598, 600, 601, 601, - 601, 601, 601, 601, 601, 601, 601, 602, 601, 603, 604, 604, 604, 605, 605, 26, - 606, 606, 606, 606, 606, 606, 606, 606, 607, 26, 606, 608, 608, 606, 606, 609, - 606, 606, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 610, 610, 610, 610, 610, 610, 610, 610, - 610, 610, 610, 611, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 612, 612, 612, 612, 612, 612, 612, 612, 612, 613, 612, 612, 612, 612, 612, 612, - 612, 614, 612, 612, 26, 26, 26, 26, 26, 26, 26, 26, 615, 26, 346, 26, - 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, - 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 26, - 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, 618, 26, 26, 26, 26, 26, - 616, 619, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 620, 621, - 622, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 623, 26, 26, 26, 26, 26, 624, 26, 625, 26, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 627, - 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 629, 628, 630, - 628, 631, 628, 632, 280, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 9, 9, 9, 9, 9, 633, 9, 9, 220, 26, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 26, - 0, 0, 0, 0, 257, 362, 0, 0, 0, 0, 0, 0, 634, 635, 0, 636, - 637, 638, 0, 0, 0, 639, 0, 0, 0, 0, 0, 0, 0, 265, 26, 26, - 14, 14, 14, 14, 14, 14, 14, 14, 246, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 280, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 26, 0, 0, 0, 259, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, - 0, 0, 0, 254, 640, 641, 0, 642, 643, 0, 0, 0, 0, 0, 0, 0, - 268, 644, 254, 254, 0, 0, 0, 645, 646, 647, 648, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 0, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 650, 26, 651, 652, 649, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 2, 2, 2, 347, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 653, 269, 269, 654, 655, 656, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 657, 657, 657, 657, 657, 658, 657, 659, 657, 660, 26, 26, 26, 26, 26, 26, - 26, 26, 661, 661, 661, 662, 26, 26, 663, 663, 663, 663, 663, 663, 663, 664, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 171, 665, 169, 171, - 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, - 666, 666, 666, 666, 666, 666, 666, 666, 667, 666, 668, 26, 26, 26, 26, 26, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 670, 669, 671, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 362, 0, - 0, 0, 0, 0, 0, 0, 376, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 362, 0, 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, 26, 26, 26, 26, - 672, 31, 31, 31, 673, 674, 675, 676, 677, 678, 673, 679, 673, 675, 675, 680, - 31, 681, 31, 682, 683, 681, 31, 682, 26, 26, 26, 26, 26, 26, 51, 26, - 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 280, 26, 0, 257, 362, 0, 362, 0, 362, 0, 0, 0, 275, 26, - 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, 26, 26, 684, 0, 0, 0, - 685, 26, 0, 0, 0, 0, 0, 280, 0, 259, 313, 26, 275, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 686, 0, 376, 0, 376, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 280, 259, 26, - 0, 280, 0, 0, 0, 0, 0, 0, 0, 26, 0, 313, 0, 0, 0, 0, - 0, 26, 0, 0, 0, 275, 313, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, 0, 275, 376, 376, - 257, 26, 0, 0, 0, 376, 0, 265, 275, 26, 0, 313, 0, 26, 257, 26, - 0, 0, 359, 0, 0, 0, 0, 0, 0, 265, 26, 26, 26, 26, 0, 313, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 26, 26, 26, 26, - 276, 276, 276, 276, 276, 276, 276, 687, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 279, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 346, 26, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 687, 26, 26, 26, - 276, 276, 276, 279, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 688, 26, 26, 26, 26, 26, 26, - 689, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 617, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 618, 618, 618, 618, 618, 618, 618, 618, + 618, 619, 618, 618, 618, 618, 618, 618, 618, 620, 618, 618, 26, 26, 26, 26, + 26, 26, 26, 26, 621, 26, 347, 26, 622, 622, 622, 622, 622, 622, 622, 622, + 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, + 622, 622, 622, 622, 622, 622, 622, 26, 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 624, 26, 26, 26, 26, 26, 622, 625, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 626, 627, 628, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 629, 26, 630, 26, + 26, 26, 631, 26, 632, 26, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, + 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, + 633, 633, 633, 633, 633, 633, 633, 634, 635, 635, 635, 635, 635, 635, 635, 635, + 635, 635, 635, 635, 635, 636, 635, 637, 635, 638, 635, 639, 281, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 9, 9, 9, 9, 9, 640, 9, 9, + 221, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 281, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 276, 26, 0, 0, 0, 0, 258, 363, 0, 0, + 0, 0, 0, 0, 641, 642, 0, 643, 644, 645, 0, 0, 0, 646, 0, 0, + 0, 0, 0, 0, 0, 266, 26, 26, 14, 14, 14, 14, 14, 14, 14, 14, + 247, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 281, 26, 0, 0, 281, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 258, 26, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 647, 648, 0, 649, + 650, 0, 0, 0, 0, 0, 0, 0, 269, 651, 255, 255, 0, 0, 0, 652, + 653, 654, 655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 268, 0, 0, 0, 0, 0, 0, 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, 656, 657, 26, 658, 659, 656, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 348, 660, 308, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 661, 270, 270, 662, 663, 664, 18, 18, + 18, 18, 18, 18, 18, 665, 26, 26, 26, 666, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 667, 667, 667, 667, 667, 668, 667, 669, + 667, 670, 26, 26, 26, 26, 26, 26, 26, 26, 671, 671, 671, 672, 26, 26, + 673, 673, 673, 673, 673, 673, 673, 674, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 675, 675, 675, 675, 675, 676, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 172, 677, 170, 172, 678, 678, 678, 678, 678, 678, 678, 678, + 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, + 679, 678, 680, 26, 26, 26, 26, 26, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 682, 681, 683, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 0, 377, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 276, + 26, 26, 26, 26, 26, 26, 26, 26, 684, 31, 31, 31, 685, 686, 687, 688, + 689, 690, 685, 691, 685, 687, 687, 692, 31, 693, 31, 694, 695, 693, 31, 694, + 26, 26, 26, 26, 26, 26, 51, 26, 0, 0, 0, 0, 0, 281, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 26, 0, 258, 363, 0, + 363, 0, 363, 0, 0, 0, 276, 26, 0, 0, 0, 0, 0, 276, 26, 26, + 26, 26, 26, 26, 696, 0, 0, 0, 697, 26, 0, 0, 0, 0, 0, 281, + 0, 260, 314, 26, 276, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 698, 0, 377, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 258, 699, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 314, 0, 281, 260, 26, 0, 281, 0, 0, 0, 0, 0, 0, + 0, 26, 0, 314, 0, 0, 0, 0, 0, 26, 0, 0, 0, 276, 314, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 281, 26, 0, 276, 0, 377, 0, 260, 0, 0, 0, 0, 0, 269, + 276, 696, 0, 281, 0, 260, 0, 260, 0, 0, 360, 0, 0, 0, 0, 0, + 0, 266, 26, 26, 26, 26, 0, 314, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 347, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 347, 26, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 700, 26, 26, 26, 277, 277, 277, 280, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 701, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 702, 26, 26, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 939, 940, 941, 942, 946, 948, 0, 962, + 969, 970, 971, 976,1001,1002,1003,1008, 0,1033,1040,1041,1042,1043,1047, 0, + 0,1080,1081,1082,1086,1110, 0, 0,1124,1125,1126,1127,1131,1133, 0,1147, + 1154,1155,1156,1161,1187,1188,1189,1193, 0,1219,1226,1227,1228,1229,1233, 0, + 0,1267,1268,1269,1273,1298, 0,1303, 943,1128, 944,1129, 954,1139, 958,1143, + 959,1144, 960,1145, 961,1146, 964,1149, 0, 0, 973,1158, 974,1159, 975,1160, + 983,1168, 978,1163, 988,1173, 990,1175, 991,1176, 993,1178, 994,1179, 0, 0, + 1004,1190,1005,1191,1006,1192,1014,1199,1007, 0, 0, 0,1016,1201,1020,1206, + 0,1022,1208,1025,1211,1023,1209, 0, 0, 0, 0,1032,1218,1037,1223,1035, + 1221, 0, 0, 0,1044,1230,1045,1231,1049,1235, 0, 0,1058,1244,1064,1250, + 1060,1246,1066,1252,1067,1253,1072,1258,1069,1255,1077,1264,1074,1261, 0, 0, + 1083,1270,1084,1271,1085,1272,1088,1275,1089,1276,1096,1283,1103,1290,1111,1299, + 1115,1118,1307,1120,1309,1121,1310, 0,1053,1239, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,1093,1280, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 949,1134,1010,1195,1050,1236,1090,1277,1341,1368,1340, + 1367,1342,1369,1339,1366, 0,1320,1347,1418,1419,1323,1350, 0, 0, 992,1177, + 1018,1204,1055,1241,1416,1417,1415,1424,1202, 0, 0, 0, 987,1172, 0, 0, + 1031,1217,1321,1348,1322,1349,1338,1365, 950,1135, 951,1136, 979,1164, 980,1165, + 1011,1196,1012,1197,1051,1237,1052,1238,1061,1247,1062,1248,1091,1278,1092,1279, + 1071,1257,1076,1263, 0, 0, 997,1182, 0, 0, 0, 0, 0, 0, 945,1130, + 982,1167,1337,1364,1335,1362,1046,1232,1422,1423,1113,1301, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10,1425, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,1314,1427, 5, + 1434,1438,1443, 0,1450, 0,1455,1461,1514, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1446,1458,1468,1476,1480,1486,1517, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1489,1503,1494,1500,1508, 0, 0, 0, 0,1520,1521, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1526,1528, 0,1525, 0, 0, 0,1522, + 0, 0, 0, 0,1536,1532,1539, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1556, 0, 0, 0, 0, 0, 0,1548,1550, 0,1547, 0, 0, 0,1567, + 0, 0, 0, 0,1558,1554,1561, 0, 0, 0, 0, 0, 0, 0,1568,1569, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1529,1551, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1523,1545,1524,1546, 0, 0,1527,1549, + 0, 0,1570,1571,1530,1552,1531,1553, 0, 0,1533,1555,1535,1557,1537,1559, + 0, 0,1572,1573,1544,1566,1538,1560,1540,1562,1541,1563,1542,1564, 0, 0, + 1543,1565, 0, 0, 0, 0, 0, 0, 0, 0,1606,1607,1609,1608,1610, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1613, 0,1611, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1612, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1620, 0, 0, 0, 0, 0, 0, 0,1623, 0, 0,1624, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1614,1615,1616,1617,1618,1619,1621,1622, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1628,1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1625,1626, 0,1627, 0, 0, 0,1634, 0, 0,1635, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1630,1631,1632, 0, 0,1633, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1639, 0, 0,1638,1640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1636,1637, 0, 0, 0, 0, 0, 0,1641, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1642,1644,1643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1645, 0, 0, 0, 0, 0, 0, 0,1646, 0, 0, 0, 0, 0, 0,1648, + 1649, 0,1647,1650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1651,1653,1652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1654, 0,1655,1657,1656, 0, 0, 0, 0,1659, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1660, 0, 0, 0, 0,1661, 0, 0, 0, 0,1662, + 0, 0, 0, 0,1663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1658, 0, 0, 0, 0, 0, 0, 0, 0, 0,1664, 0,1665,1673, 0, + 1674, 0, 0, 0, 0, 0, 0, 0, 0,1666, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1668, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1669, 0, 0, 0, 0,1670, 0, 0, 0, 0,1671, + 0, 0, 0, 0,1672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1675, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1676, 0, + 1677, 0,1678, 0,1679, 0,1680, 0, 0, 0,1681, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1682, 0,1683, 0, 0,1684,1685, 0,1686, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 953,1138, 955,1140, 956,1141, 957,1142, + 1324,1351, 963,1148, 965,1150, 968,1153, 966,1151, 967,1152,1378,1380,1379,1381, + 984,1169, 985,1170,1420,1421, 986,1171, 989,1174, 995,1180, 998,1183, 996,1181, + 999,1184,1000,1185,1015,1200,1329,1356,1017,1203,1019,1205,1021,1207,1024,1210, + 1687,1688,1027,1213,1026,1212,1028,1214,1029,1215,1030,1216,1034,1220,1036,1222, + 1039,1225,1038,1224,1334,1361,1336,1363,1382,1384,1383,1385,1056,1242,1057,1243, + 1059,1245,1063,1249,1689,1690,1065,1251,1068,1254,1070,1256,1386,1387,1388,1389, + 1691,1692,1073,1259,1075,1262,1079,1266,1078,1265,1095,1282,1098,1285,1097,1284, + 1390,1391,1392,1393,1099,1286,1100,1287,1101,1288,1102,1289,1105,1292,1104,1291, + 1106,1294,1107,1295,1108,1296,1114,1302,1119,1308,1122,1311,1123,1312,1186,1260, + 1293,1305, 0,1394, 0, 0, 0, 0, 952,1137, 947,1132,1317,1344,1316,1343, + 1319,1346,1318,1345,1693,1695,1371,1375,1370,1374,1373,1377,1372,1376,1694,1696, + 981,1166, 977,1162, 972,1157,1326,1353,1325,1352,1328,1355,1327,1354,1697,1698, + 1009,1194,1013,1198,1054,1240,1048,1234,1331,1358,1330,1357,1333,1360,1332,1359, + 1699,1700,1396,1401,1395,1400,1398,1403,1397,1402,1399,1404,1094,1281,1087,1274, + 1406,1411,1405,1410,1408,1413,1407,1412,1409,1414,1109,1297,1117,1306,1116,1304, + 1112,1300, 0, 0, 0, 0, 0, 0,1471,1472,1701,1705,1702,1706,1703,1707, + 1430,1431,1715,1719,1716,1720,1717,1721,1477,1478,1729,1731,1730,1732, 0, 0, + 1435,1436,1733,1735,1734,1736, 0, 0,1481,1482,1737,1741,1738,1742,1739,1743, + 1439,1440,1751,1755,1752,1756,1753,1757,1490,1491,1765,1768,1766,1769,1767,1770, + 1447,1448,1771,1774,1772,1775,1773,1776,1495,1496,1777,1779,1778,1780, 0, 0, + 1451,1452,1781,1783,1782,1784, 0, 0,1504,1505,1785,1788,1786,1789,1787,1790, + 0,1459, 0,1791, 0,1792, 0,1793,1509,1510,1794,1798,1795,1799,1796,1800, + 1462,1463,1808,1812,1809,1813,1810,1814,1467, 21,1475, 22,1479, 23,1485, 24, + 1493, 27,1499, 28,1507, 29, 0, 0,1704,1708,1709,1710,1711,1712,1713,1714, + 1718,1722,1723,1724,1725,1726,1727,1728,1740,1744,1745,1746,1747,1748,1749,1750, + 1754,1758,1759,1760,1761,1762,1763,1764,1797,1801,1802,1803,1804,1805,1806,1807, + 1811,1815,1816,1817,1818,1819,1820,1821,1470,1469,1822,1474,1465, 0,1473,1825, + 1429,1428,1426, 12,1432, 0, 26, 0, 0,1315,1823,1484,1466, 0,1483,1829, + 1433, 13,1437, 14,1441,1826,1827,1828,1488,1487,1513, 19, 0, 0,1492,1515, + 1445,1444,1442, 15, 0,1831,1832,1833,1502,1501,1516, 25,1497,1498,1506,1518, + 1457,1456,1454, 17,1453,1313, 11, 3, 0, 0,1824,1512,1519, 0,1511,1830, + 1449, 16,1460, 18,1464, 4, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, + 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1834,1835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1836, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1837,1839,1838, 0, 0, 0, 0,1840, 0, 0, 0, + 0,1841, 0, 0,1842, 0, 0, 0, 0, 0, 0, 0,1843, 0,1844, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1845, 0, 0,1846, 0, 0,1847, + 0,1848, 0, 0, 0, 0, 0, 0, 937, 0,1850, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1849, 936, 938,1851,1852, 0, 0,1853,1854, 0, 0, + 1855,1856, 0, 0, 0, 0, 0, 0,1857,1858, 0, 0,1861,1862, 0, 0, + 1863,1864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1867,1868,1869,1870,1859,1860,1865,1866, 0, 0, 0, 0, + 0, 0,1871,1872,1873,1874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1877, 0,1878, 0,1879, 0,1880, 0,1881, 0,1882, 0, + 1883, 0,1884, 0,1885, 0,1886, 0,1887, 0,1888, 0, 0,1889, 0,1890, + 0,1891, 0, 0, 0, 0, 0, 0,1892,1893, 0,1894,1895, 0,1896,1897, + 0,1898,1899, 0,1900,1901, 0, 0, 0, 0, 0, 0,1876, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1902, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1904, 0,1905, 0,1906, 0,1907, 0,1908, 0,1909, 0, + 1910, 0,1911, 0,1912, 0,1913, 0,1914, 0,1915, 0, 0,1916, 0,1917, + 0,1918, 0, 0, 0, 0, 0, 0,1919,1920, 0,1921,1922, 0,1923,1924, + 0,1925,1926, 0,1927,1928, 0, 0, 0, 0, 0, 0,1903, 0, 0,1929, + 1930,1931,1932, 0, 0, 0,1933, 0, 710, 385, 724, 715, 455, 103, 186, 825, + 825, 242, 751, 205, 241, 336, 524, 601, 663, 676, 688, 738, 411, 434, 474, 500, + 649, 746, 799, 108, 180, 416, 482, 662, 810, 275, 462, 658, 692, 344, 618, 679, + 293, 388, 440, 492, 740, 116, 146, 168, 368, 414, 481, 527, 606, 660, 665, 722, + 781, 803, 809, 538, 553, 588, 642, 758, 811, 701, 233, 299, 573, 612, 487, 540, + 714, 779, 232, 267, 412, 445, 457, 585, 594, 766, 167, 613, 149, 148, 560, 589, + 648, 768, 708, 345, 411, 704, 105, 259, 313, 496, 518, 174, 542, 120, 307, 101, + 430, 372, 584, 183, 228, 529, 650, 697, 424, 732, 428, 349, 632, 355, 517, 110, + 135, 147, 403, 580, 624, 700, 750, 170, 193, 245, 297, 374, 463, 543, 763, 801, + 812, 815, 162, 384, 420, 730, 287, 330, 337, 366, 459, 476, 509, 558, 591, 610, + 726, 652, 734, 759, 154, 163, 198, 473, 683, 697, 292, 311, 353, 423, 572, 494, + 113, 217, 259, 280, 314, 499, 506, 603, 608, 752, 778, 782, 788, 117, 557, 748, + 774, 320, 109, 126, 260, 265, 373, 411, 479, 523, 655, 737, 823, 380, 765, 161, + 395, 398, 438, 451, 502, 516, 537, 583, 791, 136, 340, 769, 122, 273, 446, 727, + 305, 322, 400, 496, 771, 155, 190, 269, 377, 391, 406, 432, 501, 519, 599, 684, + 687, 749, 776, 175, 452, 191, 480, 510, 659, 772, 805, 813, 397, 444, 619, 566, + 568, 575, 491, 471, 707, 111, 636, 156, 153, 288, 346, 578, 256, 435, 383, 729, + 680, 767, 694, 295, 128, 210, 0, 0, 227, 0, 379, 0, 0, 150, 493, 525, + 544, 551, 552, 556, 783, 576, 604, 0, 661, 0, 703, 0, 0, 735, 743, 0, + 0, 0, 793, 794, 795, 808, 741, 773, 118, 127, 130, 166, 169, 177, 207, 213, + 215, 226, 229, 268, 270, 317, 327, 329, 335, 369, 375, 381, 404, 441, 448, 458, + 477, 484, 503, 539, 545, 547, 546, 548, 549, 550, 554, 555, 561, 564, 569, 591, + 593, 595, 598, 607, 620, 625, 625, 651, 690, 695, 705, 706, 716, 717, 733, 735, + 777, 786, 790, 315, 869, 623, 0, 0, 102, 145, 134, 115, 129, 138, 165, 171, + 207, 202, 206, 212, 227, 231, 240, 243, 250, 254, 294, 296, 303, 308, 319, 325, + 321, 329, 326, 335, 341, 357, 360, 362, 370, 379, 388, 389, 393, 421, 424, 438, + 456, 454, 458, 465, 477, 535, 485, 490, 493, 507, 512, 514, 521, 522, 525, 526, + 528, 533, 532, 541, 565, 569, 574, 586, 591, 597, 607, 637, 647, 674, 691, 693, + 695, 698, 703, 699, 705, 704, 702, 706, 709, 717, 728, 736, 747, 754, 770, 777, + 783, 784, 786, 787, 790, 802, 825, 848, 847, 857, 55, 65, 66, 883, 892, 916, + 822, 824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1586, 0,1605, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1602,1603,1934,1935,1574,1575,1576,1577,1579,1580,1581,1583,1584, 0, + 1585,1587,1588,1589,1591, 0,1592, 0,1593,1594, 0,1595,1596, 0,1598,1599, + 1600,1601,1604,1582,1578,1590,1597, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1936, 0,1937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1939,1940, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1941,1942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1944,1943, 0,1945, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1946,1947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1949,1950,1951,1952,1953,1954,1955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, - 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0, - 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, - 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, - 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, - 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, - 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199, - 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, - 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231, - 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258, - 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275, - 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0, - 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093, - 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 949,1134,1010, - 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347, - 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424, - 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, - 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238, - 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, - 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232, - 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461, - 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1446,1458,1468,1476,1480,1486, - 1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1489,1503,1494,1500,1508, 0, - 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0, - 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, - 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, - 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560, - 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0, - 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0, - 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, - 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0, - 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0, - 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0, - 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, - 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, - 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, - 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, - 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0, - 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, - 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, - 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356, - 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214, - 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363, - 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251, - 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266, - 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287, - 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302, - 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, - 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375, - 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353, - 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234, - 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403, - 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412, - 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0, - 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721, - 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0, - 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757, - 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776, - 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0, - 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793, - 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814, - 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0, - 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728, - 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764, - 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821, - 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, - 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828, - 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833, - 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, - 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, - 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838, - 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, - 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, - 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938, - 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0, - 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870, - 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0, - 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0, - 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0, - 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, - 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0, - 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0, - 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0, - 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, - 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, - 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, - 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, - 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, - 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, - 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, - 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, - 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, - 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, - 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, - 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, - 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, - 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, - 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, - 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, - 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, - 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, - 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, - 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, - 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, - 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, - 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, - 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, - 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, - 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, - 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, - 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, - 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, - 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, - 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, - 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575, - 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0, - 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1948, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1949,1950, - 1951,1952,1953,1954,1955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1956,1957,1958,1960,1959, - 1961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, - 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, - 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, - 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, - 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, - 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, - 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, - 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, - 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, - 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, - 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, - 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, - 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, - 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, - 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, - 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, - 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, - 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, - 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, - 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, - 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, - 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, - 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, - 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, - 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, - 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, - 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, - 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, - 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, - 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, - 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, - 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, - 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, - 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0, + 0, 0, 0,1956,1957,1958,1960,1959,1961, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 106, 104, 107, 826, 114, 118, 119, 121, + 123, 124, 127, 125, 34, 830, 130, 131, 132, 137, 827, 35, 133, 139, 829, 142, + 143, 112, 144, 145, 924, 151, 152, 37, 157, 158, 159, 160, 38, 165, 166, 169, + 171, 172, 173, 174, 176, 177, 178, 179, 181, 182, 182, 182, 833, 468, 184, 185, + 834, 187, 188, 189, 196, 192, 194, 195, 197, 199, 200, 201, 203, 204, 204, 206, + 208, 209, 211, 218, 213, 219, 214, 216, 153, 234, 221, 222, 223, 220, 225, 224, + 230, 835, 235, 236, 237, 238, 239, 244, 836, 837, 247, 248, 249, 246, 251, 39, + 40, 253, 255, 255, 838, 257, 258, 259, 261, 839, 262, 263, 301, 264, 41, 266, + 270, 272, 271, 841, 274, 842, 277, 276, 278, 281, 282, 42, 283, 284, 285, 286, + 43, 843, 44, 289, 290, 291, 293, 934, 298, 845, 845, 621, 300, 300, 45, 852, + 894, 302, 304, 46, 306, 309, 310, 312, 316, 48, 47, 317, 846, 318, 323, 324, + 325, 324, 328, 329, 333, 331, 332, 334, 335, 336, 338, 339, 342, 343, 347, 351, + 849, 350, 348, 352, 354, 359, 850, 361, 358, 356, 49, 363, 365, 367, 364, 50, + 369, 371, 851, 376, 386, 378, 53, 381, 52, 51, 140, 141, 387, 382, 614, 78, + 388, 389, 390, 394, 392, 856, 54, 399, 396, 402, 404, 858, 405, 401, 407, 55, + 408, 409, 410, 413, 859, 415, 56, 417, 860, 418, 57, 419, 422, 424, 425, 861, + 840, 862, 426, 863, 429, 431, 427, 433, 437, 441, 438, 439, 442, 443, 864, 436, + 449, 450, 58, 454, 453, 865, 447, 460, 866, 867, 461, 466, 465, 464, 59, 467, + 470, 469, 472, 828, 475, 868, 478, 870, 483, 485, 486, 871, 488, 489, 872, 873, + 495, 497, 60, 498, 61, 61, 504, 505, 507, 508, 511, 62, 513, 874, 515, 875, + 518, 844, 520, 876, 877, 878, 63, 64, 528, 880, 879, 881, 882, 530, 531, 531, + 533, 66, 534, 67, 68, 884, 536, 538, 541, 69, 885, 549, 886, 887, 556, 559, + 70, 561, 562, 563, 888, 889, 889, 567, 71, 890, 570, 571, 72, 891, 577, 73, + 581, 579, 582, 893, 587, 74, 590, 592, 596, 75, 895, 896, 76, 897, 600, 898, + 602, 605, 607, 899, 900, 609, 901, 611, 853, 77, 615, 616, 79, 617, 252, 902, + 903, 854, 855, 621, 622, 731, 80, 627, 626, 628, 164, 629, 630, 631, 633, 904, + 632, 634, 639, 640, 635, 641, 646, 651, 638, 643, 644, 645, 905, 907, 906, 81, + 653, 654, 656, 911, 657, 908, 82, 83, 909, 910, 84, 664, 665, 666, 667, 669, + 668, 671, 670, 674, 672, 673, 675, 85, 677, 678, 86, 681, 682, 912, 685, 686, + 87, 689, 36, 913, 914, 88, 89, 696, 702, 709, 711, 915, 712, 713, 718, 719, + 917, 831, 721, 720, 723, 832, 725, 728, 918, 919, 739, 742, 744, 920, 745, 753, + 756, 757, 755, 760, 761, 921, 762, 90, 764, 922, 91, 775, 279, 780, 923, 925, + 92, 93, 785, 926, 94, 927, 787, 787, 789, 928, 792, 95, 796, 797, 798, 800, + 96, 929, 802, 804, 806, 97, 98, 807, 930, 99, 931, 932, 933, 814, 100, 816, + 817, 818, 819, 820, 821, 935, 0, 0, }; static const int16_t _hb_ucd_i16[196] = @@ -2792,12 +2822,12 @@ _hb_ucd_i16[196] = static inline uint_fast8_t _hb_ucd_gc (unsigned u) { - return u<1114110u?_hb_ucd_u8[6664+(((_hb_ucd_u8[1296+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; + return u<1114110u?_hb_ucd_u8[6800+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; } static inline uint_fast8_t _hb_ucd_ccc (unsigned u) { - return u<125259u?_hb_ucd_u8[8984+(((_hb_ucd_u8[7960+(((_hb_ucd_u8[7288+(((_hb_ucd_u8[7042+(u>>2>>3>>4)])<<4)+((u>>2>>3)&15u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u))]:0; + return u<125259u?_hb_ucd_u8[9184+(((_hb_ucd_u8[8128+(((_hb_ucd_u8[7424+(((_hb_ucd_u8[7178+(u>>2>>3>>4)])<<4)+((u>>2>>3)&15u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u))]:0; } static inline unsigned _hb_ucd_b4 (const uint8_t* a, unsigned i) @@ -2807,24 +2837,24 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i) static inline int_fast16_t _hb_ucd_bmg (unsigned u) { - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9728+(((_hb_ucd_u8[9608+(((_hb_ucd_b4(9480+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9932+(((_hb_ucd_u8[9812+(((_hb_ucd_b4(9684+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; } static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918000u?_hb_ucd_u8[11234+(((_hb_ucd_u16[2000+(((_hb_ucd_u8[10514+(((_hb_ucd_u8[10064+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; + return u<918000u?_hb_ucd_u8[11454+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10718+(((_hb_ucd_u8[10268+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[5888+(((_hb_ucd_u8[17136+(((_hb_ucd_u8[16754+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[6008+(((_hb_ucd_u8[17460+(((_hb_ucd_u8[17078+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; } #elif !defined(HB_NO_UCD_UNASSIGNED) static const uint8_t -_hb_ucd_u8[17564] = +_hb_ucd_u8[17868] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 11, 12, 13, 13, 13, 14, @@ -2832,7 +2862,7 @@ _hb_ucd_u8[17564] = 25, 26, 22, 22, 22, 27, 28, 29, 22, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 22, 42, - 7, 7, 43, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 7, 7, 43, 7, 44, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, @@ -2854,12 +2884,12 @@ _hb_ucd_u8[17564] = 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 44, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 45, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 46, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 47, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43, @@ -2878,35 +2908,36 @@ _hb_ucd_u8[17564] = 118,119,120,121,122,123,124,125,126,127,128,129, 34, 34,130,131, 132,133,134,135,136,137,138,139,140,141,142,122,143,144,145,146, 147,148,149,150,151,152,153,122,154,155,122,156,157,158,159,122, - 160,161,162,163,164,165,122,122,166,167,168,169,122,170,122,171, - 34, 34, 34, 34, 34, 34, 34,172,173, 34,174,122,122,122,122,122, - 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,175, - 34, 34, 34, 34, 34, 34, 34, 34,176,122,122,122,122,122,122,122, + 160,161,162,163,164,165,166,122,167,168,169,170,122,171,172,173, + 34, 34, 34, 34, 34, 34, 34,174,175, 34,176,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,177, + 34, 34, 34, 34, 34, 34, 34, 34,178,122,122,122,122,122,122,122, 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122, 34, 34, 34, 34,177,122,122,122, - 34, 34, 34, 34,178,179,180,181,122,122,122,122,182,183,184,185, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,186, - 34, 34, 34, 34, 34, 34, 34, 34, 34,187,188,122,122,122,122,122, - 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,189, - 34, 34,190, 34, 34,191,122,122,122,122,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122,192,193,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122,122,122,122,122,122,122,194,195, - 69,196,197,198,199,200,201,122,202,203,204,205,206,207,208,209, - 69, 69, 69, 69,210,211,122,122,122,122,122,122,122,122,212,122, - 213,122,214,122,122,215,122,122,122,122,122,122,122,122,122,216, - 34,217,218,122,122,122,122,122,219,220,221,122,222,223,122,122, - 224,225,226,227,228,122, 69,229, 69, 69, 69, 69, 69,230,231,232, - 233,234, 69, 69,235,236, 69,237,122,122,122,122,122,122,122,122, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,238, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,239, 34, - 240, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,241, 34, 34, - 34, 34, 34, 34, 34, 34, 34,242,122,122,122,122,122,122,122,122, - 34, 34, 34, 34,243,122,122,122,122,122,122,122,122,122,122,122, - 34, 34, 34, 34, 34, 34,244,122,122,122,122,122,122,122,122,122, - 245,122,246,247,122,122,122,122,122,122,122,122,122,122,122,122, - 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,248, - 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,249, + 122,122,122,122,122,122,122,122, 34, 34, 34, 34,179,122,122,122, + 34, 34, 34, 34,180,181,182,183,122,122,122,122,184,185,186,187, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,188, + 34, 34, 34, 34, 34, 34, 34, 34, 34,189,190,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,191, + 34, 34,192, 34, 34,193,122,122,122,122,122,122,122,122,122,122, + 122,122,122,122,122,122,122,122,194,195,122,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,196,197, + 69,198,199,200,201,202,203,122,204,205,206,207,208,209,210,211, + 69, 69, 69, 69,212,213,122,122,122,122,122,122,122,122,214,122, + 215,216,217,122,122,218,122,122,122,219,122,122,122,122,122,220, + 34,221,222,122,122,122,122,122,223,224,225,122,226,227,122,122, + 228,229,230,231,232,122, 69,233, 69, 69, 69, 69, 69,234,235,236, + 237,238, 69, 69,239,240, 69,241,122,122,122,122,122,122,122,122, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,242, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,243, 34, + 244, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,245, 34, 34, + 34, 34, 34, 34, 34, 34, 34,246,122,122,122,122,122,122,122,122, + 34, 34, 34, 34,247,122,122,122,122,122,122,122,122,122,122,122, + 34, 34, 34, 34, 34, 34,248, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34,249,122,122,122,122,122,122,122,122, + 250,122,251,252,122,122,122,122,122,122,122,122,122,122,122,122, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,253, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,254, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, @@ -2969,7 +3000,7 @@ _hb_ucd_u8[17564] = 44, 44, 57, 80, 36, 61, 62, 44, 44, 44, 44, 93, 27, 27, 27, 91, 70, 86, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 87, 86, 86, 90, 85, 90, 86, 43, 44, 44, 44, 89, 90, 44, 44, 62, 61, - 62, 61, 44, 44, 44, 44, 44, 44, 43, 86, 36, 36, 36, 36, 61, 36, + 62, 94, 44, 44, 44, 44, 44, 44, 43, 86, 36, 36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 70, 71, 86, 87, 43, 80, 86, 90, 86, 87, 77, 44, 44, 36, 94, 27, 27, 27, 95, 27, 27, 27, 27, 91, 36, 36, 36, 57, 86, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36, @@ -2979,7 +3010,7 @@ _hb_ucd_u8[17564] = 36, 36, 36, 75, 43, 43, 43, 60, 7, 7, 7, 7, 7, 2, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 62, 61, 61, 36, 36, 61, 36, 36, 36, 36, 62, 62, 36, 36, 36, 36, 70, 36, 43, 43, 43, 43, 71, 44, - 36, 36, 61, 81, 43, 43, 43, 44, 7, 7, 7, 7, 7, 44, 36, 36, + 36, 36, 61, 81, 43, 43, 43, 80, 7, 7, 7, 7, 7, 44, 36, 36, 77, 67, 2, 2, 2, 2, 2, 2, 2, 97, 97, 67, 43, 67, 67, 67, 7, 7, 7, 7, 7, 27, 27, 27, 27, 27, 50, 50, 50, 4, 4, 86, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, @@ -3146,18 +3177,19 @@ _hb_ucd_u8[17564] = 44, 44, 44, 44,179, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44, 16,110, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27,100, 36, 36, 36, 36, 36, 57,184, 44, - 36, 44, 44, 44, 44, 44, 44, 44, 27, 27, 27, 95, 44, 44, 44, 44, - 180, 27, 30, 2, 2, 44, 44, 44, 36, 43, 43, 2, 2, 44, 44, 44, - 36, 36,183, 27, 27, 27, 44, 44, 87, 98, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 60, 2, 2, 2, 44, - 27, 27, 27, 7, 7, 7, 7, 7, 71, 70, 71, 44, 44, 44, 44, 57, - 86, 87, 43, 85, 87, 60,185, 2, 2, 80, 44, 44, 44, 44, 79, 44, - 43, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, 87, 43, - 43, 43, 80, 7, 7, 7, 7, 7, 2, 2, 94, 98, 44, 44, 44, 44, - 36, 70, 2, 61, 44, 44, 44, 44, 36, 94, 86, 43, 43, 43, 43, 85, - 98, 36, 63, 2, 59, 43, 60, 87, 7, 7, 7, 7, 7, 63, 63, 2, - 179, 27, 27, 27, 27, 27, 27, 27, 27, 27,100, 44, 44, 44, 44, 44, - 36, 36, 36, 36, 36, 36, 86, 87, 43, 86, 85, 43, 2, 2, 2, 80, + 36, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 57, 43, + 27, 27, 27, 95, 44, 44, 44, 44,180, 27, 30, 2, 2, 44, 44, 44, + 36, 43, 43, 2, 2, 44, 44, 44, 36, 36,183, 27, 27, 27, 44, 44, + 87, 98, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, + 43, 43, 43, 60, 2, 2, 2, 44, 27, 27, 27, 7, 7, 7, 7, 7, + 71, 70, 71, 44, 44, 44, 44, 57, 86, 87, 43, 85, 87, 60,185, 2, + 2, 80, 44, 44, 44, 44, 79, 44, 43, 71, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 70, 43, 43, 87, 43, 43, 43, 80, 7, 7, 7, 7, 7, + 2, 2, 94, 98, 44, 44, 44, 44, 36, 70, 2, 61, 44, 44, 44, 44, + 36, 94, 86, 43, 43, 43, 43, 85, 98, 36, 63, 2, 59, 43, 60, 87, + 7, 7, 7, 7, 7, 63, 63, 2,179, 27, 27, 27, 27, 27, 27, 27, + 27, 27,100, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 86, 87, + 43, 86, 85, 43, 2, 2, 2, 71, 70, 44, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70, 86, 87, 43, 43, 43, 80, 44, 44, 43, 86, 62, 36, 36, 36, 61, 62, @@ -3179,17 +3211,20 @@ _hb_ucd_u8[17564] = 70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 85, 70, 43, 60, 2, 2, 2, 59, 44, 44, 44, 44, 70, 43, 43, 85, 87, 43, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 85, 43, 2, 72, 2, - 2, 64, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 87, - 63, 2, 2, 44, 44, 44, 44, 44, 2, 36, 36, 36, 36, 36, 36, 36, - 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 89, 43, 43, 43, - 85, 43, 87, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36, - 70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44, - 36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 86, 86, 90, - 43, 89, 87, 87, 61, 44, 44, 44, 36, 70, 85,107, 64, 44, 44, 44, + 2, 64, 44, 44, 44, 44, 44, 44, 2, 2, 2, 2, 2, 44, 44, 44, + 43, 43, 43, 80, 43, 43, 43, 87, 63, 2, 2, 44, 44, 44, 44, 44, + 2, 36, 36, 36, 36, 36, 36, 36, 44, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 89, 43, 43, 43, 85, 43, 87, 80, 44, 44, 44, 44, + 36, 36, 36, 61, 36, 62, 36, 36, 70, 43, 43, 80, 44, 80, 43, 57, + 43, 43, 43, 70, 44, 44, 44, 44, 36, 36, 36, 62, 61, 36, 36, 36, + 36, 36, 36, 36, 36, 86, 86, 90, 43, 89, 87, 87, 61, 44, 44, 44, + 36, 70, 85,107, 64, 44, 44, 44, 43, 94, 36, 36, 36, 36, 36, 36, + 36, 36, 86, 43, 43, 80, 44, 86, 85, 60, 2, 2, 2, 2, 2, 2, 27, 27, 91, 67, 67, 67, 56, 20,168, 67, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44, 93,105,105,105,105,105,105,105,181, 2, 2, 64, 44, 44, 44, 44, 44, 63, 64, 44, 44, 44, 44, 44, 44, - 65, 65, 65, 65,132, 44, 44, 44, 43, 43, 60, 44, 44, 44, 44, 44, + 65, 65, 65, 65, 65, 65, 65, 65, 71, 36, 36, 70, 43, 43, 43, 43, + 43, 43, 43, 44, 44, 44, 44, 44, 43, 43, 60, 44, 44, 44, 44, 44, 43, 43, 43, 60, 2, 2, 67, 67, 40, 40, 97, 44, 44, 44, 44, 44, 7, 7, 7, 7, 7,179, 27, 27, 27, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 62, 36, 27, 27, 27, 30, 2, 64, 44, 44, @@ -3197,7 +3232,8 @@ _hb_ucd_u8[17564] = 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 44, 44, 44, 57, 43, 74, 40, 40, 40, 40, 40, 40, 40, 88, 80, 44, 44, 44, 44, 44, 86, 44, 44, 44, 44, 44, 44, 44, 40, 40, 52, 40, 40, 40, 52, 81, - 36, 61, 44, 44, 44, 44, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, + 36, 61, 44, 44, 44, 44, 44, 44, 44, 61, 44, 44, 44, 44, 44, 44, + 36, 61, 62, 44, 44, 44, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 44, 50, 60, 65, 65, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43, 44, 43, 43, 43, 80, 44, 44, 44, 44, 67, 67, 67, 92, 55, 67, 67, 67, 67, 67,186, 87, 43, 67,186, 86, @@ -3222,10 +3258,12 @@ _hb_ucd_u8[17564] = 43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67, 67, 67, 76, 21, 2, 2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43, 16, 16, 16, 16, 16, 39, 16, 16, 16, 16, 16, 16, 16, 16, 16,110, - 43, 43, 43, 80, 43, 43, 43, 43, 43, 43, 43, 43, 80, 57, 43, 43, - 43, 57, 80, 43, 43, 80, 44, 44, 43, 43, 43, 74, 40, 40, 40, 44, - 7, 7, 7, 7, 7, 44, 44, 77, 36, 36, 36, 36, 36, 36, 36, 80, - 36, 36, 36, 36, 36, 36, 43, 43, 7, 7, 7, 7, 7, 44, 44, 96, + 44, 44,150, 16, 16,110, 44, 44, 43, 43, 43, 80, 43, 43, 43, 43, + 43, 43, 43, 43, 80, 57, 43, 43, 43, 57, 80, 43, 43, 80, 44, 44, + 40, 40, 40, 40, 40, 40, 40, 44, 44, 44, 44, 44, 44, 44, 44, 57, + 43, 43, 43, 74, 40, 40, 40, 44, 7, 7, 7, 7, 7, 44, 44, 77, + 36, 36, 36, 36, 36, 36, 36, 80, 36, 36, 36, 36, 36, 36, 43, 43, + 7, 7, 7, 7, 7, 44, 44, 96, 36, 36, 36, 36, 36, 83, 43, 43, 36, 36, 36, 61, 36, 36, 62, 61, 36, 36, 61,179, 27, 27, 27, 27, 16, 16, 43, 43, 43, 74, 44, 44, 27, 27, 27, 27, 27, 27,163, 27, 188, 27,100, 44, 44, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27,163, @@ -3238,206 +3276,210 @@ _hb_ucd_u8[17564] = 27, 27, 27, 27, 27, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 92, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44, - 67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 55, 67, - 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 44, 67, 67, 92, 44, + 67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 67, 67, + 67, 67, 67, 92, 44, 55, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, + 67, 67, 67, 67, 67, 67, 67, 55, 67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 67, 67, 67, 67, 67, 67, 79, 44, 44, 44, 44, 44, 44, 44, - 65, 65, 65, 65, 65, 65, 65, 65,171,171,171,171,171,171,171, 44, - 171,171,171,171,171,171,171, 0, 0, 0, 29, 21, 21, 21, 23, 21, - 22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21, 9, 9, 9, - 9, 22, 21, 18, 24, 16, 24, 5, 5, 5, 5, 22, 25, 18, 25, 0, - 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, 26, 25, 15, 15, - 24, 15, 7, 19, 15, 21, 9, 25, 9, 5, 5, 25, 5, 9, 5, 7, - 7, 7, 9, 8, 8, 5, 7, 5, 6, 6, 24, 24, 6, 24, 12, 12, - 2, 2, 6, 5, 9, 21, 9, 2, 2, 9, 25, 9, 26, 12, 11, 11, - 2, 6, 5, 21, 17, 2, 2, 26, 26, 23, 2, 12, 17, 12, 21, 12, - 12, 21, 7, 2, 2, 7, 7, 21, 21, 2, 1, 1, 21, 23, 26, 26, - 1, 21, 6, 7, 7, 12, 12, 7, 21, 7, 12, 1, 12, 6, 6, 12, - 12, 26, 7, 26, 26, 7, 2, 1, 12, 2, 6, 2, 24, 7, 7, 6, - 1, 12, 12, 10, 10, 10, 10, 12, 21, 6, 2, 10, 10, 2, 15, 26, - 26, 2, 2, 21, 7, 10, 15, 7, 2, 23, 21, 26, 10, 7, 21, 15, - 15, 2, 17, 7, 29, 7, 7, 22, 18, 2, 14, 14, 14, 7, 10, 21, - 17, 21, 11, 12, 5, 2, 5, 6, 8, 8, 8, 24, 5, 24, 2, 24, - 9, 24, 24, 2, 29, 29, 29, 1, 17, 17, 20, 19, 22, 20, 27, 28, - 1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, - 1, 2, 15, 6, 18, 6, 23, 2, 12, 11, 9, 26, 26, 9, 26, 5, - 5, 26, 14, 9, 5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25, - 18, 22, 5, 12, 2, 5, 22, 21, 21, 22, 18, 17, 26, 6, 7, 14, - 17, 22, 18, 18, 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, 26, 15, - 6, 21, 11, 21, 24, 9, 6, 9, 23, 26, 6, 10, 4, 4, 3, 3, - 7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 25, 2, 25, 24, 2, 15, - 12, 15, 14, 2, 21, 14, 7, 15, 12, 17, 21, 1, 26, 10, 10, 1, - 23, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, - 13, 0, 14, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171,171,171,171,171,171,171, 44,171,171,171,171,171,171,171, 0, + 0, 0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13, + 25, 25, 25, 21, 21, 9, 9, 9, 9, 22, 21, 18, 24, 16, 24, 5, + 5, 5, 5, 22, 25, 18, 25, 0, 23, 23, 26, 21, 24, 26, 7, 20, + 25, 1, 26, 24, 26, 25, 15, 15, 24, 15, 7, 19, 15, 21, 9, 25, + 9, 5, 5, 25, 5, 9, 5, 7, 7, 7, 9, 8, 8, 5, 7, 5, + 6, 6, 24, 24, 6, 24, 12, 12, 2, 2, 6, 5, 9, 21, 9, 2, + 2, 9, 25, 9, 26, 12, 11, 11, 2, 6, 5, 21, 17, 2, 2, 26, + 26, 23, 2, 12, 17, 12, 21, 12, 12, 21, 7, 2, 2, 7, 7, 21, + 21, 2, 1, 1, 21, 23, 26, 26, 1, 21, 6, 7, 7, 12, 12, 7, + 21, 7, 12, 1, 12, 6, 6, 12, 12, 26, 7, 26, 26, 7, 2, 1, + 12, 2, 6, 2, 24, 7, 7, 6, 1, 12, 12, 10, 10, 10, 10, 12, + 21, 6, 2, 10, 10, 2, 15, 26, 26, 2, 2, 21, 7, 10, 15, 7, + 2, 23, 21, 26, 10, 7, 21, 15, 15, 2, 17, 7, 29, 7, 7, 22, + 18, 2, 14, 14, 14, 7, 10, 21, 17, 21, 11, 12, 5, 2, 5, 6, + 8, 8, 8, 24, 5, 24, 2, 24, 9, 24, 24, 2, 29, 29, 29, 1, + 17, 17, 20, 19, 22, 20, 27, 28, 1, 29, 21, 20, 19, 21, 21, 16, + 16, 21, 25, 22, 18, 21, 21, 29, 1, 2, 15, 6, 18, 6, 23, 2, + 12, 11, 9, 26, 26, 9, 26, 5, 5, 26, 14, 9, 5, 14, 14, 15, + 25, 26, 26, 22, 18, 26, 18, 25, 18, 22, 5, 12, 2, 5, 22, 21, + 21, 22, 18, 17, 26, 6, 7, 14, 17, 22, 18, 18, 26, 14, 17, 6, + 14, 6, 12, 24, 24, 6, 26, 15, 6, 21, 11, 21, 24, 9, 6, 9, + 23, 26, 6, 10, 4, 4, 3, 3, 7, 25, 17, 16, 16, 22, 16, 16, + 25, 17, 25, 2, 25, 24, 2, 15, 12, 15, 14, 2, 21, 14, 7, 15, + 12, 17, 21, 1, 26, 10, 10, 1, 23, 15, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 0, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 0, + 15, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, - 0, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 21, 22, 23, 0, 0, 0, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, + 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, - 0, 0, 39, 40, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 4, 5, - 6, 7, 0, 8, 9, 10, 0, 11, 12, 13, 14, 15, 16, 17, 16, 18, - 16, 19, 16, 19, 16, 19, 0, 19, 16, 20, 16, 19, 21, 19, 0, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 0, 0, 35, - 0, 0, 36, 0, 37, 0, 0, 0, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, - 0, 0, 0, 50, 0, 51, 0, 52, 53, 0, 54, 0, 0, 0, 0, 0, - 0, 55, 56, 57, 0, 0, 0, 0, 58, 0, 0, 59, 60, 61, 62, 63, - 0, 0, 64, 65, 0, 0, 0, 66, 0, 0, 0, 0, 67, 0, 0, 0, - 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, - 0, 0, 0, 70, 0, 71, 0, 0, 72, 0, 0, 73, 0, 0, 0, 0, - 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 75, 0, 0, 76, 77, 0, - 0, 78, 79, 0, 80, 62, 0, 81, 82, 0, 0, 83, 84, 85, 0, 0, - 0, 86, 0, 87, 0, 0, 51, 88, 51, 0, 89, 0, 90, 0, 0, 0, - 79, 0, 0, 0, 91, 92, 0, 93, 94, 95, 96, 0, 0, 0, 0, 0, - 51, 0, 0, 0, 0, 97, 98, 0, 0, 0, 0, 99,100, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,101, 0, 0,102, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,103,104, 0, 0,105, 0, 0, 0, 0, 0, 0, - 106, 0, 0, 0,100, 0, 0, 0, 0, 0,107,108, 0, 0, 0, 0, - 0, 0, 0,109, 0,110, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, - 5, 6, 7, 0, 8, 0, 0, 0, 0, 9, 10, 11, 12, 0, 0, 0, - 0, 13, 0, 0, 14, 15, 0, 16, 0, 17, 18, 0, 0, 19, 0, 20, - 21, 0, 0, 0, 0, 0, 22, 23, 0, 24, 25, 0, 0, 26, 0, 0, - 0, 27, 0, 0, 28, 29, 30, 31, 0, 0, 0, 32, 33, 34, 0, 0, - 33, 0, 0, 35, 33, 0, 0, 0, 33, 36, 0, 0, 0, 0, 0, 37, - 38, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 41, - 42, 0, 0, 0, 0, 43, 0, 44, 0, 0, 0, 45, 46, 0, 0, 0, - 47, 0, 0, 0, 0, 0, 0, 48, 49, 0, 0, 0, 0, 50, 0, 0, - 0, 51, 0, 52, 0, 53, 0, 0, 0, 0, 54, 0, 0, 0, 0, 55, - 0, 56, 0, 0, 0, 0, 57, 58, 0, 0, 0, 59, 60, 0, 0, 0, - 0, 0, 0, 61, 52, 0, 62, 63, 0, 0, 64, 0, 0, 0, 65, 66, - 0, 0, 0, 67, 0, 68, 69, 70, 71, 72, 1, 73, 0, 74, 75, 76, - 0, 0, 77, 78, 0, 0, 0, 79, 0, 0, 1, 1, 0, 0, 80, 0, - 0, 81, 0, 0, 0, 0, 77, 82, 0, 83, 0, 0, 0, 0, 0, 78, - 84, 0, 85, 0, 52, 0, 1, 78, 0, 0, 86, 0, 0, 87, 0, 0, - 0, 0, 0, 88, 57, 0, 0, 0, 0, 0, 0, 89, 90, 0, 0, 84, - 0, 0, 33, 0, 0, 91, 0, 0, 0, 0, 92, 0, 0, 0, 0, 49, - 0, 0, 93, 0, 0, 0, 0, 94, 95, 0, 0, 96, 0, 0, 97, 0, - 0, 0, 98, 0, 0, 0, 99, 0,100, 93, 0, 0,101, 0, 0, 0, - 84, 0, 0,102, 0, 0, 0,103,104, 0, 0,105,106, 0, 0, 0, - 0, 0, 0,107, 0, 0,108, 0, 0, 0, 0,109, 33, 0,110,111, - 112, 35, 0, 0,113, 0, 0, 0,114, 0, 0, 0, 0, 0, 0,115, - 0, 0,116, 0, 0, 0, 0,117, 88, 0, 0, 0, 0, 0, 57, 0, - 0, 0, 0, 52,118, 0, 0, 0, 0,119, 0, 0,120, 0, 0, 0, - 0,118, 0, 0, 0, 0, 0,121, 0, 0, 0,122, 0, 0, 0,123, - 0,124, 0, 0, 0, 0,125,126,127, 0,128, 0,129, 0, 0, 0, - 130,131,132, 0, 0, 0, 35, 0, 0, 0,133, 0, 0,134, 0, 0, - 135, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, - 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, - 18, 1, 1, 1, 19, 1, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, - 25, 26, 27, 28, 29, 30, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, - 34, 35, 1, 36, 37, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, - 42, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 19, 1, - 21, 0, 0, 47, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0, 51, 0, - 0, 0, 52, 1, 0, 0, 38, 14, 4, 1, 1, 1, 53, 21, 43, 52, - 54, 21, 35, 1, 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, 0, 0, - 0, 0, 0, 59, 0, 60, 0, 0, 0, 0, 61, 62, 0, 0, 63, 0, - 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 67, 0, - 0, 0, 68, 0, 0, 69, 70, 0, 71, 72, 73, 74, 75, 76, 0, 0, - 0, 77, 0, 0, 0, 78, 79, 0, 0, 0, 0, 47, 0, 0, 0, 49, - 0, 80, 0, 0, 0, 62, 0, 0, 63, 0, 0, 81, 0, 0, 82, 0, - 0, 0, 83, 0, 0, 19, 84, 0, 62, 0, 0, 0, 0, 49, 1, 85, - 1, 52, 15, 86, 36, 10, 21, 87, 0, 55, 0, 0, 0, 0, 19, 10, - 1, 0, 0, 0, 0, 0, 88, 0, 0, 89, 0, 0, 88, 0, 0, 0, - 0, 78, 0, 0, 87, 9, 12, 4, 90, 8, 91, 47, 0, 58, 50, 0, - 21, 1, 21, 92, 93, 1, 1, 1, 1, 94, 95, 96, 97, 1, 98, 58, - 81, 99,100, 4, 58, 0, 0, 0, 0, 0, 0, 19, 50, 0, 0, 0, - 0, 0, 0, 61, 0, 0,101,102, 0, 0,103, 0, 0, 1, 1, 50, - 0, 0, 0, 38, 0, 63, 0, 0, 0, 0, 0, 62, 0, 0,104, 68, - 61, 0, 0, 0, 78, 0, 0, 0,105,106, 58, 38, 81, 0, 0, 0, - 0, 0, 0,107, 1, 14, 4, 12, 84, 0, 0, 0, 0, 38, 87, 0, - 0, 0, 0,108, 0, 0,109, 61, 0,110, 0, 0, 0, 1, 0, 0, - 0, 0, 19, 58, 0,111, 14, 52,112, 41, 0, 0, 62, 0, 0, 61, - 0, 0,113, 0, 87, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, - 0,113, 0, 0, 0, 0,114, 0, 0, 0, 78, 55, 0, 38, 1, 58, - 1, 58, 0, 0, 63, 89, 0, 0,115, 0, 0, 0, 55, 0, 0, 0, - 0,115, 0, 0, 0, 0, 61, 0, 0, 0, 0, 79, 0, 61, 0, 0, - 0, 0, 56, 0, 89, 80, 0, 0, 8, 91, 0, 0, 1, 87, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 39, 0, 0, 0, 0, 0, 0, 40, 41, 42, 0, 43, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, + 0, 0, 3, 0, 0, 0, 4, 5, 6, 7, 0, 8, 9, 10, 0, 11, + 12, 13, 14, 15, 16, 17, 16, 18, 16, 19, 16, 19, 16, 19, 0, 19, + 16, 20, 16, 19, 21, 19, 0, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 37, 0, 0, 0, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, 47, 0, 0, 0, 48, + 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0, 52, + 53, 0, 54, 0, 0, 0, 0, 0, 0, 55, 56, 57, 0, 0, 0, 0, + 58, 0, 0, 59, 60, 61, 62, 63, 0, 0, 64, 65, 0, 0, 0, 66, + 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 0, + 72, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, + 0, 0, 75, 76, 0, 77, 78, 0, 0, 79, 80, 0, 81, 62, 0, 82, + 83, 0, 0, 84, 85, 86, 0, 0, 0, 87, 0, 88, 0, 0, 51, 89, + 51, 0, 90, 0, 91, 0, 0, 0, 80, 0, 0, 0, 92, 93, 0, 94, + 95, 96, 97, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 98, 99, 0, + 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0,101,102, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,103, 0, 0,104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,105,106, 0, 0,107, 0, 0, 0, 0, 0, 0, + 108, 0,109, 0,102, 0, 0, 0, 0, 0,110,111, 0, 0, 0, 0, + 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0,113, 0,114, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 0, 0, 0, + 0, 9, 10, 11, 12, 0, 0, 0, 0, 13, 0, 0, 14, 15, 0, 16, + 0, 17, 18, 0, 0, 19, 0, 20, 21, 0, 0, 0, 0, 0, 22, 23, + 0, 24, 25, 0, 0, 26, 0, 0, 0, 27, 0, 0, 28, 29, 30, 31, + 0, 0, 0, 32, 33, 34, 0, 0, 33, 0, 0, 35, 33, 0, 0, 0, + 33, 36, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 39, + 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 43, 0, 44, + 0, 0, 0, 45, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 48, + 49, 0, 0, 0, 0, 50, 0, 0, 0, 51, 0, 52, 0, 53, 0, 0, + 0, 0, 54, 0, 0, 0, 0, 55, 0, 56, 0, 0, 0, 0, 57, 58, + 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 61, 52, 0, 62, 63, + 0, 0, 64, 0, 0, 0, 65, 66, 0, 0, 0, 67, 0, 68, 69, 70, + 71, 72, 1, 73, 0, 74, 75, 76, 0, 0, 77, 78, 0, 0, 0, 79, + 0, 0, 1, 1, 0, 0, 80, 0, 0, 81, 0, 0, 0, 0, 77, 82, + 0, 83, 0, 0, 0, 0, 0, 78, 84, 0, 85, 0, 52, 0, 1, 78, + 0, 0, 86, 0, 0, 87, 0, 0, 0, 0, 0, 88, 57, 0, 0, 0, + 0, 0, 0, 89, 90, 0, 0, 84, 0, 0, 33, 0, 0, 91, 0, 0, + 0, 0, 92, 0, 0, 0, 0, 49, 0, 0, 93, 0, 0, 0, 0, 94, + 95, 0, 0, 96, 0, 0, 97, 0, 0, 0, 98, 0, 0, 0, 99, 0, + 0, 0, 0,100,101, 93, 0, 0,102, 0, 0, 0, 84, 0, 0,103, + 0, 0, 0,104,105, 0, 0,106,107, 0, 0, 0, 0, 0, 0,108, + 0, 0,109, 0, 0, 0, 0,110, 33, 0,111,112,113, 35, 0, 0, + 114, 0, 0, 0,115, 0, 0, 0, 0, 0, 0,116, 0, 0,117, 0, + 0, 0, 0,118, 88, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 52, + 119, 0, 0, 0, 0,120, 0, 0,121, 0, 0, 0, 0,119, 0, 0, + 122, 0, 0, 0, 0, 0, 0,123, 0, 0, 0,124, 0, 0, 0,125, + 0,126, 0, 0, 0, 0,127,128,129, 0,130, 0,131, 0, 0, 0, + 132,133,134, 0, 77, 0, 0, 0, 0, 0, 35, 0, 0, 0,135, 0, + 0, 0,136, 0, 0,137, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, + 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 19, 1, 0, 0, + 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, + 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, 37, 0, 0, 0, + 0, 38, 1, 39, 14, 39, 40, 41, 42, 0, 0, 0, 43, 36, 44, 45, + 21, 45, 46, 0, 0, 0, 19, 1, 21, 0, 0, 47, 0, 38, 48, 1, + 1, 49, 49, 50, 0, 0, 51, 0, 0, 0, 52, 1, 0, 0, 38, 14, + 4, 1, 1, 1, 53, 21, 43, 52, 54, 21, 35, 1, 0, 0, 0, 55, + 0, 0, 0, 56, 57, 58, 0, 0, 0, 0, 0, 59, 0, 60, 0, 0, + 0, 0, 61, 62, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 65, 0, + 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 69, 70, 0, + 71, 72, 73, 74, 75, 76, 0, 0, 0, 77, 0, 0, 0, 78, 79, 0, + 0, 0, 0, 47, 0, 0, 0, 49, 0, 80, 0, 0, 0, 62, 0, 0, + 63, 0, 0, 81, 0, 0, 82, 0, 0, 0, 83, 0, 0, 19, 84, 0, + 62, 0, 0, 0, 0, 49, 1, 85, 1, 52, 15, 86, 36, 10, 21, 87, + 0, 55, 0, 0, 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 88, 0, + 0, 89, 0, 0, 88, 0, 0, 0, 0, 78, 0, 0, 87, 9, 12, 4, + 90, 8, 91, 47, 0, 58, 50, 0, 21, 1, 21, 92, 93, 1, 1, 1, + 1, 94, 95, 96, 97, 1, 98, 58, 81, 99,100, 4, 58, 0, 0, 0, + 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 61, 0, 0,101,102, + 0, 0,103, 0, 0, 1, 1, 50, 0, 0, 0, 38, 0, 63, 0, 0, + 0, 0, 0, 62, 0, 0,104, 68, 61, 0, 0, 0, 78, 0, 0, 0, + 105,106, 58, 38, 81, 0, 0, 0, 0, 0, 0,107, 1, 14, 4, 12, + 84, 0, 0, 0, 0, 38, 87, 0, 0, 0, 0,108, 0, 0,109, 61, + 0,110, 0, 0, 0, 1, 0, 0, 0, 0, 19, 58, 0, 0, 0, 51, + 0,111, 14, 52,112, 41, 0, 0, 62, 0, 0, 61, 0, 0,113, 0, + 87, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, 0,113, 0, 0, + 0, 0,114, 0, 0, 0, 78, 55, 0, 38, 1, 58, 1, 58, 0, 0, + 63, 89, 0, 0,115, 0, 0, 0, 55, 0, 0, 0, 0,115, 0, 0, + 0, 0, 61, 0, 0, 0, 0, 79, 0, 61, 0, 0, 0, 0, 56, 0, + 89, 80, 0, 0, 79, 0, 0, 0, 8, 91, 0, 0, 1, 87, 0, 0, 116, 0, 0, 0, 0, 0, 0,117, 0,118,119,120,121, 0,104, 4, 122, 49, 23, 0, 0, 0, 38, 50, 38, 58, 0, 0, 1, 87, 1, 1, - 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 1, 4,122, 0, 0, - 0, 1,123, 0, 0, 0, 0, 0,230,230,230,230,230,232,220,220, - 220,220,232,216,220,220,220,220,220,202,202,220,220,220,220,202, - 202,220,220,220, 1, 1, 1, 1, 1,220,220,220,220,230,230,230, - 230,240,230,220,220,220,230,230,230,220,220, 0,230,230,230,220, - 220,220,220,230,232,220,220,230,233,234,234,233,234,234,233,230, - 0, 0, 0,230, 0,220,230,230,230,230,220,230,230,230,222,220, - 230,230,220,220,230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, - 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230, - 230,220,220,230,220,230,230,220, 35, 0, 0, 0, 0, 0,230,230, - 230, 0, 0,230,230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0, - 230,220,230,230,220,220,230,220,220,230,220,230,220,230,230, 0, - 0,220, 0, 0,230,230, 0,230, 0,230,230,230,230,230, 0, 0, - 0,220,220,220,230,220,220,220,230,230, 0,220, 27, 28, 29,230, - 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, - 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 9, 0,103,103, 9, 0,107,107,107,107,118,118, 9, 0, - 122,122,122,122,220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, - 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0, - 130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, - 0, 9, 9, 0, 9, 9, 0, 0, 0,230, 0, 0, 0,228, 0, 0, - 0,222,230,220,220, 0, 0, 0,230, 0, 0,220,230,220, 0,220, - 230,230,230, 0, 0, 0, 9, 9, 0, 0, 7, 0,230, 0, 1, 1, - 1, 0, 0, 0,230,234,214,220,202,230,230,230,230,230,232,228, - 228,220,218,230,233,220,230,220,230,230, 1, 1, 1, 1, 1,230, - 0, 1, 1,230,220,230, 1, 1, 0, 0,218,228,232,222,224,224, - 0, 8, 8, 0, 0, 0, 0,220,230, 0,230,230,220, 0, 0,230, - 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, 0,230,220, 0, - 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0, 0, 7, 9, 0, - 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0, 0,216,216, 1, - 1, 1, 0, 0, 0,226,216,216,216,216,216, 0,220,220,220, 0, - 230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19, - 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 1, 0, 0, 0,123, + 4,122, 0, 0, 0, 1,124, 0, 0, 0, 0, 0,230,230,230,230, + 230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220, + 220,220,220,202,202,220,220,220, 1, 1, 1, 1, 1,220,220,220, + 220,230,230,230,230,240,230,220,220,220,230,230,230,220,220, 0, + 230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233, + 234,234,233,230, 0, 0, 0,230, 0,220,230,230,230,230,220,230, + 230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0, + 230,220, 0, 18, 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, 30, 31, + 32, 33, 34,230,230,220,220,230,220,230,230,220, 35, 0, 0, 0, + 0, 0,230,230,230, 0, 0,230,230, 0,220,230,230,220, 0, 0, + 0, 36, 0, 0,230,220,230,230,220,220,230,220,220,230,220,230, + 220,230,230, 0, 0,220, 0, 0,230,230, 0,230, 0,230,230,230, + 230,230, 0, 0, 0,220,220,220,230,220,220,220,230,230, 0,220, + 27, 28, 29,230, 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230, + 230, 0, 0, 0, 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, + 9, 0, 0, 0, 0, 0, 9, 0,103,103, 9, 0,107,107,107,107, + 118,118, 9, 0,122,122,122,122,220,220, 0, 0, 0,220, 0,220, + 0,216, 0, 0, 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130, + 130,130, 0, 0,130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, + 0, 0, 0, 7, 0, 9, 9, 0, 9, 9, 0, 0, 0,230, 0, 0, + 0,228, 0, 0, 0,222,230,220,220, 0, 0, 0,230, 0, 0,220, + 230,220, 0,220,230,230,230, 0, 0, 0, 9, 9, 0, 0, 7, 0, + 230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,202,230,230,230, + 230,230,232,228,228,220,218,230,233,220,230,220,230,230, 1, 1, + 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, 0, 0,218,228, + 232,222,224,224, 0, 8, 8, 0, 0, 0, 0,220,230, 0,230,230, + 220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, + 0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0, + 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0, + 0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0, + 220,220,220, 0,232,232,220,230,230,230, 7, 0, 16, 17, 17, 17, + 17, 17, 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113, + 129,169, 17, 27, 28, 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, 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, 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, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, - 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, 0, 27, 0, 28, - 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 36, 0, - 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, - 0, 0, 0, 0, 1, 2, 40, 41, 0, 1, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 11, 12, - 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19, - 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8, - 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27, - 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0, - 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 20, 20, - 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, 7, 20, 20, 20, - 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, 38, 1, 20, 20, - 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, 0, 0, 1, 0, - 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, 0, 1, 0, 0, - 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 7, 20, 41, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, 43, 44, 0, 45, - 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1, - 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 26, 34, 9, 0, 0, 20, 20, 1, 20, 20, 0, 0, 0, 0, 0, - 0, 0, 26, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, - 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13, - 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, 7, 7, 43, 13, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,237, 0, 1, 2, 2, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 6, 7, 8, + 9, 0, 0, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, 22, 0, 0, 0, 0, + 23, 24, 25, 26, 0, 27, 0, 28, 29, 30, 31, 32, 0, 0, 0, 0, + 0, 0, 0, 33, 34, 35, 36, 0, 0, 0, 0, 0, 37, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 1, 2, 40, 41, + 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 5, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, + 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 11, 12, 0, 13, 0, 14, 15, 16, 0, 0, + 0, 0, 0, 1, 17, 18, 0, 19, 7, 1, 0, 0, 0, 20, 20, 7, + 20, 20, 20, 20, 20, 20, 20, 8, 21, 0, 22, 0, 7, 23, 24, 0, + 20, 20, 25, 0, 0, 0, 26, 27, 1, 7, 20, 20, 20, 20, 20, 1, + 28, 29, 30, 31, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 20, 20, 20, 1, 0, 0, 8, 21, 32, 4, + 0, 10, 0, 33, 7, 20, 20, 20, 0, 0, 0, 0, 8, 34, 34, 35, + 36, 34, 37, 0, 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8, + 21, 1, 20, 0, 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 8, 21, + 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 21, 0, 42, 43, 44, 0, 45, 0, 8, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 46, 7, 1, 10, 1, 0, 0, 0, 1, 20, 20, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 34, 9, 0, 0, 20, 20, + 1, 20, 20, 0, 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 12, 13, + 13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13, + 13, 23, 24, 24, 25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32, + 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, + 7, 41, 13, 42, 7, 7, 43, 7, 44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, @@ -3459,130 +3501,131 @@ _hb_ucd_u8[17564] = 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 44, 0, 0, 1, - 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56, - 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61, - 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 13, 13, 13, 13, 45, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, + 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, + 59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 79, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, + 82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101, + 102,103,104,105,106,107,108,109,110,111, 96,112,113,114,115,116, + 117,118,119,119,120,121,122,123,124,125,126,127,128,129,130,131, + 132, 96,133,134,135,136,137,138,139,140,141,142,143, 96,144,145, + 96,146,147,148,149, 96,150,151,152,153,154,155,156, 96,157,158, + 159,160, 96,161,162,163,164,164,164,164,164,164,164,165,166,164, + 167, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96,168,169,169,169,169,169,169,169,169,170, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,171,171, + 171,171,172, 96, 96, 96,173,173,173,173,174,175,176,177, 96, 96, + 96, 96,178,179,180,181,182,182,182,182,182,182,182,182,182,182, + 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, + 182,182,182,182,182,183,182,182,182,182,182,182,184,184,184,185, + 186, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96,187,188,189,190,191,191,192, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109, - 110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123, - 124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138, - 139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151, - 152,153,154,155, 96, 96,156,157,158,159, 96,160, 96,161,162,162, - 162,162,162,162,162,163,164,162,165, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,166,167,167, - 167,167,167,167,167,167,168, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96,169,169,169,169,170, 96, 96, 96,171,171, - 171,171,172,173,174,175, 96, 96, 96, 96,176,177,178,179,180,180, - 180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180, - 180,180,180,180,180,180,180,180,180,180,180,180,180,181,180,180, - 180,180,180,180,182,182,182,183,184, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,185,186,187, - 188,189,189,190, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96,191,192, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194, 59,195, - 196,197,198,199,200, 96,201,202,203, 59, 59,204, 59,205,206,206, - 206,206,206,207, 96, 96, 96, 96, 96, 96, 96, 96,208, 96,209, 96, - 210, 96, 96,211, 96, 96, 96, 96, 96, 96, 96, 96, 96,212,213,214, - 215, 96, 96, 96, 96, 96,216,217,218, 96,219,220, 96, 96,221,222, - 59,223,224, 96, 59, 59, 59, 59, 59, 59, 59,225,226,227,228,229, - 59, 59,230,231, 59,232, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,233, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,234, 70,235, 70, + 96, 96, 96, 96,195,196, 59,197,198,199,200,201,202, 96,203,204, + 205, 59, 59,206, 59,207,208,208,208,208,208,209, 96, 96, 96, 96, + 96, 96, 96, 96,210, 96,211,212,213, 96, 96,214, 96, 96, 96,215, + 96, 96, 96, 96, 96,216,217,218,219, 96, 96, 96, 96, 96,220,221, + 222, 96,223,224, 96, 96,225,226, 59,227,228, 96, 59, 59, 59, 59, + 59, 59, 59,229,230,231,232,233, 59, 59,234,235, 59,236, 96, 96, + 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70,237, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,236, 70, 70, 70, 70, - 70, 70, 70, 70, 70,237, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, - 70, 70,238, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, - 70, 70, 70, 70,239, 96, 96, 96, 96, 96, 96, 96, 96, 96,240, 96, - 241,242, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 0, 19, 0, - 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, - 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, - 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2, - 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 6, 2, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 2, 4, 4, 4, 2, 2, 4, 4, 4, 2, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 2, - 2, 2, 2, 2, 2, 2, 14, 14, 14, 2, 2, 2, 2, 14, 14, 14, - 14, 14, 14, 2, 2, 2, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, - 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 3, - 3, 3, 3, 3, 3, 3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, 2, 2, 2, 2, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, 64, 64, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, - 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 2, 2, 95, 2, 37, 37, 37, 2, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 3, 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, - 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, - 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 5, 5, - 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, - 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, - 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, - 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2, - 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5, - 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11, - 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, - 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, - 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11, - 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11, - 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2, - 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 10, - 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, - 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, - 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, 10, - 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2, - 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, - 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21, - 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, - 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, - 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, 21, 21, 21, 21, - 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2, - 2, 2, 2, 21, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21, - 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22, - 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22, - 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 2, - 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, - 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, - 2, 2, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2, - 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 23, 2, 2, 23, 23, - 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, - 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2, - 2, 2, 2, 16, 16, 2, 16, 16, 16, 16, 2, 2, 16, 16, 2, 16, - 16, 2, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 2, 2, - 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 20, 20, 2, 36, - 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, - 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, 2, - 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, - 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, 2, 2, 2, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18, - 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18, - 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, + 70, 70, 70,240, 70, 70, 70, 70, 70, 70, 70, 70, 70,241, 96, 96, + 96, 96, 96, 96, 96, 96, 70, 70, 70, 70,242, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70,243, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,244, 96, 96, + 96, 96, 96, 96, 96, 96,245, 96,246,247, 0, 1, 2, 2, 0, 1, + 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, + 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, + 19, 19, 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2, + 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9, + 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 2, 9, 9, 9, 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 1, 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, + 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14, + 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 3, 3, + 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, + 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37, + 37, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, + 2, 2, 2, 2, 2, 2, 3, 3, 0, 3, 3, 3, 3, 3, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 7, 7, + 7, 7, 0, 0, 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, + 5, 5, 5, 2, 2, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2, + 5, 2, 2, 2, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 2, + 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, + 2, 2, 5, 5, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 2, 2, 11, 11, 11, 2, 11, 11, 11, 11, 11, + 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 11, 2, + 11, 11, 2, 11, 11, 2, 11, 11, 2, 2, 11, 2, 11, 11, 11, 2, + 2, 11, 11, 11, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, + 11, 11, 11, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 2, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 2, + 10, 10, 2, 10, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, 10, 10, + 2, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 10, 10, + 10, 10, 2, 2, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 10, + 10, 10, 10, 10, 10, 10, 2, 21, 21, 21, 2, 21, 21, 21, 21, 21, + 21, 21, 21, 2, 2, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 2, + 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, 21, 2, + 2, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 2, 2, + 2, 2, 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, 2, + 22, 22, 2, 22, 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2, + 22, 22, 22, 22, 2, 2, 2, 22, 22, 2, 22, 2, 22, 22, 2, 2, + 2, 22, 22, 2, 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 2, 2, 2, 2, 22, 22, 22, 2, 2, 2, 2, 2, 2, 22, 2, 2, + 2, 2, 2, 2, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2, + 23, 23, 23, 23, 23, 23, 23, 23, 2, 2, 23, 23, 23, 23, 23, 2, + 23, 23, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 23, 2, 23, 23, + 23, 2, 2, 23, 2, 2, 23, 23, 23, 23, 2, 2, 23, 23, 2, 2, + 2, 2, 2, 2, 2, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 2, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 2, 16, 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, 16, 2, + 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 16, 2, 16, 16, + 16, 16, 2, 2, 16, 16, 2, 16, 16, 16, 2, 2, 2, 2, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, + 20, 20, 20, 20, 20, 20, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, + 20, 20, 2, 2, 20, 20, 2, 36, 36, 36, 2, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, + 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 2, 36, 2, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 36, + 36, 36, 36, 2, 36, 2, 2, 2, 2, 2, 2, 2, 36, 36, 2, 2, + 36, 36, 36, 2, 2, 2, 2, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 24, 24, + 24, 24, 2, 2, 2, 2, 2, 18, 18, 2, 18, 2, 18, 18, 18, 18, + 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, + 18, 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 18, 18, 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, @@ -3741,49 +3784,50 @@ _hb_ucd_u8[17564] = 130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,144,144, 144,144,144,144,144,144,144,144, 2, 2, 2, 2, 2, 2,156,156, 156,156,156,156,156,156,156,156, 2,156,156,156, 2, 2,156,156, - 2, 2, 2, 2, 2, 2,147,147,147,147,147,147,147,147,148,148, - 148,148,148,148,148,148,148,148, 2, 2, 2, 2, 2, 2,158,158, - 158,158,158,158,158,158,158,158, 2, 2, 2, 2, 2, 2,153,153, - 153,153,153,153,153,153,153,153,153,153, 2, 2, 2, 2,149,149, - 149,149,149,149,149,149,149,149,149,149,149,149,149, 2, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, - 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 2, 2, 2, 94, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 85, 2, 2,101,101,101,101,101,101,101,101,101, 2, - 2, 2, 2, 2, 2, 2,101,101, 2, 2, 2, 2, 2, 2, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, 96, 96,111,111, - 111,111,111,111,111,111,111,111,111,111,111,111,111, 2,100,100, - 100,100,100,100,100,100, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 2, 2, 2,108,108,108,108,108,108,108,108,108,108, - 2,108,108,108,108,108,108,108,108,108,108,108,108, 2,129,129, - 129,129,129,129,129, 2,129, 2,129,129,129,129, 2,129,129,129, - 129,129,129,129,129,129,129,129,129,129,129,129, 2,129,129,129, - 2, 2, 2, 2, 2, 2,109,109,109,109,109,109,109,109,109,109, - 109, 2, 2, 2, 2, 2,109,109, 2, 2, 2, 2, 2, 2,107,107, - 107,107, 2,107,107,107,107,107,107,107,107, 2, 2,107,107, 2, - 2,107,107,107,107,107,107,107,107,107,107,107,107,107,107, 2, - 107,107,107,107,107,107,107, 2,107,107, 2,107,107,107,107,107, - 2, 1,107,107,107,107,107, 2, 2,107,107,107, 2, 2,107, 2, - 2, 2, 2, 2, 2,107, 2, 2, 2, 2, 2,107,107,107,107,107, - 107,107, 2, 2,107,107,107,107,107,107,107, 2, 2, 2,137,137, - 137,137,137,137,137,137,137,137,137,137, 2,137,137,137,137,137, - 2, 2, 2, 2, 2, 2,124,124,124,124,124,124,124,124,124,124, - 2, 2, 2, 2, 2, 2,123,123,123,123,123,123,123,123,123,123, - 123,123,123,123, 2, 2,114,114,114,114,114,114,114,114,114,114, - 114,114,114, 2, 2, 2,114,114, 2, 2, 2, 2, 2, 2, 32, 32, - 32, 32, 32, 2, 2, 2,102,102,102,102,102,102,102,102,102,102, - 2, 2, 2, 2, 2, 2,126,126,126,126,126,126,126,126,126,126, - 126, 2, 2,126,126,126,126,126,126,126, 2, 2, 2, 2,126,126, - 126,126,126,126,126, 2,142,142,142,142,142,142,142,142,142,142, - 142,142, 2, 2, 2, 2,125,125,125,125,125,125,125,125,125,125, - 125, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,125,154,154, - 154,154,154,154,154, 2, 2,154, 2, 2,154,154,154,154,154,154, - 154,154, 2,154,154, 2,154,154,154,154,154,154,154,154,154,154, - 154,154,154,154, 2,154,154, 2, 2,154,154,154,154,154,154,154, - 2, 2, 2, 2, 2, 2,150,150,150,150,150,150,150,150, 2, 2, - 150,150,150,150,150,150,150,150,150,150,150, 2, 2, 2,141,141, - 141,141,141,141,141,141,140,140,140,140,140,140,140,140,140,140, - 140, 2, 2, 2, 2, 2,121,121,121,121,121,121,121,121,121, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,147,147, + 147,147,147,147,147,147,148,148,148,148,148,148,148,148,148,148, + 2, 2, 2, 2, 2, 2,158,158,158,158,158,158,158,158,158,158, + 2, 2, 2, 2, 2, 2,153,153,153,153,153,153,153,153,153,153, + 153,153, 2, 2, 2, 2,149,149,149,149,149,149,149,149,149,149, + 149,149,149,149,149, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 2, 2, + 2, 2, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101, + 101,101,101,101,101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101, + 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 2, 96, 96,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111, 2,100,100,100,100,100,100,100,100, 2, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,108,108, + 108,108,108,108,108,108,108,108, 2,108,108,108,108,108,108,108, + 2, 2, 2, 2, 2, 2,129,129,129,129,129,129,129, 2,129, 2, + 129,129,129,129, 2,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129, 2,129,129,129, 2, 2, 2, 2, 2, 2,109,109, + 109,109,109,109,109,109,109,109,109, 2, 2, 2, 2, 2,109,109, + 2, 2, 2, 2, 2, 2,107,107,107,107, 2,107,107,107,107,107, + 107,107,107, 2, 2,107,107, 2, 2,107,107,107,107,107,107,107, + 107,107,107,107,107,107,107, 2,107,107,107,107,107,107,107, 2, + 107,107, 2,107,107,107,107,107, 2, 1,107,107,107,107,107, 2, + 2,107,107,107, 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2, + 2, 2, 2,107,107,107,107,107,107,107, 2, 2,107,107,107,107, + 107,107,107, 2, 2, 2,137,137,137,137,137,137,137,137,137,137, + 137,137, 2,137,137,137,137,137, 2, 2, 2, 2, 2, 2,124,124, + 124,124,124,124,124,124,124,124, 2, 2, 2, 2, 2, 2,123,123, + 123,123,123,123,123,123,123,123,123,123,123,123, 2, 2,114,114, + 114,114,114,114,114,114,114,114,114,114,114, 2, 2, 2,114,114, + 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, 32, 2, 2, 2,102,102, + 102,102,102,102,102,102,102,102, 2, 2, 2, 2, 2, 2,126,126, + 126,126,126,126,126,126,126,126,126, 2, 2,126,126,126,126,126, + 126,126, 2, 2, 2, 2,126,126,126,126,126,126,126, 2,142,142, + 142,142,142,142,142,142,142,142,142,142, 2, 2, 2, 2,125,125, + 125,125,125,125,125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2,125,154,154,154,154,154,154,154, 2, 2,154, + 2, 2,154,154,154,154,154,154,154,154, 2,154,154, 2,154,154, + 154,154,154,154,154,154,154,154,154,154,154,154, 2,154,154, 2, + 2,154,154,154,154,154,154,154, 2, 2, 2, 2, 2, 2,150,150, + 150,150,150,150,150,150, 2, 2,150,150,150,150,150,150,150,150, + 150,150,150, 2, 2, 2,141,141,141,141,141,141,141,141,140,140, + 140,140,140,140,140,140,140,140,140, 2, 2, 2, 2, 2,121,121, + 121,121,121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2, 7, 7, 2, 2, 2, 2, 2, 2,133,133,133,133,133,133,133,133,133, 2, 133,133,133,133,133,133,133,133,133,133,133,133,133, 2,133,133, 133,133,133,133, 2, 2,133,133,133,133,133, 2, 2, 2,134,134, @@ -3795,29 +3839,31 @@ _hb_ucd_u8[17564] = 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143, 143,143,143,143,143, 2,143,143, 2,143,143,143,143,143,143, 2, 2, 2, 2, 2, 2, 2,143,143, 2, 2, 2, 2, 2, 2,145,145, - 145,145,145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2, 86, 2, + 145,145,145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2,163,163, + 163,163,163,163,163,163,163, 2,163,163,163,163,163,163,163,163, + 163, 2, 2, 2,163,163,163,163, 2, 2, 2, 2, 2, 2, 86, 2, 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 63, 63, 63, 63, 2, 2, 2, 2,157,157, 157,157,157,157,157,157,157,157,157, 2, 2, 2, 2, 2, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, 80, 2, - 2, 2, 2, 2, 2, 2,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127, 2, 79, 2, 2, 2, 2, 2, 2, 2,115,115, - 115,115,115,115,115,115,115,115,115,115,115,115,115, 2,115,115, - 2, 2, 2, 2,115,115,159,159,159,159,159,159,159,159,159,159, - 159,159,159,159,159, 2,159,159, 2, 2, 2, 2, 2, 2,103,103, - 103,103,103,103,103,103,103,103,103,103,103,103, 2, 2,119,119, - 119,119,119,119,119,119,119,119,119,119,119,119, 2, 2,119,119, - 2,119,119,119,119,119, 2, 2, 2, 2, 2,119,119,119,146,146, - 146,146,146,146,146,146,146,146,146, 2, 2, 2, 2, 2, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99, 2, 2, - 2, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, 2, 2,136,136, - 136,136,136,136,136,136,155,155,155,155,155,155,155,155,155,155, - 155,155,155,155, 2, 2,136, 2, 2, 2, 2, 2, 2, 2, 17, 17, - 17, 17, 2, 17, 17, 17, 17, 17, 17, 17, 2, 17, 17, 2, 17, 15, - 15, 15, 15, 15, 15, 15, 17, 17, 17, 2, 2, 2, 2, 2, 15, 15, - 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17,139,139, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, 2,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127, 2, 79, 2, + 2, 2, 2, 2, 2, 2,115,115,115,115,115,115,115,115,115,115, + 115,115,115,115,115, 2,115,115, 2, 2, 2, 2,115,115,159,159, + 159,159,159,159,159,159,159,159,159,159,159,159,159, 2,159,159, + 2, 2, 2, 2, 2, 2,103,103,103,103,103,103,103,103,103,103, + 103,103,103,103, 2, 2,119,119,119,119,119,119,119,119,119,119, + 119,119,119,119, 2, 2,119,119, 2,119,119,119,119,119, 2, 2, + 2, 2, 2,119,119,119,146,146,146,146,146,146,146,146,146,146, + 146, 2, 2, 2, 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 2, 2, 2, 2, 99, 2, 2, 2, 2, 2, 2, 2, 99,136,139, + 13, 13,155, 2, 2, 2,136,136,136,136,136,136,136,136,155,155, + 155,155,155,155,155,155,155,155,155,155,155,155, 2, 2,136, 2, + 2, 2, 2, 2, 2, 2, 17, 17, 17, 17, 2, 17, 17, 17, 17, 17, + 17, 17, 2, 17, 17, 2, 17, 15, 15, 15, 15, 15, 15, 15, 17, 17, + 17, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, 15, 15, + 15, 2, 2, 17, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17,139,139, 139,139,139,139,139,139,139,139,139,139, 2, 2, 2, 2,105,105, 105,105,105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105, 105,105,105, 2, 2, 2,105, 2, 2, 2, 2, 2, 2, 2,105,105, @@ -3831,24 +3877,27 @@ _hb_ucd_u8[17564] = 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,131,131,131,131,131,131,131,131,131,131, 131,131, 2, 2, 2, 2, 2, 2, 2,131,131,131,131,131, 2,131, - 131,131,131,131,131,131, 56, 56, 56, 56, 56, 56, 56, 2, 56, 2, - 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, 56, 56, 56, 56, - 56, 2, 2, 2, 2, 2,151,151,151,151,151,151,151,151,151,151, - 151,151,151, 2, 2, 2,151,151,151,151,151,151, 2, 2,151,151, - 2, 2, 2, 2,151,151,160,160,160,160,160,160,160,160,160,160, - 160,160,160,160,160, 2,152,152,152,152,152,152,152,152,152,152, - 2, 2, 2, 2, 2,152, 30, 30, 30, 30, 2, 30, 30, 2,113,113, - 113,113,113,113,113,113,113,113,113,113,113, 2, 2,113,113,113, - 113,113,113,113,113, 2,132,132,132,132,132,132,132,132,132,132, - 132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2,132,132, 3, 3, - 3, 3, 2, 3, 3, 3, 2, 3, 3, 2, 3, 2, 2, 3, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, - 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 2, 3, - 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, - 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, - 2, 2, 2, 2, 0, 0, 15, 0, 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 0, 0, 0, 13, 2, 2, 2, 2, 2, 2, 2, 13, 13, + 131,131,131,131,131,131, 2, 2, 2, 2, 2, 19, 19, 19, 56, 56, + 56, 56, 56, 56, 56, 2, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56, + 2, 56, 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2, 6, 6, + 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,151,151, + 151,151,151,151,151,151,151,151,151,151,151, 2, 2, 2,151,151, + 151,151,151,151, 2, 2,151,151, 2, 2, 2, 2,151,151,160,160, + 160,160,160,160,160,160,160,160,160,160,160,160,160, 2,152,152, + 152,152,152,152,152,152,152,152, 2, 2, 2, 2, 2,152,164,164, + 164,164,164,164,164,164,164,164, 2, 2, 2, 2, 2, 2, 30, 30, + 30, 30, 2, 30, 30, 2,113,113,113,113,113,113,113,113,113,113, + 113,113,113, 2, 2,113,113,113,113,113,113,113,113, 2,132,132, + 132,132,132,132,132,132,132,132,132,132, 2, 2, 2, 2,132,132, + 2, 2, 2, 2,132,132, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, + 3, 2, 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, + 3, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, + 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 15, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, + 2, 0, 0, 0, 0, 0, 13, 2, 2, 2, 2, 2, 2, 2, 13, 13, 13, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, 12, 13, 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -3926,7 +3975,7 @@ _hb_ucd_u8[17564] = 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, }; static const uint16_t -_hb_ucd_u16[9200] = +_hb_ucd_u16[9320] = { 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, @@ -4000,509 +4049,517 @@ _hb_ucd_u16[9200] = 48, 48, 48, 468, 48, 469, 48, 470, 48, 471, 472, 140, 140, 140, 140, 140, 48, 48, 48, 48, 196, 140, 140, 140, 9, 9, 9, 473, 11, 11, 11, 474, 48, 48, 475, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 271, 476, - 48, 48, 477, 478, 140, 140, 140, 140, 48, 464, 479, 48, 62, 480, 140, 48, - 481, 140, 140, 48, 482, 140, 48, 314, 483, 48, 48, 484, 485, 457, 486, 487, - 222, 48, 48, 488, 489, 48, 196, 192, 490, 48, 491, 492, 493, 48, 48, 494, - 222, 48, 48, 495, 496, 497, 498, 499, 48, 97, 500, 501, 140, 140, 140, 140, - 502, 503, 504, 48, 48, 505, 506, 192, 507, 83, 84, 508, 509, 510, 511, 512, - 48, 48, 48, 513, 514, 515, 478, 140, 48, 48, 48, 516, 517, 192, 140, 140, - 48, 48, 518, 519, 520, 521, 140, 140, 48, 48, 48, 522, 523, 192, 524, 140, - 48, 48, 525, 526, 192, 140, 140, 140, 48, 173, 527, 528, 314, 140, 140, 140, - 48, 48, 500, 529, 140, 140, 140, 140, 140, 140, 9, 9, 11, 11, 148, 530, - 531, 532, 48, 533, 534, 192, 140, 140, 140, 140, 535, 48, 48, 536, 537, 140, - 538, 48, 48, 539, 540, 541, 48, 48, 542, 543, 544, 48, 48, 48, 48, 196, - 84, 48, 518, 545, 546, 148, 175, 547, 48, 548, 549, 550, 140, 140, 140, 140, - 551, 48, 48, 552, 553, 192, 554, 48, 555, 556, 192, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 48, 557, 140, 140, 140, 100, 271, 558, 559, 560, - 48, 207, 140, 140, 140, 140, 140, 140, 272, 272, 272, 272, 272, 272, 561, 562, - 48, 48, 48, 48, 388, 140, 140, 140, 140, 48, 48, 48, 48, 48, 48, 563, - 48, 48, 200, 564, 140, 140, 140, 140, 48, 48, 48, 48, 314, 140, 140, 140, - 48, 48, 48, 196, 48, 200, 370, 48, 48, 48, 48, 200, 192, 48, 204, 565, - 48, 48, 48, 566, 567, 568, 569, 570, 48, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 9, 9, 11, 11, 271, 571, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 572, 573, 574, 574, 575, 576, 140, 140, 140, 140, 577, 578, + 48, 48, 477, 478, 140, 140, 140, 479, 48, 464, 480, 48, 62, 481, 140, 48, + 482, 140, 140, 48, 483, 140, 48, 314, 484, 48, 48, 485, 486, 457, 487, 488, + 222, 48, 48, 489, 490, 48, 196, 192, 491, 48, 492, 493, 494, 48, 48, 495, + 222, 48, 48, 496, 497, 498, 499, 500, 48, 97, 501, 502, 503, 140, 140, 140, + 504, 505, 506, 48, 48, 507, 508, 192, 509, 83, 84, 510, 511, 512, 513, 514, + 48, 48, 48, 515, 516, 517, 478, 140, 48, 48, 48, 518, 519, 192, 140, 140, + 48, 48, 520, 521, 522, 523, 140, 140, 48, 48, 48, 524, 525, 192, 526, 140, + 48, 48, 527, 528, 192, 140, 140, 140, 48, 173, 529, 530, 314, 140, 140, 140, + 48, 48, 501, 531, 140, 140, 140, 140, 140, 140, 9, 9, 11, 11, 148, 532, + 533, 534, 48, 535, 536, 192, 140, 140, 140, 140, 537, 48, 48, 538, 539, 140, + 540, 48, 48, 541, 542, 543, 48, 48, 544, 545, 546, 48, 48, 48, 48, 196, + 547, 140, 140, 140, 140, 140, 140, 140, 84, 48, 520, 548, 549, 148, 175, 550, + 48, 551, 552, 553, 140, 140, 140, 140, 554, 48, 48, 555, 556, 192, 557, 48, + 558, 559, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 48, 560, + 561, 115, 48, 562, 563, 192, 140, 140, 140, 140, 140, 100, 271, 564, 565, 566, + 48, 207, 140, 140, 140, 140, 140, 140, 272, 272, 272, 272, 272, 272, 567, 568, + 48, 48, 48, 48, 388, 140, 140, 140, 140, 48, 48, 48, 48, 48, 48, 569, + 48, 48, 48, 570, 571, 572, 140, 140, 48, 48, 48, 48, 314, 140, 140, 140, + 48, 48, 48, 196, 48, 200, 370, 48, 48, 48, 48, 200, 192, 48, 204, 573, + 48, 48, 48, 574, 575, 576, 577, 578, 48, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 9, 9, 11, 11, 271, 579, 140, 140, 140, 140, 140, 140, + 48, 48, 48, 48, 580, 581, 582, 582, 583, 584, 140, 140, 140, 140, 585, 586, 48, 48, 48, 48, 48, 48, 48, 440, 48, 48, 48, 48, 48, 199, 140, 140, - 196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 579, - 48, 48, 580, 140, 140, 580, 581, 48, 48, 48, 48, 48, 48, 48, 48, 206, - 48, 48, 48, 48, 48, 48, 71, 151, 196, 582, 583, 140, 140, 140, 140, 140, - 32, 32, 584, 32, 585, 209, 209, 209, 209, 209, 209, 209, 323, 140, 140, 140, - 209, 209, 209, 209, 209, 209, 209, 324, 209, 209, 586, 209, 209, 209, 587, 588, - 589, 209, 590, 209, 209, 209, 288, 140, 209, 209, 209, 209, 591, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 271, 592, 209, 209, 209, 209, 209, 287, 271, 461, - 9, 593, 11, 594, 595, 596, 241, 9, 597, 598, 599, 600, 601, 9, 593, 11, - 602, 603, 11, 604, 605, 606, 607, 9, 608, 11, 9, 593, 11, 594, 595, 11, - 241, 9, 597, 607, 9, 608, 11, 9, 593, 11, 609, 9, 610, 611, 612, 613, - 11, 614, 9, 615, 616, 617, 618, 11, 619, 9, 620, 11, 621, 622, 622, 622, - 32, 32, 32, 623, 32, 32, 624, 625, 626, 627, 45, 140, 140, 140, 140, 140, - 628, 629, 140, 140, 140, 140, 140, 140, 630, 631, 632, 140, 140, 140, 140, 140, - 48, 48, 151, 633, 634, 140, 140, 140, 140, 48, 635, 140, 48, 48, 636, 637, - 140, 140, 140, 140, 140, 140, 638, 200, 48, 48, 48, 48, 639, 585, 140, 140, - 9, 9, 597, 11, 640, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 498, - 271, 271, 641, 642, 140, 140, 140, 140, 498, 271, 643, 644, 140, 140, 140, 140, - 645, 48, 646, 647, 648, 649, 650, 651, 652, 206, 653, 206, 140, 140, 140, 654, - 209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 655, 655, 655, 209, 324, - 656, 209, 209, 209, 209, 209, 209, 209, 209, 209, 657, 140, 140, 140, 658, 209, - 659, 209, 209, 325, 660, 661, 324, 140, 209, 209, 209, 209, 209, 209, 209, 662, - 209, 209, 209, 209, 209, 663, 426, 426, 209, 209, 209, 209, 209, 209, 209, 323, - 209, 209, 209, 209, 209, 660, 325, 427, 325, 209, 209, 209, 664, 176, 209, 209, - 664, 209, 657, 661, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 657, 665, - 287, 209, 426, 288, 324, 176, 664, 287, 209, 666, 209, 209, 288, 140, 140, 192, - 48, 48, 48, 48, 48, 48, 140, 140, 48, 48, 48, 196, 48, 48, 48, 48, + 196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 587, + 48, 48, 588, 589, 140, 590, 591, 48, 48, 48, 48, 48, 48, 48, 48, 206, + 48, 48, 48, 48, 48, 48, 71, 151, 196, 592, 593, 140, 140, 140, 140, 140, + 32, 32, 594, 32, 595, 209, 209, 209, 209, 209, 209, 209, 323, 140, 140, 140, + 209, 209, 209, 209, 209, 209, 209, 324, 209, 209, 596, 209, 209, 209, 597, 598, + 599, 209, 600, 209, 209, 209, 288, 140, 209, 209, 209, 209, 601, 140, 140, 140, + 140, 140, 140, 140, 271, 602, 271, 602, 209, 209, 209, 209, 209, 287, 271, 461, + 9, 603, 11, 604, 605, 606, 241, 9, 607, 608, 609, 610, 611, 9, 603, 11, + 612, 613, 11, 614, 615, 616, 617, 9, 618, 11, 9, 603, 11, 604, 605, 11, + 241, 9, 607, 617, 9, 618, 11, 9, 603, 11, 619, 9, 620, 621, 622, 623, + 11, 624, 9, 625, 626, 627, 628, 11, 629, 9, 630, 11, 631, 632, 632, 632, + 32, 32, 32, 633, 32, 32, 634, 635, 636, 637, 45, 140, 140, 140, 140, 140, + 638, 639, 640, 140, 140, 140, 140, 140, 641, 642, 643, 27, 27, 27, 644, 140, + 645, 140, 140, 140, 140, 140, 140, 140, 48, 48, 151, 646, 647, 140, 140, 140, + 140, 48, 648, 140, 48, 48, 649, 650, 140, 140, 140, 140, 140, 48, 651, 192, + 140, 140, 140, 140, 140, 140, 652, 200, 48, 48, 48, 48, 653, 595, 140, 140, + 9, 9, 607, 11, 654, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 499, + 271, 271, 655, 656, 140, 140, 140, 140, 499, 271, 657, 658, 140, 140, 140, 140, + 659, 48, 660, 661, 662, 663, 664, 665, 666, 206, 667, 206, 140, 140, 140, 668, + 209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 669, 669, 669, 209, 324, + 670, 209, 209, 209, 209, 209, 209, 209, 209, 209, 671, 140, 140, 140, 672, 209, + 673, 209, 209, 325, 674, 675, 324, 140, 209, 209, 209, 209, 209, 209, 209, 676, + 209, 209, 209, 209, 209, 677, 426, 426, 209, 209, 209, 209, 209, 209, 209, 678, + 209, 209, 209, 209, 209, 176, 325, 427, 325, 209, 209, 209, 679, 176, 209, 209, + 679, 209, 671, 675, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 671, 426, + 674, 209, 209, 680, 681, 325, 674, 674, 209, 682, 209, 209, 288, 140, 140, 192, + 48, 48, 48, 48, 48, 48, 140, 140, 48, 48, 48, 207, 48, 48, 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 478, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 140, 48, 204, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 71, 140, 140, 140, 667, 140, 668, 668, 668, 668, 668, 668, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 140, - 391, 391, 391, 391, 391, 391, 391, 669, 391, 391, 391, 391, 391, 391, 391, 670, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, - 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, - 12, 13, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 20, 21, 21, 21, 22, 20, 21, 21, 21, 21, - 21, 23, 24, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 27, 28, 26, - 29, 30, 31, 32, 31, 31, 31, 31, 33, 34, 35, 31, 31, 31, 36, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 31, 31, 31, 31, - 37, 38, 37, 37, 37, 37, 37, 37, 37, 39, 31, 31, 31, 31, 31, 31, - 40, 40, 40, 40, 40, 40, 41, 26, 42, 42, 42, 42, 42, 42, 42, 43, - 44, 44, 44, 44, 44, 45, 44, 46, 47, 47, 47, 48, 37, 49, 31, 31, - 31, 50, 51, 31, 31, 31, 31, 31, 31, 31, 31, 31, 52, 31, 31, 31, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 53, 55, 53, 53, 53, - 56, 57, 58, 59, 59, 60, 61, 62, 57, 63, 64, 65, 66, 59, 59, 67, - 68, 69, 70, 71, 71, 72, 73, 74, 69, 75, 76, 77, 78, 71, 79, 26, - 80, 81, 82, 83, 83, 84, 85, 86, 81, 87, 88, 26, 89, 83, 90, 91, - 92, 93, 94, 95, 95, 96, 97, 98, 93, 99, 100, 101, 102, 95, 95, 26, - 103, 104, 105, 106, 107, 104, 108, 109, 104, 105, 110, 26, 111, 108, 108, 112, - 113, 114, 115, 113, 113, 115, 113, 116, 114, 117, 118, 119, 120, 113, 121, 113, - 122, 123, 124, 122, 122, 124, 125, 126, 123, 127, 128, 128, 129, 122, 130, 26, - 131, 132, 133, 131, 131, 131, 131, 131, 132, 133, 134, 131, 135, 131, 131, 131, - 136, 137, 138, 139, 137, 137, 140, 141, 138, 142, 143, 137, 144, 137, 145, 26, - 146, 147, 147, 147, 147, 147, 147, 148, 147, 147, 147, 149, 26, 26, 26, 26, - 150, 151, 152, 152, 153, 152, 152, 154, 155, 154, 152, 156, 26, 26, 26, 26, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 158, 157, 157, 157, 159, 158, 157, - 157, 157, 157, 158, 157, 157, 157, 160, 157, 160, 161, 162, 26, 26, 26, 26, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 164, 164, 164, 164, 165, 166, 164, 164, 164, 164, 164, 167, - 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 170, 171, 170, 169, 169, 169, 169, - 169, 170, 169, 169, 169, 169, 170, 171, 170, 169, 171, 169, 169, 169, 169, 169, - 169, 169, 170, 169, 169, 169, 169, 169, 169, 169, 169, 172, 169, 169, 169, 173, - 169, 169, 169, 174, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 178, 178, 178, 179, 180, 180, 180, 180, 180, 180, 180, 180, 180, 181, 180, 182, - 183, 183, 184, 185, 186, 186, 187, 26, 188, 188, 189, 26, 190, 191, 192, 26, - 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, 193, 195, 193, 195, - 196, 197, 197, 198, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 199, - 197, 197, 197, 197, 197, 200, 177, 177, 177, 177, 177, 177, 177, 177, 201, 26, - 202, 202, 202, 203, 202, 204, 202, 204, 205, 202, 206, 206, 206, 207, 208, 26, - 209, 209, 209, 209, 209, 210, 209, 209, 209, 211, 209, 212, 193, 193, 193, 193, - 213, 213, 213, 214, 215, 215, 215, 215, 215, 215, 215, 216, 215, 215, 215, 217, - 215, 218, 215, 218, 215, 219, 9, 9, 9, 220, 26, 26, 26, 26, 26, 26, - 221, 221, 221, 221, 221, 221, 221, 221, 221, 222, 221, 221, 221, 221, 221, 223, - 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 226, 227, - 228, 228, 228, 228, 228, 228, 228, 229, 228, 230, 231, 231, 231, 231, 231, 231, - 18, 232, 164, 164, 164, 164, 164, 233, 224, 26, 234, 9, 235, 236, 237, 238, - 2, 2, 2, 2, 239, 240, 2, 2, 2, 2, 2, 241, 242, 243, 2, 244, - 2, 2, 2, 2, 2, 2, 2, 245, 9, 9, 9, 9, 9, 9, 9, 9, - 14, 14, 246, 246, 14, 14, 14, 14, 246, 246, 14, 247, 14, 14, 14, 246, - 14, 14, 14, 14, 14, 14, 248, 14, 248, 14, 249, 250, 14, 14, 251, 252, - 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 255, 256, - 0, 257, 2, 258, 0, 0, 0, 0, 259, 26, 9, 9, 9, 9, 260, 26, - 0, 0, 0, 0, 261, 262, 4, 0, 0, 263, 0, 0, 2, 2, 2, 2, - 2, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 71, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140, + 683, 140, 570, 570, 570, 570, 570, 570, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 140, 391, 391, 391, 391, 391, 391, 391, 684, + 391, 391, 391, 391, 391, 391, 391, 685, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 2, 3, 1, 2, 2, 3, 0, 0, 0, 0, 0, 4, 0, 4, + 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, + 0, 0, 0, 0, 7, 8, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 10, 11, 12, 13, 14, 14, 15, 14, 14, 14, + 14, 14, 14, 14, 16, 17, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 19, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 20, 21, + 21, 21, 22, 20, 21, 21, 21, 21, 21, 23, 24, 25, 25, 25, 25, 25, + 25, 26, 25, 25, 25, 27, 28, 26, 29, 30, 31, 32, 31, 31, 31, 31, + 33, 34, 35, 31, 31, 31, 36, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 29, 31, 31, 31, 31, 37, 38, 37, 37, 37, 37, 37, 37, + 37, 39, 31, 31, 31, 31, 31, 31, 40, 40, 40, 40, 40, 40, 41, 26, + 42, 42, 42, 42, 42, 42, 42, 43, 44, 44, 44, 44, 44, 45, 44, 46, + 47, 47, 47, 48, 37, 49, 31, 31, 31, 50, 51, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 52, 31, 31, 31, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 54, 53, 55, 53, 53, 53, 56, 57, 58, 59, 59, 60, 61, 62, + 57, 63, 64, 65, 66, 59, 59, 67, 68, 69, 70, 71, 71, 72, 73, 74, + 69, 75, 76, 77, 78, 71, 79, 26, 80, 81, 82, 83, 83, 84, 85, 86, + 81, 87, 88, 26, 89, 83, 90, 91, 92, 93, 94, 95, 95, 96, 97, 98, + 93, 99, 100, 101, 102, 95, 95, 26, 103, 104, 105, 106, 107, 104, 108, 109, + 104, 105, 110, 26, 111, 108, 108, 112, 113, 114, 115, 113, 113, 115, 113, 116, + 114, 117, 118, 119, 120, 113, 121, 113, 122, 123, 124, 122, 122, 124, 125, 126, + 123, 127, 128, 128, 129, 122, 130, 26, 131, 132, 133, 131, 131, 131, 131, 131, + 132, 133, 134, 131, 135, 131, 131, 131, 136, 137, 138, 139, 137, 137, 140, 141, + 138, 142, 143, 137, 144, 137, 145, 26, 146, 147, 147, 147, 147, 147, 147, 148, + 147, 147, 147, 149, 26, 26, 26, 26, 150, 151, 152, 152, 153, 152, 152, 154, + 155, 156, 152, 157, 26, 26, 26, 26, 158, 158, 158, 158, 158, 158, 158, 158, + 158, 159, 158, 158, 158, 160, 159, 158, 158, 158, 158, 159, 158, 158, 158, 161, + 158, 161, 162, 163, 26, 26, 26, 26, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, + 166, 167, 165, 165, 165, 165, 165, 168, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 171, 172, 171, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 171, 172, + 171, 170, 172, 170, 170, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 170, + 170, 170, 170, 173, 170, 170, 170, 174, 170, 170, 170, 175, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 180, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 182, 181, 183, 184, 184, 185, 186, 187, 187, 188, 26, + 189, 189, 190, 26, 191, 192, 193, 26, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 195, 194, 196, 194, 196, 197, 198, 198, 199, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 200, 198, 198, 198, 198, 198, 201, 178, 178, + 178, 178, 178, 178, 178, 178, 202, 26, 203, 203, 203, 204, 203, 205, 203, 205, + 206, 203, 207, 207, 207, 208, 209, 26, 210, 210, 210, 210, 210, 211, 210, 210, + 210, 212, 210, 213, 194, 194, 194, 194, 214, 214, 214, 215, 216, 216, 216, 216, + 216, 216, 216, 217, 216, 216, 216, 218, 216, 219, 216, 219, 216, 220, 9, 9, + 9, 221, 26, 26, 26, 26, 26, 26, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 223, 222, 222, 222, 222, 222, 224, 225, 225, 225, 225, 225, 225, 225, 225, + 226, 226, 226, 226, 226, 226, 227, 228, 229, 229, 229, 229, 229, 229, 229, 230, + 229, 231, 232, 232, 232, 232, 232, 232, 18, 233, 165, 165, 165, 165, 165, 234, + 225, 26, 235, 9, 236, 237, 238, 239, 2, 2, 2, 2, 240, 241, 2, 2, + 2, 2, 2, 242, 243, 244, 2, 245, 2, 2, 2, 2, 2, 2, 2, 246, + 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 247, 247, 14, 14, 14, 14, + 247, 247, 14, 248, 14, 14, 14, 247, 14, 14, 14, 14, 14, 14, 249, 14, + 249, 14, 250, 251, 14, 14, 252, 253, 0, 254, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 256, 257, 0, 258, 2, 259, 0, 0, 0, 0, + 260, 26, 9, 9, 9, 9, 261, 26, 0, 0, 0, 0, 262, 263, 4, 0, + 0, 264, 0, 0, 2, 2, 2, 2, 2, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 257, 26, 26, 26, 0, 265, 26, 26, 0, 0, 0, 0, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, - 0, 0, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 2, 2, 2, 2, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 270, 271, - 164, 164, 164, 164, 165, 166, 272, 272, 272, 272, 272, 272, 272, 273, 274, 273, - 169, 169, 171, 26, 171, 171, 171, 171, 171, 171, 171, 171, 18, 18, 18, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, - 276, 276, 276, 277, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 278, 26, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, 26, 26, 26, 0, 280, - 281, 0, 0, 0, 282, 283, 0, 284, 285, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 287, 288, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 291, - 292, 293, 293, 293, 293, 293, 294, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 295, 0, 0, 293, 293, 293, 293, 0, 0, 0, 0, 280, 26, 290, 290, - 168, 168, 168, 295, 0, 0, 0, 0, 0, 0, 0, 0, 168, 168, 168, 296, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 290, 290, 290, 290, 297, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 0, 0, 0, 0, 0, - 276, 276, 276, 276, 276, 276, 276, 276, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 299, 298, 298, 298, 298, 298, 298, 300, 26, 301, 301, 301, 301, 301, 301, - 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, - 302, 302, 302, 302, 302, 303, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 26, - 0, 0, 0, 0, 305, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 306, 2, 2, 2, 2, 2, 2, 2, 307, 308, 309, 26, 26, 310, 2, - 311, 311, 311, 311, 311, 312, 0, 313, 314, 314, 314, 314, 314, 314, 314, 26, - 315, 315, 315, 315, 315, 315, 315, 315, 316, 317, 315, 318, 53, 53, 53, 53, - 319, 319, 319, 319, 319, 320, 321, 321, 321, 321, 322, 323, 168, 168, 168, 324, - 325, 325, 325, 325, 325, 325, 325, 325, 325, 326, 325, 327, 163, 163, 163, 328, - 329, 329, 329, 329, 329, 329, 330, 26, 329, 331, 329, 332, 163, 163, 163, 163, - 333, 333, 333, 333, 333, 333, 333, 333, 334, 26, 26, 335, 336, 336, 337, 26, - 338, 338, 338, 26, 171, 171, 2, 2, 2, 2, 2, 339, 340, 341, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 336, 336, 336, 336, 336, 342, 336, 343, - 168, 168, 168, 168, 344, 26, 168, 168, 295, 345, 168, 168, 168, 168, 168, 344, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 26, 26, 26, + 0, 266, 26, 26, 0, 0, 0, 0, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 269, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 2, 2, 2, 2, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 271, 272, 165, 165, 165, 165, 166, 167, 273, 273, + 273, 273, 273, 273, 273, 274, 275, 274, 170, 170, 172, 26, 172, 172, 172, 172, + 172, 172, 172, 172, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 276, 26, 26, 26, 26, 277, 277, 277, 278, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 279, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 280, 26, 26, 26, 0, 281, 282, 0, 0, 0, 283, 284, 0, 285, + 286, 287, 287, 287, 287, 287, 287, 287, 287, 287, 288, 289, 290, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 292, 293, 294, 294, 294, 294, 294, 295, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 296, 0, 0, 294, 294, 294, 294, + 0, 0, 0, 0, 281, 26, 291, 291, 169, 169, 169, 296, 0, 0, 0, 0, + 0, 0, 0, 0, 169, 169, 169, 297, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 291, 291, 291, 291, 291, 298, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 0, 0, 0, 0, 0, 277, 277, 277, 277, 277, 277, 277, 277, + 0, 0, 0, 0, 0, 0, 0, 0, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 299, 299, 299, 299, 299, 299, + 301, 26, 302, 302, 302, 302, 302, 302, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 304, 26, 26, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 26, 0, 0, 0, 0, 306, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 307, 2, 2, 2, 2, 2, 2, + 2, 308, 309, 310, 26, 26, 311, 2, 312, 312, 312, 312, 312, 313, 0, 314, + 315, 315, 315, 315, 315, 315, 315, 26, 316, 316, 316, 316, 316, 316, 316, 316, + 317, 318, 316, 319, 53, 53, 53, 53, 320, 320, 320, 320, 320, 321, 322, 322, + 322, 322, 323, 324, 169, 169, 169, 325, 326, 326, 326, 326, 326, 326, 326, 326, + 326, 327, 326, 328, 164, 164, 164, 329, 330, 330, 330, 330, 330, 330, 331, 26, + 330, 332, 330, 333, 164, 164, 164, 164, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 26, 26, 336, 337, 337, 338, 26, 339, 339, 339, 26, 172, 172, 2, 2, + 2, 2, 2, 340, 341, 342, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 337, 337, 337, 337, 337, 343, 337, 344, 169, 169, 169, 169, 345, 26, 169, 169, + 296, 346, 169, 169, 169, 169, 169, 345, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 347, 26, 26, 26, 26, 348, 26, 349, 350, 25, 25, 351, 352, + 353, 25, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 354, 26, 355, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 356, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 357, 31, 31, 31, 31, 31, + 31, 358, 26, 26, 26, 26, 31, 31, 9, 9, 0, 314, 9, 359, 0, 0, + 0, 0, 360, 0, 258, 281, 361, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 362, 363, 0, 0, 0, 1, 2, 2, 3, + 1, 2, 2, 3, 364, 291, 290, 291, 291, 291, 291, 365, 169, 169, 169, 296, + 366, 366, 366, 367, 258, 258, 26, 368, 369, 370, 369, 369, 371, 369, 369, 372, + 369, 373, 369, 373, 26, 26, 26, 26, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 374, 375, 0, 0, 0, 0, 0, 376, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 253, 0, 377, 378, 26, 26, 26, + 26, 26, 0, 0, 0, 0, 0, 379, 380, 380, 380, 381, 382, 382, 382, 382, + 382, 382, 383, 26, 384, 0, 0, 281, 385, 385, 385, 385, 386, 387, 388, 388, + 388, 389, 390, 390, 390, 390, 390, 391, 392, 392, 392, 393, 394, 394, 394, 394, + 395, 394, 396, 26, 26, 26, 26, 26, 397, 397, 397, 397, 397, 397, 397, 397, + 397, 397, 398, 398, 398, 398, 398, 398, 399, 399, 399, 400, 399, 401, 402, 402, + 402, 402, 403, 402, 402, 402, 402, 403, 404, 404, 404, 404, 404, 26, 405, 405, + 405, 405, 405, 405, 406, 407, 408, 409, 408, 409, 410, 408, 411, 408, 411, 412, + 26, 26, 26, 26, 26, 26, 26, 26, 413, 413, 413, 413, 413, 413, 413, 413, + 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 414, 26, + 413, 413, 415, 26, 413, 26, 26, 26, 416, 2, 2, 2, 2, 2, 417, 308, + 26, 26, 26, 26, 26, 26, 26, 26, 418, 419, 420, 420, 420, 420, 421, 422, + 423, 423, 424, 423, 425, 425, 425, 425, 426, 426, 426, 427, 428, 426, 26, 26, + 26, 26, 26, 26, 429, 429, 430, 431, 432, 432, 432, 433, 434, 434, 434, 435, + 26, 26, 26, 26, 26, 26, 26, 26, 436, 436, 436, 436, 437, 437, 437, 438, + 437, 437, 439, 437, 437, 437, 437, 437, 440, 441, 442, 443, 444, 444, 445, 446, + 444, 447, 444, 447, 448, 448, 448, 448, 449, 449, 449, 449, 26, 26, 26, 26, + 450, 450, 450, 450, 451, 452, 451, 26, 453, 453, 453, 453, 453, 453, 454, 455, + 456, 456, 457, 456, 458, 458, 459, 458, 460, 460, 461, 462, 26, 463, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 464, 464, 464, 464, 464, 464, 464, 464, + 464, 465, 26, 26, 26, 26, 26, 26, 466, 466, 466, 466, 466, 466, 467, 26, + 466, 466, 466, 466, 466, 466, 467, 468, 469, 469, 469, 469, 469, 26, 469, 470, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 31, 31, 31, 50, 471, 471, 471, 471, 471, 472, 473, 26, + 26, 26, 26, 26, 26, 26, 26, 474, 475, 475, 475, 475, 475, 26, 476, 476, + 476, 476, 476, 477, 26, 26, 478, 478, 478, 479, 26, 26, 26, 26, 480, 480, + 480, 481, 26, 26, 482, 482, 483, 26, 484, 484, 484, 484, 484, 484, 484, 484, + 484, 485, 486, 484, 484, 484, 485, 487, 488, 488, 488, 488, 488, 488, 488, 488, + 489, 490, 491, 491, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 495, 494, + 494, 26, 496, 496, 496, 496, 497, 26, 498, 498, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 498, 499, 137, 500, 26, 501, 501, 502, 501, 501, 501, 501, 501, + 503, 26, 26, 26, 26, 26, 26, 26, 504, 505, 506, 507, 506, 508, 509, 509, + 509, 509, 509, 509, 509, 510, 509, 511, 512, 513, 514, 515, 515, 516, 517, 518, + 513, 519, 520, 521, 522, 523, 523, 26, 524, 524, 524, 524, 524, 524, 524, 524, + 524, 524, 524, 525, 526, 26, 26, 26, 527, 527, 527, 527, 527, 527, 527, 527, + 527, 26, 527, 528, 26, 26, 26, 26, 529, 529, 529, 529, 529, 529, 530, 529, + 529, 529, 529, 530, 26, 26, 26, 26, 531, 531, 531, 531, 531, 531, 531, 531, + 532, 26, 531, 533, 198, 534, 26, 26, 535, 535, 535, 535, 535, 535, 535, 536, + 535, 536, 26, 26, 26, 26, 26, 26, 537, 537, 537, 538, 537, 539, 537, 537, + 540, 26, 26, 26, 26, 26, 26, 26, 541, 541, 541, 541, 541, 541, 541, 542, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 543, 543, 543, 543, + 543, 543, 543, 543, 543, 543, 544, 545, 546, 547, 548, 549, 549, 549, 550, 551, + 546, 26, 549, 552, 26, 26, 26, 26, 26, 26, 26, 26, 553, 554, 553, 553, + 553, 553, 553, 554, 555, 26, 26, 26, 556, 556, 556, 556, 556, 556, 556, 556, + 556, 26, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 558, 26, 178, 178, + 559, 559, 559, 559, 559, 559, 559, 560, 53, 561, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 562, 563, 562, 562, 562, 562, 564, 562, + 565, 26, 562, 562, 562, 566, 567, 567, 567, 567, 568, 567, 567, 569, 570, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 571, 572, 573, 573, 573, 573, 571, 574, + 573, 26, 573, 575, 576, 577, 578, 578, 578, 579, 580, 581, 578, 582, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 583, 583, 583, 584, 585, 585, 586, 585, 585, 585, 585, 587, + 585, 585, 585, 588, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 589, 26, + 108, 108, 108, 108, 108, 108, 590, 591, 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 593, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 594, 595, 26, 592, 592, 592, 592, 592, 592, 592, 592, + 596, 26, 26, 26, 26, 26, 26, 26, 26, 26, 597, 597, 597, 597, 597, 597, + 597, 597, 597, 597, 597, 597, 598, 26, 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 600, 26, 26, 26, 26, 26, 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, 26, 26, 26, 26, 26, 26, 26, 305, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 603, + 604, 604, 604, 605, 604, 606, 607, 607, 607, 607, 607, 607, 607, 607, 607, 608, + 607, 609, 610, 610, 610, 611, 611, 26, 612, 612, 612, 612, 612, 612, 612, 612, + 613, 26, 612, 614, 614, 612, 612, 615, 612, 612, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 617, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 618, 618, 618, 618, 618, 618, 618, 618, + 618, 619, 618, 618, 618, 618, 618, 618, 618, 620, 618, 618, 26, 26, 26, 26, + 26, 26, 26, 26, 621, 26, 347, 26, 622, 622, 622, 622, 622, 622, 622, 622, + 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, + 622, 622, 622, 622, 622, 622, 622, 26, 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 624, 26, 26, 26, 26, 26, 622, 625, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 346, 26, 26, 26, 26, - 347, 26, 348, 349, 25, 25, 350, 351, 352, 25, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 353, 26, 354, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 355, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 356, 31, 31, 31, 31, 31, 31, 357, 26, 26, 26, 26, 31, 31, - 9, 9, 0, 313, 9, 358, 0, 0, 0, 0, 359, 0, 257, 280, 360, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 361, - 362, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 363, 290, 289, 290, - 290, 290, 290, 364, 168, 168, 168, 295, 365, 365, 365, 366, 257, 257, 26, 367, - 368, 369, 368, 368, 370, 368, 368, 371, 368, 372, 368, 372, 26, 26, 26, 26, - 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 373, - 374, 0, 0, 0, 0, 0, 375, 0, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 252, 0, 376, 377, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 378, - 379, 379, 379, 380, 381, 381, 381, 381, 381, 381, 382, 26, 383, 0, 0, 280, - 384, 384, 384, 384, 385, 386, 387, 387, 387, 388, 389, 389, 389, 389, 389, 390, - 391, 391, 391, 392, 393, 393, 393, 393, 394, 393, 395, 26, 26, 26, 26, 26, - 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, 397, - 398, 398, 398, 399, 398, 400, 401, 401, 401, 401, 402, 401, 401, 401, 401, 402, - 403, 403, 403, 403, 403, 26, 404, 404, 404, 404, 404, 404, 405, 406, 407, 408, - 407, 408, 409, 407, 410, 407, 410, 411, 26, 26, 26, 26, 26, 26, 26, 26, - 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, - 412, 412, 412, 412, 412, 412, 413, 26, 412, 412, 414, 26, 412, 26, 26, 26, - 415, 2, 2, 2, 2, 2, 416, 307, 26, 26, 26, 26, 26, 26, 26, 26, - 417, 418, 419, 419, 419, 419, 420, 421, 422, 422, 423, 422, 424, 424, 424, 424, - 425, 425, 425, 426, 427, 425, 26, 26, 26, 26, 26, 26, 428, 428, 429, 430, - 431, 431, 431, 432, 433, 433, 433, 434, 26, 26, 26, 26, 26, 26, 26, 26, - 435, 435, 435, 435, 436, 436, 436, 437, 436, 436, 438, 436, 436, 436, 436, 436, - 439, 440, 441, 442, 443, 443, 444, 445, 443, 446, 443, 446, 447, 447, 447, 447, - 448, 448, 448, 448, 26, 26, 26, 26, 449, 449, 449, 449, 450, 451, 450, 26, - 452, 452, 452, 452, 452, 452, 453, 454, 455, 455, 456, 455, 457, 457, 458, 457, - 459, 459, 460, 461, 26, 462, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 463, 463, 463, 463, 463, 463, 463, 463, 463, 464, 26, 26, 26, 26, 26, 26, - 465, 465, 465, 465, 465, 465, 466, 26, 465, 465, 465, 465, 465, 465, 466, 467, - 468, 468, 468, 468, 468, 26, 468, 469, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 50, - 470, 470, 470, 470, 470, 471, 472, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 473, 473, 473, 473, 473, 26, 474, 474, 474, 474, 474, 475, 26, 26, 476, 476, - 476, 477, 26, 26, 26, 26, 478, 478, 478, 479, 26, 26, 480, 480, 481, 26, - 482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 484, 482, 482, 482, 483, 485, - 486, 486, 486, 486, 486, 486, 486, 486, 487, 488, 489, 489, 489, 490, 489, 491, - 492, 492, 492, 492, 492, 492, 493, 492, 492, 26, 494, 494, 494, 494, 495, 26, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 497, 137, 498, 26, - 499, 499, 500, 499, 499, 499, 499, 501, 26, 26, 26, 26, 26, 26, 26, 26, - 502, 503, 504, 505, 504, 506, 507, 507, 507, 507, 507, 507, 507, 508, 507, 509, - 510, 511, 512, 513, 513, 514, 515, 516, 511, 517, 518, 519, 520, 521, 521, 26, - 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 524, 26, 26, 26, - 525, 525, 525, 525, 525, 525, 525, 525, 525, 26, 525, 526, 26, 26, 26, 26, - 527, 527, 527, 527, 527, 527, 528, 527, 527, 527, 527, 528, 26, 26, 26, 26, - 529, 529, 529, 529, 529, 529, 529, 529, 530, 26, 529, 531, 197, 532, 26, 26, - 533, 533, 533, 533, 533, 533, 533, 534, 533, 534, 26, 26, 26, 26, 26, 26, - 535, 535, 535, 536, 535, 537, 535, 535, 538, 26, 26, 26, 26, 26, 26, 26, - 539, 539, 539, 539, 539, 539, 539, 540, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 542, 543, - 544, 545, 546, 547, 547, 547, 548, 549, 544, 26, 547, 550, 26, 26, 26, 26, - 26, 26, 26, 26, 551, 552, 551, 551, 551, 551, 551, 552, 553, 26, 26, 26, - 554, 554, 554, 554, 554, 554, 554, 554, 554, 26, 555, 555, 555, 555, 555, 555, - 555, 555, 555, 555, 556, 26, 177, 177, 557, 557, 557, 557, 557, 557, 557, 558, - 559, 560, 559, 559, 559, 559, 561, 559, 562, 26, 559, 559, 559, 563, 564, 564, - 564, 564, 565, 564, 564, 566, 567, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 568, 569, 570, 570, 570, 570, 568, 571, 570, 26, 570, 572, 573, 574, 575, 575, - 575, 576, 577, 578, 575, 579, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 580, 580, 580, 581, - 26, 26, 26, 26, 26, 26, 582, 26, 108, 108, 108, 108, 108, 108, 583, 584, - 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, - 585, 585, 585, 586, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 587, 588, 26, - 585, 585, 585, 585, 585, 585, 585, 585, 589, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 591, 26, - 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, - 592, 592, 592, 592, 592, 593, 592, 594, 26, 26, 26, 26, 26, 26, 26, 26, - 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, - 595, 595, 595, 595, 595, 595, 595, 595, 596, 26, 26, 26, 26, 26, 26, 26, - 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, - 304, 304, 304, 304, 304, 304, 304, 597, 598, 598, 598, 599, 598, 600, 601, 601, - 601, 601, 601, 601, 601, 601, 601, 602, 601, 603, 604, 604, 604, 605, 605, 26, - 606, 606, 606, 606, 606, 606, 606, 606, 607, 26, 606, 608, 608, 606, 606, 609, - 606, 606, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 610, 610, 610, 610, 610, 610, 610, 610, - 610, 610, 610, 611, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 612, 612, 612, 612, 612, 612, 612, 612, 612, 613, 612, 612, 612, 612, 612, 612, - 612, 614, 612, 612, 26, 26, 26, 26, 26, 26, 26, 26, 615, 26, 346, 26, - 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, - 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 26, - 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, 618, 26, 26, 26, 26, 26, - 616, 619, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 620, 621, - 622, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 623, 26, 26, 26, 26, 26, 624, 26, 625, 26, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 627, - 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 629, 628, 630, - 628, 631, 628, 632, 280, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 9, 9, 9, 9, 9, 633, 9, 9, 220, 26, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 26, - 0, 0, 0, 0, 257, 362, 0, 0, 0, 0, 0, 0, 634, 635, 0, 636, - 637, 638, 0, 0, 0, 639, 0, 0, 0, 0, 0, 0, 0, 265, 26, 26, - 14, 14, 14, 14, 14, 14, 14, 14, 246, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 280, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 26, 0, 0, 0, 259, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, - 0, 0, 0, 254, 640, 641, 0, 642, 643, 0, 0, 0, 0, 0, 0, 0, - 268, 644, 254, 254, 0, 0, 0, 645, 646, 647, 648, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 0, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 650, 26, 651, 652, 649, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 2, 2, 2, 347, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 653, 269, 269, 654, 655, 656, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 657, 657, 657, 657, 657, 658, 657, 659, 657, 660, 26, 26, 26, 26, 26, 26, - 26, 26, 661, 661, 661, 662, 26, 26, 663, 663, 663, 663, 663, 663, 663, 664, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 171, 665, 169, 171, - 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, - 666, 666, 666, 666, 666, 666, 666, 666, 667, 666, 668, 26, 26, 26, 26, 26, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 670, 669, 671, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 362, 0, - 0, 0, 0, 0, 0, 0, 376, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 362, 0, 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, 26, 26, 26, 26, - 672, 31, 31, 31, 673, 674, 675, 676, 677, 678, 673, 679, 673, 675, 675, 680, - 31, 681, 31, 682, 683, 681, 31, 682, 26, 26, 26, 26, 26, 26, 51, 26, - 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 280, 26, 0, 257, 362, 0, 362, 0, 362, 0, 0, 0, 275, 26, - 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, 26, 26, 684, 0, 0, 0, - 685, 26, 0, 0, 0, 0, 0, 280, 0, 259, 313, 26, 275, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 686, 0, 376, 0, 376, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 280, 259, 26, - 0, 280, 0, 0, 0, 0, 0, 0, 0, 26, 0, 313, 0, 0, 0, 0, - 0, 26, 0, 0, 0, 275, 313, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, 0, 275, 376, 376, - 257, 26, 0, 0, 0, 376, 0, 265, 275, 26, 0, 313, 0, 26, 257, 26, - 0, 0, 359, 0, 0, 0, 0, 0, 0, 265, 26, 26, 26, 26, 0, 313, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 26, 26, 26, 26, - 276, 276, 276, 276, 276, 276, 276, 687, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 279, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 346, 26, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 687, 26, 26, 26, - 276, 276, 276, 279, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 688, 26, 26, 26, 26, 26, 26, - 689, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 626, 627, 628, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 629, 26, 630, 26, + 26, 26, 631, 26, 632, 26, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, + 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, + 633, 633, 633, 633, 633, 633, 633, 634, 635, 635, 635, 635, 635, 635, 635, 635, + 635, 635, 635, 635, 635, 636, 635, 637, 635, 638, 635, 639, 281, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 9, 9, 9, 9, 9, 640, 9, 9, + 221, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 281, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 276, 26, 0, 0, 0, 0, 258, 363, 0, 0, + 0, 0, 0, 0, 641, 642, 0, 643, 644, 645, 0, 0, 0, 646, 0, 0, + 0, 0, 0, 0, 0, 266, 26, 26, 14, 14, 14, 14, 14, 14, 14, 14, + 247, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 281, 26, 0, 0, 281, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 258, 26, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 647, 648, 0, 649, + 650, 0, 0, 0, 0, 0, 0, 0, 269, 651, 255, 255, 0, 0, 0, 652, + 653, 654, 655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 268, 0, 0, 0, 0, 0, 0, 656, 656, 656, 656, 656, 656, 656, 656, + 656, 656, 656, 656, 656, 656, 656, 656, 656, 657, 26, 658, 659, 656, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 348, 660, 308, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 661, 270, 270, 662, 663, 664, 18, 18, + 18, 18, 18, 18, 18, 665, 26, 26, 26, 666, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 667, 667, 667, 667, 667, 668, 667, 669, + 667, 670, 26, 26, 26, 26, 26, 26, 26, 26, 671, 671, 671, 672, 26, 26, + 673, 673, 673, 673, 673, 673, 673, 674, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 675, 675, 675, 675, 675, 676, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 172, 677, 170, 172, 678, 678, 678, 678, 678, 678, 678, 678, + 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, + 679, 678, 680, 26, 26, 26, 26, 26, 681, 681, 681, 681, 681, 681, 681, 681, + 681, 682, 681, 683, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 0, 377, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 276, + 26, 26, 26, 26, 26, 26, 26, 26, 684, 31, 31, 31, 685, 686, 687, 688, + 689, 690, 685, 691, 685, 687, 687, 692, 31, 693, 31, 694, 695, 693, 31, 694, + 26, 26, 26, 26, 26, 26, 51, 26, 0, 0, 0, 0, 0, 281, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 26, 0, 258, 363, 0, + 363, 0, 363, 0, 0, 0, 276, 26, 0, 0, 0, 0, 0, 276, 26, 26, + 26, 26, 26, 26, 696, 0, 0, 0, 697, 26, 0, 0, 0, 0, 0, 281, + 0, 260, 314, 26, 276, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 698, 0, 377, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 258, 699, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 314, 0, 281, 260, 26, 0, 281, 0, 0, 0, 0, 0, 0, + 0, 26, 0, 314, 0, 0, 0, 0, 0, 26, 0, 0, 0, 276, 314, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 281, 26, 0, 276, 0, 377, 0, 260, 0, 0, 0, 0, 0, 269, + 276, 696, 0, 281, 0, 260, 0, 260, 0, 0, 360, 0, 0, 0, 0, 0, + 0, 266, 26, 26, 26, 26, 0, 314, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 347, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 347, 26, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 700, 26, 26, 26, 277, 277, 277, 280, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 701, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 702, 26, 26, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 939, 940, 941, 942, 946, 948, 0, 962, + 969, 970, 971, 976,1001,1002,1003,1008, 0,1033,1040,1041,1042,1043,1047, 0, + 0,1080,1081,1082,1086,1110, 0, 0,1124,1125,1126,1127,1131,1133, 0,1147, + 1154,1155,1156,1161,1187,1188,1189,1193, 0,1219,1226,1227,1228,1229,1233, 0, + 0,1267,1268,1269,1273,1298, 0,1303, 943,1128, 944,1129, 954,1139, 958,1143, + 959,1144, 960,1145, 961,1146, 964,1149, 0, 0, 973,1158, 974,1159, 975,1160, + 983,1168, 978,1163, 988,1173, 990,1175, 991,1176, 993,1178, 994,1179, 0, 0, + 1004,1190,1005,1191,1006,1192,1014,1199,1007, 0, 0, 0,1016,1201,1020,1206, + 0,1022,1208,1025,1211,1023,1209, 0, 0, 0, 0,1032,1218,1037,1223,1035, + 1221, 0, 0, 0,1044,1230,1045,1231,1049,1235, 0, 0,1058,1244,1064,1250, + 1060,1246,1066,1252,1067,1253,1072,1258,1069,1255,1077,1264,1074,1261, 0, 0, + 1083,1270,1084,1271,1085,1272,1088,1275,1089,1276,1096,1283,1103,1290,1111,1299, + 1115,1118,1307,1120,1309,1121,1310, 0,1053,1239, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,1093,1280, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 949,1134,1010,1195,1050,1236,1090,1277,1341,1368,1340, + 1367,1342,1369,1339,1366, 0,1320,1347,1418,1419,1323,1350, 0, 0, 992,1177, + 1018,1204,1055,1241,1416,1417,1415,1424,1202, 0, 0, 0, 987,1172, 0, 0, + 1031,1217,1321,1348,1322,1349,1338,1365, 950,1135, 951,1136, 979,1164, 980,1165, + 1011,1196,1012,1197,1051,1237,1052,1238,1061,1247,1062,1248,1091,1278,1092,1279, + 1071,1257,1076,1263, 0, 0, 997,1182, 0, 0, 0, 0, 0, 0, 945,1130, + 982,1167,1337,1364,1335,1362,1046,1232,1422,1423,1113,1301, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10,1425, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,1314,1427, 5, + 1434,1438,1443, 0,1450, 0,1455,1461,1514, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1446,1458,1468,1476,1480,1486,1517, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1489,1503,1494,1500,1508, 0, 0, 0, 0,1520,1521, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1526,1528, 0,1525, 0, 0, 0,1522, + 0, 0, 0, 0,1536,1532,1539, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1556, 0, 0, 0, 0, 0, 0,1548,1550, 0,1547, 0, 0, 0,1567, + 0, 0, 0, 0,1558,1554,1561, 0, 0, 0, 0, 0, 0, 0,1568,1569, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1529,1551, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1523,1545,1524,1546, 0, 0,1527,1549, + 0, 0,1570,1571,1530,1552,1531,1553, 0, 0,1533,1555,1535,1557,1537,1559, + 0, 0,1572,1573,1544,1566,1538,1560,1540,1562,1541,1563,1542,1564, 0, 0, + 1543,1565, 0, 0, 0, 0, 0, 0, 0, 0,1606,1607,1609,1608,1610, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1613, 0,1611, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1612, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1620, 0, 0, 0, 0, 0, 0, 0,1623, 0, 0,1624, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1614,1615,1616,1617,1618,1619,1621,1622, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1628,1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1625,1626, 0,1627, 0, 0, 0,1634, 0, 0,1635, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1630,1631,1632, 0, 0,1633, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1639, 0, 0,1638,1640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1636,1637, 0, 0, 0, 0, 0, 0,1641, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1642,1644,1643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1645, 0, 0, 0, 0, 0, 0, 0,1646, 0, 0, 0, 0, 0, 0,1648, + 1649, 0,1647,1650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1651,1653,1652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1654, 0,1655,1657,1656, 0, 0, 0, 0,1659, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1660, 0, 0, 0, 0,1661, 0, 0, 0, 0,1662, + 0, 0, 0, 0,1663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1658, 0, 0, 0, 0, 0, 0, 0, 0, 0,1664, 0,1665,1673, 0, + 1674, 0, 0, 0, 0, 0, 0, 0, 0,1666, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1668, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1669, 0, 0, 0, 0,1670, 0, 0, 0, 0,1671, + 0, 0, 0, 0,1672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1675, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1676, 0, + 1677, 0,1678, 0,1679, 0,1680, 0, 0, 0,1681, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1682, 0,1683, 0, 0,1684,1685, 0,1686, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 953,1138, 955,1140, 956,1141, 957,1142, + 1324,1351, 963,1148, 965,1150, 968,1153, 966,1151, 967,1152,1378,1380,1379,1381, + 984,1169, 985,1170,1420,1421, 986,1171, 989,1174, 995,1180, 998,1183, 996,1181, + 999,1184,1000,1185,1015,1200,1329,1356,1017,1203,1019,1205,1021,1207,1024,1210, + 1687,1688,1027,1213,1026,1212,1028,1214,1029,1215,1030,1216,1034,1220,1036,1222, + 1039,1225,1038,1224,1334,1361,1336,1363,1382,1384,1383,1385,1056,1242,1057,1243, + 1059,1245,1063,1249,1689,1690,1065,1251,1068,1254,1070,1256,1386,1387,1388,1389, + 1691,1692,1073,1259,1075,1262,1079,1266,1078,1265,1095,1282,1098,1285,1097,1284, + 1390,1391,1392,1393,1099,1286,1100,1287,1101,1288,1102,1289,1105,1292,1104,1291, + 1106,1294,1107,1295,1108,1296,1114,1302,1119,1308,1122,1311,1123,1312,1186,1260, + 1293,1305, 0,1394, 0, 0, 0, 0, 952,1137, 947,1132,1317,1344,1316,1343, + 1319,1346,1318,1345,1693,1695,1371,1375,1370,1374,1373,1377,1372,1376,1694,1696, + 981,1166, 977,1162, 972,1157,1326,1353,1325,1352,1328,1355,1327,1354,1697,1698, + 1009,1194,1013,1198,1054,1240,1048,1234,1331,1358,1330,1357,1333,1360,1332,1359, + 1699,1700,1396,1401,1395,1400,1398,1403,1397,1402,1399,1404,1094,1281,1087,1274, + 1406,1411,1405,1410,1408,1413,1407,1412,1409,1414,1109,1297,1117,1306,1116,1304, + 1112,1300, 0, 0, 0, 0, 0, 0,1471,1472,1701,1705,1702,1706,1703,1707, + 1430,1431,1715,1719,1716,1720,1717,1721,1477,1478,1729,1731,1730,1732, 0, 0, + 1435,1436,1733,1735,1734,1736, 0, 0,1481,1482,1737,1741,1738,1742,1739,1743, + 1439,1440,1751,1755,1752,1756,1753,1757,1490,1491,1765,1768,1766,1769,1767,1770, + 1447,1448,1771,1774,1772,1775,1773,1776,1495,1496,1777,1779,1778,1780, 0, 0, + 1451,1452,1781,1783,1782,1784, 0, 0,1504,1505,1785,1788,1786,1789,1787,1790, + 0,1459, 0,1791, 0,1792, 0,1793,1509,1510,1794,1798,1795,1799,1796,1800, + 1462,1463,1808,1812,1809,1813,1810,1814,1467, 21,1475, 22,1479, 23,1485, 24, + 1493, 27,1499, 28,1507, 29, 0, 0,1704,1708,1709,1710,1711,1712,1713,1714, + 1718,1722,1723,1724,1725,1726,1727,1728,1740,1744,1745,1746,1747,1748,1749,1750, + 1754,1758,1759,1760,1761,1762,1763,1764,1797,1801,1802,1803,1804,1805,1806,1807, + 1811,1815,1816,1817,1818,1819,1820,1821,1470,1469,1822,1474,1465, 0,1473,1825, + 1429,1428,1426, 12,1432, 0, 26, 0, 0,1315,1823,1484,1466, 0,1483,1829, + 1433, 13,1437, 14,1441,1826,1827,1828,1488,1487,1513, 19, 0, 0,1492,1515, + 1445,1444,1442, 15, 0,1831,1832,1833,1502,1501,1516, 25,1497,1498,1506,1518, + 1457,1456,1454, 17,1453,1313, 11, 3, 0, 0,1824,1512,1519, 0,1511,1830, + 1449, 16,1460, 18,1464, 4, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, + 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1834,1835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1836, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1837,1839,1838, 0, 0, 0, 0,1840, 0, 0, 0, + 0,1841, 0, 0,1842, 0, 0, 0, 0, 0, 0, 0,1843, 0,1844, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1845, 0, 0,1846, 0, 0,1847, + 0,1848, 0, 0, 0, 0, 0, 0, 937, 0,1850, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1849, 936, 938,1851,1852, 0, 0,1853,1854, 0, 0, + 1855,1856, 0, 0, 0, 0, 0, 0,1857,1858, 0, 0,1861,1862, 0, 0, + 1863,1864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1867,1868,1869,1870,1859,1860,1865,1866, 0, 0, 0, 0, + 0, 0,1871,1872,1873,1874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1877, 0,1878, 0,1879, 0,1880, 0,1881, 0,1882, 0, + 1883, 0,1884, 0,1885, 0,1886, 0,1887, 0,1888, 0, 0,1889, 0,1890, + 0,1891, 0, 0, 0, 0, 0, 0,1892,1893, 0,1894,1895, 0,1896,1897, + 0,1898,1899, 0,1900,1901, 0, 0, 0, 0, 0, 0,1876, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1902, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1904, 0,1905, 0,1906, 0,1907, 0,1908, 0,1909, 0, + 1910, 0,1911, 0,1912, 0,1913, 0,1914, 0,1915, 0, 0,1916, 0,1917, + 0,1918, 0, 0, 0, 0, 0, 0,1919,1920, 0,1921,1922, 0,1923,1924, + 0,1925,1926, 0,1927,1928, 0, 0, 0, 0, 0, 0,1903, 0, 0,1929, + 1930,1931,1932, 0, 0, 0,1933, 0, 710, 385, 724, 715, 455, 103, 186, 825, + 825, 242, 751, 205, 241, 336, 524, 601, 663, 676, 688, 738, 411, 434, 474, 500, + 649, 746, 799, 108, 180, 416, 482, 662, 810, 275, 462, 658, 692, 344, 618, 679, + 293, 388, 440, 492, 740, 116, 146, 168, 368, 414, 481, 527, 606, 660, 665, 722, + 781, 803, 809, 538, 553, 588, 642, 758, 811, 701, 233, 299, 573, 612, 487, 540, + 714, 779, 232, 267, 412, 445, 457, 585, 594, 766, 167, 613, 149, 148, 560, 589, + 648, 768, 708, 345, 411, 704, 105, 259, 313, 496, 518, 174, 542, 120, 307, 101, + 430, 372, 584, 183, 228, 529, 650, 697, 424, 732, 428, 349, 632, 355, 517, 110, + 135, 147, 403, 580, 624, 700, 750, 170, 193, 245, 297, 374, 463, 543, 763, 801, + 812, 815, 162, 384, 420, 730, 287, 330, 337, 366, 459, 476, 509, 558, 591, 610, + 726, 652, 734, 759, 154, 163, 198, 473, 683, 697, 292, 311, 353, 423, 572, 494, + 113, 217, 259, 280, 314, 499, 506, 603, 608, 752, 778, 782, 788, 117, 557, 748, + 774, 320, 109, 126, 260, 265, 373, 411, 479, 523, 655, 737, 823, 380, 765, 161, + 395, 398, 438, 451, 502, 516, 537, 583, 791, 136, 340, 769, 122, 273, 446, 727, + 305, 322, 400, 496, 771, 155, 190, 269, 377, 391, 406, 432, 501, 519, 599, 684, + 687, 749, 776, 175, 452, 191, 480, 510, 659, 772, 805, 813, 397, 444, 619, 566, + 568, 575, 491, 471, 707, 111, 636, 156, 153, 288, 346, 578, 256, 435, 383, 729, + 680, 767, 694, 295, 128, 210, 0, 0, 227, 0, 379, 0, 0, 150, 493, 525, + 544, 551, 552, 556, 783, 576, 604, 0, 661, 0, 703, 0, 0, 735, 743, 0, + 0, 0, 793, 794, 795, 808, 741, 773, 118, 127, 130, 166, 169, 177, 207, 213, + 215, 226, 229, 268, 270, 317, 327, 329, 335, 369, 375, 381, 404, 441, 448, 458, + 477, 484, 503, 539, 545, 547, 546, 548, 549, 550, 554, 555, 561, 564, 569, 591, + 593, 595, 598, 607, 620, 625, 625, 651, 690, 695, 705, 706, 716, 717, 733, 735, + 777, 786, 790, 315, 869, 623, 0, 0, 102, 145, 134, 115, 129, 138, 165, 171, + 207, 202, 206, 212, 227, 231, 240, 243, 250, 254, 294, 296, 303, 308, 319, 325, + 321, 329, 326, 335, 341, 357, 360, 362, 370, 379, 388, 389, 393, 421, 424, 438, + 456, 454, 458, 465, 477, 535, 485, 490, 493, 507, 512, 514, 521, 522, 525, 526, + 528, 533, 532, 541, 565, 569, 574, 586, 591, 597, 607, 637, 647, 674, 691, 693, + 695, 698, 703, 699, 705, 704, 702, 706, 709, 717, 728, 736, 747, 754, 770, 777, + 783, 784, 786, 787, 790, 802, 825, 848, 847, 857, 55, 65, 66, 883, 892, 916, + 822, 824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1586, 0,1605, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1602,1603,1934,1935,1574,1575,1576,1577,1579,1580,1581,1583,1584, 0, + 1585,1587,1588,1589,1591, 0,1592, 0,1593,1594, 0,1595,1596, 0,1598,1599, + 1600,1601,1604,1582,1578,1590,1597, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1936, 0,1937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1939,1940, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1941,1942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1944,1943, 0,1945, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1946,1947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1949,1950,1951,1952,1953,1954,1955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, - 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0, - 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, - 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, - 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, - 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, - 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199, - 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, - 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231, - 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258, - 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275, - 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0, - 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093, - 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 949,1134,1010, - 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347, - 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424, - 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, - 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238, - 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, - 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232, - 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461, - 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1446,1458,1468,1476,1480,1486, - 1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1489,1503,1494,1500,1508, 0, - 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0, - 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, - 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, - 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560, - 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0, - 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0, - 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, - 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0, - 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0, - 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0, - 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, - 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, - 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, - 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, - 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0, - 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, - 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, - 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356, - 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214, - 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363, - 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251, - 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266, - 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287, - 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302, - 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, - 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375, - 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353, - 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234, - 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403, - 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412, - 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0, - 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721, - 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0, - 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757, - 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776, - 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0, - 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793, - 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814, - 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0, - 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728, - 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764, - 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821, - 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, - 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828, - 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833, - 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, - 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, - 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838, - 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, - 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, - 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938, - 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0, - 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870, - 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0, - 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0, - 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0, - 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, - 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0, - 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0, - 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0, - 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, - 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, - 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, - 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, - 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, - 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, - 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, - 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, - 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, - 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, - 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, - 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, - 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, - 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, - 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, - 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, - 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, - 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, - 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, - 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, - 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, - 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, - 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, - 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, - 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, - 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, - 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, - 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, - 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, - 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, - 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, - 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575, - 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0, - 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1948, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1949,1950, - 1951,1952,1953,1954,1955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1956,1957,1958,1960,1959, - 1961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, - 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, - 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, - 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, - 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, - 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, - 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, - 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, - 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, - 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, - 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, - 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, - 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, - 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, - 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, - 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, - 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, - 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, - 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, - 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, - 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, - 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, - 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, - 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, - 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, - 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, - 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, - 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, - 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, - 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, - 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, - 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, - 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, - 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0, + 0, 0, 0,1956,1957,1958,1960,1959,1961, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 106, 104, 107, 826, 114, 118, 119, 121, + 123, 124, 127, 125, 34, 830, 130, 131, 132, 137, 827, 35, 133, 139, 829, 142, + 143, 112, 144, 145, 924, 151, 152, 37, 157, 158, 159, 160, 38, 165, 166, 169, + 171, 172, 173, 174, 176, 177, 178, 179, 181, 182, 182, 182, 833, 468, 184, 185, + 834, 187, 188, 189, 196, 192, 194, 195, 197, 199, 200, 201, 203, 204, 204, 206, + 208, 209, 211, 218, 213, 219, 214, 216, 153, 234, 221, 222, 223, 220, 225, 224, + 230, 835, 235, 236, 237, 238, 239, 244, 836, 837, 247, 248, 249, 246, 251, 39, + 40, 253, 255, 255, 838, 257, 258, 259, 261, 839, 262, 263, 301, 264, 41, 266, + 270, 272, 271, 841, 274, 842, 277, 276, 278, 281, 282, 42, 283, 284, 285, 286, + 43, 843, 44, 289, 290, 291, 293, 934, 298, 845, 845, 621, 300, 300, 45, 852, + 894, 302, 304, 46, 306, 309, 310, 312, 316, 48, 47, 317, 846, 318, 323, 324, + 325, 324, 328, 329, 333, 331, 332, 334, 335, 336, 338, 339, 342, 343, 347, 351, + 849, 350, 348, 352, 354, 359, 850, 361, 358, 356, 49, 363, 365, 367, 364, 50, + 369, 371, 851, 376, 386, 378, 53, 381, 52, 51, 140, 141, 387, 382, 614, 78, + 388, 389, 390, 394, 392, 856, 54, 399, 396, 402, 404, 858, 405, 401, 407, 55, + 408, 409, 410, 413, 859, 415, 56, 417, 860, 418, 57, 419, 422, 424, 425, 861, + 840, 862, 426, 863, 429, 431, 427, 433, 437, 441, 438, 439, 442, 443, 864, 436, + 449, 450, 58, 454, 453, 865, 447, 460, 866, 867, 461, 466, 465, 464, 59, 467, + 470, 469, 472, 828, 475, 868, 478, 870, 483, 485, 486, 871, 488, 489, 872, 873, + 495, 497, 60, 498, 61, 61, 504, 505, 507, 508, 511, 62, 513, 874, 515, 875, + 518, 844, 520, 876, 877, 878, 63, 64, 528, 880, 879, 881, 882, 530, 531, 531, + 533, 66, 534, 67, 68, 884, 536, 538, 541, 69, 885, 549, 886, 887, 556, 559, + 70, 561, 562, 563, 888, 889, 889, 567, 71, 890, 570, 571, 72, 891, 577, 73, + 581, 579, 582, 893, 587, 74, 590, 592, 596, 75, 895, 896, 76, 897, 600, 898, + 602, 605, 607, 899, 900, 609, 901, 611, 853, 77, 615, 616, 79, 617, 252, 902, + 903, 854, 855, 621, 622, 731, 80, 627, 626, 628, 164, 629, 630, 631, 633, 904, + 632, 634, 639, 640, 635, 641, 646, 651, 638, 643, 644, 645, 905, 907, 906, 81, + 653, 654, 656, 911, 657, 908, 82, 83, 909, 910, 84, 664, 665, 666, 667, 669, + 668, 671, 670, 674, 672, 673, 675, 85, 677, 678, 86, 681, 682, 912, 685, 686, + 87, 689, 36, 913, 914, 88, 89, 696, 702, 709, 711, 915, 712, 713, 718, 719, + 917, 831, 721, 720, 723, 832, 725, 728, 918, 919, 739, 742, 744, 920, 745, 753, + 756, 757, 755, 760, 761, 921, 762, 90, 764, 922, 91, 775, 279, 780, 923, 925, + 92, 93, 785, 926, 94, 927, 787, 787, 789, 928, 792, 95, 796, 797, 798, 800, + 96, 929, 802, 804, 806, 97, 98, 807, 930, 99, 931, 932, 933, 814, 100, 816, + 817, 818, 819, 820, 821, 935, 0, 0, }; static const int16_t _hb_ucd_i16[196] = @@ -4525,12 +4582,12 @@ _hb_ucd_i16[196] = static inline uint_fast8_t _hb_ucd_gc (unsigned u) { - return u<1114110u?_hb_ucd_u8[6664+(((_hb_ucd_u8[1296+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; + return u<1114110u?_hb_ucd_u8[6800+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; } static inline uint_fast8_t _hb_ucd_ccc (unsigned u) { - return u<125259u?_hb_ucd_u8[8612+(((_hb_ucd_u8[8068+(((_hb_ucd_u8[7624+(((_hb_ucd_u8[7288+(((_hb_ucd_u8[7042+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; + return u<125259u?_hb_ucd_u8[8792+(((_hb_ucd_u8[8236+(((_hb_ucd_u8[7776+(((_hb_ucd_u8[7424+(((_hb_ucd_u8[7178+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; } static inline unsigned _hb_ucd_b4 (const uint8_t* a, unsigned i) @@ -4540,24 +4597,24 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i) static inline int_fast16_t _hb_ucd_bmg (unsigned u) { - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9356+(((_hb_ucd_u8[9236+(((_hb_ucd_b4(9108+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9540+(((_hb_ucd_u8[9420+(((_hb_ucd_b4(9292+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; } static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918000u?_hb_ucd_u8[10862+(((_hb_ucd_u16[2000+(((_hb_ucd_u8[10142+(((_hb_ucd_u8[9692+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; + return u<918000u?_hb_ucd_u8[11062+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10326+(((_hb_ucd_u8[9876+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[5888+(((_hb_ucd_u8[16764+(((_hb_ucd_u8[16382+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[6008+(((_hb_ucd_u8[17068+(((_hb_ucd_u8[16686+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; } #else static const uint8_t -_hb_ucd_u8[13246] = +_hb_ucd_u8[13370] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 7, 11, 12, 12, 12, 13, @@ -4565,7 +4622,7 @@ _hb_ucd_u8[13246] = 7, 24, 21, 21, 21, 25, 26, 27, 21, 28, 29, 30, 31, 32, 33, 34, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 35, 21, 36, - 7, 7, 37, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 7, 7, 7, 7, 35, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4587,7 +4644,7 @@ _hb_ucd_u8[13246] = 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 38, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 37, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 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, 12, 12, 12, 12, 12, 12, @@ -4610,28 +4667,27 @@ _hb_ucd_u8[13246] = 34, 34,109,110,111,112,113,114,115,116,117,118, 34, 34, 34,119, 120,121,122,123,124,125,126,127, 34,128,129,111,130,131,132,133, 134,135,136,137,138,139,140,111,141,142,111,143,144,145,146,111, - 147,148,149,150,151,152,111,111,153,154,155,156,111,157,111,158, - 34, 34, 34, 34, 34, 34, 34, 34,159, 34, 34,111,111,111,111,111, - 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,160, - 34, 34, 34, 34, 34, 34, 34, 34,161,111,111,111,111,111,111,111, + 147,148,149,150,151,152,153,111,154,155,156,157,111,158,159,160, + 34, 34, 34, 34, 34, 34, 34, 34,161, 34, 34,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,162, + 34, 34, 34, 34, 34, 34, 34, 34,163,111,111,111,111,111,111,111, 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, 111,111,111,111,111,111,111,111, 34, 34, 34, 34, 34,111,111,111, - 34, 34, 34, 34,162,163,164, 34,111,111,111,111,165,166,167,168, + 34, 34, 34, 34,164,165,166, 34,111,111,111,111,167,168,169,170, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111, 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,119, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111, - 111,111,111,111,111,111,111,111, 34,169,111,111,111,111,111,111, - 111,111,111,111,111,111,111,111,111,111,111,111,111,111,170, 67, - 67, 67,171,172,173,130, 65,111,174,175,176,177,178,179,180,181, - 67, 67, 67, 67,182,183,111,111,111,111,111,111,111,111,184,111, - 185,111,186,111,111,187,111,111,111,111,111,111,111,111,111, 34, - 34,188,189,111,111,111,111,111,130,190,191,111, 34,192,111,111, - 67, 67,193, 67, 67,111, 67,194, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67,195,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111, 34,171,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,172, 67, + 67, 67,173,174,175,130, 65,111,176,177,178,179,180,181,182,183, + 67, 67, 67, 67,184,185,111,111,111,111,111,111,111,111,186,111, + 187,188,189,111,111,190,111,111,111,191,111,111,111,111,111, 34, + 34,192,193,111,111,111,111,111,130,194,195,111, 34,196,111,111, + 67, 67,197, 67, 67,111, 67,198, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67,199,111,111,111,111,111,111,111,111, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,111, - 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111, - 196,111,185,185,111,111,111,111,111,111,111,111,111,111,111,111, + 200,111,188,188,111,111,111,111,111,111,111,111,111,111,111,111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, @@ -4687,7 +4743,7 @@ _hb_ucd_u8[13246] = 36, 36, 36, 36, 36, 36, 65, 43, 77, 78, 78, 43, 43, 43, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 7, 7, 7, 85, 27, 27, 27, 84, 64, 78, 66, 36, 36, 36, 36, 36, 78, 78, 78, 77, 78, 78, 43, 43, - 43, 43, 77, 78, 78, 78, 81, 36, 86, 36, 36, 36, 36, 36, 36, 36, + 43, 43, 77, 78, 78, 78, 81, 36, 86, 82, 78, 78, 78, 78, 78, 78, 43, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 65, 78, 79, 43, 43, 78, 78, 78, 79, 71, 61, 61, 36, 82, 27, 27, 27, 87, 27, 27, 27, 27, 84, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 77, @@ -4827,7 +4883,7 @@ _hb_ucd_u8[13246] = 36, 64, 2, 36, 36, 36, 36, 36, 36, 82, 78, 43, 43, 43, 43, 77, 81, 36, 58, 2, 56, 43, 57, 79, 7, 7, 7, 7, 7, 58, 58, 2, 90, 27, 27, 27, 27, 27, 27, 27, 36, 36, 36, 36, 36, 36, 78, 79, - 43, 78, 77, 43, 2, 2, 2, 43, 36, 36, 36, 36, 36, 36, 36, 64, + 43, 78, 77, 43, 2, 2, 2, 65, 36, 36, 36, 36, 36, 36, 36, 64, 77, 78, 78, 78, 78, 78, 78, 78, 36, 36, 36, 82, 78, 78, 81, 36, 36, 78, 78, 43, 43, 43, 43, 43, 36, 36, 82, 78, 43, 43, 43, 43, 78, 43, 77, 65, 36, 58, 2, 2, 7, 7, 7, 7, 7, 2, 2, 65, @@ -4848,8 +4904,10 @@ _hb_ucd_u8[13246] = 43, 43, 43, 43, 77, 43, 43, 43, 77, 43, 79, 43, 43, 43, 43, 43, 43, 43, 43, 64, 43, 43, 43, 43, 36, 36, 36, 36, 36, 78, 78, 78, 43, 77, 79, 79, 36, 36, 36, 36, 36, 64, 77, 97, 2, 2, 2, 2, - 27, 27, 84, 61, 61, 61, 53, 20,150, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 21, 43, 43, 57, 2, 2, 2, 2, 2, + 43, 82, 36, 36, 36, 36, 36, 36, 36, 36, 78, 43, 43, 43, 43, 78, + 77, 57, 2, 2, 2, 2, 2, 2, 27, 27, 84, 61, 61, 61, 53, 20, + 150, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 21, + 65, 36, 36, 64, 43, 43, 43, 43, 43, 43, 57, 2, 2, 2, 2, 2, 43, 43, 43, 57, 2, 2, 61, 61, 40, 40, 89, 61, 61, 61, 61, 61, 7, 7, 7, 7, 7,167, 27, 27, 27, 87, 36, 36, 36, 36, 36, 36, 27, 27, 27, 30, 2, 2, 2, 2, 82, 78, 78, 78, 78, 78, 78, 78, @@ -4872,462 +4930,469 @@ _hb_ucd_u8[13246] = 16, 16, 16, 16, 16, 39, 16, 16, 43, 43, 43, 68, 40, 40, 40, 40, 7, 7, 7, 7, 7, 7, 7, 71, 36, 36, 36, 36, 36, 36, 36, 43, 36, 36, 36, 36, 36, 36, 43, 43, 7, 7, 7, 7, 7, 7, 7,170, - 16, 16, 43, 43, 43, 68, 40, 40, 27, 27, 27, 27, 27, 27,145, 27, - 171, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,145, - 27, 27, 27, 27, 27, 27, 84, 61, 61, 61, 61, 61, 61, 25, 41, 41, - 0, 0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13, - 25, 25, 25, 21, 21, 9, 9, 9, 9, 22, 21, 18, 24, 16, 24, 5, - 5, 5, 5, 22, 25, 18, 25, 0, 23, 23, 26, 21, 24, 26, 7, 20, - 25, 1, 26, 24, 26, 25, 15, 15, 24, 15, 7, 19, 15, 21, 9, 25, - 9, 5, 5, 25, 5, 9, 5, 7, 7, 7, 9, 8, 8, 5, 7, 5, - 6, 6, 24, 24, 6, 24, 12, 12, 6, 5, 9, 21, 25, 9, 26, 12, - 11, 11, 9, 6, 5, 21, 17, 17, 17, 26, 26, 23, 23, 12, 17, 12, - 21, 12, 12, 21, 7, 21, 1, 1, 21, 23, 26, 26, 1, 21, 6, 7, - 7, 12, 12, 7, 21, 7, 12, 1, 12, 6, 6, 12, 12, 26, 7, 26, - 26, 7, 21, 1, 24, 7, 7, 6, 1, 12, 12, 10, 10, 10, 10, 12, - 21, 6, 10, 7, 7, 10, 23, 7, 15, 26, 13, 21, 13, 7, 15, 7, - 12, 23, 21, 26, 21, 15, 17, 7, 29, 7, 7, 22, 18, 18, 14, 14, - 14, 7, 10, 21, 17, 21, 11, 12, 5, 6, 8, 8, 8, 24, 5, 24, - 9, 24, 29, 29, 29, 1, 20, 19, 22, 20, 27, 28, 1, 29, 21, 20, - 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, 15, 6, 18, 6, - 12, 11, 9, 26, 26, 9, 26, 5, 5, 26, 14, 9, 5, 14, 14, 15, - 25, 26, 26, 22, 18, 26, 18, 25, 18, 22, 5, 12, 22, 21, 21, 22, - 18, 17, 26, 6, 7, 14, 17, 22, 26, 14, 17, 6, 14, 6, 12, 24, - 24, 6, 26, 15, 6, 21, 11, 21, 24, 9, 6, 9, 23, 26, 6, 10, - 4, 4, 3, 3, 7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 7, 1, - 25, 24, 26, 1, 2, 2, 12, 15, 21, 14, 7, 15, 12, 17, 13, 15, - 26, 10, 10, 1, 13, 23, 23, 15, 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 0, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 0, 15, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 36, 36, 36, 36, 75, 43, 43, 16, 16, 43, 43, 43, 68, 40, 40, + 27, 27, 27, 27, 27, 27,145, 27,171, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27,145, 27, 27, 27, 27, 27, 27, 84, 61, + 61, 61, 61, 61, 61, 25, 41, 41, 0, 0, 29, 21, 21, 21, 23, 21, + 22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21, 9, 9, 9, + 9, 22, 21, 18, 24, 16, 24, 5, 5, 5, 5, 22, 25, 18, 25, 0, + 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, 26, 25, 15, 15, + 24, 15, 7, 19, 15, 21, 9, 25, 9, 5, 5, 25, 5, 9, 5, 7, + 7, 7, 9, 8, 8, 5, 7, 5, 6, 6, 24, 24, 6, 24, 12, 12, + 6, 5, 9, 21, 25, 9, 26, 12, 11, 11, 9, 6, 5, 21, 17, 17, + 17, 26, 26, 23, 23, 12, 17, 12, 21, 12, 12, 21, 7, 21, 1, 1, + 21, 23, 26, 26, 1, 21, 6, 7, 7, 12, 12, 7, 21, 7, 12, 1, + 12, 6, 6, 12, 12, 26, 7, 26, 26, 7, 21, 1, 24, 7, 7, 6, + 1, 12, 12, 10, 10, 10, 10, 12, 21, 6, 10, 7, 7, 10, 23, 7, + 15, 26, 13, 21, 13, 7, 15, 7, 12, 23, 21, 26, 21, 15, 17, 7, + 29, 7, 7, 22, 18, 18, 14, 14, 14, 7, 10, 21, 17, 21, 11, 12, + 5, 6, 8, 8, 8, 24, 5, 24, 9, 24, 29, 29, 29, 1, 20, 19, + 22, 20, 27, 28, 1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, + 18, 21, 21, 29, 15, 6, 18, 6, 12, 11, 9, 26, 26, 9, 26, 5, + 5, 26, 14, 9, 5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25, + 18, 22, 5, 12, 22, 21, 21, 22, 18, 17, 26, 6, 7, 14, 17, 22, + 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, 26, 15, 6, 21, 11, 21, + 24, 9, 6, 9, 23, 26, 6, 10, 4, 4, 3, 3, 7, 25, 17, 16, + 16, 22, 16, 16, 25, 17, 7, 1, 25, 24, 26, 1, 2, 2, 12, 15, + 21, 14, 7, 15, 12, 17, 13, 15, 26, 10, 10, 1, 13, 23, 23, 15, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, 13, 0, + 14, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 20, 0, 21, 22, 23, 0, 0, 0, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 21, + 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 35, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 37, 38, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 41, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, - 3, 0, 0, 0, 4, 5, 6, 7, 0, 8, 9, 10, 0, 11, 12, 13, - 14, 15, 16, 17, 16, 18, 16, 19, 16, 19, 16, 19, 0, 19, 16, 20, - 16, 19, 21, 19, 0, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, - 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 37, 0, 0, 0, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 0, 0, 47, 0, 0, 0, 48, 0, 0, - 0, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0, 52, 53, 0, - 54, 0, 0, 0, 0, 0, 0, 55, 56, 57, 0, 0, 0, 0, 58, 0, - 0, 59, 60, 61, 62, 63, 0, 0, 64, 65, 0, 0, 0, 66, 0, 0, - 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 0, 72, 0, - 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, - 75, 0, 0, 76, 77, 0, 0, 78, 79, 0, 80, 62, 0, 81, 82, 0, - 0, 83, 84, 85, 0, 0, 0, 86, 0, 87, 0, 0, 51, 88, 51, 0, - 89, 0, 90, 0, 0, 0, 79, 0, 0, 0, 91, 92, 0, 93, 94, 95, - 96, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 97, 98, 0, 0, 0, - 0, 99,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,101, 0, 0, - 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103,104, 0, 0,105, - 0, 0, 0, 0, 0, 0,106, 0, 0, 0,100, 0, 0, 0, 0, 0, - 107,108, 0, 0, 0, 0, 0, 0, 0,109, 0,110, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 0, 0, 0, 0, 9, - 10, 11, 12, 0, 0, 0, 0, 13, 0, 0, 14, 15, 0, 16, 0, 17, - 18, 0, 0, 19, 0, 20, 21, 0, 0, 0, 0, 0, 22, 23, 0, 24, - 25, 0, 0, 26, 0, 0, 0, 27, 0, 0, 28, 29, 30, 31, 0, 0, - 0, 32, 33, 34, 0, 0, 33, 0, 0, 35, 33, 0, 0, 0, 33, 36, - 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 39, 40, 0, - 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 43, 0, 44, 0, 0, - 0, 45, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 48, 49, 0, - 0, 0, 0, 50, 0, 0, 0, 51, 0, 52, 0, 53, 0, 0, 0, 0, - 54, 0, 0, 0, 0, 55, 0, 56, 0, 0, 0, 0, 57, 58, 0, 0, - 0, 59, 60, 0, 0, 0, 0, 0, 0, 61, 52, 0, 62, 63, 0, 0, - 64, 0, 0, 0, 65, 66, 0, 0, 0, 67, 0, 68, 69, 70, 71, 72, - 1, 73, 0, 74, 75, 76, 0, 0, 77, 78, 0, 0, 0, 79, 0, 0, - 1, 1, 0, 0, 80, 0, 0, 81, 0, 0, 0, 0, 77, 82, 0, 83, - 0, 0, 0, 0, 0, 78, 84, 0, 85, 0, 52, 0, 1, 78, 0, 0, - 86, 0, 0, 87, 0, 0, 0, 0, 0, 88, 57, 0, 0, 0, 0, 0, - 0, 89, 90, 0, 0, 84, 0, 0, 33, 0, 0, 91, 0, 0, 0, 0, - 92, 0, 0, 0, 0, 49, 0, 0, 93, 0, 0, 0, 0, 94, 95, 0, - 0, 96, 0, 0, 97, 0, 0, 0, 98, 0, 0, 0, 99, 0,100, 93, - 0, 0,101, 0, 0, 0, 84, 0, 0,102, 0, 0, 0,103,104, 0, - 0,105,106, 0, 0, 0, 0, 0, 0,107, 0, 0,108, 0, 0, 0, - 0,109, 33, 0,110,111,112, 35, 0, 0,113, 0, 0, 0,114, 0, - 0, 0, 0, 0, 0,115, 0, 0,116, 0, 0, 0, 0,117, 88, 0, - 0, 0, 0, 0, 57, 0, 0, 0, 0, 52,118, 0, 0, 0, 0,119, - 0, 0,120, 0, 0, 0, 0,118, 0, 0, 0, 0, 0,121, 0, 0, - 0,122, 0, 0, 0,123, 0,124, 0, 0, 0, 0,125,126,127, 0, - 128, 0,129, 0, 0, 0,130,131,132, 0, 0, 0, 35, 0, 0, 0, - 133, 0, 0,134, 0, 0,135, 0, 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, - 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 19, 1, 0, 0, 20, 21, - 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, 1, 1, - 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, 37, 0, 0, 0, 0, 38, - 1, 39, 14, 39, 40, 41, 42, 0, 0, 0, 43, 36, 44, 45, 21, 45, - 46, 0, 0, 0, 19, 1, 21, 0, 0, 47, 0, 38, 48, 1, 1, 49, - 49, 50, 0, 0, 51, 0, 0, 0, 52, 1, 0, 0, 38, 14, 4, 1, - 1, 1, 53, 21, 43, 52, 54, 21, 35, 1, 0, 0, 0, 55, 0, 0, - 0, 56, 57, 58, 0, 0, 0, 0, 0, 59, 0, 60, 0, 0, 0, 0, - 61, 62, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, - 66, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 69, 70, 0, 71, 72, - 73, 74, 75, 76, 0, 0, 0, 77, 0, 0, 0, 78, 79, 0, 0, 0, - 0, 47, 0, 0, 0, 49, 0, 80, 0, 0, 0, 62, 0, 0, 63, 0, - 0, 81, 0, 0, 82, 0, 0, 0, 83, 0, 0, 19, 84, 0, 62, 0, - 0, 0, 0, 49, 1, 85, 1, 52, 15, 86, 36, 10, 21, 87, 0, 55, - 0, 0, 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 88, 0, 0, 89, - 0, 0, 88, 0, 0, 0, 0, 78, 0, 0, 87, 9, 12, 4, 90, 8, - 91, 47, 0, 58, 50, 0, 21, 1, 21, 92, 93, 1, 1, 1, 1, 94, - 95, 96, 97, 1, 98, 58, 81, 99,100, 4, 58, 0, 0, 0, 0, 0, - 0, 19, 50, 0, 0, 0, 0, 0, 0, 61, 0, 0,101,102, 0, 0, - 103, 0, 0, 1, 1, 50, 0, 0, 0, 38, 0, 63, 0, 0, 0, 0, - 0, 62, 0, 0,104, 68, 61, 0, 0, 0, 78, 0, 0, 0,105,106, - 58, 38, 81, 0, 0, 0, 0, 0, 0,107, 1, 14, 4, 12, 84, 0, - 0, 0, 0, 38, 87, 0, 0, 0, 0,108, 0, 0,109, 61, 0,110, - 0, 0, 0, 1, 0, 0, 0, 0, 19, 58, 0,111, 14, 52,112, 41, - 0, 0, 62, 0, 0, 61, 0, 0,113, 0, 87, 0, 0, 0, 61, 62, - 0, 0, 62, 0, 89, 0, 0,113, 0, 0, 0, 0,114, 0, 0, 0, - 78, 55, 0, 38, 1, 58, 1, 58, 0, 0, 63, 89, 0, 0,115, 0, - 0, 0, 55, 0, 0, 0, 0,115, 0, 0, 0, 0, 61, 0, 0, 0, - 0, 79, 0, 61, 0, 0, 0, 0, 56, 0, 89, 80, 0, 0, 8, 91, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 0, 0, + 40, 41, 42, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 4, 5, 6, 7, + 0, 8, 9, 10, 0, 11, 12, 13, 14, 15, 16, 17, 16, 18, 16, 19, + 16, 19, 16, 19, 0, 19, 16, 20, 16, 19, 21, 19, 0, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 0, 0, 35, 0, 0, + 36, 0, 37, 0, 0, 0, 38, 39, 40, 41, 42, 43, 44, 45, 46, 0, + 0, 47, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, + 0, 50, 0, 51, 0, 52, 53, 0, 54, 0, 0, 0, 0, 0, 0, 55, + 56, 57, 0, 0, 0, 0, 58, 0, 0, 59, 60, 61, 62, 63, 0, 0, + 64, 65, 0, 0, 0, 66, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, + 0, 70, 0, 71, 0, 0, 72, 0, 0, 73, 0, 0, 0, 0, 0, 0, + 0, 0, 74, 0, 0, 0, 0, 0, 75, 76, 0, 77, 78, 0, 0, 79, + 80, 0, 81, 62, 0, 82, 83, 0, 0, 84, 85, 86, 0, 0, 0, 87, + 0, 88, 0, 0, 51, 89, 51, 0, 90, 0, 91, 0, 0, 0, 80, 0, + 0, 0, 92, 93, 0, 94, 95, 96, 97, 0, 0, 0, 0, 0, 51, 0, + 0, 0, 0, 98, 99, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, + 0,101,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103, 0, 0, + 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,106, 0, 0,107, + 0, 0, 0, 0, 0, 0,108, 0,109, 0,102, 0, 0, 0, 0, 0, + 110,111, 0, 0, 0, 0, 0, 0, 0,112, 0, 0, 0, 0, 0, 0, + 0,113, 0,114, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, + 7, 0, 8, 0, 0, 0, 0, 9, 10, 11, 12, 0, 0, 0, 0, 13, + 0, 0, 14, 15, 0, 16, 0, 17, 18, 0, 0, 19, 0, 20, 21, 0, + 0, 0, 0, 0, 22, 23, 0, 24, 25, 0, 0, 26, 0, 0, 0, 27, + 0, 0, 28, 29, 30, 31, 0, 0, 0, 32, 33, 34, 0, 0, 33, 0, + 0, 35, 33, 0, 0, 0, 33, 36, 0, 0, 0, 0, 0, 37, 38, 0, + 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, + 0, 0, 0, 43, 0, 44, 0, 0, 0, 45, 46, 0, 0, 0, 47, 0, + 0, 0, 0, 0, 0, 48, 49, 0, 0, 0, 0, 50, 0, 0, 0, 51, + 0, 52, 0, 53, 0, 0, 0, 0, 54, 0, 0, 0, 0, 55, 0, 56, + 0, 0, 0, 0, 57, 58, 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, + 0, 61, 52, 0, 62, 63, 0, 0, 64, 0, 0, 0, 65, 66, 0, 0, + 0, 67, 0, 68, 69, 70, 71, 72, 1, 73, 0, 74, 75, 76, 0, 0, + 77, 78, 0, 0, 0, 79, 0, 0, 1, 1, 0, 0, 80, 0, 0, 81, + 0, 0, 0, 0, 77, 82, 0, 83, 0, 0, 0, 0, 0, 78, 84, 0, + 85, 0, 52, 0, 1, 78, 0, 0, 86, 0, 0, 87, 0, 0, 0, 0, + 0, 88, 57, 0, 0, 0, 0, 0, 0, 89, 90, 0, 0, 84, 0, 0, + 33, 0, 0, 91, 0, 0, 0, 0, 92, 0, 0, 0, 0, 49, 0, 0, + 93, 0, 0, 0, 0, 94, 95, 0, 0, 96, 0, 0, 97, 0, 0, 0, + 98, 0, 0, 0, 99, 0, 0, 0, 0,100,101, 93, 0, 0,102, 0, + 0, 0, 84, 0, 0,103, 0, 0, 0,104,105, 0, 0,106,107, 0, + 0, 0, 0, 0, 0,108, 0, 0,109, 0, 0, 0, 0,110, 33, 0, + 111,112,113, 35, 0, 0,114, 0, 0, 0,115, 0, 0, 0, 0, 0, + 0,116, 0, 0,117, 0, 0, 0, 0,118, 88, 0, 0, 0, 0, 0, + 57, 0, 0, 0, 0, 52,119, 0, 0, 0, 0,120, 0, 0,121, 0, + 0, 0, 0,119, 0, 0,122, 0, 0, 0, 0, 0, 0,123, 0, 0, + 0,124, 0, 0, 0,125, 0,126, 0, 0, 0, 0,127,128,129, 0, + 130, 0,131, 0, 0, 0,132,133,134, 0, 77, 0, 0, 0, 0, 0, + 35, 0, 0, 0,135, 0, 0, 0,136, 0, 0,137, 0, 0,138, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, + 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, + 1, 1, 19, 1, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, + 27, 28, 29, 30, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, + 1, 36, 37, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, 42, 0, + 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 19, 1, 21, 0, + 0, 47, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0, 51, 0, 0, 0, + 52, 1, 0, 0, 38, 14, 4, 1, 1, 1, 53, 21, 43, 52, 54, 21, + 35, 1, 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, 0, 0, 0, 0, + 0, 59, 0, 60, 0, 0, 0, 0, 61, 62, 0, 0, 63, 0, 0, 0, + 64, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, + 68, 0, 0, 69, 70, 0, 71, 72, 73, 74, 75, 76, 0, 0, 0, 77, + 0, 0, 0, 78, 79, 0, 0, 0, 0, 47, 0, 0, 0, 49, 0, 80, + 0, 0, 0, 62, 0, 0, 63, 0, 0, 81, 0, 0, 82, 0, 0, 0, + 83, 0, 0, 19, 84, 0, 62, 0, 0, 0, 0, 49, 1, 85, 1, 52, + 15, 86, 36, 10, 21, 87, 0, 55, 0, 0, 0, 0, 19, 10, 1, 0, + 0, 0, 0, 0, 88, 0, 0, 89, 0, 0, 88, 0, 0, 0, 0, 78, + 0, 0, 87, 9, 12, 4, 90, 8, 91, 47, 0, 58, 50, 0, 21, 1, + 21, 92, 93, 1, 1, 1, 1, 94, 95, 96, 97, 1, 98, 58, 81, 99, + 100, 4, 58, 0, 0, 0, 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, + 0, 61, 0, 0,101,102, 0, 0,103, 0, 0, 1, 1, 50, 0, 0, + 0, 38, 0, 63, 0, 0, 0, 0, 0, 62, 0, 0,104, 68, 61, 0, + 0, 0, 78, 0, 0, 0,105,106, 58, 38, 81, 0, 0, 0, 0, 0, + 0,107, 1, 14, 4, 12, 84, 0, 0, 0, 0, 38, 87, 0, 0, 0, + 0,108, 0, 0,109, 61, 0,110, 0, 0, 0, 1, 0, 0, 0, 0, + 19, 58, 0, 0, 0, 51, 0,111, 14, 52,112, 41, 0, 0, 62, 0, + 0, 61, 0, 0,113, 0, 87, 0, 0, 0, 61, 62, 0, 0, 62, 0, + 89, 0, 0,113, 0, 0, 0, 0,114, 0, 0, 0, 78, 55, 0, 38, + 1, 58, 1, 58, 0, 0, 63, 89, 0, 0,115, 0, 0, 0, 55, 0, + 0, 0, 0,115, 0, 0, 0, 0, 61, 0, 0, 0, 0, 79, 0, 61, + 0, 0, 0, 0, 56, 0, 89, 80, 0, 0, 79, 0, 0, 0, 8, 91, 0, 0, 1, 87, 0, 0,116, 0, 0, 0, 0, 0, 0,117, 0,118, 119,120,121, 0,104, 4,122, 49, 23, 0, 0, 0, 38, 50, 38, 58, 0, 0, 1, 87, 1, 1, 1, 1, 39, 1, 48,105, 87, 0, 0, 0, - 0, 1, 4,122, 0, 0, 0, 1,123, 0, 0, 0, 0, 0,230,230, - 230,230,230,232,220,220,220,220,232,216,220,220,220,220,220,202, - 202,220,220,220,220,202,202,220,220,220, 1, 1, 1, 1, 1,220, - 220,220,220,230,230,230,230,240,230,220,220,220,230,230,230,220, - 220, 0,230,230,230,220,220,220,220,230,232,220,220,230,233,234, - 234,233,234,234,233,230, 0, 0, 0,230, 0,220,230,230,230,230, - 220,230,230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, - 25, 0,230,220, 0, 18, 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, - 30, 31, 32, 33, 34,230,230,220,220,230,220,230,230,220, 35, 0, - 0, 0, 0, 0,230,230,230, 0, 0,230,230, 0,220,230,230,220, - 0, 0, 0, 36, 0, 0,230,220,230,230,220,220,230,220,220,230, - 220,230,220,230,230, 0, 0,220, 0, 0,230,230, 0,230, 0,230, - 230,230,230,230, 0, 0, 0,220,220,220,230,220,220,220,230,230, - 0,220, 27, 28, 29,230, 7, 0, 0, 0, 0, 9, 0, 0, 0,230, - 220,230,230, 0, 0, 0, 0, 0,230, 0, 0, 84, 91, 0, 0, 0, - 0, 9, 9, 0, 0, 0, 0, 0, 9, 0,103,103, 9, 0,107,107, - 107,107,118,118, 9, 0,122,122,122,122,220,220, 0, 0, 0,220, - 0,220, 0,216, 0, 0, 0,129,130, 0,132, 0, 0, 0, 0, 0, - 130,130,130,130, 0, 0,130, 0,230,230, 9, 0,230,230, 0, 0, - 220, 0, 0, 0, 0, 7, 0, 9, 9, 0, 9, 9, 0, 0, 0,230, - 0, 0, 0,228, 0, 0, 0,222,230,220,220, 0, 0, 0,230, 0, - 0,220,230,220, 0,220,230,230,230, 0, 0, 0, 9, 9, 0, 0, - 7, 0,230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,202,230, - 230,230,230,230,232,228,228,220,218,230,233,220,230,220,230,230, - 1, 1, 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, 0, 0, - 218,228,232,222,224,224, 0, 8, 8, 0, 0, 0, 0,220,230, 0, - 230,230,220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1, - 220, 0, 0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, - 7, 0, 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, - 1, 0, 0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216, - 216, 0,220,220,220, 0,230,230, 7, 0, 16, 17, 17, 33, 17, 49, - 17, 17, 84, 97,135,145, 26, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 1, 0, 0, 0,123, 4,122, 0, 0, 0, 1,124, 0, 0, 0, + 0, 0,230,230,230,230,230,232,220,220,220,220,232,216,220,220, + 220,220,220,202,202,220,220,220,220,202,202,220,220,220, 1, 1, + 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220,220,220, + 230,230,230,220,220, 0,230,230,230,220,220,220,220,230,232,220, + 220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230, 0,220, + 230,230,230,230,220,230,230,230,222,220,230,230,220,220,230,222, + 228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, + 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0, 0, 0, + 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230,220,230, + 230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230,230, 0, + 220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230,220,220, + 230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0,230,230, + 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220,230,220, + 220,220,230,230, 0,220, 27, 28, 29,230, 7, 0, 0, 0, 0, 9, + 0, 0, 0,230,220,230,230, 0, 0, 0, 0, 0,230, 0, 0, 84, + 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 9, 0,103,103, + 9, 0,107,107,107,107,118,118, 9, 0,122,122,122,122,220,220, + 0, 0, 0,220, 0,220, 0,216, 0, 0, 0,129,130, 0,132, 0, + 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0,230,230, 9, 0, + 230,230, 0, 0,220, 0, 0, 0, 0, 7, 0, 9, 9, 0, 9, 9, + 0, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220,220, 0, + 0, 0,230, 0, 0,220,230,220, 0,220,230,230,230, 0, 0, 0, + 9, 9, 0, 0, 7, 0,230, 0, 1, 1, 1, 0, 0, 0,230,234, + 214,220,202,230,230,230,230,230,232,228,228,220,218,230,233,220, + 230,220,230,230, 1, 1, 1, 1, 1,230, 0, 1, 1,230,220,230, + 1, 1, 0, 0,218,228,232,222,224,224, 0, 8, 8, 0, 0, 0, + 0,220,230, 0,230,230,220, 0, 0,230, 0, 0, 26, 0, 0,220, + 0,230,230, 1,220, 0, 0,230,220, 0, 0, 0,220,220, 0, 0, + 230,220, 0, 9, 7, 0, 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, + 0, 0, 0, 0, 1, 0, 0,216,216, 1, 1, 1, 0, 0, 0,226, + 216,216,216,216,216, 0,220,220,220, 0,232,232,220,230,230,230, + 7, 0, 16, 17, 17, 33, 17, 49, 17, 17, 84, 97,135,145, 26, 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, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17,177, 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 3, 3, 3, + 3, 3, 6, 7, 8, 3, 3, 3, 3, 3, 9, 10, 11, 12, 13, 3, + 3, 3, 3, 3, 3, 3, 3, 14, 3, 15, 3, 3, 3, 3, 3, 3, + 16, 17, 18, 19, 20, 21, 3, 3, 3, 22, 23, 24, 3, 3, 3, 3, + 3, 3, 25, 3, 3, 3, 3, 3, 3, 3, 3, 26, 3, 3, 27, 28, + 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, + 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 0, + 0, 14, 15, 16, 6, 0, 17, 18, 19, 19, 19, 20, 21, 22, 23, 24, + 19, 25, 0, 26, 27, 19, 19, 28, 29, 30, 0, 31, 0, 0, 0, 8, + 0, 0, 0, 0, 0, 0, 0, 19, 28, 0, 32, 33, 9, 34, 35, 19, + 0, 0, 36, 37, 38, 39, 40, 19, 0, 41, 42, 43, 44, 31, 0, 1, + 45, 42, 0, 0, 0, 0, 0, 32, 14, 14, 0, 0, 0, 0, 14, 0, + 0, 46, 47, 47, 47, 47, 48, 49, 47, 47, 47, 47, 50, 51, 52, 53, + 43, 21, 0, 0, 0, 0, 0, 0, 0, 54, 6, 55, 0, 14, 19, 1, + 0, 0, 0, 0, 56, 57, 0, 0, 0, 0, 0, 19, 58, 31, 0, 0, + 0, 0, 0, 0, 0, 59, 14, 0, 0, 0, 0, 1, 0, 2, 0, 0, + 0, 3, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 2, 3, 0, 4, 5, 0, 0, 6, 0, 0, 0, 7, + 0, 0, 0, 1, 1, 0, 0, 8, 9, 0, 8, 9, 0, 0, 0, 0, + 8, 9, 10, 11, 12, 0, 0, 0, 13, 0, 0, 0, 0, 14, 15, 16, + 17, 0, 0, 0, 1, 0, 0, 18, 19, 0, 0, 0, 20, 0, 0, 0, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 8, 21, 9, + 0, 0, 22, 0, 0, 0, 0, 1, 0, 23, 24, 25, 0, 0, 26, 0, + 0, 0, 8, 21, 27, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 28, + 29, 30, 0, 31, 32, 20, 1, 1, 0, 0, 0, 8, 21, 9, 1, 4, + 5, 0, 0, 0, 33, 9, 0, 1, 1, 1, 0, 8, 21, 21, 21, 21, + 34, 1, 35, 21, 21, 21, 9, 36, 0, 0, 37, 38, 1, 0, 39, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 8, 21, 9, 1, 0, 0, 0, + 40, 0, 8, 21, 21, 21, 21, 21, 21, 21, 21, 9, 0, 1, 1, 1, + 1, 8, 21, 21, 21, 9, 0, 0, 0, 41, 0, 42, 43, 0, 0, 0, + 1, 44, 0, 0, 0, 45, 8, 9, 1, 0, 0, 0, 8, 21, 21, 21, + 9, 0, 1, 0, 1, 1, 8, 21, 21, 9, 0, 4, 5, 8, 9, 1, + 0, 0, 0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 3, 3, 3, 3, 3, 3, 3, 15, 3, 16, 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, 17, 17, 17,177, 0, 1, 2, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, - 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 6, 7, 8, 3, 3, 3, - 3, 3, 9, 10, 11, 12, 13, 3, 3, 3, 3, 3, 3, 3, 3, 14, - 3, 15, 3, 3, 3, 3, 3, 3, 16, 17, 18, 19, 20, 21, 3, 3, - 3, 22, 23, 24, 3, 3, 3, 3, 3, 3, 25, 3, 3, 3, 3, 3, - 3, 3, 3, 26, 3, 3, 27, 28, 0, 1, 0, 0, 0, 0, 0, 1, - 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, - 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8, 9, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, - 0, 0, 0, 10, 11, 12, 13, 0, 0, 14, 15, 16, 6, 0, 17, 18, - 19, 19, 19, 20, 21, 22, 23, 24, 19, 25, 0, 26, 27, 19, 19, 28, - 29, 30, 0, 31, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 19, - 28, 0, 32, 33, 9, 34, 35, 19, 0, 0, 36, 37, 38, 39, 40, 19, - 0, 41, 42, 43, 44, 31, 0, 1, 45, 42, 0, 0, 0, 0, 0, 32, - 14, 14, 0, 0, 0, 0, 14, 0, 0, 46, 47, 47, 47, 47, 48, 49, - 47, 47, 47, 47, 50, 51, 52, 53, 43, 21, 0, 0, 0, 0, 0, 0, - 0, 54, 6, 55, 0, 14, 19, 1, 0, 0, 0, 0, 56, 57, 0, 0, - 0, 0, 0, 19, 58, 31, 0, 0, 0, 0, 0, 0, 0, 59, 14, 0, - 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 60, 61, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 3, 0, 4, - 5, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 1, 1, 0, 0, 8, - 9, 0, 8, 9, 0, 0, 0, 0, 8, 9, 10, 11, 12, 0, 0, 0, - 13, 0, 0, 0, 0, 14, 15, 16, 17, 0, 0, 0, 1, 0, 0, 18, - 19, 0, 0, 0, 20, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 0, 8, 21, 9, 0, 0, 22, 0, 0, 0, 0, 1, - 0, 23, 24, 25, 0, 0, 26, 0, 0, 0, 8, 21, 27, 0, 1, 0, - 0, 1, 1, 1, 1, 0, 1, 28, 29, 30, 0, 31, 32, 20, 1, 1, - 0, 0, 0, 8, 21, 9, 1, 4, 5, 0, 0, 0, 33, 9, 0, 1, - 1, 1, 0, 8, 21, 21, 21, 21, 34, 1, 35, 21, 21, 21, 9, 36, - 0, 0, 37, 38, 1, 0, 39, 0, 0, 0, 1, 0, 1, 0, 0, 0, - 0, 8, 21, 9, 1, 0, 0, 0, 40, 0, 8, 21, 21, 21, 21, 21, - 21, 21, 21, 9, 0, 1, 1, 1, 1, 8, 21, 21, 21, 9, 0, 0, - 0, 41, 0, 42, 43, 0, 0, 0, 1, 44, 0, 0, 0, 45, 8, 9, - 1, 0, 0, 0, 8, 21, 21, 21, 9, 0, 1, 0, 1, 1, 8, 21, - 21, 9, 0, 4, 5, 8, 9, 1, 0, 0, 0, 1, 2, 3, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 3, 3, 3, 3, 3, 3, - 3, 15, 16, 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, 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, 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, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 0, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 17, - 18, 17, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 24, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 25, 25, 26, 27, - 28, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 31, - 31, 31, 31, 54, 55, 55, 56, 31, 31, 31, 31, 31, 31, 31, 57, 58, + 17, 17, 18, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 17, 17, 18, 17, 19, 20, 21, 22, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 25, 25, 26, 27, 28, 29, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 59, 60, 31, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 63, 64, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 65, 66, 67, 31, 31, 31, 31, 68, 31, 31, 31, 31, 31, - 31, 31, 31, 69, 70, 71, 17, 17, 72, 73, 31, 74, 75, 76, 31, 77, - 78, 31, 79, 80, 17, 81, 17, 17, 17, 17, 31, 31, 23, 23, 23, 23, - 23, 23, 31, 31, 31, 31, 31, 31, 23, 82, 31, 31, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 84, 0, 0, 1, - 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, - 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 11, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 19, 27, - 28, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, - 37, 37, 38, 38, 39, 40, 41, 41, 42, 42, 42, 43, 44, 44, 45, 46, - 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 49, 50, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 51, - 60, 61, 62, 63, 64, 65, 66, 7, 67, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 7, 4, 4, 4, 4, 77, 77, 77, 77, 78, 79, 80, 81, - 82, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 85, 85, - 0, 0, 0, 0, 86, 87, 88, 88, 89, 90, 48, 91, 0, 0, 92, 92, - 92, 92, 92, 93, 94, 95, 96, 97, 98, 47, 99,100,101,102, 0,103, - 104,105, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 0,106,106,106,106,106,106,106,106,106,106,106,107, - 108,108,108,108,108, 11,109,110,111, 4,112, 4,113,114,115,116, - 117,118,119,120,121,122,123,124,125,126, 50,127, 47, 47, 47, 47, - 47, 47, 47, 47,128,128,128,128,128,128,128,128,128,128,128,128, - 92, 92, 92, 92, 92, 92, 92, 92,129,130, 19, 19, 19, 19, 19, 19, - 131, 19, 19, 19,132,133, 19,134,135,136,137,101,138,138,138,138, - 0, 77,139,140,128,128,141,142,143,144,145,146,147,148,149,150, - 151,152,153,153,154,154,154,154,154,154, 4, 4,155,156,157,158, - 159,160,161,162,163,164,165,166,167,168,169,169,170,170,171,171, - 172,172,128,128, 19, 19,173,173,174,175,176,177,178,178,179,180, - 181,182,183,184,185,185,186,187,188,189,128,128,190,190,191,191, - 128,128,192,192,193,194,195,195,196,196,128,128,197,197,198,198, - 199,199,200,200,201,202,203,204,128,128,128,128,205,206,207,207, - 208,209,210,210,128,128,211,211,128,128,212, 34,213,213,213,213, - 213,213,213,213,213,213,213,213,213,213,128,128,128,128,128,128, - 128,128,214,214,215,215,215,215,215,215,215,215,215,215,128,128, - 128,128,128,128,216,216,216,216,216,216,216,216,216,216,128,128, - 128,128,128,128,110,110,110,110,110,110,110,110,110,217,218,219, - 220,220,220,220,221,221,221,221,222,222,222,223,224,224,224,224, - 224,224,224,224,224,224,224,224,225,225,225,225,225,225,225,225, - 224,224,128,128,128,128,128,128,128,128,104,104,226,227,227,227, - 228,229,230,230,230,230,230,230,128,128,128,128,231,231,232, 0, - 128,128,128,128,128,128,128,128, 7,233, 0, 0, 0, 0, 0, 0, - 0,234,235, 0, 77, 77, 0, 0, 0, 0,128,128,236,236,236,236, - 236,236,236,236,236,236,236,236,128,128,128,128,128,128,128,128, - 4, 4,128,128, 86, 86,128,128,237,237,128,128,128,128,238,239, - 128,128,128,128,128,128,128,128,128,128, 48, 48,240,240,240,240, - 241,241,128,128, 0, 0, 0, 0, 0, 0,128,128, 19, 19, 19, 19, - 128,128,128,128,242, 0,128,128, 0, 0, 0, 0, 92, 92,128,128, - 128,128,128,128, 92, 92, 92, 92, 92, 92,128,128, 0, 0,128,128, - 7, 7, 7, 7, 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, - 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 6, 0, 0, 7, 0, - 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 11, 11, 11, 11, 12, 11, - 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 15, 16, 16, 16, 16, - 16, 17, 18, 18, 18, 18, 18, 18, 19, 20, 21, 21, 22, 23, 21, 24, - 21, 21, 21, 21, 21, 25, 21, 21, 26, 26, 26, 26, 26, 21, 21, 21, - 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 26, 21, - 21, 21, 31, 21, 32, 32, 32, 32, 32, 33, 34, 32, 35, 35, 35, 35, - 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, - 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, - 44, 44, 44, 45, 44, 44, 44, 44, 46, 46, 46, 46, 47, 47, 47, 47, - 47, 48, 47, 47, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, - 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, - 55, 55, 55, 55, 56, 56, 57, 57, 57, 57, 58, 57, 59, 59, 60, 61, - 62, 62, 63, 63, 64, 64, 64, 64, 65, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 55, 67, 67, 67, 67, 67, 68, 68, 68, 69, 69, 69, 69, - 69, 69, 64, 64, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 8, - 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, - 75, 76, 76, 76, 13, 50, 50, 50, 73, 77, 78, 79, 4, 4, 80, 4, - 4, 81, 82, 83, 4, 4, 4, 84, 11, 11, 11, 11, 85, 0, 0, 0, - 0, 0, 0, 86, 0, 4, 0, 0, 0, 8, 8, 8, 0, 0, 87, 88, - 89, 0, 4, 4, 6, 0, 0, 0, 90, 90, 90, 90, 91, 91, 91, 91, - 91, 91, 4, 4, 92, 92, 92, 92, 50, 50, 50, 93, 93, 93, 93, 93, - 53, 53, 13, 13, 94, 94, 94, 94, 94, 94, 94, 0, 95, 0, 96, 97, - 98, 99, 99, 99, 99,100,101,102,102,102,102,103,104,104,104,105, - 52, 0,104,104, 0, 0, 0,102, 52, 52, 0, 0, 0, 0, 52,106, - 0,102,102,107,102,102,102,102,102,108, 0, 0,109,109,109,109, - 109,110,110,110,111,111,111,111, 13, 13,112,112,112,112,112,112, - 0, 0,113, 4,114, 4, 4, 4,115,115,115, 0,116,116,116,116, - 117,117,117,117,117,117, 32, 32,118,118,119,120,120,120, 52, 52, - 121,121,121,121,122,121, 49, 49,123,123,123,123,123,123, 49, 49, - 124,124,124,124,124,124,125,125, 53, 53, 53, 4, 4,126,127, 54, - 125,125,125,125,128,128,128,128, 4,129, 18, 18, 18, 21, 21, 21, - 21, 21, 21,130, 8, 0,131, 0, 0, 0, 0, 21, 21, 21, 21,132, - 0, 0, 1, 2, 1, 2,133,101,102,134, 52, 52,135,135,135,135, - 11, 0, 11, 11, 11, 0, 0,136,137,137,138,138,138,138,139, 0, - 140,140,140,141,141,142,142,142,143,143,144,144,144,144,144,144, - 145,145,145,145,145,146,146,146,147,147,147,148,148,148,148,148, - 149,149,149,150,150,150,150,151,151,151,151,151,152,152,152,152, - 153,153,153,153,154,154,155,155,156,156,156,156,156,156,157,157, - 158,158,159,159,159,159,159,159,160,160,161,161,161,161,161,161, - 162,162,162,162,162,162,163,163,164,164,164,164,165,165,165,165, - 166,166,166,166,167,167,168,168,169,169,169,169,170,170,170,170, - 171,171,171,171,172,172,172,172,173,173,173,173,174,174,174,175, - 175,175,175,176,176,176,176,177,177,177,178,178,179,179,179,179, - 180,180,180,180,180,181,181,181,182,182,182,182,182,183,183,183, - 184,184,184,184,184,184,185, 43,186,186,186,186,187,187,187,188, - 188,188,188,188,189,189,189,190,189,189,189,189,191,191,191,191, - 192,192,192,192,193,193,193,193,194,194,194,194,194,194, 66, 66, - 195,195,195,195,196,196,196,196,197,197,197,197,198,198,198,198, - 199,199,199,199,200,200,200,200,201,201,201,201,201,202,202,202, - 202,202,202, 55,203,203,203,203,204,204,204,204,204,204,204,205, - 205,205,205,205,206,206,206,206,206,206,207,207,207,207,207,207, - 208,208,208,208,110,110,110,110,209,209,209,209,210,210,210,210, - 211,211,211,211,212,212,212,212,213,213,213,214,214,214,214,214, - 214,215,215,215,216,216,216,216,217,217,217,217,218,218,218,218, - 218,218,219, 94,220,220,220,220,221,221,221,221,222, 99, 99, 99, - 99, 99, 99, 99, 99, 99,102,102,102, 99,223,224,224,224,224,224, - 225,225,225,225,225,225, 0, 0, 8, 0, 0, 0, 0, 0,226,227, - 228, 0,229, 0,230,230,230,230,231,231,231,231,232,232,232,232, - 233,233,233,233,234,234,234,234,235,235,235,235,236, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 3, 0, 0, 0, 4, 0, - 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 5, 0, 2, 5, 6, 0, - 7, 7, 7, 7, 8, 9, 8, 10, 8, 11, 8, 8, 8, 8, 8, 8, - 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 14, 14, 16, 17, 17, 17, - 17, 17, 17, 17, 18, 19, 19, 19, 19, 19, 19, 19, 20, 21, 20, 22, - 20, 20, 23, 23, 20, 20, 20, 20, 22, 20, 24, 7, 7, 25, 20, 20, - 26, 20, 20, 20, 20, 20, 20, 21, 27, 27, 27, 27, 28, 28, 28, 28, - 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 20, 20, 20, - 33, 33, 33, 33, 34, 35, 33, 33, 33, 36, 33, 33, 37, 37, 37, 37, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 52, 53, 31, 31, 31, 31, 54, 55, 55, 56, 31, + 31, 31, 31, 31, 31, 31, 57, 58, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 59, 60, 31, 61, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 64, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 65, 66, 67, 31, 31, + 31, 31, 68, 31, 31, 31, 31, 31, 31, 31, 31, 69, 70, 71, 17, 17, + 72, 73, 31, 74, 75, 76, 77, 78, 79, 31, 80, 81, 17, 82, 17, 17, + 17, 17, 31, 31, 23, 23, 23, 23, 23, 23, 31, 31, 31, 31, 31, 31, + 23, 83, 31, 31, 23, 23, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 84, 0, 0, 1, 0, 1, 2, 3, 0, 1, 2, 3, + 4, 5, 6, 7, 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, + 7, 8, 9, 10, 11, 11, 12, 11, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 19, 27, 28, 29, 30, 30, 31, 31, 32, 32, + 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 40, 41, 41, + 42, 42, 42, 43, 44, 44, 45, 46, 47, 47, 47, 47, 48, 48, 48, 48, + 48, 48, 49, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, + 54, 55, 56, 56, 57, 58, 59, 51, 60, 61, 62, 63, 64, 65, 66, 7, + 67, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 7, 4, 4, 4, 4, + 77, 77, 77, 77, 78, 79, 80, 81, 82, 83, 84, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 85, 85, 85, 85, 0, 0, 0, 0, 86, 87, 88, 88, + 89, 90, 48, 91, 0, 0, 92, 92, 92, 92, 92, 93, 94, 95, 96, 97, + 98, 47, 99,100,101,102, 0,103,104,105, 0, 0, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0,106,106,106,106, + 106,106,106,106,106,106,106,107,108,108,108,108,108, 11,109,110, + 111, 4,112, 4,113,114,115,116,117,118,119,120,121,122,123,124, + 125,126, 50,127, 47, 47, 47, 47, 47, 47, 47, 47,128,128,128,128, + 128,128,128,128,128,128,128,128, 92, 92, 92, 92, 92, 92, 92, 92, + 129,130, 19, 19, 19, 19, 19, 19,131, 19, 19, 19,132,133, 19,134, + 135,136,137,101,138,138,138,138, 0, 77,139,140,128,128,141,142, + 143,144,145,146,147,148,149,150,151,152,153,153,154,154,154,154, + 154,154, 4, 4,155,156,157,158,159,160,161,162,163,164,165,166, + 167,168,169,169,170,170,171,171,172,172,128,128, 19, 19,173,174, + 175,176,177,178,179,179,180,181,182,183,184,185,186,186,187,188, + 189,190,128,128,191,191,192,192,128,128,193,193,194,195,196,196, + 197,197,128,128,198,198,199,199,200,200,201,201,202,203,204,205, + 28, 28,128,128,206,207,208,208,209,210,211,211,128,128,212,212, + 213,213,214, 34,215,215,215,215,215,215,215,215,215,215,215,215, + 215,215,128,128,128,128,128,128,128,128,216,216,217,217,217,217, + 217,217,217,217,217,217,128,128,128,128,128,128,218,218,218,218, + 218,218,218,218,218,218,128,128,128,128,128,128,110,110,110,110, + 110,110,110,110,110,219,220,221,222,222,222,222,223,223,223,223, + 224,224,224,225,226,226,226,226,226,226,226,226,226,226,226,226, + 227,227,227,227,227,227,227,227,226,226,128,128,128,128,128,128, + 128,128,104,104,228,229,229,229,230,231,232,232,232,232,232,232, + 128,128,128,128,233,233,234, 0,128,128,128,128,128,128,128,128, + 7,235, 0, 0, 0, 0, 0, 0, 0,236,237, 0, 77, 77, 0, 0, + 0, 0,128,128,238,238,238,238,238,238,238,238,238,238,238,238, + 128,128,128,128,128,128,128,128, 4, 4,128,128,239, 11, 11, 11, + 240,240,128,128,128,128,241,242,128,128,128,128,128,128,243,243, + 128,128,128,128,128,128,128,128,128,128, 48, 48,244,244,244,244, + 245,245,128,128, 0, 0, 0, 0, 0, 0,128,128, 19, 19, 19, 19, + 128,128,128,128,246, 0,128,128, 0, 0, 0, 0, 92, 92,128,128, + 128,128,128,128, 0, 0,128,128, 7, 7, 7, 7, 0, 0, 0, 0, + 1, 2, 1, 2, 0, 0, 3, 3, 4, 5, 4, 5, 4, 4, 4, 4, + 4, 4, 4, 6, 0, 0, 7, 0, 8, 8, 8, 8, 8, 8, 8, 9, + 10, 11, 11, 11, 11, 11, 12, 11, 13, 13, 13, 13, 14, 13, 13, 13, + 13, 13, 13, 15, 16, 16, 16, 16, 16, 17, 18, 18, 18, 18, 18, 18, + 19, 20, 21, 21, 22, 23, 21, 24, 21, 21, 21, 21, 21, 25, 21, 21, + 26, 26, 26, 26, 26, 21, 21, 21, 27, 27, 27, 27, 28, 28, 28, 28, + 29, 29, 29, 29, 30, 30, 26, 21, 21, 21, 31, 21, 32, 32, 32, 32, + 32, 33, 34, 32, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, - 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, - 46, 46, 46, 46, 46, 46, 46, 47, 48, 48, 48, 48, 49, 49, 49, 49, - 49, 50, 51, 49, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 54, 53, - 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, - 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 61, 62, 63, 63, 63, 63, - 64, 64, 64, 64, 64, 65, 0, 0, 66, 66, 66, 66, 67, 67, 67, 67, - 68, 68, 68, 68, 69, 70, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, - 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76, 76, 76, - 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79, 80, 80, 80, 80, - 81, 81, 81, 81, 82, 7, 7, 7, 83, 7, 84, 85, 0, 84, 86, 0, - 2, 87, 88, 2, 2, 2, 2, 89, 90, 87, 91, 2, 2, 2, 92, 2, - 2, 2, 2, 93, 0, 0, 0, 86, 1, 0, 0, 94, 0, 95, 96, 0, - 4, 0, 0, 0, 0, 0, 0, 4, 97, 97, 97, 97, 98, 98, 98, 98, - 13, 13, 13, 13, 99, 99, 99, 99,100,100,100,100, 0,101, 0, 0, - 102,100,103,104, 0, 0,100, 0,105,106,106,106,106,106,106,106, - 106,106,107,105,108,109,109,109,109,109,109,109,109,109,110,108, - 111,111,111,111,112, 55, 55, 55, 55, 55, 55,113,109,109,109,110, - 109,109, 0, 0,114,114,114,114,115,115,115,115,116,116,116,116, - 117,117,117,117, 96, 2, 2, 2, 2, 2, 94, 2,118,118,118,118, - 119,119,119,119,120,120,120,120,121,121,121,121,121,121,121,122, - 123,123,123,123,124,124,124,124,124,124,124,125,126,126,126,126, - 127,127,127,127,128,128,128,128, 2, 2, 3, 2, 2,129,130, 0, - 131,131,131,131,132, 17, 17, 18, 20, 20, 20,133, 7, 7, 7,134, - 20, 20, 20, 23, 0,135,109,109,109,109,109,136,137,137,137,137, - 0, 0, 0,138,139,139,139,139,140,140,140,140, 84, 0, 0, 0, - 141,141,141,141,142,142,142,142,143,143,143,143,144,144,144,144, - 145,145,145,145,146,146,146,146,147,147,147,147,148,148,148,148, - 149,149,149,149,150,150,150,150,151,151,151,151,152,152,152,152, - 153,153,153,153,154,154,154,154,155,155,155,155,156,156,156,156, - 157,157,157,157,158,158,158,158,159,159,159,159,160,160,160,160, - 161,161,161,161,162,162,162,162,163,163,163,163,164,164,164,164, - 165,165,165,165,166,166,166,166,167,167,167,167,168,168,168,168, + 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 45, 44, 44, 44, 44, + 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 47, 47, 49, 49, 49, 49, + 49, 49, 50, 50, 50, 50, 50, 51, 52, 52, 52, 52, 53, 53, 53, 53, + 53, 53, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 57, 57, + 57, 57, 58, 57, 59, 59, 60, 61, 62, 62, 63, 63, 64, 64, 64, 64, + 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 55, 67, 67, 67, 67, + 67, 68, 68, 68, 69, 69, 69, 69, 69, 69, 64, 64, 70, 70, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 8, 72, 72, 72, 72, 73, 73, 73, 73, + 74, 74, 74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 13, 50, 50, 50, + 73, 77, 78, 79, 4, 4, 80, 4, 4, 81, 82, 83, 4, 4, 4, 84, + 11, 11, 11, 11, 85, 0, 0, 0, 0, 0, 0, 86, 0, 4, 0, 0, + 0, 8, 8, 8, 0, 0, 87, 88, 89, 0, 4, 4, 6, 0, 0, 0, + 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 4, 4, 92, 92, 92, 92, + 50, 50, 50, 93, 93, 93, 93, 93, 53, 53, 13, 13, 94, 94, 94, 94, + 94, 94, 94, 0, 95, 0, 96, 97, 98, 99, 99, 99, 99,100,101,102, + 102,102,102,103,104,104,104,105, 52, 0,104,104, 0, 0, 0,102, + 52, 52, 0, 0, 0, 0, 52,106, 0,102,102,107,102,102,102,102, + 102,108, 0, 0,109,109,109,109,109,110,110,110,111,111,111,111, + 13, 13,112,112,112,112,112,112, 0, 0,113, 4,114, 4, 4, 4, + 115,115,115, 0,116,116,116,116,117,117,117,117,117,117, 32, 32, + 118,118,119,120,120,120, 52, 52,121,121,121,121,122,121, 49, 49, + 123,123,123,123,123,123, 49, 49,124,124,124,124,124,124,125,125, + 53, 53, 53, 4, 4,126,127, 54,125,125,125,125,128,128,128,128, + 4,129, 18, 18, 18, 21, 21, 21, 21, 21, 21,130, 8, 0,131, 0, + 0, 0, 0, 21, 21, 21, 21,132, 0, 0, 1, 2, 1, 2,133,101, + 102,134, 52, 52,135,135,135,135, 11, 0, 11, 11, 11, 0, 0,136, + 137,137,138,138,138,138,139, 0,140,140,140,141,141,142,142,142, + 143,143,144,144,144,144,144,144,145,145,145,145,145,146,146,146, + 147,147,147,148,148,148,148,148,149,149,149,150,150,150,150,151, + 151,151,151,151,152,152,152,152,153,153,153,153,154,154,155,155, + 156,156,156,156,156,156,157,157,158,158,159,159,159,159,159,159, + 160,160,161,161,161,161,161,161,162,162,162,162,162,162,163,163, + 164,164,164,164,165,165,165,165,166,166,166,166,167,167,168,168, 169,169,169,169,170,170,170,170,171,171,171,171,172,172,172,172, - 173,173,173,173,174,174,174,174,175,175,175,175,176,176,176,176, - 177,177,177,177,178,178,178,178,179,179,179,179,180,180,180,180, - 181,181,181,181,182,182,182,182,183,183,183,183,184,184,184,184, - 185,185,185,185,186, 45, 45, 45,187,187,187,187,188,188,188,188, - 189,189,189,189,190,190,190,190,190,190,191,190,192,192,192,192, - 193,193,193,193,194,194,194,194,195,195,195,195,196,196,196,196, + 173,173,173,173,173,173,173,174,175,175,175,176,176,176,176,177, + 177,177,177,178,178,178,179,179,180,180,180,180,181,181,181,181, + 181,182,182,182,183,183,183,183,183,184,184,184,185,185,185,185, + 185,185,186, 43,187,187,187,187,188,188,188,189,189,189,189,189, + 190,190,190,191,190,190,190,190,192,192,192,192,193,193,193,193, + 194,194,194,194,195,195,195,195,195,195, 66, 66,196,196,196,196, 197,197,197,197,198,198,198,198,199,199,199,199,200,200,200,200, - 201,201,201,201,202,202,202,202,203,203,203,203,204,204,204,204, - 205,205,205,205,206,206,206,206,207,207,207,207,208,208,208,208, - 209,209,209,209,210,210,210,210,211,211,211,211,212,212,212,212, - 213,213,213,213,214,214,214,214,215,215,215,215,216,216,216,216, - 217,217,217,217,218,218,218,218,219,219,219,219,220,221,221,221, - 222,222,222,222,221,221,221,221,223,106,106,106,106,109,109,109, - 224,224,224,224,225,225,225,225, 0,226, 86, 0, 0, 0,226, 7, - 82,138, 7, 0, 0, 0,227, 86,228,228,228,228,229,229,229,229, - 230,230,230,230,231,231,231,231,232,232,232,232,233,233,233,233, - 234, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 0, 0, 0, 19, 0, 19, 0, 0, 0, 0, 0, 26, 26, - 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, - 9, 0, 9, 0, 9, 9, 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, - 6, 1, 1, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 14, 14, 14, - 14, 14, 14, 14, 3, 3, 3, 3, 3, 0, 3, 3, 0, 3, 3, 3, - 3, 3, 3, 0, 3, 3, 3, 1, 1, 1, 3, 3, 1, 3, 3, 3, - 37, 37, 37, 37, 38, 38, 38, 38, 64, 64, 64, 64, 90, 90, 90, 90, - 95, 95, 95, 95, 3, 3, 0, 3, 7, 7, 7, 7, 7, 1, 1, 1, - 1, 7, 7, 7, 0, 0, 7, 7, 5, 5, 5, 5, 11, 11, 11, 11, - 10, 10, 10, 10, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, - 16, 16, 16, 16, 20, 20, 20, 20, 36, 36, 36, 36, 24, 24, 24, 24, - 24, 24, 24, 0, 18, 18, 18, 18, 25, 25, 25, 25, 25, 0, 0, 0, - 0, 25, 25, 25, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 0, - 12, 12, 12, 12, 30, 30, 30, 30, 29, 29, 29, 29, 28, 28, 28, 28, - 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, - 45, 45, 45, 45, 44, 44, 44, 44, 44, 0, 0, 0, 43, 43, 43, 43, - 46, 46, 46, 46, 31, 31, 31, 31, 32, 32, 0, 0, 32, 0, 32, 32, - 32, 32, 32, 32, 48, 48, 48, 48, 52, 52, 52, 52, 58, 58, 58, 58, - 54, 54, 54, 54, 91, 91, 91, 91, 62, 62, 62, 62, 76, 76, 76, 76, - 93, 93, 93, 93, 70, 70, 70, 70, 73, 73, 73, 73, 1, 1, 1, 0, - 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, - 19, 19, 9, 9, 9, 9, 9, 6, 19, 9, 9, 9, 9, 9, 19, 19, - 9, 9, 9, 19, 6, 19, 19, 19, 19, 19, 19, 9, 0, 0, 0, 19, - 0, 0, 9, 0, 0, 0, 19, 19, 27, 27, 27, 27, 56, 56, 56, 56, - 61, 61, 61, 61, 13, 13, 13, 13, 0, 13, 0, 13, 0, 13, 13, 13, - 13, 13, 1, 1, 1, 1, 12, 12, 0, 15, 15, 15, 15, 15, 15, 15, - 15, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, - 26, 26, 26, 26, 26, 12, 12, 12, 12, 12, 12, 0, 39, 39, 39, 39, - 86, 86, 86, 86, 77, 77, 77, 77, 79, 79, 79, 79, 60, 60, 60, 60, - 65, 65, 65, 65, 75, 75, 75, 75, 69, 69, 69, 69, 69, 69, 0, 69, - 74, 74, 74, 74, 84, 84, 84, 84, 84, 84, 84, 0, 68, 68, 68, 68, - 92, 92, 92, 92, 87, 87, 87, 87, 19, 9, 19, 19, 19, 19, 0, 0, - 2, 2, 2, 2, 19, 19, 19, 4, 3, 3, 0, 0, 1, 1, 6, 6, - 0, 0, 17, 17, 17, 17, 0, 0, 49, 49, 49, 49, 0, 1, 1, 1, - 71, 71, 71, 71, 67, 67, 67, 67, 42, 42, 42, 42, 41, 41, 41, 41, - 118,118,118,118, 53, 53, 53, 53, 59, 59, 59, 59, 40, 40, 40, 40, - 51, 51, 51, 51, 50, 50, 50, 50,135,135,135,135,106,106,106,106, - 104,104,104,104,161,161,161,161,110,110,110,110, 47, 47, 47, 47, - 81, 81, 81, 81,120,120,120,120,116,116,116,116,128,128,128,128, - 66, 66, 66, 66, 72, 72, 72, 72, 98, 98, 98, 98, 97, 97, 97, 97, - 57, 57, 57, 57, 88, 88, 88, 88,117,117,117,117,112,112,112,112, - 78, 78, 78, 78, 83, 83, 83, 83, 82, 82, 82, 82,122,122,122,122, - 89, 89, 89, 89,130,130,130,130,144,144,144,144,156,156,156,156, - 147,147,147,147,148,148,148,148,158,158,158,158,153,153,153,153, - 149,149,149,149, 94, 94, 94, 94, 85, 85, 85, 85,101,101,101,101, - 96, 96, 96, 96,111,111,111,111,100,100,100,100,100, 36, 36, 36, - 108,108,108,108,129,129,129,129,109,109,109,109,107,107,107,107, - 107,107,107, 1,137,137,137,137,124,124,124,124,123,123,123,123, - 114,114,114,114,102,102,102,102,126,126,126,126,142,142,142,142, - 125,125,125,125,154,154,154,154,150,150,150,150,141,141,141,141, - 140,140,140,140,121,121,121,121,133,133,133,133,134,134,134,134, - 138,138,138,138,143,143,143,143,145,145,145,145, 63, 63, 63, 63, + 201,201,201,201,202,202,202,202,202,203,203,203,203,203,203, 55, + 204,204,204,204,205,205,205,205,205,205,205,206,206,206,206,206, + 207,207,207,207,207,207,208,208,208,208,208,208,209,209,209,209, + 210,210,210,210,110,110,110,110,211,211,211,211,212,212,212,212, + 213,213,213,213,214,214,214,214,215,215,215,216,216,216,216,216, + 216,217,217,217,218,218,218,218,219,219,219,219,220,220,220,220, + 220,220,221, 94,222,222,222,222,223,223,223,223,224, 99, 99, 99, + 99, 99, 99, 99, 99, 99,102,225, 99,226,102,227,227,227,227,227, + 228,228,228,228,228,228, 0, 0, 8, 0, 0, 0, 0, 0,229,230, + 231, 0,232, 0,233,233,233,233, 91, 91, 91, 13,234,234,234,234, + 235,235,235,235,236,236,236,236,237,237,237,237,238,238,238,238, + 239,239,239,239,240, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, + 2, 2, 3, 0, 0, 0, 4, 0, 2, 2, 2, 2, 2, 3, 2, 2, + 2, 2, 5, 0, 2, 5, 6, 0, 7, 7, 7, 7, 8, 9, 8, 10, + 8, 11, 8, 8, 8, 8, 8, 8, 12, 13, 13, 13, 14, 14, 14, 14, + 14, 15, 14, 14, 16, 17, 17, 17, 17, 17, 17, 17, 18, 19, 19, 19, + 19, 19, 19, 19, 20, 21, 20, 22, 20, 20, 23, 23, 20, 20, 20, 20, + 22, 20, 24, 7, 7, 25, 20, 20, 26, 20, 20, 20, 20, 20, 20, 21, + 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, + 31, 31, 31, 31, 32, 20, 20, 20, 33, 33, 33, 33, 34, 35, 33, 33, + 33, 36, 33, 33, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, + 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, + 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, + 48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 51, 49, 52, 52, 52, 52, + 53, 53, 53, 53, 53, 53, 54, 53, 55, 55, 55, 55, 56, 56, 56, 56, + 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, + 60, 60, 61, 62, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65, 0, 0, + 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 69, 70, 71, 71, + 71, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, + 75, 75, 75, 75, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, + 79, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82, 7, 7, 7, + 83, 7, 84, 85, 0, 84, 86, 0, 2, 87, 88, 2, 2, 2, 2, 89, + 90, 87, 91, 2, 2, 2, 92, 2, 2, 2, 2, 93, 0, 0, 0, 86, + 1, 0, 0, 94, 0, 95, 96, 0, 4, 0, 0, 0, 0, 0, 0, 4, + 97, 97, 97, 97, 98, 98, 98, 98, 13, 13, 13, 13, 99, 99, 99, 99, + 100,100,100,100, 0,101, 0, 0,102,100,103,104, 0, 0,100, 0, + 105,106,106,106,106,106,106,106,106,106,107,105,108,109,109,109, + 109,109,109,109,109,109,110,108,111,111,111,111,112, 55, 55, 55, + 55, 55, 55,113,109,109,109,110,109,109, 0, 0,114,114,114,114, + 115,115,115,115,116,116,116,116,117,117,117,117, 96, 2, 2, 2, + 2, 2, 94, 2,118,118,118,118,119,119,119,119,120,120,120,120, + 121,121,121,121,121,121,121,122,123,123,123,123,124,124,124,124, + 124,124,124,125,126,126,126,126,127,127,127,127,128,128,128,128, + 2, 2, 3, 2, 2,129,130, 0,131,131,131,131,132, 17, 17, 18, + 20, 20, 20,133, 7, 7, 7,134, 20, 20, 20, 23, 0,135,109,109, + 109,109,109,136,137,137,137,137, 0, 0, 0,138,139,139,139,139, + 140,140,140,140, 84, 0, 0, 0,141,141,141,141,142,142,142,142, + 143,143,143,143,144,144,144,144,145,145,145,145,146,146,146,146, + 147,147,147,147,148,148,148,148,149,149,149,149,150,150,150,150, + 151,151,151,151,152,152,152,152,153,153,153,153,154,154,154,154, + 155,155,155,155,156,156,156,156,157,157,157,157,158,158,158,158, + 159,159,159,159,160,160,160,160,161,161,161,161,162,162,162,162, + 163,163,163,163,164,164,164,164,165,165,165,165,166,166,166,166, + 167,167,167,167,168,168,168,168,169,169,169,169,170,170,170,170, + 171,171,171,171,172,172,172,172,173,173,173,173,174,174,174,174, + 174,174,174,175,176,176,176,176,177,177,177,177,178,178,178,178, + 179,179,179,179,180,180,180,180,181,181,181,181,182,182,182,182, + 183,183,183,183,184,184,184,184,185,185,185,185,186,186,186,186, + 187, 45, 45, 45,188,188,188,188,189,189,189,189,190,190,190,190, + 191,191,191,191,191,191,192,191,193,193,193,193,194,194,194,194, + 195,195,195,195,196,196,196,196,197,197,197,197,198,198,198,198, + 199,199,199,199,200,200,200,200,201,201,201,201,202,202,202,202, + 203,203,203,203,204,204,204,204,205,205,205,205,206,206,206,206, + 207,207,207,207,208,208,208,208,209,209,209,209,210,210,210,210, + 211,211,211,211,212,212,212,212,213,213,213,213,214,214,214,214, + 215,215,215,215,216,216,216,216,217,217,217,217,218,218,218,218, + 219,219,219,219,220,220,220,220,221,221,221,221,222,223,223,223, + 224,224,224,224,223,223,223,223,225,106,106,106,226,106,106,106, + 106,227,109,109,228,228,228,228,229,229,229,229, 0,230, 86, 0, + 0, 0,230, 7, 82,138, 7, 0, 0, 0,231, 86,232,232,232,232, + 233,233,233,233,234,234,234,234,235,235,235,235,236,236,236,236, + 237,237,237,237,238,238,238,238,239, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 0, + 19, 0, 0, 0, 0, 0, 26, 26, 1, 1, 1, 1, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 55, 55, + 55, 55, 55, 55, 6, 6, 6, 6, 6, 1, 1, 6, 6, 4, 4, 4, + 4, 4, 4, 4, 4, 14, 14, 14, 14, 14, 14, 14, 3, 3, 3, 3, + 3, 0, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 1, + 1, 1, 3, 3, 1, 3, 3, 3, 37, 37, 37, 37, 38, 38, 38, 38, + 64, 64, 64, 64, 90, 90, 90, 90, 95, 95, 95, 95, 3, 3, 0, 3, + 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 0, 0, 7, 7, + 5, 5, 5, 5, 11, 11, 11, 11, 10, 10, 10, 10, 21, 21, 21, 21, + 22, 22, 22, 22, 23, 23, 23, 23, 16, 16, 16, 16, 20, 20, 20, 20, + 36, 36, 36, 36, 24, 24, 24, 24, 24, 24, 24, 0, 18, 18, 18, 18, + 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, 25, 25, 33, 33, 33, 33, + 8, 8, 8, 8, 8, 8, 8, 0, 12, 12, 12, 12, 30, 30, 30, 30, + 29, 29, 29, 29, 28, 28, 28, 28, 34, 34, 34, 34, 35, 35, 35, 35, + 35, 35, 35, 0, 0, 0, 35, 35, 45, 45, 45, 45, 44, 44, 44, 44, + 44, 0, 0, 0, 43, 43, 43, 43, 46, 46, 46, 46, 31, 31, 31, 31, + 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, + 52, 52, 52, 52, 58, 58, 58, 58, 54, 54, 54, 54, 91, 91, 91, 91, + 62, 62, 62, 62, 76, 76, 76, 76, 93, 93, 93, 93, 70, 70, 70, 70, + 73, 73, 73, 73, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 19, 19, 9, 9, 9, 9, 9, 6, + 19, 9, 9, 9, 9, 9, 19, 19, 9, 9, 9, 19, 6, 19, 19, 19, + 19, 19, 19, 9, 0, 0, 0, 19, 0, 0, 9, 0, 0, 0, 19, 19, + 27, 27, 27, 27, 56, 56, 56, 56, 61, 61, 61, 61, 13, 13, 13, 13, + 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, + 0, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 0, 0, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 0, 26, 26, 26, 26, 26, 12, 12, 12, + 12, 12, 12, 0, 39, 39, 39, 39, 86, 86, 86, 86, 77, 77, 77, 77, + 79, 79, 79, 79, 60, 60, 60, 60, 65, 65, 65, 65, 75, 75, 75, 75, + 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 84, 84, 84, 84, + 84, 84, 84, 0, 68, 68, 68, 68, 92, 92, 92, 92, 87, 87, 87, 87, + 19, 9, 19, 19, 19, 19, 0, 0, 2, 2, 2, 2, 19, 19, 19, 4, + 3, 3, 0, 0, 1, 1, 6, 6, 0, 0, 17, 17, 17, 17, 0, 0, + 49, 49, 49, 49, 0, 1, 1, 1, 71, 71, 71, 71, 67, 67, 67, 67, + 42, 42, 42, 42, 41, 41, 41, 41,118,118,118,118, 53, 53, 53, 53, + 59, 59, 59, 59, 40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50, + 135,135,135,135,106,106,106,106,104,104,104,104,161,161,161,161, + 110,110,110,110, 47, 47, 47, 47, 81, 81, 81, 81,120,120,120,120, + 116,116,116,116,128,128,128,128, 66, 66, 66, 66, 72, 72, 72, 72, + 98, 98, 98, 98, 97, 97, 97, 97, 57, 57, 57, 57, 88, 88, 88, 88, + 117,117,117,117,112,112,112,112, 78, 78, 78, 78, 83, 83, 83, 83, + 82, 82, 82, 82,122,122,122,122, 89, 89, 89, 89,130,130,130,130, + 144,144,144,144,156,156,156,156,156, 3, 3, 3,147,147,147,147, + 148,148,148,148,158,158,158,158,153,153,153,153,149,149,149,149, + 94, 94, 94, 94, 85, 85, 85, 85,101,101,101,101, 96, 96, 96, 96, + 111,111,111,111,100,100,100,100,100, 36, 36, 36,108,108,108,108, + 129,129,129,129,109,109,109,109,107,107,107,107,107,107,107, 1, + 137,137,137,137,124,124,124,124,123,123,123,123,114,114,114,114, + 102,102,102,102,126,126,126,126,142,142,142,142,125,125,125,125, + 154,154,154,154,150,150,150,150,141,141,141,141,140,140,140,140, + 121,121,121,121,133,133,133,133,134,134,134,134,138,138,138,138, + 143,143,143,143,145,145,145,145,163,163,163,163, 63, 63, 63, 63, 157,157,157,157, 80, 80, 80, 80,127,127,127,127,115,115,115,115, 159,159,159,159,103,103,103,103,119,119,119,119,146,146,146,146, 99, 99, 99, 99,136,139, 13, 13,155,155,155,155,136,136,136,136, - 17, 15, 15, 15,139,139,139,139,105,105,105,105, 0, 0, 0, 1, - 0, 0, 1, 1,131,131,131,131,151,151,151,151,160,160,160,160, - 152,152,152,152,113,113,113,113,132,132,132,132, 15, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, - 12, 13, 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, + 17, 15, 15, 15, 17, 17, 15, 15, 15, 17, 17, 17,139,139,139,139, + 105,105,105,105, 0, 0, 0, 1, 0, 0, 1, 1,131,131,131,131, + 151,151,151,151,160,160,160,160,152,152,152,152,164,164,164,164, + 113,113,113,113,132,132,132,132, 15, 0, 0, 0, 0, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, 12, 13, 9, 9, + 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -5336,60 +5401,60 @@ _hb_ucd_u8[13246] = 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, - 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, + 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, + 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, - 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, - 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 45, + 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, + 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, + 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, + 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, - 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, - 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 69, 70, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, + 0, 0, 0,105,106, 0,107, 0, 0, 0,108, 0,109, 0,110, 0, + 111,112,113, 0,114, 0, 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 104, 0, 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0,108, 0, - 109, 0,110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, 0, 0, - 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,119, + 120,121, 0,122,123,124,125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,118,119,120,121, 0,122,123,124,125,126, 0,127, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129,130,131,132,133, + 134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149, + 150,151,152,153,154,155,156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129, - 130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145, - 146,147,148,149,150,151,152,153,154,155,156,157, 0, 0, 0,158, - 159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, 0, 0, - 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,162,163, 0, 0, 0, 0, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,169,170, 0, 0, 0, 0,171,172, 0, 0, 0,173,174, - 175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, - 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,169, + 170, 0, 0, 0, 0,171,172, 0, 0, 0,173,174,175,176,177,178, + 179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194, + 195,196,197,198,199,200,201,202,203,204,205,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, }; static const uint16_t -_hb_ucd_u16[4888] = +_hb_ucd_u16[4920] = { 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, @@ -5456,39 +5521,41 @@ _hb_ucd_u16[4888] = 359, 47, 47, 360, 145, 66, 47, 361, 47, 362, 145, 145, 363, 47, 364, 66, 47, 47, 47, 365, 47, 366, 47, 366, 47, 365, 144, 145, 145, 145, 145, 145, 9, 9, 9, 9, 11, 11, 11, 367, 47, 47, 368, 160, 160, 160, 160, 160, - 145, 145, 145, 145, 145, 145, 145, 145, 47, 47, 369, 47, 47, 47, 47, 47, + 145, 145, 145, 145, 145, 145, 145, 145, 47, 47, 369, 47, 47, 47, 47, 143, 47, 362, 370, 47, 60, 371, 66, 47, 372, 66, 66, 47, 373, 145, 47, 47, 374, 47, 47, 360, 375, 376, 377, 378, 180, 47, 47, 379, 380, 47, 47, 160, 97, 47, 381, 382, 383, 47, 47, 384, 180, 47, 47, 385, 386, 387, 388, 145, - 47, 47, 389, 390, 32, 32, 32, 32, 47, 47, 365, 47, 47, 391, 172, 160, + 47, 47, 389, 390, 359, 32, 32, 32, 47, 47, 365, 47, 47, 391, 172, 160, 92, 47, 47, 113, 392, 393, 394, 32, 47, 47, 47, 395, 396, 397, 47, 47, 47, 47, 47, 398, 399, 160, 160, 160, 47, 47, 400, 401, 402, 403, 32, 32, 47, 47, 47, 404, 405, 160, 66, 66, 47, 47, 406, 407, 160, 160, 160, 160, 47, 143, 408, 409, 47, 47, 47, 47, 47, 47, 389, 410, 66, 66, 66, 66, 9, 9, 9, 9, 11, 11, 128, 411, 47, 47, 47, 412, 413, 160, 160, 160, 47, 47, 47, 47, 47, 414, 415, 416, 417, 47, 47, 418, 419, 420, 47, 47, - 421, 422, 66, 47, 47, 47, 47, 47, 47, 47, 400, 423, 424, 128, 145, 425, - 47, 156, 426, 427, 32, 32, 32, 32, 47, 47, 47, 359, 428, 160, 47, 47, - 429, 430, 160, 160, 160, 160, 160, 160, 47, 47, 47, 47, 47, 47, 47, 431, - 47, 47, 47, 47, 145, 432, 433, 434, 219, 219, 219, 219, 219, 219, 219, 66, - 47, 47, 47, 47, 47, 47, 47, 424, 47, 47, 47, 208, 208, 208, 208, 208, - 47, 47, 47, 47, 47, 47, 305, 47, 47, 47, 47, 47, 160, 47, 47, 435, - 47, 47, 47, 436, 437, 438, 439, 47, 9, 9, 9, 9, 9, 9, 11, 11, - 145, 440, 66, 66, 66, 66, 66, 66, 47, 47, 47, 47, 391, 441, 416, 416, - 442, 443, 27, 27, 27, 27, 444, 416, 47, 445, 208, 208, 208, 208, 208, 208, - 32, 32, 32, 32, 32, 146, 146, 146, 146, 146, 146, 146, 146, 146, 446, 447, - 448, 146, 449, 146, 146, 146, 146, 146, 146, 146, 146, 146, 450, 146, 146, 146, - 9, 451, 11, 452, 453, 11, 196, 9, 454, 455, 9, 456, 11, 9, 451, 11, - 452, 453, 11, 196, 9, 454, 455, 9, 456, 11, 9, 451, 11, 452, 453, 11, - 196, 9, 454, 455, 9, 456, 11, 9, 451, 11, 196, 9, 457, 458, 459, 460, - 11, 461, 9, 462, 463, 464, 465, 11, 466, 9, 467, 11, 468, 160, 160, 160, - 32, 32, 32, 469, 32, 32, 470, 471, 472, 473, 32, 32, 32, 32, 32, 32, - 474, 11, 11, 11, 11, 11, 11, 11, 32, 32, 32, 32, 32, 32, 32, 32, - 47, 47, 47, 475, 476, 146, 146, 146, 47, 47, 477, 32, 47, 47, 478, 479, - 47, 47, 47, 47, 355, 32, 32, 32, 9, 9, 454, 11, 480, 305, 66, 66, - 145, 145, 481, 482, 145, 145, 145, 145, 145, 145, 483, 145, 145, 145, 145, 145, - 47, 47, 47, 47, 47, 47, 47, 226, 484, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 146, 146, 146, 146, 146, 485, 146, 146, 146, 146, 146, 146, 146, 160, + 421, 422, 66, 47, 47, 47, 47, 47, 66, 66, 66, 66, 66, 66, 66, 66, + 47, 47, 400, 423, 424, 128, 145, 425, 47, 156, 426, 427, 32, 32, 32, 32, + 47, 47, 47, 359, 428, 160, 47, 47, 429, 430, 160, 160, 160, 160, 160, 160, + 47, 47, 47, 47, 47, 47, 47, 431, 432, 47, 47, 433, 434, 160, 160, 160, + 47, 47, 47, 47, 145, 435, 436, 437, 219, 219, 219, 219, 219, 219, 219, 66, + 47, 47, 47, 47, 47, 47, 47, 424, 47, 47, 47, 208, 438, 32, 32, 32, + 47, 47, 47, 47, 47, 47, 305, 47, 47, 47, 47, 47, 160, 47, 47, 439, + 47, 47, 47, 440, 441, 442, 443, 47, 9, 9, 9, 9, 9, 9, 11, 11, + 145, 444, 66, 66, 66, 66, 66, 66, 47, 47, 47, 47, 391, 445, 416, 416, + 446, 447, 27, 27, 27, 27, 448, 416, 47, 449, 208, 208, 208, 208, 208, 208, + 32, 32, 32, 32, 32, 146, 146, 146, 146, 146, 146, 146, 146, 146, 450, 451, + 452, 146, 453, 146, 146, 146, 146, 146, 146, 146, 146, 146, 454, 146, 146, 146, + 9, 455, 11, 456, 457, 11, 196, 9, 458, 459, 9, 460, 11, 9, 455, 11, + 456, 457, 11, 196, 9, 458, 459, 9, 460, 11, 9, 455, 11, 456, 457, 11, + 196, 9, 458, 459, 9, 460, 11, 9, 455, 11, 196, 9, 461, 462, 463, 464, + 11, 465, 9, 466, 467, 468, 469, 11, 470, 9, 471, 11, 472, 160, 160, 160, + 32, 32, 32, 473, 32, 32, 474, 475, 476, 477, 32, 32, 32, 32, 32, 32, + 478, 11, 11, 11, 11, 11, 11, 11, 32, 32, 32, 27, 27, 27, 27, 27, + 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 47, 479, 480, 146, 146, 146, + 47, 47, 481, 32, 47, 47, 482, 483, 47, 47, 47, 47, 47, 47, 484, 160, + 47, 47, 47, 47, 355, 32, 32, 32, 9, 9, 458, 11, 485, 305, 66, 66, + 145, 145, 486, 487, 145, 145, 145, 145, 145, 145, 488, 145, 145, 145, 145, 145, + 47, 47, 47, 47, 47, 47, 47, 226, 489, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 490, 146, 146, 146, 146, 146, 146, 146, 160, 208, 208, 208, 208, 208, 208, 208, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, 0,1033,1040,1041,1042,1043,1047, 0, @@ -5712,12 +5779,12 @@ _hb_ucd_i16[92] = static inline uint_fast8_t _hb_ucd_gc (unsigned u) { - return u<1114112u?_hb_ucd_u8[5056+(((_hb_ucd_u8[1168+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; + return u<1114112u?_hb_ucd_u8[5080+(((_hb_ucd_u8[1152+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; } static inline uint_fast8_t _hb_ucd_ccc (unsigned u) { - return u<125259u?_hb_ucd_u8[6970+(((_hb_ucd_u8[6426+(((_hb_ucd_u8[5982+(((_hb_ucd_u8[5646+(((_hb_ucd_u8[5400+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; + return u<125259u?_hb_ucd_u8[7038+(((_hb_ucd_u8[6482+(((_hb_ucd_u8[6022+(((_hb_ucd_u8[5670+(((_hb_ucd_u8[5424+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; } static inline unsigned _hb_ucd_b4 (const uint8_t* a, unsigned i) @@ -5727,17 +5794,17 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i) static inline int_fast16_t _hb_ucd_bmg (unsigned u) { - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7858+(((_hb_ucd_u8[7626+(((_hb_ucd_u8[7530+(((_hb_ucd_b4(7466+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0; + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7930+(((_hb_ucd_u8[7698+(((_hb_ucd_u8[7602+(((_hb_ucd_b4(7538+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0; } static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918016u?_hb_ucd_u8[11124+(((_hb_ucd_u8[10176+(((_hb_ucd_u8[9204+(((_hb_ucd_u8[8524+(((_hb_ucd_u8[8220+(((_hb_ucd_u8[8106+(u>>2>>2>>2>>3>>4)])<<4)+((u>>2>>2>>2>>3)&15u))])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; + return u<918016u?_hb_ucd_u8[11228+(((_hb_ucd_u8[10264+(((_hb_ucd_u8[9276+(((_hb_ucd_u8[8596+(((_hb_ucd_u8[8292+(((_hb_ucd_u8[8178+(u>>2>>2>>2>>3>>4)])<<4)+((u>>2>>2>>2>>3)&15u))])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[1576+(((_hb_ucd_u8[12446+(((_hb_ucd_u8[12064+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[1608+(((_hb_ucd_u8[12570+(((_hb_ucd_u8[12188+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; } #endif diff --git a/thirdparty/harfbuzz/src/hb-unicode-emoji-table.hh b/thirdparty/harfbuzz/src/hb-unicode-emoji-table.hh index 036c71a424..13b1c4b1d4 100644 --- a/thirdparty/harfbuzz/src/hb-unicode-emoji-table.hh +++ b/thirdparty/harfbuzz/src/hb-unicode-emoji-table.hh @@ -6,16 +6,16 @@ * * on file with this header: * - * # emoji-data-14.0.0.txt - * # Date: 2021-08-26, 17:22:22 GMT - * # © 2021 Unicode®, Inc. + * # emoji-data.txt + * # Date: 2022-08-02, 00:26:10 GMT + * # © 2022 Unicode®, Inc. * # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. - * # For terms of use, see http://www.unicode.org/terms_of_use.html + * # For terms of use, see https://www.unicode.org/terms_of_use.html * # * # Emoji Data for UTS #51 - * # Used with Emoji Version 14.0 and subsequent minor revisions (if any) + * # Used with Emoji Version 15.0 and subsequent minor revisions (if any) * # - * # For documentation and usage, see http://www.unicode.org/reports/tr51 + * # For documentation and usage, see https://www.unicode.org/reports/tr51 */ #ifndef HB_UNICODE_EMOJI_TABLE_HH diff --git a/thirdparty/harfbuzz/src/hb-version.h b/thirdparty/harfbuzz/src/hb-version.h index a1586a58b6..fa7403cae7 100644 --- a/thirdparty/harfbuzz/src/hb-version.h +++ b/thirdparty/harfbuzz/src/hb-version.h @@ -47,7 +47,7 @@ HB_BEGIN_DECLS * * The minor component of the library version available at compile-time. */ -#define HB_VERSION_MINOR 1 +#define HB_VERSION_MINOR 2 /** * HB_VERSION_MICRO: * @@ -60,7 +60,7 @@ HB_BEGIN_DECLS * * A string literal containing the library version available at compile-time. */ -#define HB_VERSION_STRING "5.1.0" +#define HB_VERSION_STRING "5.2.0" /** * HB_VERSION_ATLEAST: diff --git a/thirdparty/libpng/LICENSE b/thirdparty/libpng/LICENSE index e0c5b531cf..c8ad24eecf 100644 --- a/thirdparty/libpng/LICENSE +++ b/thirdparty/libpng/LICENSE @@ -4,8 +4,8 @@ COPYRIGHT NOTICE, DISCLAIMER, and LICENSE PNG Reference Library License version 2 --------------------------------------- - * Copyright (c) 1995-2019 The PNG Reference Library Authors. - * Copyright (c) 2018-2019 Cosmin Truta. + * Copyright (c) 1995-2022 The PNG Reference Library Authors. + * Copyright (c) 2018-2022 Cosmin Truta. * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. * Copyright (c) 1996-1997 Andreas Dilger. * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. diff --git a/thirdparty/libpng/arm/arm_init.c b/thirdparty/libpng/arm/arm_init.c index a34ecdbef7..ab22525b38 100644 --- a/thirdparty/libpng/arm/arm_init.c +++ b/thirdparty/libpng/arm/arm_init.c @@ -1,7 +1,7 @@ /* arm_init.c - NEON optimised filter functions * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 2014,2016 Glenn Randers-Pehrson * Written by Mans Rullgard, 2011. * @@ -10,9 +10,7 @@ * and license in png.h */ -/* Below, after checking __linux__, various non-C90 POSIX 1003.1 functions are - * called. - */ +/* This module requires POSIX 1003.1 functions. */ #define _POSIX_SOURCE 1 #include "../pngpriv.h" @@ -33,21 +31,23 @@ * has partial support is contrib/arm-neon/linux.c - a generic Linux * implementation which reads /proc/cpufino. */ +#include <signal.h> /* for sig_atomic_t */ + #ifndef PNG_ARM_NEON_FILE -# ifdef __linux__ -# define PNG_ARM_NEON_FILE "contrib/arm-neon/linux.c" +# if defined(__aarch64__) || defined(_M_ARM64) + /* ARM Neon is expected to be unconditionally available on ARM64. */ +# error "PNG_ARM_NEON_CHECK_SUPPORTED must not be defined on this platform" +# elif defined(__linux__) +# define PNG_ARM_NEON_FILE "contrib/arm-neon/linux.c" +# else +# error "No support for run-time ARM Neon checking; use compile-time options" # endif #endif -#ifdef PNG_ARM_NEON_FILE - -#include <signal.h> /* for sig_atomic_t */ static int png_have_neon(png_structp png_ptr); -#include PNG_ARM_NEON_FILE - -#else /* PNG_ARM_NEON_FILE */ -# error "PNG_ARM_NEON_FILE undefined: no support for run-time ARM NEON checks" -#endif /* PNG_ARM_NEON_FILE */ +#ifdef PNG_ARM_NEON_FILE +# include PNG_ARM_NEON_FILE +#endif #endif /* PNG_ARM_NEON_CHECK_SUPPORTED */ #ifndef PNG_ALIGNED_MEMORY_SUPPORTED diff --git a/thirdparty/libpng/arm/filter_neon_intrinsics.c b/thirdparty/libpng/arm/filter_neon_intrinsics.c index 553c0be21c..4466d48b20 100644 --- a/thirdparty/libpng/arm/filter_neon_intrinsics.c +++ b/thirdparty/libpng/arm/filter_neon_intrinsics.c @@ -18,7 +18,7 @@ /* This code requires -mfpu=neon on the command line: */ #if PNG_ARM_NEON_IMPLEMENTATION == 1 /* intrinsics code from pngpriv.h */ -#if defined(_MSC_VER) && defined(_M_ARM64) +#if defined(_MSC_VER) && !defined(__clang__) && defined(_M_ARM64) # include <arm64_neon.h> #else # include <arm_neon.h> diff --git a/thirdparty/libpng/arm/palette_neon_intrinsics.c b/thirdparty/libpng/arm/palette_neon_intrinsics.c index b4d1fd2abf..92c7d6f9f6 100644 --- a/thirdparty/libpng/arm/palette_neon_intrinsics.c +++ b/thirdparty/libpng/arm/palette_neon_intrinsics.c @@ -14,7 +14,7 @@ #if PNG_ARM_NEON_IMPLEMENTATION == 1 -#if defined(_MSC_VER) && defined(_M_ARM64) +#if defined(_MSC_VER) && !defined(__clang__) && defined(_M_ARM64) # include <arm64_neon.h> #else # include <arm_neon.h> @@ -30,8 +30,6 @@ png_riffle_palette_neon(png_structrp png_ptr) int num_trans = png_ptr->num_trans; int i; - png_debug(1, "in png_riffle_palette_neon"); - /* Initially black, opaque. */ uint8x16x4_t w = {{ vdupq_n_u8(0x00), @@ -40,6 +38,8 @@ png_riffle_palette_neon(png_structrp png_ptr) vdupq_n_u8(0xff), }}; + png_debug(1, "in png_riffle_palette_neon"); + /* First, riffle the RGB colours into an RGBA8 palette. * The alpha component is set to opaque for now. */ @@ -65,11 +65,12 @@ png_do_expand_palette_rgba8_neon(png_structrp png_ptr, png_row_infop row_info, png_uint_32 row_width = row_info->width; const png_uint_32 *riffled_palette = (const png_uint_32 *)png_ptr->riffled_palette; - const png_int_32 pixels_per_chunk = 4; - int i; + const png_uint_32 pixels_per_chunk = 4; + png_uint_32 i; png_debug(1, "in png_do_expand_palette_rgba8_neon"); + PNG_UNUSED(row) if (row_width < pixels_per_chunk) return 0; @@ -109,10 +110,11 @@ png_do_expand_palette_rgb8_neon(png_structrp png_ptr, png_row_infop row_info, png_uint_32 row_width = row_info->width; png_const_bytep palette = (png_const_bytep)png_ptr->palette; const png_uint_32 pixels_per_chunk = 8; - int i; + png_uint_32 i; png_debug(1, "in png_do_expand_palette_rgb8_neon"); + PNG_UNUSED(row) if (row_width <= pixels_per_chunk) return 0; diff --git a/thirdparty/libpng/png.c b/thirdparty/libpng/png.c index 757c755f97..fc09564262 100644 --- a/thirdparty/libpng/png.c +++ b/thirdparty/libpng/png.c @@ -1,7 +1,7 @@ /* png.c - location for general purpose libpng functions * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -14,7 +14,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_6_37 Your_png_h_is_not_version_1_6_37; +typedef png_libpng_version_1_6_38 Your_png_h_is_not_version_1_6_38; #ifdef __GNUC__ /* The version tests may need to be added to, but the problem warning has @@ -720,7 +720,7 @@ png_init_io(png_structrp png_ptr, png_FILE_p fp) * * Where UNSIGNED_MAX is the appropriate maximum unsigned value, so when the * negative integral value is added the result will be an unsigned value - * correspnding to the 2's complement representation. + * corresponding to the 2's complement representation. */ void PNGAPI png_save_int_32(png_bytep buf, png_int_32 i) @@ -815,8 +815,8 @@ png_get_copyright(png_const_structrp png_ptr) return PNG_STRING_COPYRIGHT #else return PNG_STRING_NEWLINE \ - "libpng version 1.6.37" PNG_STRING_NEWLINE \ - "Copyright (c) 2018-2019 Cosmin Truta" PNG_STRING_NEWLINE \ + "libpng version 1.6.38" PNG_STRING_NEWLINE \ + "Copyright (c) 2018-2022 Cosmin Truta" PNG_STRING_NEWLINE \ "Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \ PNG_STRING_NEWLINE \ "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ @@ -1843,12 +1843,12 @@ png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace, # ifdef PNG_WARNINGS_SUPPORTED else { - char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114*/ + char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114 */ pos = png_safecat(message, (sizeof message), pos, png_format_number(number, number+(sizeof number), PNG_NUMBER_FORMAT_x, value)); - pos = png_safecat(message, (sizeof message), pos, "h: "); /*+2 = 116*/ + pos = png_safecat(message, (sizeof message), pos, "h: "); /* +2 = 116 */ } # endif /* The 'reason' is an arbitrary message, allow +79 maximum 195 */ diff --git a/thirdparty/libpng/png.h b/thirdparty/libpng/png.h index b12174ba35..5fb494fb1a 100644 --- a/thirdparty/libpng/png.h +++ b/thirdparty/libpng/png.h @@ -1,9 +1,9 @@ /* png.h - header file for PNG reference library * - * libpng version 1.6.37 - April 14, 2019 + * libpng version 1.6.38 - September 14, 2022 * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -15,7 +15,7 @@ * libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger * libpng versions 0.97, January 1998, through 1.6.35, July 2018: * Glenn Randers-Pehrson - * libpng versions 1.6.36, December 2018, through 1.6.37, April 2019: + * libpng versions 1.6.36, December 2018, through 1.6.38, September 2022: * Cosmin Truta * See also "Contributing Authors", below. */ @@ -27,8 +27,8 @@ * PNG Reference Library License version 2 * --------------------------------------- * - * * Copyright (c) 1995-2019 The PNG Reference Library Authors. - * * Copyright (c) 2018-2019 Cosmin Truta. + * * Copyright (c) 1995-2022 The PNG Reference Library Authors. + * * Copyright (c) 2018-2022 Cosmin Truta. * * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. * * Copyright (c) 1996-1997 Andreas Dilger. * * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -239,7 +239,7 @@ * ... * 1.5.30 15 10530 15.so.15.30[.0] * ... - * 1.6.37 16 10637 16.so.16.37[.0] + * 1.6.38 16 10638 16.so.16.38[.0] * * Henceforth the source version will match the shared-library major and * minor numbers; the shared-library major version number will be used for @@ -278,8 +278,8 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.6.37" -#define PNG_HEADER_VERSION_STRING " libpng version 1.6.37 - April 14, 2019\n" +#define PNG_LIBPNG_VER_STRING "1.6.38" +#define PNG_HEADER_VERSION_STRING " libpng version 1.6.38 - September 14, 2022\n" #define PNG_LIBPNG_VER_SONUM 16 #define PNG_LIBPNG_VER_DLLNUM 16 @@ -287,7 +287,7 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 6 -#define PNG_LIBPNG_VER_RELEASE 37 +#define PNG_LIBPNG_VER_RELEASE 38 /* This should be zero for a public release, or non-zero for a * development version. [Deprecated] @@ -318,7 +318,7 @@ * From version 1.0.1 it is: * XXYYZZ, where XX=major, YY=minor, ZZ=release */ -#define PNG_LIBPNG_VER 10637 /* 1.6.37 */ +#define PNG_LIBPNG_VER 10638 /* 1.6.38 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -330,10 +330,6 @@ # include "pnglibconf.h" #endif -#define PNG_APNG_SUPPORTED -#define PNG_READ_APNG_SUPPORTED -#define PNG_WRITE_APNG_SUPPORTED - #ifndef PNG_VERSION_INFO_ONLY /* Machine specific configuration. */ # include "pngconf.h" @@ -429,21 +425,10 @@ extern "C" { * See pngconf.h for base types that vary by machine/system */ -#ifdef PNG_APNG_SUPPORTED -/* dispose_op flags from inside fcTL */ -#define PNG_DISPOSE_OP_NONE 0x00U -#define PNG_DISPOSE_OP_BACKGROUND 0x01U -#define PNG_DISPOSE_OP_PREVIOUS 0x02U - -/* blend_op flags from inside fcTL */ -#define PNG_BLEND_OP_SOURCE 0x00U -#define PNG_BLEND_OP_OVER 0x01U -#endif /* PNG_APNG_SUPPORTED */ - /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char* png_libpng_version_1_6_37; +typedef char* png_libpng_version_1_6_38; /* Basic control structions. Read libpng-manual.txt or libpng.3 for more info. * @@ -761,10 +746,6 @@ typedef png_unknown_chunk * * png_unknown_chunkpp; #define PNG_INFO_sCAL 0x4000U /* ESR, 1.0.6 */ #define PNG_INFO_IDAT 0x8000U /* ESR, 1.0.6 */ #define PNG_INFO_eXIf 0x10000U /* GR-P, 1.6.31 */ -#ifdef PNG_APNG_SUPPORTED -#define PNG_INFO_acTL 0x20000U -#define PNG_INFO_fcTL 0x40000U -#endif /* This is used for the transformation routines, as some of them * change these values for the row. It also should enable using @@ -802,10 +783,6 @@ typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32, #ifdef PNG_PROGRESSIVE_READ_SUPPORTED typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop)); typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop)); -#ifdef PNG_APNG_SUPPORTED -typedef PNG_CALLBACK(void, *png_progressive_frame_ptr, (png_structp, - png_uint_32)); -#endif /* The following callback receives png_uint_32 row_number, int pass for the * png_bytep data of the row. When transforming an interlaced image the @@ -1469,7 +1446,7 @@ PNG_EXPORT(66, void, png_set_crc_action, (png_structrp png_ptr, int crit_action, * mainly useful for testing, as the defaults should work with most users. * Those users who are tight on memory or want faster performance at the * expense of compression can modify them. See the compression library - * header file (zlib.h) for an explination of the compression functions. + * header file (zlib.h) for an explanation of the compression functions. */ /* Set the filtering method(s) used by libpng. Currently, the only valid @@ -1524,7 +1501,7 @@ PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 * (0 - no compression, 9 - "maximal" compression). Note that tests have * shown that zlib compression levels 3-6 usually perform as well as level 9 - * for PNG images, and do considerably fewer caclulations. In the future, + * for PNG images, and do considerably fewer calculations. In the future, * these values may not correspond directly to the zlib compression levels. */ #ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED @@ -3249,74 +3226,6 @@ PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option, /******************************************************************************* * END OF HARDWARE AND SOFTWARE OPTIONS ******************************************************************************/ -#ifdef PNG_APNG_SUPPORTED -PNG_EXPORT(250, png_uint_32, png_get_acTL, (png_structp png_ptr, - png_infop info_ptr, png_uint_32 *num_frames, png_uint_32 *num_plays)); - -PNG_EXPORT(251, png_uint_32, png_set_acTL, (png_structp png_ptr, - png_infop info_ptr, png_uint_32 num_frames, png_uint_32 num_plays)); - -PNG_EXPORT(252, png_uint_32, png_get_num_frames, (png_structp png_ptr, - png_infop info_ptr)); - -PNG_EXPORT(253, png_uint_32, png_get_num_plays, (png_structp png_ptr, - png_infop info_ptr)); - -PNG_EXPORT(254, png_uint_32, png_get_next_frame_fcTL, - (png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, - png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset, - png_uint_16 *delay_num, png_uint_16 *delay_den, png_byte *dispose_op, - png_byte *blend_op)); - -PNG_EXPORT(255, png_uint_32, png_set_next_frame_fcTL, - (png_structp png_ptr, png_infop info_ptr, png_uint_32 width, - png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, - png_byte blend_op)); - -PNG_EXPORT(256, png_uint_32, png_get_next_frame_width, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(257, png_uint_32, png_get_next_frame_height, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(258, png_uint_32, png_get_next_frame_x_offset, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(259, png_uint_32, png_get_next_frame_y_offset, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(260, png_uint_16, png_get_next_frame_delay_num, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(261, png_uint_16, png_get_next_frame_delay_den, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(262, png_byte, png_get_next_frame_dispose_op, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(263, png_byte, png_get_next_frame_blend_op, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(264, png_byte, png_get_first_frame_is_hidden, - (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(265, png_uint_32, png_set_first_frame_is_hidden, - (png_structp png_ptr, png_infop info_ptr, png_byte is_hidden)); - -#ifdef PNG_READ_APNG_SUPPORTED -PNG_EXPORT(266, void, png_read_frame_head, (png_structp png_ptr, - png_infop info_ptr)); -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_EXPORT(267, void, png_set_progressive_frame_fn, (png_structp png_ptr, - png_progressive_frame_ptr frame_info_fn, - png_progressive_frame_ptr frame_end_fn)); -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ -#endif /* PNG_READ_APNG_SUPPORTED */ - -#ifdef PNG_WRITE_APNG_SUPPORTED -PNG_EXPORT(268, void, png_write_frame_head, (png_structp png_ptr, - png_infop info_ptr, png_bytepp row_pointers, - png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, - png_byte blend_op)); - -PNG_EXPORT(269, void, png_write_frame_tail, (png_structp png_ptr, - png_infop info_ptr)); -#endif /* PNG_WRITE_APNG_SUPPORTED */ -#endif /* PNG_APNG_SUPPORTED */ /* Maintainer: Put new public prototypes here ^, in libpng.3, in project * defs, and in scripts/symbols.def. @@ -3326,11 +3235,7 @@ PNG_EXPORT(269, void, png_write_frame_tail, (png_structp png_ptr, * one to use is one more than this.) */ #ifdef PNG_EXPORT_LAST_ORDINAL -#ifdef PNG_APNG_SUPPORTED - PNG_EXPORT_LAST_ORDINAL(269); -#else PNG_EXPORT_LAST_ORDINAL(249); -#endif /* PNG_APNG_SUPPORTED */ #endif #ifdef __cplusplus diff --git a/thirdparty/libpng/pngconf.h b/thirdparty/libpng/pngconf.h index 927a769dbe..89d28f83a0 100644 --- a/thirdparty/libpng/pngconf.h +++ b/thirdparty/libpng/pngconf.h @@ -1,9 +1,9 @@ /* pngconf.h - machine-configurable file for libpng * - * libpng version 1.6.37 + * libpng version 1.6.38 * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -180,8 +180,8 @@ * compiler-specific macros to the values required to change the calling * conventions of the various functions. */ -#if defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ - defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +#if defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || \ + defined(__CYGWIN__) /* Windows system (DOS doesn't support DLLs). Includes builds under Cygwin or * MinGW on any architecture currently supported by Windows. Also includes * Watcom builds but these need special treatment because they are not diff --git a/thirdparty/libpng/pngget.c b/thirdparty/libpng/pngget.c index 9ed101aedc..e44933c0d2 100644 --- a/thirdparty/libpng/pngget.c +++ b/thirdparty/libpng/pngget.c @@ -1151,7 +1151,7 @@ png_get_unknown_chunks(png_const_structrp png_ptr, png_inforp info_ptr, #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED png_byte PNGAPI -png_get_rgb_to_gray_status (png_const_structrp png_ptr) +png_get_rgb_to_gray_status(png_const_structrp png_ptr) { return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0); } @@ -1192,27 +1192,27 @@ png_get_compression_buffer_size(png_const_structrp png_ptr) /* These functions were added to libpng 1.2.6 and were enabled * by default in libpng-1.4.0 */ png_uint_32 PNGAPI -png_get_user_width_max (png_const_structrp png_ptr) +png_get_user_width_max(png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_width_max : 0); } png_uint_32 PNGAPI -png_get_user_height_max (png_const_structrp png_ptr) +png_get_user_height_max(png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_height_max : 0); } /* This function was added to libpng 1.4.0 */ png_uint_32 PNGAPI -png_get_chunk_cache_max (png_const_structrp png_ptr) +png_get_chunk_cache_max(png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_chunk_cache_max : 0); } /* This function was added to libpng 1.4.1 */ png_alloc_size_t PNGAPI -png_get_chunk_malloc_max (png_const_structrp png_ptr) +png_get_chunk_malloc_max(png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_chunk_malloc_max : 0); } @@ -1221,13 +1221,13 @@ png_get_chunk_malloc_max (png_const_structrp png_ptr) /* These functions were added to libpng 1.4.0 */ #ifdef PNG_IO_STATE_SUPPORTED png_uint_32 PNGAPI -png_get_io_state (png_const_structrp png_ptr) +png_get_io_state(png_const_structrp png_ptr) { return png_ptr->io_state; } png_uint_32 PNGAPI -png_get_io_chunk_type (png_const_structrp png_ptr) +png_get_io_chunk_type(png_const_structrp png_ptr) { return png_ptr->chunk_name; } @@ -1246,166 +1246,4 @@ png_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr) # endif #endif -#ifdef PNG_APNG_SUPPORTED -png_uint_32 PNGAPI -png_get_acTL(png_structp png_ptr, png_infop info_ptr, - png_uint_32 *num_frames, png_uint_32 *num_plays) -{ - png_debug1(1, "in %s retrieval function", "acTL"); - - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_acTL) && - num_frames != NULL && num_plays != NULL) - { - *num_frames = info_ptr->num_frames; - *num_plays = info_ptr->num_plays; - return (1); - } - - return (0); -} - -png_uint_32 PNGAPI -png_get_num_frames(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_num_frames()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->num_frames); - return (0); -} - -png_uint_32 PNGAPI -png_get_num_plays(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_num_plays()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->num_plays); - return (0); -} - -png_uint_32 PNGAPI -png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr, - png_uint_32 *width, png_uint_32 *height, - png_uint_32 *x_offset, png_uint_32 *y_offset, - png_uint_16 *delay_num, png_uint_16 *delay_den, - png_byte *dispose_op, png_byte *blend_op) -{ - png_debug1(1, "in %s retrieval function", "fcTL"); - - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_fcTL) && - width != NULL && height != NULL && - x_offset != NULL && y_offset != NULL && - delay_num != NULL && delay_den != NULL && - dispose_op != NULL && blend_op != NULL) - { - *width = info_ptr->next_frame_width; - *height = info_ptr->next_frame_height; - *x_offset = info_ptr->next_frame_x_offset; - *y_offset = info_ptr->next_frame_y_offset; - *delay_num = info_ptr->next_frame_delay_num; - *delay_den = info_ptr->next_frame_delay_den; - *dispose_op = info_ptr->next_frame_dispose_op; - *blend_op = info_ptr->next_frame_blend_op; - return (1); - } - - return (0); -} - -png_uint_32 PNGAPI -png_get_next_frame_width(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_width()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_width); - return (0); -} - -png_uint_32 PNGAPI -png_get_next_frame_height(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_height()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_height); - return (0); -} - -png_uint_32 PNGAPI -png_get_next_frame_x_offset(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_x_offset()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_x_offset); - return (0); -} - -png_uint_32 PNGAPI -png_get_next_frame_y_offset(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_y_offset()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_y_offset); - return (0); -} - -png_uint_16 PNGAPI -png_get_next_frame_delay_num(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_delay_num()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_delay_num); - return (0); -} - -png_uint_16 PNGAPI -png_get_next_frame_delay_den(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_delay_den()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_delay_den); - return (0); -} - -png_byte PNGAPI -png_get_next_frame_dispose_op(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_dispose_op()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_dispose_op); - return (0); -} - -png_byte PNGAPI -png_get_next_frame_blend_op(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_get_next_frame_blend_op()"); - - if (png_ptr != NULL && info_ptr != NULL) - return (info_ptr->next_frame_blend_op); - return (0); -} - -png_byte PNGAPI -png_get_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_first_frame_is_hidden()"); - - if (png_ptr != NULL) - return (png_byte)(png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN); - - PNG_UNUSED(info_ptr) - - return 0; -} -#endif /* PNG_APNG_SUPPORTED */ #endif /* READ || WRITE */ diff --git a/thirdparty/libpng/pnginfo.h b/thirdparty/libpng/pnginfo.h index ac7b269132..1f98dedc42 100644 --- a/thirdparty/libpng/pnginfo.h +++ b/thirdparty/libpng/pnginfo.h @@ -263,18 +263,5 @@ defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytepp row_pointers; /* the image bits */ #endif -#ifdef PNG_APNG_SUPPORTED - png_uint_32 num_frames; /* including default image */ - png_uint_32 num_plays; - png_uint_32 next_frame_width; - png_uint_32 next_frame_height; - png_uint_32 next_frame_x_offset; - png_uint_32 next_frame_y_offset; - png_uint_16 next_frame_delay_num; - png_uint_16 next_frame_delay_den; - png_byte next_frame_dispose_op; - png_byte next_frame_blend_op; -#endif - }; #endif /* PNGINFO_H */ diff --git a/thirdparty/libpng/pnglibconf.h b/thirdparty/libpng/pnglibconf.h index e1e27e957e..89d5b4c8ad 100644 --- a/thirdparty/libpng/pnglibconf.h +++ b/thirdparty/libpng/pnglibconf.h @@ -1,8 +1,8 @@ /* pnglibconf.h - library build configuration */ -/* libpng version 1.6.37 */ +/* libpng version 1.6.38 */ -/* Copyright (c) 2018-2019 Cosmin Truta */ +/* Copyright (c) 2018-2022 Cosmin Truta */ /* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */ /* This code is released under the libpng license. */ diff --git a/thirdparty/libpng/pngpread.c b/thirdparty/libpng/pngpread.c index 2eaeca08f7..e283627b77 100644 --- a/thirdparty/libpng/pngpread.c +++ b/thirdparty/libpng/pngpread.c @@ -195,106 +195,6 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) chunk_name = png_ptr->chunk_name; -#ifdef PNG_READ_APNG_SUPPORTED - if (png_ptr->num_frames_read > 0 && - png_ptr->num_frames_read < info_ptr->num_frames) - { - if (chunk_name == png_IDAT) - { - /* Discard trailing IDATs for the first frame */ - if (png_ptr->mode & PNG_HAVE_fcTL || png_ptr->num_frames_read > 1) - png_error(png_ptr, "out of place IDAT"); - - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; - return; - } - else if (chunk_name == png_fdAT) - { - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_ensure_sequence_number(png_ptr, 4); - - if (!(png_ptr->mode & PNG_HAVE_fcTL)) - { - /* Discard trailing fdATs for frames other than the first */ - if (png_ptr->num_frames_read < 2) - png_error(png_ptr, "out of place fdAT"); - - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; - return; - } - - else - { - /* frame data follows */ - png_ptr->idat_size = png_ptr->push_length - 4; - png_ptr->mode |= PNG_HAVE_IDAT; - png_ptr->process_mode = PNG_READ_IDAT_MODE; - - return; - } - } - - else if (chunk_name == png_fcTL) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_read_reset(png_ptr); - png_ptr->mode &= ~PNG_HAVE_fcTL; - - png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length); - - if (!(png_ptr->mode & PNG_HAVE_fcTL)) - png_error(png_ptr, "missing required fcTL chunk"); - - png_read_reinit(png_ptr, info_ptr); - png_progressive_read_reset(png_ptr); - - if (png_ptr->frame_info_fn != NULL) - (*(png_ptr->frame_info_fn))(png_ptr, png_ptr->num_frames_read); - - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; - - return; - } - - else - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_warning(png_ptr, "Skipped (ignored) a chunk " - "between APNG chunks"); - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; - return; - } - - return; - } -#endif /* PNG_READ_APNG_SUPPORTED */ - if (chunk_name == png_IDAT) { if ((png_ptr->mode & PNG_AFTER_IDAT) != 0) @@ -361,9 +261,6 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) else if (chunk_name == png_IDAT) { -#ifdef PNG_READ_APNG_SUPPORTED - png_have_info(png_ptr, info_ptr); -#endif png_ptr->idat_size = png_ptr->push_length; png_ptr->process_mode = PNG_READ_IDAT_MODE; png_push_have_info(png_ptr, info_ptr); @@ -509,30 +406,6 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); } #endif -#ifdef PNG_READ_APNG_SUPPORTED - else if (chunk_name == png_acTL) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_acTL(png_ptr, info_ptr, png_ptr->push_length); - } - - else if (chunk_name == png_fcTL) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif /* PNG_READ_APNG_SUPPORTED */ else { @@ -666,11 +539,7 @@ png_push_read_IDAT(png_structrp png_ptr) png_byte chunk_tag[4]; /* TODO: this code can be commoned up with the same code in push_read */ -#ifdef PNG_READ_APNG_SUPPORTED - PNG_PUSH_SAVE_BUFFER_IF_LT(12) -#else PNG_PUSH_SAVE_BUFFER_IF_LT(8) -#endif png_push_fill_buffer(png_ptr, chunk_length, 4); png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); png_reset_crc(png_ptr); @@ -678,64 +547,17 @@ png_push_read_IDAT(png_structrp png_ptr) png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag); png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; -#ifdef PNG_READ_APNG_SUPPORTED - if (png_ptr->chunk_name != png_fdAT && png_ptr->num_frames_read > 0) - { - if (png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) - { - png_ptr->process_mode = PNG_READ_CHUNK_MODE; - if (png_ptr->frame_end_fn != NULL) - (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read); - png_ptr->num_frames_read++; - return; - } - else - { - if (png_ptr->chunk_name == png_IEND) - png_error(png_ptr, "Not enough image data"); - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_warning(png_ptr, "Skipping (ignoring) a chunk between " - "APNG chunks"); - png_crc_finish(png_ptr, png_ptr->push_length); - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; - return; - } - } - else -#endif -#ifdef PNG_READ_APNG_SUPPORTED - if (png_ptr->chunk_name != png_IDAT && png_ptr->num_frames_read == 0) -#else if (png_ptr->chunk_name != png_IDAT) -#endif { png_ptr->process_mode = PNG_READ_CHUNK_MODE; if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0) png_error(png_ptr, "Not enough compressed data"); -#ifdef PNG_READ_APNG_SUPPORTED - if (png_ptr->frame_end_fn != NULL) - (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read); - png_ptr->num_frames_read++; -#endif - return; } png_ptr->idat_size = png_ptr->push_length; - -#ifdef PNG_READ_APNG_SUPPORTED - if (png_ptr->num_frames_read > 0) - { - png_ensure_sequence_number(png_ptr, 4); - png_ptr->idat_size -= 4; - } -#endif } if (png_ptr->idat_size != 0 && png_ptr->save_buffer_size != 0) @@ -809,15 +631,6 @@ png_process_IDAT_data(png_structrp png_ptr, png_bytep buffer, if (!(buffer_length > 0) || buffer == NULL) png_error(png_ptr, "No IDAT data (internal error)"); -#ifdef PNG_READ_APNG_SUPPORTED - /* If the app is not APNG-aware, decode only the first frame */ - if (!(png_ptr->apng_flags & PNG_APNG_APP) && png_ptr->num_frames_read > 0) - { - png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; - return; - } -#endif - /* This routine must process all the data it has been given * before returning, calling the row callback as required to * handle the uncompressed results. @@ -1272,18 +1085,6 @@ png_set_progressive_read_fn(png_structrp png_ptr, png_voidp progressive_ptr, png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); } -#ifdef PNG_READ_APNG_SUPPORTED -void PNGAPI -png_set_progressive_frame_fn(png_structp png_ptr, - png_progressive_frame_ptr frame_info_fn, - png_progressive_frame_ptr frame_end_fn) -{ - png_ptr->frame_info_fn = frame_info_fn; - png_ptr->frame_end_fn = frame_end_fn; - png_ptr->apng_flags |= PNG_APNG_APP; -} -#endif - png_voidp PNGAPI png_get_progressive_ptr(png_const_structrp png_ptr) { diff --git a/thirdparty/libpng/pngpriv.h b/thirdparty/libpng/pngpriv.h index 57e1bf989b..2e426cf47d 100644 --- a/thirdparty/libpng/pngpriv.h +++ b/thirdparty/libpng/pngpriv.h @@ -1,7 +1,7 @@ /* pngpriv.h - private declarations for use inside libpng * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -174,7 +174,7 @@ # else /* !defined __ARM_NEON__ */ /* The 'intrinsics' code simply won't compile without this -mfpu=neon: */ -# if !defined(__aarch64__) +# if !defined(__aarch64__) && !defined(_M_ARM64) /* The assembler code currently does not work on ARM64 */ # define PNG_ARM_NEON_IMPLEMENTATION 2 # endif /* __aarch64__ */ @@ -185,6 +185,8 @@ /* Use the intrinsics code by default. */ # define PNG_ARM_NEON_IMPLEMENTATION 1 # endif +#else /* PNG_ARM_NEON_OPT == 0 */ +# define PNG_ARM_NEON_IMPLEMENTATION 0 #endif /* PNG_ARM_NEON_OPT > 0 */ #ifndef PNG_MIPS_MSA_OPT @@ -263,11 +265,15 @@ # ifndef PNG_MIPS_MSA_IMPLEMENTATION # define PNG_MIPS_MSA_IMPLEMENTATION 1 # endif +#else +# define PNG_MIPS_MSA_IMPLEMENTATION 0 #endif /* PNG_MIPS_MSA_OPT > 0 */ #if PNG_POWERPC_VSX_OPT > 0 # define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_vsx # define PNG_POWERPC_VSX_IMPLEMENTATION 1 +#else +# define PNG_POWERPC_VSX_IMPLEMENTATION 0 #endif @@ -492,16 +498,7 @@ static_cast<type>(static_cast<const void*>(value)) #else # define png_voidcast(type, value) (value) -# ifdef _WIN64 -# ifdef __GNUC__ - typedef unsigned long long png_ptruint; -# else - typedef unsigned __int64 png_ptruint; -# endif -# else - typedef unsigned long png_ptruint; -# endif -# define png_constcast(type, value) ((type)(png_ptruint)(const void*)(value)) +# define png_constcast(type, value) ((type)(void*)(const void*)(value)) # define png_aligncast(type, value) ((void*)(value)) # define png_aligncastconst(type, value) ((const void*)(value)) #endif /* __cplusplus */ @@ -543,9 +540,8 @@ # include <alloc.h> #endif -#if defined(WIN32) || defined(_Windows) || defined(_WINDOWS) || \ - defined(_WIN32) || defined(__WIN32__) -# include <windows.h> /* defines _WINDOWS_ macro */ +#if defined(_WIN32) || defined(__WIN32__) || defined(__NT__) +# include <windows.h> #endif #endif /* PNG_VERSION_INFO_ONLY */ @@ -554,24 +550,20 @@ * functions that are passed far data must be model-independent. */ -/* Memory model/platform independent fns */ +/* Platform-independent functions */ #ifndef PNG_ABORT -# ifdef _WINDOWS_ -# define PNG_ABORT() ExitProcess(0) -# else -# define PNG_ABORT() abort() -# endif +# define PNG_ABORT() abort() #endif /* These macros may need to be architecture dependent. */ -#define PNG_ALIGN_NONE 0 /* do not use data alignment */ -#define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */ +#define PNG_ALIGN_NONE 0 /* do not use data alignment */ +#define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */ #ifdef offsetof -# define PNG_ALIGN_OFFSET 2 /* use offsetof to determine alignment */ +# define PNG_ALIGN_OFFSET 2 /* use offsetof to determine alignment */ #else # define PNG_ALIGN_OFFSET -1 /* prevent the use of this */ #endif -#define PNG_ALIGN_SIZE 3 /* use sizeof to determine alignment */ +#define PNG_ALIGN_SIZE 3 /* use sizeof to determine alignment */ #ifndef PNG_ALIGN_TYPE /* Default to using aligned access optimizations and requiring alignment to a @@ -585,26 +577,25 @@ /* This is used because in some compiler implementations non-aligned * structure members are supported, so the offsetof approach below fails. * Set PNG_ALIGN_SIZE=0 for compiler combinations where unaligned access - * is good for performance. Do not do this unless you have tested the result - * and understand it. + * is good for performance. Do not do this unless you have tested the + * result and understand it. */ -# define png_alignof(type) (sizeof (type)) +# define png_alignof(type) (sizeof(type)) #else # if PNG_ALIGN_TYPE == PNG_ALIGN_OFFSET -# define png_alignof(type) offsetof(struct{char c; type t;}, t) +# define png_alignof(type) offsetof(struct{char c; type t;}, t) # else -# if PNG_ALIGN_TYPE == PNG_ALIGN_ALWAYS -# define png_alignof(type) (1) -# endif - /* Else leave png_alignof undefined to prevent use thereof */ +# if PNG_ALIGN_TYPE == PNG_ALIGN_ALWAYS +# define png_alignof(type) 1 +# endif + /* Else leave png_alignof undefined to prevent use thereof */ # endif #endif -/* This implicitly assumes alignment is always to a power of 2. */ +/* This implicitly assumes alignment is always a multiple of 2. */ #ifdef png_alignof -# define png_isaligned(ptr, type)\ - (((type)((const char*)ptr-(const char*)0) & \ - (type)(png_alignof(type)-1)) == 0) +# define png_isaligned(ptr, type) \ + (((type)(size_t)((const void*)(ptr)) & (type)(png_alignof(type)-1)) == 0) #else # define png_isaligned(ptr, type) 0 #endif @@ -637,10 +628,6 @@ #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000U /* Have another chunk after IDAT */ /* 0x4000U (unused) */ #define PNG_IS_READ_STRUCT 0x8000U /* Else is a write struct */ -#ifdef PNG_APNG_SUPPORTED -#define PNG_HAVE_acTL 0x10000U -#define PNG_HAVE_fcTL 0x20000U -#endif /* Flags for the transformations the PNG library does on the image data */ #define PNG_BGR 0x0001U @@ -877,16 +864,6 @@ #define png_tRNS PNG_U32(116, 82, 78, 83) #define png_zTXt PNG_U32(122, 84, 88, 116) -#ifdef PNG_APNG_SUPPORTED -#define png_acTL PNG_U32( 97, 99, 84, 76) -#define png_fcTL PNG_U32(102, 99, 84, 76) -#define png_fdAT PNG_U32(102, 100, 65, 84) - -/* For png_struct.apng_flags: */ -#define PNG_FIRST_FRAME_HIDDEN 0x0001U -#define PNG_APNG_APP 0x0002U -#endif - /* The following will work on (signed char*) strings, whereas the get_uint_32 * macro will fail on top-bit-set values because of the sign extension. */ @@ -1658,47 +1635,6 @@ PNG_INTERNAL_FUNCTION(void,png_colorspace_sync,(png_const_structrp png_ptr, */ #endif -#ifdef PNG_APNG_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_ensure_fcTL_is_valid,(png_structp png_ptr, - png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, - png_byte dispose_op, png_byte blend_op), PNG_EMPTY); - -#ifdef PNG_READ_APNG_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_acTL,(png_structp png_ptr, png_infop info_ptr, - png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_handle_fcTL,(png_structp png_ptr, png_infop info_ptr, - png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_handle_fdAT,(png_structp png_ptr, png_infop info_ptr, - png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_have_info,(png_structp png_ptr, png_infop info_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_ensure_sequence_number,(png_structp png_ptr, - png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_read_reset,(png_structp png_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_read_reinit,(png_structp png_ptr, - png_infop info_ptr),PNG_EMPTY); -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_progressive_read_reset,(png_structp png_ptr),PNG_EMPTY); -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ -#endif /* PNG_READ_APNG_SUPPORTED */ - -#ifdef PNG_WRITE_APNG_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_acTL,(png_structp png_ptr, - png_uint_32 num_frames, png_uint_32 num_plays),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_write_fcTL,(png_structp png_ptr, - png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, - png_byte dispose_op, png_byte blend_op),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_write_fdAT,(png_structp png_ptr, - png_const_bytep data, png_size_t length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_write_reset,(png_structp png_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_write_reinit,(png_structp png_ptr, - png_infop info_ptr, png_uint_32 width, png_uint_32 height),PNG_EMPTY); -#endif /* PNG_WRITE_APNG_SUPPORTED */ -#endif /* PNG_APNG_SUPPORTED */ - /* Added at libpng version 1.4.0 */ #ifdef PNG_COLORSPACE_SUPPORTED /* These internal functions are for maintaining the colorspace structure within diff --git a/thirdparty/libpng/pngread.c b/thirdparty/libpng/pngread.c index fa44d5a8e4..5ab9224038 100644 --- a/thirdparty/libpng/pngread.c +++ b/thirdparty/libpng/pngread.c @@ -161,9 +161,6 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr) else if (chunk_name == png_IDAT) { -#ifdef PNG_READ_APNG_SUPPORTED - png_have_info(png_ptr, info_ptr); -#endif png_ptr->idat_size = length; break; } @@ -258,17 +255,6 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr) png_handle_iTXt(png_ptr, info_ptr, length); #endif -#ifdef PNG_READ_APNG_SUPPORTED - else if (chunk_name == png_acTL) - png_handle_acTL(png_ptr, info_ptr, length); - - else if (chunk_name == png_fcTL) - png_handle_fcTL(png_ptr, info_ptr, length); - - else if (chunk_name == png_fdAT) - png_handle_fdAT(png_ptr, info_ptr, length); -#endif - else png_handle_unknown(png_ptr, info_ptr, length, PNG_HANDLE_CHUNK_AS_DEFAULT); @@ -276,72 +262,6 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr) } #endif /* SEQUENTIAL_READ */ -#ifdef PNG_READ_APNG_SUPPORTED -void PNGAPI -png_read_frame_head(png_structp png_ptr, png_infop info_ptr) -{ - png_byte have_chunk_after_DAT; /* after IDAT or after fdAT */ - - png_debug(0, "Reading frame head"); - - if (!(png_ptr->mode & PNG_HAVE_acTL)) - png_error(png_ptr, "attempt to png_read_frame_head() but " - "no acTL present"); - - /* do nothing for the main IDAT */ - if (png_ptr->num_frames_read == 0) - return; - - png_read_reset(png_ptr); - png_ptr->flags &= ~PNG_FLAG_ROW_INIT; - png_ptr->mode &= ~PNG_HAVE_fcTL; - - have_chunk_after_DAT = 0; - for (;;) - { - png_uint_32 length = png_read_chunk_header(png_ptr); - - if (png_ptr->chunk_name == png_IDAT) - { - /* discard trailing IDATs for the first frame */ - if (have_chunk_after_DAT || png_ptr->num_frames_read > 1) - png_error(png_ptr, "png_read_frame_head(): out of place IDAT"); - png_crc_finish(png_ptr, length); - } - - else if (png_ptr->chunk_name == png_fcTL) - { - png_handle_fcTL(png_ptr, info_ptr, length); - have_chunk_after_DAT = 1; - } - - else if (png_ptr->chunk_name == png_fdAT) - { - png_ensure_sequence_number(png_ptr, length); - - /* discard trailing fdATs for frames other than the first */ - if (!have_chunk_after_DAT && png_ptr->num_frames_read > 1) - png_crc_finish(png_ptr, length - 4); - else if(png_ptr->mode & PNG_HAVE_fcTL) - { - png_ptr->idat_size = length - 4; - png_ptr->mode |= PNG_HAVE_IDAT; - - break; - } - else - png_error(png_ptr, "png_read_frame_head(): out of place fdAT"); - } - else - { - png_warning(png_ptr, "Skipped (ignored) a chunk " - "between APNG chunks"); - png_crc_finish(png_ptr, length); - } - } -} -#endif /* PNG_READ_APNG_SUPPORTED */ - /* Optional call to update the users info_ptr structure */ void PNGAPI png_read_update_info(png_structrp png_ptr, png_inforp info_ptr) @@ -3532,7 +3452,6 @@ png_image_read_background(png_voidp argument) for (pass = 0; pass < passes; ++pass) { - png_bytep row = png_voidcast(png_bytep, display->first_row); unsigned int startx, stepx, stepy; png_uint_32 y; @@ -3637,8 +3556,6 @@ png_image_read_background(png_voidp argument) inrow += 2; /* gray and alpha channel */ } - - row += display->row_bytes; } } } diff --git a/thirdparty/libpng/pngrtran.c b/thirdparty/libpng/pngrtran.c index 9a8fad9f4a..238f5afe7e 100644 --- a/thirdparty/libpng/pngrtran.c +++ b/thirdparty/libpng/pngrtran.c @@ -21,7 +21,7 @@ #ifdef PNG_ARM_NEON_IMPLEMENTATION # if PNG_ARM_NEON_IMPLEMENTATION == 1 # define PNG_ARM_NEON_INTRINSICS_AVAILABLE -# if defined(_MSC_VER) && defined(_M_ARM64) +# if defined(_MSC_VER) && !defined(__clang__) && defined(_M_ARM64) # include <arm64_neon.h> # else # include <arm_neon.h> diff --git a/thirdparty/libpng/pngrutil.c b/thirdparty/libpng/pngrutil.c index ae66a48a83..ca060dd15f 100644 --- a/thirdparty/libpng/pngrutil.c +++ b/thirdparty/libpng/pngrutil.c @@ -1,7 +1,7 @@ /* pngrutil.c - utilities to read a PNG file * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -302,7 +302,6 @@ png_read_buffer(png_structrp png_ptr, png_alloc_size_t new_size, int warn) if (buffer != NULL && new_size > png_ptr->read_buffer_size) { png_ptr->read_buffer = NULL; - png_ptr->read_buffer = NULL; png_ptr->read_buffer_size = 0; png_free(png_ptr, buffer); buffer = NULL; @@ -865,11 +864,6 @@ png_handle_IHDR(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) filter_type = buf[11]; interlace_type = buf[12]; -#ifdef PNG_READ_APNG_SUPPORTED - png_ptr->first_frame_width = width; - png_ptr->first_frame_height = height; -#endif - /* Set internal variables */ png_ptr->width = width; png_ptr->height = height; @@ -2081,21 +2075,22 @@ png_handle_eXIf(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_byte buf[1]; png_crc_read(png_ptr, buf, 1); info_ptr->eXIf_buf[i] = buf[0]; - if (i == 1 && buf[0] != 'M' && buf[0] != 'I' - && info_ptr->eXIf_buf[0] != buf[0]) + if (i == 1) { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "incorrect byte-order specifier"); - png_free(png_ptr, info_ptr->eXIf_buf); - info_ptr->eXIf_buf = NULL; - return; + if ((buf[0] != 'M' && buf[0] != 'I') || + (info_ptr->eXIf_buf[0] != buf[0])) + { + png_crc_finish(png_ptr, length - 2); + png_chunk_benign_error(png_ptr, "incorrect byte-order specifier"); + png_free(png_ptr, info_ptr->eXIf_buf); + info_ptr->eXIf_buf = NULL; + return; + } } } - if (png_crc_finish(png_ptr, 0) != 0) - return; - - png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf); + if (png_crc_finish(png_ptr, 0) == 0) + png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf); png_free(png_ptr, info_ptr->eXIf_buf); info_ptr->eXIf_buf = NULL; @@ -2131,8 +2126,9 @@ png_handle_hIST(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) num = length / 2 ; - if (num != (unsigned int) png_ptr->num_palette || - num > (unsigned int) PNG_MAX_PALETTE_LENGTH) + if (length != num * 2 || + num != (unsigned int)png_ptr->num_palette || + num > (unsigned int)PNG_MAX_PALETTE_LENGTH) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "invalid"); @@ -2862,179 +2858,6 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) } #endif -#ifdef PNG_READ_APNG_SUPPORTED -void /* PRIVATE */ -png_handle_acTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte data[8]; - png_uint_32 num_frames; - png_uint_32 num_plays; - png_uint_32 didSet; - - png_debug(1, "in png_handle_acTL"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - { - png_error(png_ptr, "Missing IHDR before acTL"); - } - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid acTL after IDAT skipped"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_acTL) - { - png_warning(png_ptr, "Duplicate acTL skipped"); - png_crc_finish(png_ptr, length); - return; - } - else if (length != 8) - { - png_warning(png_ptr, "acTL with invalid length skipped"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, data, 8); - png_crc_finish(png_ptr, 0); - - num_frames = png_get_uint_31(png_ptr, data); - num_plays = png_get_uint_31(png_ptr, data + 4); - - /* the set function will do error checking on num_frames */ - didSet = png_set_acTL(png_ptr, info_ptr, num_frames, num_plays); - if(didSet) - png_ptr->mode |= PNG_HAVE_acTL; -} - -void /* PRIVATE */ -png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte data[22]; - png_uint_32 width; - png_uint_32 height; - png_uint_32 x_offset; - png_uint_32 y_offset; - png_uint_16 delay_num; - png_uint_16 delay_den; - png_byte dispose_op; - png_byte blend_op; - - png_debug(1, "in png_handle_fcTL"); - - png_ensure_sequence_number(png_ptr, length); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - { - png_error(png_ptr, "Missing IHDR before fcTL"); - } - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - /* for any frames other then the first this message may be misleading, - * but correct. PNG_HAVE_IDAT is unset before the frame head is read - * i can't think of a better message */ - png_warning(png_ptr, "Invalid fcTL after IDAT skipped"); - png_crc_finish(png_ptr, length-4); - return; - } - else if (png_ptr->mode & PNG_HAVE_fcTL) - { - png_warning(png_ptr, "Duplicate fcTL within one frame skipped"); - png_crc_finish(png_ptr, length-4); - return; - } - else if (length != 26) - { - png_warning(png_ptr, "fcTL with invalid length skipped"); - png_crc_finish(png_ptr, length-4); - return; - } - - png_crc_read(png_ptr, data, 22); - png_crc_finish(png_ptr, 0); - - width = png_get_uint_31(png_ptr, data); - height = png_get_uint_31(png_ptr, data + 4); - x_offset = png_get_uint_31(png_ptr, data + 8); - y_offset = png_get_uint_31(png_ptr, data + 12); - delay_num = png_get_uint_16(data + 16); - delay_den = png_get_uint_16(data + 18); - dispose_op = data[20]; - blend_op = data[21]; - - if (png_ptr->num_frames_read == 0 && (x_offset != 0 || y_offset != 0)) - { - png_warning(png_ptr, "fcTL for the first frame must have zero offset"); - return; - } - - if (info_ptr != NULL) - { - if (png_ptr->num_frames_read == 0 && - (width != info_ptr->width || height != info_ptr->height)) - { - png_warning(png_ptr, "size in first frame's fcTL must match " - "the size in IHDR"); - return; - } - - /* The set function will do more error checking */ - png_set_next_frame_fcTL(png_ptr, info_ptr, width, height, - x_offset, y_offset, delay_num, delay_den, - dispose_op, blend_op); - - png_read_reinit(png_ptr, info_ptr); - - png_ptr->mode |= PNG_HAVE_fcTL; - } -} - -void /* PRIVATE */ -png_have_info(png_structp png_ptr, png_infop info_ptr) -{ - if((info_ptr->valid & PNG_INFO_acTL) && !(info_ptr->valid & PNG_INFO_fcTL)) - { - png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN; - info_ptr->num_frames++; - } -} - -void /* PRIVATE */ -png_handle_fdAT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_ensure_sequence_number(png_ptr, length); - - /* This function is only called from png_read_end(), png_read_info(), - * and png_push_read_chunk() which means that: - * - the user doesn't want to read this frame - * - or this is an out-of-place fdAT - * in either case it is safe to ignore the chunk with a warning */ - png_warning(png_ptr, "ignoring fdAT chunk"); - png_crc_finish(png_ptr, length - 4); - PNG_UNUSED(info_ptr) -} - -void /* PRIVATE */ -png_ensure_sequence_number(png_structp png_ptr, png_uint_32 length) -{ - png_byte data[4]; - png_uint_32 sequence_number; - - if (length < 4) - png_error(png_ptr, "invalid fcTL or fdAT chunk found"); - - png_crc_read(png_ptr, data, 4); - sequence_number = png_get_uint_31(png_ptr, data); - - if (sequence_number != png_ptr->next_seq_num) - png_error(png_ptr, "fcTL or fdAT chunk with out-of-order sequence " - "number found"); - - png_ptr->next_seq_num++; -} -#endif /* PNG_READ_APNG_SUPPORTED */ - #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED /* Utility function for png_handle_unknown; set up png_ptr::unknown_chunk */ static int @@ -4343,38 +4166,7 @@ png_read_IDAT_data(png_structrp png_ptr, png_bytep output, { uInt avail_in; png_bytep buffer; -#ifdef PNG_READ_APNG_SUPPORTED - png_uint_32 bytes_to_skip = 0; - - while (png_ptr->idat_size == 0 || bytes_to_skip != 0) - { - png_crc_finish(png_ptr, bytes_to_skip); - bytes_to_skip = 0; - - png_ptr->idat_size = png_read_chunk_header(png_ptr); - if (png_ptr->num_frames_read == 0) - { - if (png_ptr->chunk_name != png_IDAT) - png_error(png_ptr, "Not enough image data"); - } - else - { - if (png_ptr->chunk_name == png_IEND) - png_error(png_ptr, "Not enough image data"); - if (png_ptr->chunk_name != png_fdAT) - { - png_warning(png_ptr, "Skipped (ignored) a chunk " - "between APNG chunks"); - bytes_to_skip = png_ptr->idat_size; - continue; - } - - png_ensure_sequence_number(png_ptr, png_ptr->idat_size); - png_ptr->idat_size -= 4; - } - } -#else while (png_ptr->idat_size == 0) { png_crc_finish(png_ptr, 0); @@ -4386,7 +4178,7 @@ png_read_IDAT_data(png_structrp png_ptr, png_bytep output, if (png_ptr->chunk_name != png_IDAT) png_error(png_ptr, "Not enough image data"); } -#endif /* PNG_READ_APNG_SUPPORTED */ + avail_in = png_ptr->IDAT_read_size; if (avail_in > png_ptr->idat_size) @@ -4449,9 +4241,6 @@ png_read_IDAT_data(png_structrp png_ptr, png_bytep output, png_ptr->mode |= PNG_AFTER_IDAT; png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; -#ifdef PNG_READ_APNG_SUPPORTED - png_ptr->num_frames_read++; -#endif if (png_ptr->zstream.avail_in > 0 || png_ptr->idat_size > 0) png_chunk_benign_error(png_ptr, "Extra compressed data"); @@ -4833,14 +4622,13 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) */ { png_bytep temp = png_ptr->big_row_buf + 32; - int extra = (int)((temp - (png_bytep)0) & 0x0f); + size_t extra = (size_t)temp & 0x0f; png_ptr->row_buf = temp - extra - 1/*filter byte*/; temp = png_ptr->big_prev_row + 32; - extra = (int)((temp - (png_bytep)0) & 0x0f); + extra = (size_t)temp & 0x0f; png_ptr->prev_row = temp - extra - 1/*filter byte*/; } - #else /* Use 31 bytes of padding before and 17 bytes after row_buf. */ png_ptr->row_buf = png_ptr->big_row_buf + 31; @@ -4890,80 +4678,4 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) png_ptr->flags |= PNG_FLAG_ROW_INIT; } - -#ifdef PNG_READ_APNG_SUPPORTED -/* This function is to be called after the main IDAT set has been read and - * before a new IDAT is read. It resets some parts of png_ptr - * to make them usable by the read functions again */ -void /* PRIVATE */ -png_read_reset(png_structp png_ptr) -{ - png_ptr->mode &= ~PNG_HAVE_IDAT; - png_ptr->mode &= ~PNG_AFTER_IDAT; - png_ptr->row_number = 0; - png_ptr->pass = 0; -} - -void /* PRIVATE */ -png_read_reinit(png_structp png_ptr, png_infop info_ptr) -{ - png_ptr->width = info_ptr->next_frame_width; - png_ptr->height = info_ptr->next_frame_height; - png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->width); - png_ptr->info_rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, - png_ptr->width); - if (png_ptr->prev_row) - memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); -} - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -/* same as png_read_reset() but for the progressive reader */ -void /* PRIVATE */ -png_progressive_read_reset(png_structp png_ptr) -{ -#ifdef PNG_READ_INTERLACING_SUPPORTED - /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* Start of interlace block */ - const int png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; - - /* Offset to next interlace block */ - const int png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; - - /* Start of interlace block in the y direction */ - const int png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; - - /* Offset to next interlace block in the y direction */ - const int png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; - - if (png_ptr->interlaced) - { - if (!(png_ptr->transformations & PNG_INTERLACE)) - png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - - png_pass_ystart[0]) / png_pass_yinc[0]; - else - png_ptr->num_rows = png_ptr->height; - - png_ptr->iwidth = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; - } - else -#endif /* PNG_READ_INTERLACING_SUPPORTED */ - { - png_ptr->num_rows = png_ptr->height; - png_ptr->iwidth = png_ptr->width; - } - png_ptr->flags &= ~PNG_FLAG_ZSTREAM_ENDED; - if (inflateReset(&(png_ptr->zstream)) != Z_OK) - png_error(png_ptr, "inflateReset failed"); - png_ptr->zstream.avail_in = 0; - png_ptr->zstream.next_in = 0; - png_ptr->zstream.next_out = png_ptr->row_buf; - png_ptr->zstream.avail_out = (uInt)PNG_ROWBYTES(png_ptr->pixel_depth, - png_ptr->iwidth) + 1; -} -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ -#endif /* PNG_READ_APNG_SUPPORTED */ #endif /* READ */ diff --git a/thirdparty/libpng/pngset.c b/thirdparty/libpng/pngset.c index a281db58ae..8c372cf415 100644 --- a/thirdparty/libpng/pngset.c +++ b/thirdparty/libpng/pngset.c @@ -1,7 +1,7 @@ /* pngset.c - storage of image information into info struct * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -288,11 +288,6 @@ png_set_IHDR(png_const_structrp png_ptr, png_inforp info_ptr, info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width); - -#ifdef PNG_APNG_SUPPORTED - /* for non-animated png. this may be overwritten from an acTL chunk later */ - info_ptr->num_frames = 1; -#endif } #ifdef PNG_oFFs_SUPPORTED @@ -1024,6 +1019,9 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr, info_ptr->trans_alpha = png_voidcast(png_bytep, png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH)); memcpy(info_ptr->trans_alpha, trans_alpha, (size_t)num_trans); + + info_ptr->valid |= PNG_INFO_tRNS; + info_ptr->free_me |= PNG_FREE_TRNS; } png_ptr->trans_alpha = info_ptr->trans_alpha; } @@ -1163,147 +1161,6 @@ png_set_sPLT(png_const_structrp png_ptr, } #endif /* sPLT */ -#ifdef PNG_APNG_SUPPORTED -png_uint_32 PNGAPI -png_set_acTL(png_structp png_ptr, png_infop info_ptr, - png_uint_32 num_frames, png_uint_32 num_plays) -{ - png_debug1(1, "in %s storage function", "acTL"); - - if (png_ptr == NULL || info_ptr == NULL) - { - png_warning(png_ptr, - "Call to png_set_acTL() with NULL png_ptr " - "or info_ptr ignored"); - return (0); - } - if (num_frames == 0) - { - png_warning(png_ptr, - "Ignoring attempt to set acTL with num_frames zero"); - return (0); - } - if (num_frames > PNG_UINT_31_MAX) - { - png_warning(png_ptr, - "Ignoring attempt to set acTL with num_frames > 2^31-1"); - return (0); - } - if (num_plays > PNG_UINT_31_MAX) - { - png_warning(png_ptr, - "Ignoring attempt to set acTL with num_plays " - "> 2^31-1"); - return (0); - } - - info_ptr->num_frames = num_frames; - info_ptr->num_plays = num_plays; - - info_ptr->valid |= PNG_INFO_acTL; - - return (1); -} - -/* delay_num and delay_den can hold any 16-bit values including zero */ -png_uint_32 PNGAPI -png_set_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr, - png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, - png_byte dispose_op, png_byte blend_op) -{ - png_debug1(1, "in %s storage function", "fcTL"); - - if (png_ptr == NULL || info_ptr == NULL) - { - png_warning(png_ptr, - "Call to png_set_fcTL() with NULL png_ptr or info_ptr " - "ignored"); - return (0); - } - - png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset, - delay_num, delay_den, dispose_op, blend_op); - - if (blend_op == PNG_BLEND_OP_OVER) - { - if (!(png_ptr->color_type & PNG_COLOR_MASK_ALPHA) && - !(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) - { - png_warning(png_ptr, "PNG_BLEND_OP_OVER is meaningless " - "and wasteful for opaque images, ignored"); - blend_op = PNG_BLEND_OP_SOURCE; - } - } - - info_ptr->next_frame_width = width; - info_ptr->next_frame_height = height; - info_ptr->next_frame_x_offset = x_offset; - info_ptr->next_frame_y_offset = y_offset; - info_ptr->next_frame_delay_num = delay_num; - info_ptr->next_frame_delay_den = delay_den; - info_ptr->next_frame_dispose_op = dispose_op; - info_ptr->next_frame_blend_op = blend_op; - - info_ptr->valid |= PNG_INFO_fcTL; - - return (1); -} - -void /* PRIVATE */ -png_ensure_fcTL_is_valid(png_structp png_ptr, - png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, - png_byte dispose_op, png_byte blend_op) -{ - if (width == 0 || width > PNG_UINT_31_MAX) - png_error(png_ptr, "invalid width in fcTL (> 2^31-1)"); - if (height == 0 || height > PNG_UINT_31_MAX) - png_error(png_ptr, "invalid height in fcTL (> 2^31-1)"); - if (x_offset > PNG_UINT_31_MAX) - png_error(png_ptr, "invalid x_offset in fcTL (> 2^31-1)"); - if (y_offset > PNG_UINT_31_MAX) - png_error(png_ptr, "invalid y_offset in fcTL (> 2^31-1)"); - if (width + x_offset > png_ptr->first_frame_width || - height + y_offset > png_ptr->first_frame_height) - png_error(png_ptr, "dimensions of a frame are greater than" - "the ones in IHDR"); - - if (dispose_op != PNG_DISPOSE_OP_NONE && - dispose_op != PNG_DISPOSE_OP_BACKGROUND && - dispose_op != PNG_DISPOSE_OP_PREVIOUS) - png_error(png_ptr, "invalid dispose_op in fcTL"); - - if (blend_op != PNG_BLEND_OP_SOURCE && - blend_op != PNG_BLEND_OP_OVER) - png_error(png_ptr, "invalid blend_op in fcTL"); - - PNG_UNUSED(delay_num) - PNG_UNUSED(delay_den) -} - -png_uint_32 PNGAPI -png_set_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr, - png_byte is_hidden) -{ - png_debug(1, "in png_first_frame_is_hidden()"); - - if (png_ptr == NULL) - return 0; - - if (is_hidden) - png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN; - else - png_ptr->apng_flags &= ~PNG_FIRST_FRAME_HIDDEN; - - PNG_UNUSED(info_ptr) - - return 1; -} -#endif /* PNG_APNG_SUPPORTED */ - #ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED static png_byte check_location(png_const_structrp png_ptr, int location) @@ -1472,7 +1329,7 @@ png_set_unknown_chunk_location(png_const_structrp png_ptr, png_inforp info_ptr, #ifdef PNG_MNG_FEATURES_SUPPORTED png_uint_32 PNGAPI -png_permit_mng_features (png_structrp png_ptr, png_uint_32 mng_features) +png_permit_mng_features(png_structrp png_ptr, png_uint_32 mng_features) { png_debug(1, "in png_permit_mng_features"); @@ -1779,7 +1636,7 @@ png_set_invalid(png_const_structrp png_ptr, png_inforp info_ptr, int mask) #ifdef PNG_SET_USER_LIMITS_SUPPORTED /* This function was added to libpng 1.2.6 */ void PNGAPI -png_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max, +png_set_user_limits(png_structrp png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max) { /* Images with dimensions larger than these limits will be @@ -1795,7 +1652,7 @@ png_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max, /* This function was added to libpng 1.4.0 */ void PNGAPI -png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max) +png_set_chunk_cache_max(png_structrp png_ptr, png_uint_32 user_chunk_cache_max) { if (png_ptr != NULL) png_ptr->user_chunk_cache_max = user_chunk_cache_max; @@ -1803,7 +1660,7 @@ png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max) /* This function was added to libpng 1.4.1 */ void PNGAPI -png_set_chunk_malloc_max (png_structrp png_ptr, +png_set_chunk_malloc_max(png_structrp png_ptr, png_alloc_size_t user_chunk_malloc_max) { if (png_ptr != NULL) diff --git a/thirdparty/libpng/pngstruct.h b/thirdparty/libpng/pngstruct.h index 2a2236f92e..e591d94d58 100644 --- a/thirdparty/libpng/pngstruct.h +++ b/thirdparty/libpng/pngstruct.h @@ -1,7 +1,7 @@ /* pngstruct.h - header file for PNG reference library * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -334,18 +334,8 @@ struct png_struct_def size_t current_buffer_size; /* amount of data now in current_buffer */ int process_mode; /* what push library is currently doing */ int cur_palette; /* current push library palette index */ - #endif /* PROGRESSIVE_READ */ -#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) -/* For the Borland special 64K segment handler */ - png_bytepp offset_table_ptr; - png_bytep offset_table; - png_uint_16 offset_table_number; - png_uint_16 offset_table_count; - png_uint_16 offset_table_count_free; -#endif - #ifdef PNG_READ_QUANTIZE_SUPPORTED png_bytep palette_lookup; /* lookup table for quantizing */ png_bytep quantize_index; /* index translation for palette files */ @@ -409,27 +399,6 @@ struct png_struct_def png_byte filter_type; #endif -#ifdef PNG_APNG_SUPPORTED - png_uint_32 apng_flags; - png_uint_32 next_seq_num; /* next fcTL/fdAT chunk sequence number */ - png_uint_32 first_frame_width; - png_uint_32 first_frame_height; - -#ifdef PNG_READ_APNG_SUPPORTED - png_uint_32 num_frames_read; /* incremented after all image data of */ - /* a frame is read */ -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED - png_progressive_frame_ptr frame_info_fn; /* frame info read callback */ - png_progressive_frame_ptr frame_end_fn; /* frame data read callback */ -#endif -#endif - -#ifdef PNG_WRITE_APNG_SUPPORTED - png_uint_32 num_frames_to_write; - png_uint_32 num_frames_written; -#endif -#endif /* PNG_APNG_SUPPORTED */ - /* New members added in libpng-1.2.0 */ /* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ diff --git a/thirdparty/libpng/pngwrite.c b/thirdparty/libpng/pngwrite.c index 5e68032378..06c45d16ab 100644 --- a/thirdparty/libpng/pngwrite.c +++ b/thirdparty/libpng/pngwrite.c @@ -1,7 +1,7 @@ /* pngwrite.c - general routines to write a PNG file * - * Copyright (c) 2018-2019 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -128,10 +128,6 @@ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr) * the application continues writing the PNG. So check the 'invalid' * flag here too. */ -#ifdef PNG_WRITE_APNG_SUPPORTED - if (info_ptr->valid & PNG_INFO_acTL) - png_write_acTL(png_ptr, info_ptr->num_frames, info_ptr->num_plays); -#endif #ifdef PNG_GAMMA_SUPPORTED # ifdef PNG_WRITE_gAMA_SUPPORTED if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 && @@ -374,11 +370,6 @@ png_write_end(png_structrp png_ptr, png_inforp info_ptr) png_benign_error(png_ptr, "Wrote palette index exceeding num_palette"); #endif -#ifdef PNG_WRITE_APNG_SUPPORTED - if (png_ptr->num_frames_written != png_ptr->num_frames_to_write) - png_error(png_ptr, "Not enough frames written"); -#endif - /* See if user wants us to write information chunks */ if (info_ptr != NULL) { @@ -498,6 +489,16 @@ png_convert_from_time_t(png_timep ptime, time_t ttime) png_debug(1, "in png_convert_from_time_t"); tbuf = gmtime(&ttime); + if (tbuf == NULL) + { + /* TODO: add a safe function which takes a png_ptr argument and raises + * a png_error if the ttime argument is invalid and the call to gmtime + * fails as a consequence. + */ + memset(ptime, 0, sizeof(*ptime)); + return; + } + png_convert_from_struct_tm(ptime, tbuf); } #endif @@ -1470,43 +1471,6 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr, } #endif -#ifdef PNG_WRITE_APNG_SUPPORTED -void PNGAPI -png_write_frame_head(png_structp png_ptr, png_infop info_ptr, - png_bytepp row_pointers, png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, - png_byte blend_op) -{ - png_debug(1, "in png_write_frame_head"); - - /* there is a chance this has been set after png_write_info was called, - * so it would be set but not written. is there a way to be sure? */ - if (!(info_ptr->valid & PNG_INFO_acTL)) - png_error(png_ptr, "png_write_frame_head(): acTL not set"); - - png_write_reset(png_ptr); - - png_write_reinit(png_ptr, info_ptr, width, height); - - if ( !(png_ptr->num_frames_written == 0 && - (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) ) ) - png_write_fcTL(png_ptr, width, height, x_offset, y_offset, - delay_num, delay_den, dispose_op, blend_op); - - PNG_UNUSED(row_pointers) -} - -void PNGAPI -png_write_frame_tail(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_write_frame_tail"); - - png_ptr->num_frames_written++; - - PNG_UNUSED(info_ptr) -} -#endif /* PNG_WRITE_APNG_SUPPORTED */ #ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED /* Initialize the write structure - general purpose utility. */ diff --git a/thirdparty/libpng/pngwutil.c b/thirdparty/libpng/pngwutil.c index b4809cda6b..16345e4c0b 100644 --- a/thirdparty/libpng/pngwutil.c +++ b/thirdparty/libpng/pngwutil.c @@ -821,11 +821,6 @@ png_write_IHDR(png_structrp png_ptr, png_uint_32 width, png_uint_32 height, /* Write the chunk */ png_write_complete_chunk(png_ptr, png_IHDR, buf, 13); -#ifdef PNG_WRITE_APNG_SUPPORTED - png_ptr->first_frame_width = width; - png_ptr->first_frame_height = height; -#endif - if ((png_ptr->do_filter) == PNG_NO_FILTERS) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || @@ -1007,17 +1002,8 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input, optimize_cmf(data, png_image_size(png_ptr)); #endif - if (size > 0) -#ifdef PNG_WRITE_APNG_SUPPORTED - { - if (png_ptr->num_frames_written == 0) -#endif - png_write_complete_chunk(png_ptr, png_IDAT, data, size); -#ifdef PNG_WRITE_APNG_SUPPORTED - else - png_write_fdAT(png_ptr, data, size); - } -#endif /* PNG_WRITE_APNG_SUPPORTED */ + if (size > 0) + png_write_complete_chunk(png_ptr, png_IDAT, data, size); png_ptr->mode |= PNG_HAVE_IDAT; png_ptr->zstream.next_out = data; @@ -1064,17 +1050,7 @@ png_compress_IDAT(png_structrp png_ptr, png_const_bytep input, #endif if (size > 0) -#ifdef PNG_WRITE_APNG_SUPPORTED - { - if (png_ptr->num_frames_written == 0) -#endif png_write_complete_chunk(png_ptr, png_IDAT, data, size); -#ifdef PNG_WRITE_APNG_SUPPORTED - else - png_write_fdAT(png_ptr, data, size); - } -#endif /* PNG_WRITE_APNG_SUPPORTED */ - png_ptr->zstream.avail_out = 0; png_ptr->zstream.next_out = NULL; png_ptr->mode |= PNG_HAVE_IDAT | PNG_AFTER_IDAT; @@ -1909,82 +1885,6 @@ png_write_tIME(png_structrp png_ptr, png_const_timep mod_time) } #endif -#ifdef PNG_WRITE_APNG_SUPPORTED -void /* PRIVATE */ -png_write_acTL(png_structp png_ptr, - png_uint_32 num_frames, png_uint_32 num_plays) -{ - png_byte buf[8]; - - png_debug(1, "in png_write_acTL"); - - png_ptr->num_frames_to_write = num_frames; - - if (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) - num_frames--; - - png_save_uint_32(buf, num_frames); - png_save_uint_32(buf + 4, num_plays); - - png_write_complete_chunk(png_ptr, png_acTL, buf, (png_size_t)8); -} - -void /* PRIVATE */ -png_write_fcTL(png_structp png_ptr, png_uint_32 width, png_uint_32 height, - png_uint_32 x_offset, png_uint_32 y_offset, - png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, - png_byte blend_op) -{ - png_byte buf[26]; - - png_debug(1, "in png_write_fcTL"); - - if (png_ptr->num_frames_written == 0 && (x_offset != 0 || y_offset != 0)) - png_error(png_ptr, "x and/or y offset for the first frame aren't 0"); - if (png_ptr->num_frames_written == 0 && - (width != png_ptr->first_frame_width || - height != png_ptr->first_frame_height)) - png_error(png_ptr, "width and/or height in the first frame's fcTL " - "don't match the ones in IHDR"); - - /* more error checking */ - png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset, - delay_num, delay_den, dispose_op, blend_op); - - png_save_uint_32(buf, png_ptr->next_seq_num); - png_save_uint_32(buf + 4, width); - png_save_uint_32(buf + 8, height); - png_save_uint_32(buf + 12, x_offset); - png_save_uint_32(buf + 16, y_offset); - png_save_uint_16(buf + 20, delay_num); - png_save_uint_16(buf + 22, delay_den); - buf[24] = dispose_op; - buf[25] = blend_op; - - png_write_complete_chunk(png_ptr, png_fcTL, buf, (png_size_t)26); - - png_ptr->next_seq_num++; -} - -void /* PRIVATE */ -png_write_fdAT(png_structp png_ptr, - png_const_bytep data, png_size_t length) -{ - png_byte buf[4]; - - png_write_chunk_header(png_ptr, png_fdAT, (png_uint_32)(4 + length)); - - png_save_uint_32(buf, png_ptr->next_seq_num); - png_write_chunk_data(png_ptr, buf, 4); - - png_write_chunk_data(png_ptr, data, length); - - png_write_chunk_end(png_ptr); - - png_ptr->next_seq_num++; -} -#endif /* PNG_WRITE_APNG_SUPPORTED */ - /* Initializes the row writing capability of libpng */ void /* PRIVATE */ png_write_start_row(png_structrp png_ptr) @@ -2878,39 +2778,4 @@ png_write_filtered_row(png_structrp png_ptr, png_bytep filtered_row, } #endif /* WRITE_FLUSH */ } - -#ifdef PNG_WRITE_APNG_SUPPORTED -void /* PRIVATE */ -png_write_reset(png_structp png_ptr) -{ - png_ptr->row_number = 0; - png_ptr->pass = 0; - png_ptr->mode &= ~PNG_HAVE_IDAT; -} - -void /* PRIVATE */ -png_write_reinit(png_structp png_ptr, png_infop info_ptr, - png_uint_32 width, png_uint_32 height) -{ - if (png_ptr->num_frames_written == 0 && - (width != png_ptr->first_frame_width || - height != png_ptr->first_frame_height)) - png_error(png_ptr, "width and/or height in the first frame's fcTL " - "don't match the ones in IHDR"); - if (width > png_ptr->first_frame_width || - height > png_ptr->first_frame_height) - png_error(png_ptr, "width and/or height for a frame greater than" - "the ones in IHDR"); - - png_set_IHDR(png_ptr, info_ptr, width, height, - info_ptr->bit_depth, info_ptr->color_type, - info_ptr->interlace_type, info_ptr->compression_type, - info_ptr->filter_type); - - png_ptr->width = width; - png_ptr->height = height; - png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width); - png_ptr->usr_width = png_ptr->width; -} -#endif /* PNG_WRITE_APNG_SUPPORTED */ #endif /* WRITE */ diff --git a/thirdparty/openxr/include/openxr/openxr.h b/thirdparty/openxr/include/openxr/openxr.h index 6c6a52d27e..6f9b71aa68 100644 --- a/thirdparty/openxr/include/openxr/openxr.h +++ b/thirdparty/openxr/include/openxr/openxr.h @@ -2,7 +2,7 @@ #define OPENXR_H_ 1 /* -** Copyright (c) 2017-2022, The Khronos Group Inc. +** Copyright 2017-2022 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 OR MIT */ @@ -25,7 +25,7 @@ extern "C" { ((((major) & 0xffffULL) << 48) | (((minor) & 0xffffULL) << 32) | ((patch) & 0xffffffffULL)) // OpenXR current version number. -#define XR_CURRENT_API_VERSION XR_MAKE_VERSION(1, 0, 23) +#define XR_CURRENT_API_VERSION XR_MAKE_VERSION(1, 0, 25) #define XR_VERSION_MAJOR(version) (uint16_t)(((uint64_t)(version) >> 48)& 0xffffULL) #define XR_VERSION_MINOR(version) (uint16_t)(((uint64_t)(version) >> 32) & 0xffffULL) @@ -401,6 +401,7 @@ typedef enum XrStructureType { XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB = 1000118003, XR_TYPE_GEOMETRY_INSTANCE_CREATE_INFO_FB = 1000118004, XR_TYPE_GEOMETRY_INSTANCE_TRANSFORM_FB = 1000118005, + XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES2_FB = 1000118006, XR_TYPE_PASSTHROUGH_STYLE_FB = 1000118020, XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_RGBA_FB = 1000118021, XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_MONO_FB = 1000118022, @@ -439,6 +440,9 @@ typedef enum XrStructureType { XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB = 1000163000, XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB = 1000171000, XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB = 1000171001, + XR_TYPE_SEMANTIC_LABELS_FB = 1000175000, + XR_TYPE_ROOM_LAYOUT_FB = 1000175001, + XR_TYPE_BOUNDARY_2D_FB = 1000175002, XR_TYPE_DIGITAL_LENS_CONTROL_ALMALENCE = 1000196000, XR_TYPE_SPACE_CONTAINER_FB = 1000199000, XR_TYPE_PASSTHROUGH_KEYBOARD_HANDS_INTENSITY_FB = 1000203002, @@ -2603,7 +2607,7 @@ typedef struct XrHandJointsMotionRangeInfoEXT { XR_DEFINE_HANDLE(XrSceneMSFT) -#define XR_MSFT_scene_understanding_SPEC_VERSION 1 +#define XR_MSFT_scene_understanding_SPEC_VERSION 2 #define XR_MSFT_SCENE_UNDERSTANDING_EXTENSION_NAME "XR_MSFT_scene_understanding" typedef enum XrSceneComputeFeatureMSFT { @@ -2925,7 +2929,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrGetSceneMeshBuffersMSFT( #define XR_MSFT_scene_understanding_serialization 1 -#define XR_MSFT_scene_understanding_serialization_SPEC_VERSION 1 +#define XR_MSFT_scene_understanding_serialization_SPEC_VERSION 2 #define XR_MSFT_SCENE_UNDERSTANDING_SERIALIZATION_EXTENSION_NAME "XR_MSFT_scene_understanding_serialization" typedef struct XrSerializedSceneFragmentDataGetInfoMSFT { XrStructureType type; @@ -3166,7 +3170,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrGetFacialExpressionsHTC( #define XR_FB_color_space 1 -#define XR_FB_color_space_SPEC_VERSION 2 +#define XR_FB_color_space_SPEC_VERSION 3 #define XR_FB_COLOR_SPACE_EXTENSION_NAME "XR_FB_color_space" typedef enum XrColorSpaceFB { @@ -3206,7 +3210,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrSetColorSpaceFB( #define XR_FB_hand_tracking_mesh 1 -#define XR_FB_hand_tracking_mesh_SPEC_VERSION 2 +#define XR_FB_hand_tracking_mesh_SPEC_VERSION 3 #define XR_FB_HAND_TRACKING_MESH_EXTENSION_NAME "XR_FB_hand_tracking_mesh" typedef struct XrVector4sFB { int16_t x; @@ -3317,6 +3321,10 @@ XR_DEFINE_ATOM(XrAsyncRequestIdFB) typedef enum XrSpaceComponentTypeFB { XR_SPACE_COMPONENT_TYPE_LOCATABLE_FB = 0, XR_SPACE_COMPONENT_TYPE_STORABLE_FB = 1, + XR_SPACE_COMPONENT_TYPE_BOUNDED_2D_FB = 3, + XR_SPACE_COMPONENT_TYPE_BOUNDED_3D_FB = 4, + XR_SPACE_COMPONENT_TYPE_SEMANTIC_LABELS_FB = 5, + XR_SPACE_COMPONENT_TYPE_ROOM_LAYOUT_FB = 6, XR_SPACE_COMPONENT_TYPE_SPACE_CONTAINER_FB = 7, XR_SPACE_COMPONENT_TYPE_MAX_ENUM_FB = 0x7FFFFFFF } XrSpaceComponentTypeFB; @@ -3625,7 +3633,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrTriangleMeshEndVertexBufferUpdateFB( XR_DEFINE_HANDLE(XrPassthroughFB) XR_DEFINE_HANDLE(XrPassthroughLayerFB) XR_DEFINE_HANDLE(XrGeometryInstanceFB) -#define XR_FB_passthrough_SPEC_VERSION 2 +#define XR_FB_passthrough_SPEC_VERSION 3 #define XR_FB_PASSTHROUGH_EXTENSION_NAME "XR_FB_passthrough" #define XR_PASSTHROUGH_COLOR_MAP_MONO_SIZE_FB 256 @@ -3636,10 +3644,18 @@ typedef enum XrPassthroughLayerPurposeFB { XR_PASSTHROUGH_LAYER_PURPOSE_TRACKED_KEYBOARD_MASKED_HANDS_FB = 1000203002, XR_PASSTHROUGH_LAYER_PURPOSE_MAX_ENUM_FB = 0x7FFFFFFF } XrPassthroughLayerPurposeFB; +typedef XrFlags64 XrPassthroughCapabilityFlagsFB; + +// Flag bits for XrPassthroughCapabilityFlagsFB +static const XrPassthroughCapabilityFlagsFB XR_PASSTHROUGH_CAPABILITY_BIT_FB = 0x00000001; +static const XrPassthroughCapabilityFlagsFB XR_PASSTHROUGH_CAPABILITY_COLOR_BIT_FB = 0x00000002; +static const XrPassthroughCapabilityFlagsFB XR_PASSTHROUGH_CAPABILITY_LAYER_DEPTH_BIT_FB = 0x00000004; + typedef XrFlags64 XrPassthroughFlagsFB; // Flag bits for XrPassthroughFlagsFB static const XrPassthroughFlagsFB XR_PASSTHROUGH_IS_RUNNING_AT_CREATION_BIT_FB = 0x00000001; +static const XrPassthroughFlagsFB XR_PASSTHROUGH_LAYER_DEPTH_BIT_FB = 0x00000002; typedef XrFlags64 XrPassthroughStateChangedFlagsFB; @@ -3656,6 +3672,13 @@ typedef struct XrSystemPassthroughPropertiesFB { XrBool32 supportsPassthrough; } XrSystemPassthroughPropertiesFB; +// XrSystemPassthroughProperties2FB extends XrSystemProperties +typedef struct XrSystemPassthroughProperties2FB { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrPassthroughCapabilityFlagsFB capabilities; +} XrSystemPassthroughProperties2FB; + typedef struct XrPassthroughCreateInfoFB { XrStructureType type; const void* XR_MAY_ALIAS next; @@ -3801,7 +3824,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrGeometryInstanceSetTransformFB( #define XR_NULL_RENDER_MODEL_KEY_FB 0 XR_DEFINE_ATOM(XrRenderModelKeyFB) -#define XR_FB_render_model_SPEC_VERSION 2 +#define XR_FB_render_model_SPEC_VERSION 3 #define XR_FB_RENDER_MODEL_EXTENSION_NAME "XR_FB_render_model" #define XR_MAX_RENDER_MODEL_NAME_SIZE_FB 64 typedef XrFlags64 XrRenderModelFlagsFB; @@ -4007,6 +4030,11 @@ XRAPI_ATTR XrResult XRAPI_CALL xrSetViewOffsetVARJO( #endif /* !XR_NO_PROTOTYPES */ +#define XR_ML_ml2_controller_interaction 1 +#define XR_ML_ml2_controller_interaction_SPEC_VERSION 1 +#define XR_ML_ML2_CONTROLLER_INTERACTION_EXTENSION_NAME "XR_ML_ml2_controller_interaction" + + #define XR_MSFT_spatial_anchor_persistence 1 XR_DEFINE_HANDLE(XrSpatialAnchorStoreConnectionMSFT) #define XR_MAX_SPATIAL_ANCHOR_NAME_SIZE_MSFT 256 @@ -4303,6 +4331,93 @@ typedef struct XrSystemSpaceWarpPropertiesFB { +#define XR_FB_scene 1 +#define XR_FB_scene_SPEC_VERSION 1 +#define XR_FB_SCENE_EXTENSION_NAME "XR_FB_scene" +typedef struct XrExtent3DfFB { + float width; + float height; + float depth; +} XrExtent3DfFB; + +typedef struct XrOffset3DfFB { + float x; + float y; + float z; +} XrOffset3DfFB; + +typedef struct XrRect3DfFB { + XrOffset3DfFB offset; + XrExtent3DfFB extent; +} XrRect3DfFB; + +typedef struct XrSemanticLabelsFB { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t bufferCapacityInput; + uint32_t bufferCountOutput; + char* buffer; +} XrSemanticLabelsFB; + +typedef struct XrRoomLayoutFB { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrUuidEXT floorUuid; + XrUuidEXT ceilingUuid; + uint32_t wallUuidCapacityInput; + uint32_t wallUuidCountOutput; + XrUuidEXT* wallUuids; +} XrRoomLayoutFB; + +typedef struct XrBoundary2DFB { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t vertexCapacityInput; + uint32_t vertexCountOutput; + XrVector2f* vertices; +} XrBoundary2DFB; + +typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceBoundingBox2DFB)(XrSession session, XrSpace space, XrRect2Df* boundingBox2DOutput); +typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceBoundingBox3DFB)(XrSession session, XrSpace space, XrRect3DfFB* boundingBox3DOutput); +typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceSemanticLabelsFB)(XrSession session, XrSpace space, XrSemanticLabelsFB* semanticLabelsOutput); +typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceBoundary2DFB)(XrSession session, XrSpace space, XrBoundary2DFB* boundary2DOutput); +typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceRoomLayoutFB)(XrSession session, XrSpace space, XrRoomLayoutFB* roomLayoutOutput); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceBoundingBox2DFB( + XrSession session, + XrSpace space, + XrRect2Df* boundingBox2DOutput); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceBoundingBox3DFB( + XrSession session, + XrSpace space, + XrRect3DfFB* boundingBox3DOutput); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceSemanticLabelsFB( + XrSession session, + XrSpace space, + XrSemanticLabelsFB* semanticLabelsOutput); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceBoundary2DFB( + XrSession session, + XrSpace space, + XrBoundary2DFB* boundary2DOutput); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceRoomLayoutFB( + XrSession session, + XrSpace space, + XrRoomLayoutFB* roomLayoutOutput); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_EXT_palm_pose 1 +#define XR_EXT_palm_pose_SPEC_VERSION 2 +#define XR_EXT_PALM_POSE_EXTENSION_NAME "XR_EXT_palm_pose" + + #define XR_ALMALENCE_digital_lens_control 1 #define XR_ALMALENCE_digital_lens_control_SPEC_VERSION 1 #define XR_ALMALENCE_DIGITAL_LENS_CONTROL_EXTENSION_NAME "XR_ALMALENCE_digital_lens_control" @@ -4329,13 +4444,13 @@ XRAPI_ATTR XrResult XRAPI_CALL xrSetDigitalLensControlALMALENCE( #define XR_FB_spatial_entity_container 1 -#define XR_FB_spatial_entity_container_SPEC_VERSION 1 +#define XR_FB_spatial_entity_container_SPEC_VERSION 2 #define XR_FB_SPATIAL_ENTITY_CONTAINER_EXTENSION_NAME "XR_FB_spatial_entity_container" typedef struct XrSpaceContainerFB { XrStructureType type; const void* XR_MAY_ALIAS next; uint32_t uuidCapacityInput; - uint32_t* uuidCountOutput; + uint32_t uuidCountOutput; XrUuidEXT* uuids; } XrSpaceContainerFB; diff --git a/thirdparty/openxr/include/openxr/openxr_platform.h b/thirdparty/openxr/include/openxr/openxr_platform.h index f0fbf6955a..b3aabb23c5 100644 --- a/thirdparty/openxr/include/openxr/openxr_platform.h +++ b/thirdparty/openxr/include/openxr/openxr_platform.h @@ -2,7 +2,7 @@ #define OPENXR_PLATFORM_H_ 1 /* -** Copyright (c) 2017-2022, The Khronos Group Inc. +** Copyright 2017-2022 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 OR MIT */ diff --git a/thirdparty/openxr/include/openxr/openxr_reflection.h b/thirdparty/openxr/include/openxr/openxr_reflection.h index 163b54e4e4..ac6f452377 100644 --- a/thirdparty/openxr/include/openxr/openxr_reflection.h +++ b/thirdparty/openxr/include/openxr/openxr_reflection.h @@ -302,6 +302,7 @@ XR_ENUM_STR(XrResult); _(XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB, 1000118003) \ _(XR_TYPE_GEOMETRY_INSTANCE_CREATE_INFO_FB, 1000118004) \ _(XR_TYPE_GEOMETRY_INSTANCE_TRANSFORM_FB, 1000118005) \ + _(XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES2_FB, 1000118006) \ _(XR_TYPE_PASSTHROUGH_STYLE_FB, 1000118020) \ _(XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_RGBA_FB, 1000118021) \ _(XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_MONO_FB, 1000118022) \ @@ -340,6 +341,9 @@ XR_ENUM_STR(XrResult); _(XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB, 1000163000) \ _(XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB, 1000171000) \ _(XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB, 1000171001) \ + _(XR_TYPE_SEMANTIC_LABELS_FB, 1000175000) \ + _(XR_TYPE_ROOM_LAYOUT_FB, 1000175001) \ + _(XR_TYPE_BOUNDARY_2D_FB, 1000175002) \ _(XR_TYPE_DIGITAL_LENS_CONTROL_ALMALENCE, 1000196000) \ _(XR_TYPE_SPACE_CONTAINER_FB, 1000199000) \ _(XR_TYPE_PASSTHROUGH_KEYBOARD_HANDS_INTENSITY_FB, 1000203002) \ @@ -660,6 +664,10 @@ XR_ENUM_STR(XrResult); #define XR_LIST_ENUM_XrSpaceComponentTypeFB(_) \ _(XR_SPACE_COMPONENT_TYPE_LOCATABLE_FB, 0) \ _(XR_SPACE_COMPONENT_TYPE_STORABLE_FB, 1) \ + _(XR_SPACE_COMPONENT_TYPE_BOUNDED_2D_FB, 3) \ + _(XR_SPACE_COMPONENT_TYPE_BOUNDED_3D_FB, 4) \ + _(XR_SPACE_COMPONENT_TYPE_SEMANTIC_LABELS_FB, 5) \ + _(XR_SPACE_COMPONENT_TYPE_ROOM_LAYOUT_FB, 6) \ _(XR_SPACE_COMPONENT_TYPE_SPACE_CONTAINER_FB, 7) \ _(XR_SPACE_COMPONENT_TYPE_MAX_ENUM_FB, 0x7FFFFFFF) @@ -847,8 +855,14 @@ XR_ENUM_STR(XrResult); #define XR_LIST_BITS_XrTriangleMeshFlagsFB(_) \ _(XR_TRIANGLE_MESH_MUTABLE_BIT_FB, 0x00000001) \ +#define XR_LIST_BITS_XrPassthroughCapabilityFlagsFB(_) \ + _(XR_PASSTHROUGH_CAPABILITY_BIT_FB, 0x00000001) \ + _(XR_PASSTHROUGH_CAPABILITY_COLOR_BIT_FB, 0x00000002) \ + _(XR_PASSTHROUGH_CAPABILITY_LAYER_DEPTH_BIT_FB, 0x00000004) \ + #define XR_LIST_BITS_XrPassthroughFlagsFB(_) \ _(XR_PASSTHROUGH_IS_RUNNING_AT_CREATION_BIT_FB, 0x00000001) \ + _(XR_PASSTHROUGH_LAYER_DEPTH_BIT_FB, 0x00000002) \ #define XR_LIST_BITS_XrPassthroughStateChangedFlagsFB(_) \ _(XR_PASSTHROUGH_STATE_CHANGED_REINIT_REQUIRED_BIT_FB, 0x00000001) \ @@ -2288,6 +2302,11 @@ XR_ENUM_STR(XrResult); _(next) \ _(supportsPassthrough) \ +#define XR_LIST_STRUCT_XrSystemPassthroughProperties2FB(_) \ + _(type) \ + _(next) \ + _(capabilities) \ + #define XR_LIST_STRUCT_XrPassthroughCreateInfoFB(_) \ _(type) \ _(next) \ @@ -2589,6 +2608,43 @@ XR_ENUM_STR(XrResult); _(recommendedMotionVectorImageRectWidth) \ _(recommendedMotionVectorImageRectHeight) \ +#define XR_LIST_STRUCT_XrExtent3DfFB(_) \ + _(width) \ + _(height) \ + _(depth) \ + +#define XR_LIST_STRUCT_XrOffset3DfFB(_) \ + _(x) \ + _(y) \ + _(z) \ + +#define XR_LIST_STRUCT_XrRect3DfFB(_) \ + _(offset) \ + _(extent) \ + +#define XR_LIST_STRUCT_XrSemanticLabelsFB(_) \ + _(type) \ + _(next) \ + _(bufferCapacityInput) \ + _(bufferCountOutput) \ + _(buffer) \ + +#define XR_LIST_STRUCT_XrRoomLayoutFB(_) \ + _(type) \ + _(next) \ + _(floorUuid) \ + _(ceilingUuid) \ + _(wallUuidCapacityInput) \ + _(wallUuidCountOutput) \ + _(wallUuids) \ + +#define XR_LIST_STRUCT_XrBoundary2DFB(_) \ + _(type) \ + _(next) \ + _(vertexCapacityInput) \ + _(vertexCountOutput) \ + _(vertices) \ + #define XR_LIST_STRUCT_XrDigitalLensControlALMALENCE(_) \ _(type) \ _(next) \ @@ -2785,6 +2841,7 @@ XR_ENUM_STR(XrResult); _(XrKeyboardTrackingQueryFB, XR_TYPE_KEYBOARD_TRACKING_QUERY_FB) \ _(XrTriangleMeshCreateInfoFB, XR_TYPE_TRIANGLE_MESH_CREATE_INFO_FB) \ _(XrSystemPassthroughPropertiesFB, XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES_FB) \ + _(XrSystemPassthroughProperties2FB, XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES2_FB) \ _(XrPassthroughCreateInfoFB, XR_TYPE_PASSTHROUGH_CREATE_INFO_FB) \ _(XrPassthroughLayerCreateInfoFB, XR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_FB) \ _(XrCompositionLayerPassthroughFB, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB) \ @@ -2823,6 +2880,9 @@ XR_ENUM_STR(XrResult); _(XrEventDataSpaceEraseCompleteFB, XR_TYPE_EVENT_DATA_SPACE_ERASE_COMPLETE_FB) \ _(XrCompositionLayerSpaceWarpInfoFB, XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB) \ _(XrSystemSpaceWarpPropertiesFB, XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB) \ + _(XrSemanticLabelsFB, XR_TYPE_SEMANTIC_LABELS_FB) \ + _(XrRoomLayoutFB, XR_TYPE_ROOM_LAYOUT_FB) \ + _(XrBoundary2DFB, XR_TYPE_BOUNDARY_2D_FB) \ _(XrDigitalLensControlALMALENCE, XR_TYPE_DIGITAL_LENS_CONTROL_ALMALENCE) \ _(XrSpaceContainerFB, XR_TYPE_SPACE_CONTAINER_FB) \ _(XrPassthroughKeyboardHandsIntensityFB, XR_TYPE_PASSTHROUGH_KEYBOARD_HANDS_INTENSITY_FB) \ @@ -3071,6 +3131,7 @@ XR_ENUM_STR(XrResult); _(XR_VARJO_environment_depth_estimation, 124) \ _(XR_VARJO_marker_tracking, 125) \ _(XR_VARJO_view_offset, 126) \ + _(XR_ML_ml2_controller_interaction, 135) \ _(XR_MSFT_spatial_anchor_persistence, 143) \ _(XR_ULTRALEAP_hand_tracking_forearm, 150) \ _(XR_FB_spatial_entity_query, 157) \ @@ -3082,6 +3143,8 @@ XR_ENUM_STR(XrResult); _(XR_FB_swapchain_update_state_vulkan, 164) \ _(XR_KHR_swapchain_usage_input_attachment_bit, 166) \ _(XR_FB_space_warp, 172) \ + _(XR_FB_scene, 176) \ + _(XR_EXT_palm_pose, 177) \ _(XR_ALMALENCE_digital_lens_control, 197) \ _(XR_FB_spatial_entity_container, 200) \ _(XR_FB_passthrough_keyboard_hands, 204) \ diff --git a/thirdparty/openxr/src/common/unique_asset.h b/thirdparty/openxr/src/common/unique_asset.h new file mode 100644 index 0000000000..4929039a03 --- /dev/null +++ b/thirdparty/openxr/src/common/unique_asset.h @@ -0,0 +1,33 @@ +// Copyright (c) 2017-2022, The Khronos Group Inc. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT +#pragma once + +#ifdef XR_USE_PLATFORM_ANDROID + +#include <memory> +#include <android/asset_manager.h> + +namespace deleters { +struct AAssetDeleter { + void operator()(AAsset* asset) const noexcept { + if (asset != nullptr) { + AAsset_close(asset); + } + } +}; + +struct AAssetDirDeleter { + void operator()(AAssetDir* dir) const noexcept { + if (dir != nullptr) { + AAssetDir_close(dir); + } + } +}; + +} // namespace deleters + +using UniqueAsset = std::unique_ptr<AAsset, deleters::AAssetDeleter>; +using UniqueAssetDir = std::unique_ptr<AAssetDir, deleters::AAssetDirDeleter>; + +#endif diff --git a/thirdparty/openxr/src/loader/android_utilities.cpp b/thirdparty/openxr/src/loader/android_utilities.cpp index 807a775820..59d9a99b74 100644 --- a/thirdparty/openxr/src/loader/android_utilities.cpp +++ b/thirdparty/openxr/src/loader/android_utilities.cpp @@ -299,7 +299,7 @@ int getActiveRuntimeVirtualManifest(wrap::android::content::Context const &conte auto hasFunctions = cursor.getInt(cursor.getColumnIndex(active_runtime::Columns::HAS_FUNCTIONS)) == 1; __android_log_print(ANDROID_LOG_INFO, TAG, "Got runtime: package: %s, so filename: %s, native lib dir: %s, has functions: %s", - packageName.c_str(), libDir.c_str(), filename.c_str(), (hasFunctions ? "yes" : "no")); + packageName.c_str(), filename.c_str(), libDir.c_str(), (hasFunctions ? "yes" : "no")); auto lib_path = libDir + "/" + filename; cursor.close(); diff --git a/thirdparty/openxr/src/loader/api_layer_interface.cpp b/thirdparty/openxr/src/loader/api_layer_interface.cpp index c3fd5bb7f1..b946e09402 100644 --- a/thirdparty/openxr/src/loader/api_layer_interface.cpp +++ b/thirdparty/openxr/src/loader/api_layer_interface.cpp @@ -53,7 +53,6 @@ XrResult ApiLayerInterface::GetApiLayerProperties(const std::string& openxr_comm uint32_t* outgoing_count, XrApiLayerProperties* api_layer_properties) { std::vector<std::unique_ptr<ApiLayerManifestFile>> manifest_files; uint32_t manifest_count = 0; - // Validate props struct before proceeding if (0 < incoming_count && nullptr != api_layer_properties) { for (uint32_t i = 0; i < incoming_count; i++) { diff --git a/thirdparty/openxr/src/loader/loader_core.cpp b/thirdparty/openxr/src/loader/loader_core.cpp index 375f1c93ba..a8bbfb4de2 100644 --- a/thirdparty/openxr/src/loader/loader_core.cpp +++ b/thirdparty/openxr/src/loader/loader_core.cpp @@ -711,9 +711,6 @@ XRLOADER_ABI_CATCH_FALLBACK XRAPI_ATTR XrResult XRAPI_CALL LoaderXrGetInstanceProcAddr(XrInstance instance, const char *name, PFN_xrVoidFunction *function) XRLOADER_ABI_TRY { - // Initialize the function to nullptr in case it does not get caught in a known case - *function = nullptr; - if (nullptr == function) { LoaderLogger::LogValidationErrorMessage("VUID-xrGetInstanceProcAddr-function-parameter", "xrGetInstanceProcAddr", "Invalid Function pointer"); @@ -726,6 +723,9 @@ XRAPI_ATTR XrResult XRAPI_CALL LoaderXrGetInstanceProcAddr(XrInstance instance, return XR_ERROR_VALIDATION_FAILURE; } + // Initialize the function to nullptr in case it does not get caught in a known case + *function = nullptr; + LoaderInstance *loader_instance = nullptr; if (instance == XR_NULL_HANDLE) { // Null instance is allowed for a few specific API entry points, otherwise return error diff --git a/thirdparty/openxr/src/loader/manifest_file.cpp b/thirdparty/openxr/src/loader/manifest_file.cpp index e4eab3949e..df99d51f8f 100644 --- a/thirdparty/openxr/src/loader/manifest_file.cpp +++ b/thirdparty/openxr/src/loader/manifest_file.cpp @@ -21,6 +21,7 @@ #include "loader_platform.hpp" #include "platform_utils.hpp" #include "loader_logger.hpp" +#include "unique_asset.h" #include <json/json.h> #include <openxr/openxr.h> @@ -50,6 +51,10 @@ #define SYSCONFDIR "/etc" #endif // !SYSCONFDIR +#ifdef XR_USE_PLATFORM_ANDROID +#include <android/asset_manager.h> +#endif + #ifdef XRLOADER_DISABLE_EXCEPTION_HANDLING #if JSON_USE_EXCEPTIONS #error \ @@ -656,17 +661,68 @@ ApiLayerManifestFile::ApiLayerManifestFile(ManifestFileType type, const std::str _description(description), _implementation_version(implementation_version) {} -void ApiLayerManifestFile::CreateIfValid(ManifestFileType type, const std::string &filename, - std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files) { - std::ifstream json_stream(filename, std::ifstream::in); +#ifdef XR_USE_PLATFORM_ANDROID +void ApiLayerManifestFile::AddManifestFilesAndroid(ManifestFileType type, + std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files) { + AAssetManager *assetManager = (AAssetManager *)Android_Get_Asset_Manager(); + std::vector<std::string> filenames; + { + std::string search_path = ""; + switch (type) { + case MANIFEST_TYPE_IMPLICIT_API_LAYER: + search_path = "openxr/1/api_layers/implicit.d/"; + break; + case MANIFEST_TYPE_EXPLICIT_API_LAYER: + search_path = "openxr/1/api_layers/explicit.d/"; + break; + default: + return; + } - std::ostringstream error_ss("ApiLayerManifestFile::CreateIfValid "); - if (!json_stream.is_open()) { - error_ss << "failed to open " << filename << ". Does it exist?"; - LoaderLogger::LogErrorMessage("", error_ss.str()); - return; + UniqueAssetDir dir{AAssetManager_openDir(assetManager, search_path.c_str())}; + if (!dir) { + return; + } + const std::string json = ".json"; + const char *fn = nullptr; + while ((fn = AAssetDir_getNextFileName(dir.get())) != nullptr) { + const std::string filename = search_path + fn; + if (filename.size() < json.size()) { + continue; + } + if (filename.compare(filename.size() - json.size(), json.size(), json) == 0) { + filenames.push_back(filename); + } + } } + for (const auto &filename : filenames) { + UniqueAsset asset{AAssetManager_open(assetManager, filename.c_str(), AASSET_MODE_BUFFER)}; + if (!asset) { + LoaderLogger::LogWarningMessage( + "", "ApiLayerManifestFile::AddManifestFilesAndroid unable to open asset " + filename + ", skipping"); + + continue; + } + size_t length = AAsset_getLength(asset.get()); + const char *buf = reinterpret_cast<const char *>(AAsset_getBuffer(asset.get())); + if (!buf) { + LoaderLogger::LogWarningMessage( + "", "ApiLayerManifestFile::AddManifestFilesAndroid unable to access asset" + filename + ", skipping"); + continue; + } + std::istringstream json_stream(std::string{buf, length}); + + CreateIfValid(ManifestFileType::MANIFEST_TYPE_EXPLICIT_API_LAYER, filename, json_stream, + &ApiLayerManifestFile::LocateLibraryInAssets, manifest_files); + } +} +#endif // XR_USE_PLATFORM_ANDROID + +void ApiLayerManifestFile::CreateIfValid(ManifestFileType type, const std::string &filename, std::istream &json_stream, + LibraryLocator locate_library, + std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files) { + std::ostringstream error_ss("ApiLayerManifestFile::CreateIfValid "); Json::CharReaderBuilder builder; std::string errors; Json::Value root_node = Json::nullValue; @@ -757,9 +813,7 @@ void ApiLayerManifestFile::CreateIfValid(ManifestFileType type, const std::strin } else { // Otherwise, treat the library path as a relative path based on the JSON file. std::string combined_path; - std::string file_parent; - if (!FileSysUtilsGetParentPath(filename, file_parent) || - !FileSysUtilsCombinePaths(file_parent, library_path, combined_path) || !FileSysUtilsPathExists(combined_path)) { + if (!locate_library(filename, library_path, combined_path)) { error_ss << filename << " library " << combined_path << " does not appear to exist"; LoaderLogger::LogErrorMessage("", error_ss.str()); return; @@ -781,6 +835,46 @@ void ApiLayerManifestFile::CreateIfValid(ManifestFileType type, const std::strin manifest_files.back()->ParseCommon(layer_root_node); } +void ApiLayerManifestFile::CreateIfValid(ManifestFileType type, const std::string &filename, + std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files) { + std::ifstream json_stream(filename, std::ifstream::in); + if (!json_stream.is_open()) { + std::ostringstream error_ss("ApiLayerManifestFile::CreateIfValid "); + error_ss << "failed to open " << filename << ". Does it exist?"; + LoaderLogger::LogErrorMessage("", error_ss.str()); + return; + } + CreateIfValid(type, filename, json_stream, &ApiLayerManifestFile::LocateLibraryRelativeToJson, manifest_files); +} + +bool ApiLayerManifestFile::LocateLibraryRelativeToJson( + const std::string &json_filename, const std::string &library_path, + std::string &out_combined_path) { // Otherwise, treat the library path as a relative path based on the JSON file. + std::string combined_path; + std::string file_parent; + if (!FileSysUtilsGetParentPath(json_filename, file_parent) || + !FileSysUtilsCombinePaths(file_parent, library_path, combined_path) || !FileSysUtilsPathExists(combined_path)) { + out_combined_path = combined_path; + return false; + } + out_combined_path = combined_path; + return true; +} + +#ifdef XR_USE_PLATFORM_ANDROID +bool ApiLayerManifestFile::LocateLibraryInAssets(const std::string & /* json_filename */, const std::string &library_path, + std::string &out_combined_path) { + std::string combined_path; + std::string file_parent = GetAndroidNativeLibraryDir(); + if (!FileSysUtilsCombinePaths(file_parent, library_path, combined_path) || !FileSysUtilsPathExists(combined_path)) { + out_combined_path = combined_path; + return false; + } + out_combined_path = combined_path; + return true; +} +#endif + void ApiLayerManifestFile::PopulateApiLayerProperties(XrApiLayerProperties &props) const { props.layerVersion = _implementation_version; props.specVersion = XR_MAKE_VERSION(_api_version.major, _api_version.minor, _api_version.patch); @@ -841,5 +935,9 @@ XrResult ApiLayerManifestFile::FindManifestFiles(ManifestFileType type, ApiLayerManifestFile::CreateIfValid(type, cur_file, manifest_files); } +#ifdef XR_USE_PLATFORM_ANDROID + ApiLayerManifestFile::AddManifestFilesAndroid(type, manifest_files); +#endif // XR_USE_PLATFORM_ANDROID + return XR_SUCCESS; } diff --git a/thirdparty/openxr/src/loader/manifest_file.hpp b/thirdparty/openxr/src/loader/manifest_file.hpp index 0d04886d84..de0aab65c2 100644 --- a/thirdparty/openxr/src/loader/manifest_file.hpp +++ b/thirdparty/openxr/src/loader/manifest_file.hpp @@ -14,6 +14,7 @@ #include <memory> #include <string> #include <vector> +#include <iosfwd> #include <unordered_map> namespace Json { @@ -79,6 +80,8 @@ class RuntimeManifestFile : public ManifestFile { std::vector<std::unique_ptr<RuntimeManifestFile>> &manifest_files); }; +using LibraryLocator = bool (*)(const std::string &json_filename, const std::string &library_path, std::string &out_combined_path); + // ApiLayerManifestFile class - // Responsible for finding and parsing API Layer-specific manifest files. class ApiLayerManifestFile : public ManifestFile { @@ -93,8 +96,19 @@ class ApiLayerManifestFile : public ManifestFile { ApiLayerManifestFile(ManifestFileType type, const std::string &filename, const std::string &layer_name, const std::string &description, const JsonVersion &api_version, const uint32_t &implementation_version, const std::string &library_path); + + static void CreateIfValid(ManifestFileType type, const std::string &filename, std::istream &json_stream, + LibraryLocator locate_library, std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files); static void CreateIfValid(ManifestFileType type, const std::string &filename, std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files); + /// @return false if we could not find the library. + static bool LocateLibraryRelativeToJson(const std::string &json_filename, const std::string &library_path, + std::string &out_combined_path); +#ifdef XR_USE_PLATFORM_ANDROID + static bool LocateLibraryInAssets(const std::string &json_filename, const std::string &library_path, + std::string &out_combined_path); + static void AddManifestFilesAndroid(ManifestFileType type, std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files); +#endif JsonVersion _api_version; std::string _layer_name; diff --git a/thirdparty/openxr/src/loader/runtime_interface.cpp b/thirdparty/openxr/src/loader/runtime_interface.cpp index 1a35ba013a..0f081ff9b2 100644 --- a/thirdparty/openxr/src/loader/runtime_interface.cpp +++ b/thirdparty/openxr/src/loader/runtime_interface.cpp @@ -27,6 +27,7 @@ #ifdef XR_USE_PLATFORM_ANDROID #include "android_utilities.h" +#include <android/asset_manager_jni.h> #include <json/value.h> #endif // XR_USE_PLATFORM_ANDROID @@ -50,6 +51,14 @@ class LoaderInitData { * Type alias for the platform-specific structure type. */ using StructType = XrLoaderInitInfoAndroidKHR; + /*! + * Native library path. + */ + std::string _native_library_path; + /*! + * Android asset manager. + */ + AAssetManager* _android_asset_manager; #endif /*! @@ -99,6 +108,30 @@ XrResult LoaderInitData::initialize(const XrLoaderInitInfoBaseHeaderKHR* info) { _data = *cast_info; jni::init((jni::JavaVM*)_data.applicationVM); _data.next = nullptr; + JNIEnv* Env; + ((jni::JavaVM*)(cast_info->applicationVM))->AttachCurrentThread(&Env, nullptr); + const jclass contextClass = Env->GetObjectClass((jobject)_data.applicationContext); + + const jmethodID getAssetsMethod = Env->GetMethodID(contextClass, "getAssets", "()Landroid/content/res/AssetManager;"); + const jobject AssetManagerObject = Env->CallObjectMethod((jobject)_data.applicationContext, getAssetsMethod); + _android_asset_manager = AAssetManager_fromJava(Env, AssetManagerObject); + + const jmethodID getApplicationContextMethod = + Env->GetMethodID(contextClass, "getApplicationContext", "()Landroid/content/Context;"); + const jobject contextObject = Env->CallObjectMethod((jobject)_data.applicationContext, getApplicationContextMethod); + const jmethodID getApplicationInfoMethod = + Env->GetMethodID(contextClass, "getApplicationInfo", "()Landroid/content/pm/ApplicationInfo;"); + const jobject applicationInfoObject = Env->CallObjectMethod(contextObject, getApplicationInfoMethod); + const jfieldID nativeLibraryDirField = + Env->GetFieldID(Env->GetObjectClass(applicationInfoObject), "nativeLibraryDir", "Ljava/lang/String;"); + const jobject nativeLibraryDirObject = Env->GetObjectField(applicationInfoObject, nativeLibraryDirField); + const jmethodID getBytesMethod = + Env->GetMethodID(Env->GetObjectClass(nativeLibraryDirObject), "getBytes", "(Ljava/lang/String;)[B"); + const auto bytesObject = + static_cast<jbyteArray>(Env->CallObjectMethod(nativeLibraryDirObject, getBytesMethod, Env->NewStringUTF("UTF-8"))); + const size_t length = Env->GetArrayLength(bytesObject); + const jbyte* const bytes = Env->GetByteArrayElements(bytesObject, nullptr); + _native_library_path = std::string(reinterpret_cast<const char*>(bytes), length); _initialized = true; return XR_SUCCESS; } @@ -109,6 +142,10 @@ XrResult InitializeLoader(const XrLoaderInitInfoBaseHeaderKHR* loaderInitInfo) { return LoaderInitData::instance().initialize(loaderInitInfo); } +std::string GetAndroidNativeLibraryDir() { return LoaderInitData::instance()._native_library_path; } + +void* Android_Get_Asset_Manager() { return LoaderInitData::instance()._android_asset_manager; } + #endif // XR_KHR_LOADER_INIT_SUPPORT #ifdef XR_USE_PLATFORM_ANDROID diff --git a/thirdparty/openxr/src/loader/runtime_interface.hpp b/thirdparty/openxr/src/loader/runtime_interface.hpp index 5f49b28abe..fa53ee03f2 100644 --- a/thirdparty/openxr/src/loader/runtime_interface.hpp +++ b/thirdparty/openxr/src/loader/runtime_interface.hpp @@ -31,6 +31,8 @@ class Value; //! Initialize loader, where required. XrResult InitializeLoader(const XrLoaderInitInfoBaseHeaderKHR* loaderInitInfo); XrResult GetPlatformRuntimeVirtualManifest(Json::Value& out_manifest); +std::string GetAndroidNativeLibraryDir(); +void* Android_Get_Asset_Manager(); #endif class RuntimeManifestFile; diff --git a/version.py b/version.py index f9aa1dd0f4..cfa1773b85 100644 --- a/version.py +++ b/version.py @@ -3,7 +3,7 @@ name = "Godot Engine" major = 4 minor = 0 patch = 0 -status = "alpha" +status = "beta" module_config = "" year = 2022 website = "https://godotengine.org" |